Repository: aniyomiorg/aniyomi Branch: main Commit: 2f5cf775c4d9 Files: 1961 Total size: 13.7 MB Directory structure: gitextract_glkkya1o/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── config.yml │ │ ├── report_issue.yml │ │ └── request_feature.yml │ ├── pull_request_template.md │ ├── renovate.json5 │ └── workflows/ │ ├── build_pull_request.yml │ └── build_push.yml ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app/ │ ├── .idea/ │ │ ├── .gitignore │ │ ├── .name │ │ ├── discord.xml │ │ ├── gradle.xml │ │ ├── misc.xml │ │ └── vcs.xml │ ├── build.gradle.kts │ ├── proguard-android-optimize.txt │ ├── proguard-rules.pro │ ├── shortcuts.xml │ └── src/ │ ├── debug/ │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_foreground.xml │ │ └── mipmap/ │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── assets/ │ │ │ └── aniyomi.lua │ │ ├── baseline-prof.txt │ │ ├── java/ │ │ │ ├── aniyomi/ │ │ │ │ └── util/ │ │ │ │ └── DataSaver.kt │ │ │ ├── eu/ │ │ │ │ └── kanade/ │ │ │ │ ├── core/ │ │ │ │ │ ├── preference/ │ │ │ │ │ │ ├── CheckboxState.kt │ │ │ │ │ │ └── PreferenceMutableState.kt │ │ │ │ │ └── util/ │ │ │ │ │ ├── AnimeSourceUtil.kt │ │ │ │ │ ├── CollectionUtils.kt │ │ │ │ │ ├── MangaSourceUtil.kt │ │ │ │ │ └── RxJavaExtensions.kt │ │ │ │ ├── domain/ │ │ │ │ │ ├── DomainModule.kt │ │ │ │ │ ├── SYDomainModule.kt │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── BasePreferences.kt │ │ │ │ │ │ └── ExtensionInstallerPreference.kt │ │ │ │ │ ├── download/ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ └── interactor/ │ │ │ │ │ │ │ └── DeleteEpisodeDownload.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ └── interactor/ │ │ │ │ │ │ └── DeleteChapterDownload.kt │ │ │ │ │ ├── entries/ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── SetAnimeViewerFlags.kt │ │ │ │ │ │ │ │ ├── SyncSeasonsWithSource.kt │ │ │ │ │ │ │ │ └── UpdateAnime.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── Anime.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ ├── GetExcludedScanlators.kt │ │ │ │ │ │ │ ├── SetExcludedScanlators.kt │ │ │ │ │ │ │ ├── SetMangaViewerFlags.kt │ │ │ │ │ │ │ └── UpdateManga.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── Manga.kt │ │ │ │ │ ├── extension/ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── GetAnimeExtensionLanguages.kt │ │ │ │ │ │ │ │ ├── GetAnimeExtensionSources.kt │ │ │ │ │ │ │ │ ├── GetAnimeExtensionsByType.kt │ │ │ │ │ │ │ │ └── TrustAnimeExtension.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── AnimeExtensions.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ ├── GetMangaExtensionLanguages.kt │ │ │ │ │ │ │ ├── GetMangaExtensionSources.kt │ │ │ │ │ │ │ ├── GetMangaExtensionsByType.kt │ │ │ │ │ │ │ └── TrustMangaExtension.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── MangaExtensions.kt │ │ │ │ │ ├── items/ │ │ │ │ │ │ ├── chapter/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── GetAvailableScanlators.kt │ │ │ │ │ │ │ │ ├── SetReadStatus.kt │ │ │ │ │ │ │ │ └── SyncChaptersWithSource.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ ├── Chapter.kt │ │ │ │ │ │ │ └── ChapterFilter.kt │ │ │ │ │ │ └── episode/ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ ├── SetSeenStatus.kt │ │ │ │ │ │ │ └── SyncEpisodesWithSource.kt │ │ │ │ │ │ └── model/ │ │ │ │ │ │ ├── Episode.kt │ │ │ │ │ │ └── EpisodeFilter.kt │ │ │ │ │ ├── source/ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── GetAnimeIncognitoState.kt │ │ │ │ │ │ │ │ ├── GetAnimeSourcesWithFavoriteCount.kt │ │ │ │ │ │ │ │ ├── GetEnabledAnimeSources.kt │ │ │ │ │ │ │ │ ├── GetLanguagesWithAnimeSources.kt │ │ │ │ │ │ │ │ ├── ToggleAnimeIncognito.kt │ │ │ │ │ │ │ │ ├── ToggleAnimeSource.kt │ │ │ │ │ │ │ │ └── ToggleAnimeSourcePin.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── AnimeSource.kt │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ ├── SetMigrateSorting.kt │ │ │ │ │ │ │ └── ToggleLanguage.kt │ │ │ │ │ │ ├── manga/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── GetEnabledMangaSources.kt │ │ │ │ │ │ │ │ ├── GetLanguagesWithMangaSources.kt │ │ │ │ │ │ │ │ ├── GetMangaIncognitoState.kt │ │ │ │ │ │ │ │ ├── GetMangaSourcesWithFavoriteCount.kt │ │ │ │ │ │ │ │ ├── ToggleExcludeFromMangaDataSaver.kt │ │ │ │ │ │ │ │ ├── ToggleMangaIncognito.kt │ │ │ │ │ │ │ │ ├── ToggleMangaSource.kt │ │ │ │ │ │ │ │ └── ToggleMangaSourcePin.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── MangaSource.kt │ │ │ │ │ │ └── service/ │ │ │ │ │ │ └── SourcePreferences.kt │ │ │ │ │ ├── track/ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── AddAnimeTracks.kt │ │ │ │ │ │ │ │ ├── RefreshAnimeTracks.kt │ │ │ │ │ │ │ │ ├── SyncEpisodeProgressWithTrack.kt │ │ │ │ │ │ │ │ └── TrackEpisode.kt │ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ │ └── AnimeTrack.kt │ │ │ │ │ │ │ ├── service/ │ │ │ │ │ │ │ │ └── DelayedAnimeTrackingUpdateJob.kt │ │ │ │ │ │ │ └── store/ │ │ │ │ │ │ │ └── DelayedAnimeTrackingStore.kt │ │ │ │ │ │ ├── manga/ │ │ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ │ │ ├── AddMangaTracks.kt │ │ │ │ │ │ │ │ ├── RefreshMangaTracks.kt │ │ │ │ │ │ │ │ ├── SyncChapterProgressWithTrack.kt │ │ │ │ │ │ │ │ └── TrackChapter.kt │ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ │ └── MangaTrack.kt │ │ │ │ │ │ │ ├── service/ │ │ │ │ │ │ │ │ └── DelayedMangaTrackingUpdateJob.kt │ │ │ │ │ │ │ └── store/ │ │ │ │ │ │ │ └── DelayedMangaTrackingStore.kt │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ └── AutoTrackState.kt │ │ │ │ │ │ └── service/ │ │ │ │ │ │ └── TrackPreferences.kt │ │ │ │ │ └── ui/ │ │ │ │ │ ├── UiPreferences.kt │ │ │ │ │ └── model/ │ │ │ │ │ ├── AppTheme.kt │ │ │ │ │ ├── NavStyle.kt │ │ │ │ │ ├── StartScreen.kt │ │ │ │ │ ├── TabletUiMode.kt │ │ │ │ │ └── ThemeMode.kt │ │ │ │ ├── presentation/ │ │ │ │ │ ├── browse/ │ │ │ │ │ │ ├── BaseBrowseItem.kt │ │ │ │ │ │ ├── BrowseBadges.kt │ │ │ │ │ │ ├── BrowseSourceDialogs.kt │ │ │ │ │ │ ├── BrowseSourceLoadingItem.kt │ │ │ │ │ │ ├── GlobalSearchResultItems.kt │ │ │ │ │ │ ├── GlobalSerachCard.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeExtensionDetailsScreen.kt │ │ │ │ │ │ │ ├── AnimeExtensionFilterScreen.kt │ │ │ │ │ │ │ ├── AnimeExtensionsScreen.kt │ │ │ │ │ │ │ ├── AnimeSourcesFilterScreen.kt │ │ │ │ │ │ │ ├── AnimeSourcesScreen.kt │ │ │ │ │ │ │ ├── BrowseAnimeSourceScreen.kt │ │ │ │ │ │ │ ├── GlobalAnimeSearchScreen.kt │ │ │ │ │ │ │ ├── MigrateAnimeScreen.kt │ │ │ │ │ │ │ ├── MigrateAnimeSearchScreen.kt │ │ │ │ │ │ │ ├── MigrateAnimeSourceScreen.kt │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ ├── BaseAnimeSourceItem.kt │ │ │ │ │ │ │ ├── BrowseAnimeIcons.kt │ │ │ │ │ │ │ ├── BrowseAnimeSourceComfortableGrid.kt │ │ │ │ │ │ │ ├── BrowseAnimeSourceCompactGrid.kt │ │ │ │ │ │ │ ├── BrowseAnimeSourceList.kt │ │ │ │ │ │ │ ├── BrowseAnimeSourceToolbar.kt │ │ │ │ │ │ │ ├── GlobalAnimeSearchCardRow.kt │ │ │ │ │ │ │ └── GlobalAnimeSearchToolbar.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── BrowseMangaSourceScreen.kt │ │ │ │ │ │ ├── GlobalMangaSearchScreen.kt │ │ │ │ │ │ ├── MangaExtensionDetailsScreen.kt │ │ │ │ │ │ ├── MangaExtensionFilterScreen.kt │ │ │ │ │ │ ├── MangaExtensionsScreen.kt │ │ │ │ │ │ ├── MangaSourcesFilterScreen.kt │ │ │ │ │ │ ├── MangaSourcesScreen.kt │ │ │ │ │ │ ├── MigrateMangaScreen.kt │ │ │ │ │ │ ├── MigrateMangaSearchScreen.kt │ │ │ │ │ │ ├── MigrateMangaSourceScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── BaseMangaSourceItem.kt │ │ │ │ │ │ ├── BrowseMangaIcons.kt │ │ │ │ │ │ ├── BrowseMangaSourceComfortableGrid.kt │ │ │ │ │ │ ├── BrowseMangaSourceCompactGrid.kt │ │ │ │ │ │ ├── BrowseMangaSourceList.kt │ │ │ │ │ │ ├── BrowseMangaSourceToolbar.kt │ │ │ │ │ │ ├── GlobalMangaSearchCardRow.kt │ │ │ │ │ │ └── GlobalMangaSearchToolbar.kt │ │ │ │ │ ├── category/ │ │ │ │ │ │ ├── AnimeCategoryScreen.kt │ │ │ │ │ │ ├── CategoryExtensions.kt │ │ │ │ │ │ ├── MangaCategoryScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── CategoryDialogs.kt │ │ │ │ │ │ ├── CategoryFloatingActionButton.kt │ │ │ │ │ │ └── CategoryListItem.kt │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AdaptiveSheet.kt │ │ │ │ │ │ ├── AppBar.kt │ │ │ │ │ │ ├── Banners.kt │ │ │ │ │ │ ├── DateText.kt │ │ │ │ │ │ ├── DropdownMenu.kt │ │ │ │ │ │ ├── EmptyScreen.kt │ │ │ │ │ │ ├── EntryDownloadDropdownMenu.kt │ │ │ │ │ │ ├── FloatingActionAddButton.kt │ │ │ │ │ │ ├── ItemDownloadIndicator.kt │ │ │ │ │ │ ├── TabbedDialog.kt │ │ │ │ │ │ └── TabbedScreen.kt │ │ │ │ │ ├── crash/ │ │ │ │ │ │ └── CrashScreen.kt │ │ │ │ │ ├── entries/ │ │ │ │ │ │ ├── EntryScreenConstants.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeScreen.kt │ │ │ │ │ │ │ ├── DuplicateAnimeDialog.kt │ │ │ │ │ │ │ ├── EpisodeOptionsDialogScreen.kt │ │ │ │ │ │ │ ├── EpisodeSettingsDialog.kt │ │ │ │ │ │ │ ├── SeasonSettingsDialog.kt │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ ├── AnimeEpisodeListItem.kt │ │ │ │ │ │ │ ├── AnimeImagesDialog.kt │ │ │ │ │ │ │ ├── AnimeInfoHeader.kt │ │ │ │ │ │ │ ├── AnimeSeasonListItem.kt │ │ │ │ │ │ │ ├── BaseAnimeListItem.kt │ │ │ │ │ │ │ └── EpisodeDownloadIndicator.kt │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── DotSeparatorText.kt │ │ │ │ │ │ │ ├── EntryBottomActionMenu.kt │ │ │ │ │ │ │ ├── EntryToolbar.kt │ │ │ │ │ │ │ ├── ItemCover.kt │ │ │ │ │ │ │ ├── ItemHeader.kt │ │ │ │ │ │ │ ├── ItemsDialogs.kt │ │ │ │ │ │ │ └── MissingItemCountListItem.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── ChapterSettingsDialog.kt │ │ │ │ │ │ ├── DuplicateMangaDialog.kt │ │ │ │ │ │ ├── MangaScreen.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── BaseMangaListItem.kt │ │ │ │ │ │ ├── ChapterDownloadIndicator.kt │ │ │ │ │ │ ├── MangaChapterListItem.kt │ │ │ │ │ │ ├── MangaCoverDialog.kt │ │ │ │ │ │ ├── MangaInfoHeader.kt │ │ │ │ │ │ └── ScanlatorFilterDialog.kt │ │ │ │ │ ├── history/ │ │ │ │ │ │ ├── HistoryDialogs.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeHistoryScreen.kt │ │ │ │ │ │ │ ├── AnimeHistoryScreenModelStateProvider.kt │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ ├── AnimeHistoryItem.kt │ │ │ │ │ │ │ └── AnimeHistoryWithRelationsProvider.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── MangaHistoryScreen.kt │ │ │ │ │ │ ├── MangaHistoryScreenModelStateProvider.kt │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── MangaHistoryItem.kt │ │ │ │ │ │ └── MangaHistoryWithRelationsProvider.kt │ │ │ │ │ ├── library/ │ │ │ │ │ │ ├── DeleteLibraryEntryDialog.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeLibraryComfortableGrid.kt │ │ │ │ │ │ │ ├── AnimeLibraryCompactGrid.kt │ │ │ │ │ │ │ ├── AnimeLibraryContent.kt │ │ │ │ │ │ │ ├── AnimeLibraryList.kt │ │ │ │ │ │ │ ├── AnimeLibraryPager.kt │ │ │ │ │ │ │ └── AnimeLibrarySettingsDialog.kt │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── CommonEntryItem.kt │ │ │ │ │ │ │ ├── GlobalSearchItem.kt │ │ │ │ │ │ │ ├── LazyLibraryGrid.kt │ │ │ │ │ │ │ ├── LibraryBadges.kt │ │ │ │ │ │ │ ├── LibraryTabs.kt │ │ │ │ │ │ │ └── LibraryToolbar.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── MangaLibraryComfortableGrid.kt │ │ │ │ │ │ ├── MangaLibraryCompactGrid.kt │ │ │ │ │ │ ├── MangaLibraryContent.kt │ │ │ │ │ │ ├── MangaLibraryList.kt │ │ │ │ │ │ ├── MangaLibraryPager.kt │ │ │ │ │ │ └── MangaLibrarySettingsDialog.kt │ │ │ │ │ ├── more/ │ │ │ │ │ │ ├── LogoHeader.kt │ │ │ │ │ │ ├── MoreScreen.kt │ │ │ │ │ │ ├── NewUpdateScreen.kt │ │ │ │ │ │ ├── onboarding/ │ │ │ │ │ │ │ ├── GuidesStep.kt │ │ │ │ │ │ │ ├── OnboardingScreen.kt │ │ │ │ │ │ │ ├── OnboardingStep.kt │ │ │ │ │ │ │ ├── PermissionStep.kt │ │ │ │ │ │ │ ├── StorageStep.kt │ │ │ │ │ │ │ └── ThemeStep.kt │ │ │ │ │ │ ├── settings/ │ │ │ │ │ │ │ ├── Preference.kt │ │ │ │ │ │ │ ├── PreferenceItem.kt │ │ │ │ │ │ │ ├── PreferenceScaffold.kt │ │ │ │ │ │ │ ├── PreferenceScreen.kt │ │ │ │ │ │ │ ├── screen/ │ │ │ │ │ │ │ │ ├── Commons.kt │ │ │ │ │ │ │ │ ├── SearchableSettings.kt │ │ │ │ │ │ │ │ ├── SettingsAdvancedScreen.kt │ │ │ │ │ │ │ │ ├── SettingsAppearanceScreen.kt │ │ │ │ │ │ │ │ ├── SettingsBrowseScreen.kt │ │ │ │ │ │ │ │ ├── SettingsDataScreen.kt │ │ │ │ │ │ │ │ ├── SettingsDownloadScreen.kt │ │ │ │ │ │ │ │ ├── SettingsLibraryScreen.kt │ │ │ │ │ │ │ │ ├── SettingsMainScreen.kt │ │ │ │ │ │ │ │ ├── SettingsReaderScreen.kt │ │ │ │ │ │ │ │ ├── SettingsSearchScreen.kt │ │ │ │ │ │ │ │ ├── SettingsSecurityScreen.kt │ │ │ │ │ │ │ │ ├── SettingsTrackingScreen.kt │ │ │ │ │ │ │ │ ├── about/ │ │ │ │ │ │ │ │ │ ├── AboutScreen.kt │ │ │ │ │ │ │ │ │ ├── OpenSourceLibraryLicenseScreen.kt │ │ │ │ │ │ │ │ │ └── OpenSourceLicensesScreen.kt │ │ │ │ │ │ │ │ ├── advanced/ │ │ │ │ │ │ │ │ │ ├── ClearAnimeDatabaseScreen.kt │ │ │ │ │ │ │ │ │ └── ClearDatabaseScreen.kt │ │ │ │ │ │ │ │ ├── appearance/ │ │ │ │ │ │ │ │ │ └── AppLanguageScreen.kt │ │ │ │ │ │ │ │ ├── browse/ │ │ │ │ │ │ │ │ │ ├── AnimeExtensionReposScreen.kt │ │ │ │ │ │ │ │ │ ├── AnimeExtensionReposScreenModel.kt │ │ │ │ │ │ │ │ │ ├── MangaExtensionReposScreen.kt │ │ │ │ │ │ │ │ │ ├── MangaExtensionReposScreenModel.kt │ │ │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ │ │ ├── ExtensionReposContent.kt │ │ │ │ │ │ │ │ │ ├── ExtensionReposDialogs.kt │ │ │ │ │ │ │ │ │ └── ExtensionReposScreen.kt │ │ │ │ │ │ │ │ ├── data/ │ │ │ │ │ │ │ │ │ ├── CreateBackupScreen.kt │ │ │ │ │ │ │ │ │ ├── RestoreBackupScreen.kt │ │ │ │ │ │ │ │ │ └── StorageInfo.kt │ │ │ │ │ │ │ │ ├── debug/ │ │ │ │ │ │ │ │ │ ├── BackupSchemaScreen.kt │ │ │ │ │ │ │ │ │ ├── DebugInfoScreen.kt │ │ │ │ │ │ │ │ │ └── WorkerInfoScreen.kt │ │ │ │ │ │ │ │ └── player/ │ │ │ │ │ │ │ │ ├── PlayerSettingsAdvancedScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsAudioScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsDecoderScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsGesturesScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsMainScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsPlayerScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsSubtitleScreen.kt │ │ │ │ │ │ │ │ ├── custombutton/ │ │ │ │ │ │ │ │ │ ├── PlayerSettingsCustomButtonScreen.kt │ │ │ │ │ │ │ │ │ ├── PlayerSettingsCustomButtonScreenModel.kt │ │ │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ │ │ ├── CustomButtonDialogs.kt │ │ │ │ │ │ │ │ │ ├── CustomButtonListItem.kt │ │ │ │ │ │ │ │ │ └── CustomButtonScreen.kt │ │ │ │ │ │ │ │ └── editor/ │ │ │ │ │ │ │ │ ├── PlayerSettingsEditorScreen.kt │ │ │ │ │ │ │ │ ├── PlayerSettingsEditorScreenModel.kt │ │ │ │ │ │ │ │ ├── codeeditor/ │ │ │ │ │ │ │ │ │ ├── CodeEditScreen.kt │ │ │ │ │ │ │ │ │ ├── CodeEditScreenModel.kt │ │ │ │ │ │ │ │ │ ├── Highlight.kt │ │ │ │ │ │ │ │ │ └── SyntaxHighlight.kt │ │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ │ ├── EditorDialogs.kt │ │ │ │ │ │ │ │ ├── EditorScreen.kt │ │ │ │ │ │ │ │ └── EditorTypeDropdown.kt │ │ │ │ │ │ │ └── widget/ │ │ │ │ │ │ │ ├── AppThemeModePreferenceWidget.kt │ │ │ │ │ │ │ ├── AppThemePreferenceWidget.kt │ │ │ │ │ │ │ ├── BasePreferenceWidget.kt │ │ │ │ │ │ │ ├── EditTextPreferenceWidget.kt │ │ │ │ │ │ │ ├── InfoWidget.kt │ │ │ │ │ │ │ ├── ListPreferenceWidget.kt │ │ │ │ │ │ │ ├── MultiSelectListPreferenceWidget.kt │ │ │ │ │ │ │ ├── PreferenceGroupHeader.kt │ │ │ │ │ │ │ ├── SwitchPreferenceWidget.kt │ │ │ │ │ │ │ ├── TextPreferenceWidget.kt │ │ │ │ │ │ │ ├── TrackingPreferenceWidget.kt │ │ │ │ │ │ │ └── TriStateListDialog.kt │ │ │ │ │ │ ├── stats/ │ │ │ │ │ │ │ ├── AnimeStatsScreenContent.kt │ │ │ │ │ │ │ ├── MangaStatsScreenContent.kt │ │ │ │ │ │ │ ├── StatsScreenState.kt │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ └── StatsItem.kt │ │ │ │ │ │ │ └── data/ │ │ │ │ │ │ │ └── StatsData.kt │ │ │ │ │ │ └── storage/ │ │ │ │ │ │ ├── CumulativeStorage.kt │ │ │ │ │ │ ├── SelectStorageCategory.kt │ │ │ │ │ │ ├── StorageItem.kt │ │ │ │ │ │ ├── StorageScreenContent.kt │ │ │ │ │ │ └── StorageScreenState.kt │ │ │ │ │ ├── player/ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ ├── ExpandableCard.kt │ │ │ │ │ │ ├── ExposedTextDropDownMenu.kt │ │ │ │ │ │ ├── OutlinedNumericChooser.kt │ │ │ │ │ │ ├── OvalBox.kt │ │ │ │ │ │ ├── PlayerSheet.kt │ │ │ │ │ │ ├── RepeatingIconButton.kt │ │ │ │ │ │ ├── SliderItem.kt │ │ │ │ │ │ ├── SwitchPreference.kt │ │ │ │ │ │ └── TintedSliderItem.kt │ │ │ │ │ ├── reader/ │ │ │ │ │ │ ├── ChapterTransition.kt │ │ │ │ │ │ ├── DisplayRefreshHost.kt │ │ │ │ │ │ ├── OrientationSelectDialog.kt │ │ │ │ │ │ ├── PageIndicatorText.kt │ │ │ │ │ │ ├── ReaderContentOverlay.kt │ │ │ │ │ │ ├── ReaderPageActionsDialog.kt │ │ │ │ │ │ ├── ReadingModeSelectDialog.kt │ │ │ │ │ │ ├── appbars/ │ │ │ │ │ │ │ ├── BottomReaderBar.kt │ │ │ │ │ │ │ └── ReaderAppBars.kt │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── ChapterNavigator.kt │ │ │ │ │ │ │ └── ModeSelectionDialog.kt │ │ │ │ │ │ └── settings/ │ │ │ │ │ │ ├── ColorFilterPage.kt │ │ │ │ │ │ ├── GeneralSettingsPage.kt │ │ │ │ │ │ ├── ReaderSettingsDialog.kt │ │ │ │ │ │ └── ReadingModePage.kt │ │ │ │ │ ├── theme/ │ │ │ │ │ │ ├── TachiyomiTheme.kt │ │ │ │ │ │ └── colorscheme/ │ │ │ │ │ │ ├── BaseColorScheme.kt │ │ │ │ │ │ ├── CloudflareColorScheme.kt │ │ │ │ │ │ ├── CottoncandyColorScheme.kt │ │ │ │ │ │ ├── DoomColorScheme.kt │ │ │ │ │ │ ├── GreenAppleColorScheme.kt │ │ │ │ │ │ ├── LavenderColorScheme.kt │ │ │ │ │ │ ├── MatrixColorScheme.kt │ │ │ │ │ │ ├── MidnightDuskColorScheme.kt │ │ │ │ │ │ ├── MochaColorScheme.kt │ │ │ │ │ │ ├── MonetColorScheme.kt │ │ │ │ │ │ ├── MonochromeColorScheme.kt │ │ │ │ │ │ ├── NordColorScheme.kt │ │ │ │ │ │ ├── SapphireColorScheme.kt │ │ │ │ │ │ ├── StrawberryColorScheme.kt │ │ │ │ │ │ ├── TachiyomiColorScheme.kt │ │ │ │ │ │ ├── TakoColorScheme.kt │ │ │ │ │ │ ├── TealTurqoiseColorScheme.kt │ │ │ │ │ │ ├── TidalWaveColorScheme.kt │ │ │ │ │ │ ├── YinYangColorScheme.kt │ │ │ │ │ │ └── YotsubaColorScheme.kt │ │ │ │ │ ├── track/ │ │ │ │ │ │ ├── TrackInfoDialogSelector.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeTrackInfoDialogHome.kt │ │ │ │ │ │ │ ├── AnimeTrackInfoDialogHomePreviewProvider.kt │ │ │ │ │ │ │ ├── AnimeTrackerSearch.kt │ │ │ │ │ │ │ └── AnimeTrackerSearchPreviewProvider.kt │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── TrackLogoIcon.kt │ │ │ │ │ │ │ └── TrackLogoIconPreviewProvider.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── MangaTrackInfoDialogHome.kt │ │ │ │ │ │ ├── MangaTrackInfoDialogHomePreviewProvider.kt │ │ │ │ │ │ ├── MangaTrackerSearch.kt │ │ │ │ │ │ └── MangaTrackerSearchPreviewProvider.kt │ │ │ │ │ ├── updates/ │ │ │ │ │ │ ├── UpdatesDialog.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeUpdatesScreen.kt │ │ │ │ │ │ │ └── AnimeUpdatesUiItem.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── MangaUpdatesScreen.kt │ │ │ │ │ │ └── MangaUpdatesUiItem.kt │ │ │ │ │ ├── util/ │ │ │ │ │ │ ├── ExceptionFormatter.kt │ │ │ │ │ │ ├── FastScrollAnimateItem.kt │ │ │ │ │ │ ├── ItemNumberFormatter.kt │ │ │ │ │ │ ├── Navigator.kt │ │ │ │ │ │ ├── Permissions.kt │ │ │ │ │ │ ├── Resources.kt │ │ │ │ │ │ ├── TimeUtils.kt │ │ │ │ │ │ └── WindowSize.kt │ │ │ │ │ └── webview/ │ │ │ │ │ └── WebViewScreenContent.kt │ │ │ │ ├── tachiyomi/ │ │ │ │ │ ├── App.kt │ │ │ │ │ ├── AppInfo.kt │ │ │ │ │ ├── crash/ │ │ │ │ │ │ ├── CrashActivity.kt │ │ │ │ │ │ └── GlobalExceptionHandler.kt │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── backup/ │ │ │ │ │ │ │ ├── BackupDecoder.kt │ │ │ │ │ │ │ ├── BackupDetector.kt │ │ │ │ │ │ │ ├── BackupFileValidator.kt │ │ │ │ │ │ │ ├── BackupNotifier.kt │ │ │ │ │ │ │ ├── create/ │ │ │ │ │ │ │ │ ├── BackupCreateJob.kt │ │ │ │ │ │ │ │ ├── BackupCreator.kt │ │ │ │ │ │ │ │ ├── BackupOptions.kt │ │ │ │ │ │ │ │ └── creators/ │ │ │ │ │ │ │ │ ├── AnimeBackupCreator.kt │ │ │ │ │ │ │ │ ├── AnimeCategoriesBackupCreator.kt │ │ │ │ │ │ │ │ ├── AnimeExtensionRepoBackupCreator.kt │ │ │ │ │ │ │ │ ├── AnimeSourcesBackupCreator.kt │ │ │ │ │ │ │ │ ├── CustomButtonBackupCreator.kt │ │ │ │ │ │ │ │ ├── ExtensionsBackupCreator.kt │ │ │ │ │ │ │ │ ├── MangaBackupCreator.kt │ │ │ │ │ │ │ │ ├── MangaCategoriesBackupCreator.kt │ │ │ │ │ │ │ │ ├── MangaExtensionRepoBackupCreator.kt │ │ │ │ │ │ │ │ ├── MangaSourcesBackupCreator.kt │ │ │ │ │ │ │ │ └── PreferenceBackupCreator.kt │ │ │ │ │ │ │ ├── full/ │ │ │ │ │ │ │ │ └── models/ │ │ │ │ │ │ │ │ ├── Backup.kt │ │ │ │ │ │ │ │ └── BackupPreference.kt │ │ │ │ │ │ │ ├── models/ │ │ │ │ │ │ │ │ ├── Backup.kt │ │ │ │ │ │ │ │ ├── BackupAnime.kt │ │ │ │ │ │ │ │ ├── BackupAnimeHistory.kt │ │ │ │ │ │ │ │ ├── BackupAnimeSource.kt │ │ │ │ │ │ │ │ ├── BackupAnimeTracking.kt │ │ │ │ │ │ │ │ ├── BackupCategory.kt │ │ │ │ │ │ │ │ ├── BackupChapter.kt │ │ │ │ │ │ │ │ ├── BackupCustomButtons.kt │ │ │ │ │ │ │ │ ├── BackupEpisode.kt │ │ │ │ │ │ │ │ ├── BackupExtension.kt │ │ │ │ │ │ │ │ ├── BackupExtensionPreferences.kt │ │ │ │ │ │ │ │ ├── BackupExtensionRepos.kt │ │ │ │ │ │ │ │ ├── BackupHistory.kt │ │ │ │ │ │ │ │ ├── BackupManga.kt │ │ │ │ │ │ │ │ ├── BackupPreference.kt │ │ │ │ │ │ │ │ ├── BackupSource.kt │ │ │ │ │ │ │ │ └── BackupTracking.kt │ │ │ │ │ │ │ └── restore/ │ │ │ │ │ │ │ ├── BackupRestoreJob.kt │ │ │ │ │ │ │ ├── BackupRestorer.kt │ │ │ │ │ │ │ ├── RestoreOptions.kt │ │ │ │ │ │ │ └── restorers/ │ │ │ │ │ │ │ ├── AnimeCategoriesRestorer.kt │ │ │ │ │ │ │ ├── AnimeExtensionRepoRestorer.kt │ │ │ │ │ │ │ ├── AnimeRestorer.kt │ │ │ │ │ │ │ ├── CustomButtonRestorer.kt │ │ │ │ │ │ │ ├── ExtensionsRestorer.kt │ │ │ │ │ │ │ ├── MangaCategoriesRestorer.kt │ │ │ │ │ │ │ ├── MangaExtensionRepoRestorer.kt │ │ │ │ │ │ │ ├── MangaRestorer.kt │ │ │ │ │ │ │ └── PreferenceRestorer.kt │ │ │ │ │ │ ├── cache/ │ │ │ │ │ │ │ ├── AnimeBackgroundCache.kt │ │ │ │ │ │ │ ├── AnimeCoverCache.kt │ │ │ │ │ │ │ ├── ChapterCache.kt │ │ │ │ │ │ │ └── MangaCoverCache.kt │ │ │ │ │ │ ├── coil/ │ │ │ │ │ │ │ ├── AnimeCoverKeyer.kt │ │ │ │ │ │ │ ├── AnimeImageFetcher.kt │ │ │ │ │ │ │ ├── BufferedSourceFetcher.kt │ │ │ │ │ │ │ ├── MangaCoverFetcher.kt │ │ │ │ │ │ │ ├── MangaCoverKeyer.kt │ │ │ │ │ │ │ ├── TachiyomiImageDecoder.kt │ │ │ │ │ │ │ └── Utils.kt │ │ │ │ │ │ ├── database/ │ │ │ │ │ │ │ └── models/ │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeTrack.kt │ │ │ │ │ │ │ │ ├── AnimeTrackImpl.kt │ │ │ │ │ │ │ │ ├── Episode.kt │ │ │ │ │ │ │ │ └── EpisodeImpl.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── Chapter.kt │ │ │ │ │ │ │ ├── ChapterImpl.kt │ │ │ │ │ │ │ ├── MangaTrack.kt │ │ │ │ │ │ │ └── MangaTrackImpl.kt │ │ │ │ │ │ ├── download/ │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeDownloadCache.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadJob.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadManager.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadNotifier.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadPendingDeleter.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadProvider.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadStore.kt │ │ │ │ │ │ │ │ ├── AnimeDownloader.kt │ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ │ ├── AnimeDownload.kt │ │ │ │ │ │ │ │ └── AnimeDownloadPart.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaDownloadCache.kt │ │ │ │ │ │ │ ├── MangaDownloadJob.kt │ │ │ │ │ │ │ ├── MangaDownloadManager.kt │ │ │ │ │ │ │ ├── MangaDownloadNotifier.kt │ │ │ │ │ │ │ ├── MangaDownloadPendingDeleter.kt │ │ │ │ │ │ │ ├── MangaDownloadProvider.kt │ │ │ │ │ │ │ ├── MangaDownloadStore.kt │ │ │ │ │ │ │ ├── MangaDownloader.kt │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── MangaDownload.kt │ │ │ │ │ │ ├── export/ │ │ │ │ │ │ │ └── LibraryExporter.kt │ │ │ │ │ │ ├── library/ │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeLibraryUpdateJob.kt │ │ │ │ │ │ │ │ ├── AnimeLibraryUpdateNotifier.kt │ │ │ │ │ │ │ │ └── AnimeMetadataUpdateJob.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaLibraryUpdateJob.kt │ │ │ │ │ │ │ ├── MangaLibraryUpdateNotifier.kt │ │ │ │ │ │ │ └── MangaMetadataUpdateJob.kt │ │ │ │ │ │ ├── notification/ │ │ │ │ │ │ │ ├── NotificationHandler.kt │ │ │ │ │ │ │ ├── NotificationReceiver.kt │ │ │ │ │ │ │ └── Notifications.kt │ │ │ │ │ │ ├── preference/ │ │ │ │ │ │ │ └── SharedPreferencesDataStore.kt │ │ │ │ │ │ ├── saver/ │ │ │ │ │ │ │ └── ImageSaver.kt │ │ │ │ │ │ ├── track/ │ │ │ │ │ │ │ ├── AnimeTracker.kt │ │ │ │ │ │ │ ├── BaseTracker.kt │ │ │ │ │ │ │ ├── DeletableAnimeTracker.kt │ │ │ │ │ │ │ ├── DeletableMangaTracker.kt │ │ │ │ │ │ │ ├── EnhancedAnimeTracker.kt │ │ │ │ │ │ │ ├── EnhancedMangaTracker.kt │ │ │ │ │ │ │ ├── MangaTracker.kt │ │ │ │ │ │ │ ├── Tracker.kt │ │ │ │ │ │ │ ├── TrackerManager.kt │ │ │ │ │ │ │ ├── anilist/ │ │ │ │ │ │ │ │ ├── Anilist.kt │ │ │ │ │ │ │ │ ├── AnilistApi.kt │ │ │ │ │ │ │ │ ├── AnilistInterceptor.kt │ │ │ │ │ │ │ │ ├── AnilistUtils.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── ALAddEntry.kt │ │ │ │ │ │ │ │ ├── ALAnime.kt │ │ │ │ │ │ │ │ ├── ALFuzzyDate.kt │ │ │ │ │ │ │ │ ├── ALManga.kt │ │ │ │ │ │ │ │ ├── ALOAuth.kt │ │ │ │ │ │ │ │ ├── ALSearch.kt │ │ │ │ │ │ │ │ ├── ALSearchItem.kt │ │ │ │ │ │ │ │ ├── ALUser.kt │ │ │ │ │ │ │ │ └── ALUserList.kt │ │ │ │ │ │ │ ├── bangumi/ │ │ │ │ │ │ │ │ ├── Bangumi.kt │ │ │ │ │ │ │ │ ├── BangumiApi.kt │ │ │ │ │ │ │ │ ├── BangumiInterceptor.kt │ │ │ │ │ │ │ │ ├── BangumiUtils.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── BGMCollectionResponse.kt │ │ │ │ │ │ │ │ ├── BGMOAuth.kt │ │ │ │ │ │ │ │ ├── BGMSearch.kt │ │ │ │ │ │ │ │ └── BGMUser.kt │ │ │ │ │ │ │ ├── jellyfin/ │ │ │ │ │ │ │ │ ├── Jellyfin.kt │ │ │ │ │ │ │ │ ├── JellyfinApi.kt │ │ │ │ │ │ │ │ ├── JellyfinInterceptor.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ └── JFItem.kt │ │ │ │ │ │ │ ├── kavita/ │ │ │ │ │ │ │ │ ├── Kavita.kt │ │ │ │ │ │ │ │ ├── KavitaApi.kt │ │ │ │ │ │ │ │ ├── KavitaInterceptor.kt │ │ │ │ │ │ │ │ └── KavitaModels.kt │ │ │ │ │ │ │ ├── kitsu/ │ │ │ │ │ │ │ │ ├── Kitsu.kt │ │ │ │ │ │ │ │ ├── KitsuApi.kt │ │ │ │ │ │ │ │ ├── KitsuDateHelper.kt │ │ │ │ │ │ │ │ ├── KitsuInterceptor.kt │ │ │ │ │ │ │ │ ├── KitsuUtils.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── KitsuAddEntry.kt │ │ │ │ │ │ │ │ ├── KitsuListSearch.kt │ │ │ │ │ │ │ │ ├── KitsuOAuth.kt │ │ │ │ │ │ │ │ ├── KitsuSearch.kt │ │ │ │ │ │ │ │ ├── KitsuSearchItemCover.kt │ │ │ │ │ │ │ │ └── KitsuUser.kt │ │ │ │ │ │ │ ├── komga/ │ │ │ │ │ │ │ │ ├── Komga.kt │ │ │ │ │ │ │ │ ├── KomgaApi.kt │ │ │ │ │ │ │ │ └── KomgaModels.kt │ │ │ │ │ │ │ ├── mangaupdates/ │ │ │ │ │ │ │ │ ├── MangaUpdates.kt │ │ │ │ │ │ │ │ ├── MangaUpdatesApi.kt │ │ │ │ │ │ │ │ ├── MangaUpdatesInterceptor.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── MUContext.kt │ │ │ │ │ │ │ │ ├── MUImage.kt │ │ │ │ │ │ │ │ ├── MUListItem.kt │ │ │ │ │ │ │ │ ├── MULoginResponse.kt │ │ │ │ │ │ │ │ ├── MURating.kt │ │ │ │ │ │ │ │ ├── MURecord.kt │ │ │ │ │ │ │ │ ├── MUSearch.kt │ │ │ │ │ │ │ │ ├── MUSeries.kt │ │ │ │ │ │ │ │ ├── MUStatus.kt │ │ │ │ │ │ │ │ └── MUUrl.kt │ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ │ ├── AnimeTrackSearch.kt │ │ │ │ │ │ │ │ └── MangaTrackSearch.kt │ │ │ │ │ │ │ ├── myanimelist/ │ │ │ │ │ │ │ │ ├── MyAnimeList.kt │ │ │ │ │ │ │ │ ├── MyAnimeListApi.kt │ │ │ │ │ │ │ │ ├── MyAnimeListInterceptor.kt │ │ │ │ │ │ │ │ ├── MyAnimeListUtils.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── MALAnime.kt │ │ │ │ │ │ │ │ ├── MALList.kt │ │ │ │ │ │ │ │ ├── MALManga.kt │ │ │ │ │ │ │ │ ├── MALOAuth.kt │ │ │ │ │ │ │ │ ├── MALSearch.kt │ │ │ │ │ │ │ │ ├── MALUser.kt │ │ │ │ │ │ │ │ └── MALUserListSearch.kt │ │ │ │ │ │ │ ├── shikimori/ │ │ │ │ │ │ │ │ ├── Shikimori.kt │ │ │ │ │ │ │ │ ├── ShikimoriApi.kt │ │ │ │ │ │ │ │ ├── ShikimoriInterceptor.kt │ │ │ │ │ │ │ │ ├── ShikimoriUtils.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── SMAddEntryResponse.kt │ │ │ │ │ │ │ │ ├── SMEntry.kt │ │ │ │ │ │ │ │ ├── SMOAuth.kt │ │ │ │ │ │ │ │ ├── SMUser.kt │ │ │ │ │ │ │ │ └── SMUserListEntry.kt │ │ │ │ │ │ │ ├── simkl/ │ │ │ │ │ │ │ │ ├── Simkl.kt │ │ │ │ │ │ │ │ ├── SimklApi.kt │ │ │ │ │ │ │ │ ├── SimklInterceptor.kt │ │ │ │ │ │ │ │ ├── SimklUtils.kt │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── SimklOAuth.kt │ │ │ │ │ │ │ │ ├── SimklSearch.kt │ │ │ │ │ │ │ │ ├── SimklSyncItem.kt │ │ │ │ │ │ │ │ ├── SimklSyncWatched.kt │ │ │ │ │ │ │ │ └── SimklUser.kt │ │ │ │ │ │ │ └── suwayomi/ │ │ │ │ │ │ │ ├── Suwayomi.kt │ │ │ │ │ │ │ ├── SuwayomiApi.kt │ │ │ │ │ │ │ └── SuwayomiModels.kt │ │ │ │ │ │ └── updater/ │ │ │ │ │ │ ├── AppUpdateChecker.kt │ │ │ │ │ │ ├── AppUpdateDownloadJob.kt │ │ │ │ │ │ └── AppUpdateNotifier.kt │ │ │ │ │ ├── di/ │ │ │ │ │ │ ├── AppModule.kt │ │ │ │ │ │ └── PreferenceModule.kt │ │ │ │ │ ├── extension/ │ │ │ │ │ │ ├── ExtensionUpdateNotifier.kt │ │ │ │ │ │ ├── InstallStep.kt │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AnimeExtensionManager.kt │ │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ │ └── AnimeExtensionApi.kt │ │ │ │ │ │ │ ├── installer/ │ │ │ │ │ │ │ │ ├── InstallerAnime.kt │ │ │ │ │ │ │ │ ├── PackageInstallerInstallerAnime.kt │ │ │ │ │ │ │ │ └── ShizukuInstallerAnime.kt │ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ │ ├── AnimeExtension.kt │ │ │ │ │ │ │ │ └── AnimeLoadResult.kt │ │ │ │ │ │ │ └── util/ │ │ │ │ │ │ │ ├── AnimeExtensionInstallActivity.kt │ │ │ │ │ │ │ ├── AnimeExtensionInstallReceiver.kt │ │ │ │ │ │ │ ├── AnimeExtensionInstallService.kt │ │ │ │ │ │ │ ├── AnimeExtensionInstaller.kt │ │ │ │ │ │ │ └── AnimeExtensionLoader.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── MangaExtensionManager.kt │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ └── MangaExtensionApi.kt │ │ │ │ │ │ ├── installer/ │ │ │ │ │ │ │ ├── InstallerManga.kt │ │ │ │ │ │ │ ├── PackageInstallerInstallerManga.kt │ │ │ │ │ │ │ └── ShizukuInstallerManga.kt │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── MangaExtension.kt │ │ │ │ │ │ │ └── MangaLoadResult.kt │ │ │ │ │ │ └── util/ │ │ │ │ │ │ ├── MangaExtensionInstallActivity.kt │ │ │ │ │ │ ├── MangaExtensionInstallReceiver.kt │ │ │ │ │ │ ├── MangaExtensionInstallService.kt │ │ │ │ │ │ ├── MangaExtensionInstaller.kt │ │ │ │ │ │ └── MangaExtensionLoader.kt │ │ │ │ │ ├── source/ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ ├── AndroidAnimeSourceManager.kt │ │ │ │ │ │ │ └── AnimeSourceExtensions.kt │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ ├── AndroidMangaSourceManager.kt │ │ │ │ │ │ └── MangaSourceExtensions.kt │ │ │ │ │ ├── ui/ │ │ │ │ │ │ ├── base/ │ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ │ └── BaseActivity.kt │ │ │ │ │ │ │ └── delegate/ │ │ │ │ │ │ │ ├── SecureActivityDelegate.kt │ │ │ │ │ │ │ └── ThemingDelegate.kt │ │ │ │ │ │ ├── browse/ │ │ │ │ │ │ │ ├── BrowseTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── extension/ │ │ │ │ │ │ │ │ │ ├── AnimeExtensionFilterScreen.kt │ │ │ │ │ │ │ │ │ ├── AnimeExtensionFilterScreenModel.kt │ │ │ │ │ │ │ │ │ ├── AnimeExtensionsScreenModel.kt │ │ │ │ │ │ │ │ │ ├── AnimeExtensionsTab.kt │ │ │ │ │ │ │ │ │ └── details/ │ │ │ │ │ │ │ │ │ ├── AnimeExtensionDetailsScreen.kt │ │ │ │ │ │ │ │ │ ├── AnimeExtensionDetailsScreenModel.kt │ │ │ │ │ │ │ │ │ └── AnimeSourcePreferencesScreen.kt │ │ │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ │ │ ├── AnimeMigrationFlags.kt │ │ │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ │ │ ├── MigrateAnimeScreen.kt │ │ │ │ │ │ │ │ │ │ ├── MigrateAnimeScreenModel.kt │ │ │ │ │ │ │ │ │ │ └── season/ │ │ │ │ │ │ │ │ │ │ ├── MigrateSeasonSelectScreen.kt │ │ │ │ │ │ │ │ │ │ └── MigrateSeasonSelectScreenModel.kt │ │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ │ ├── AnimeMigrateSearchScreenDialogScreenModel.kt │ │ │ │ │ │ │ │ │ │ ├── AnimeSourceSearchScreen.kt │ │ │ │ │ │ │ │ │ │ ├── MigrateAnimeDialog.kt │ │ │ │ │ │ │ │ │ │ ├── MigrateAnimeSearchScreen.kt │ │ │ │ │ │ │ │ │ │ └── MigrateAnimeSearchScreenModel.kt │ │ │ │ │ │ │ │ │ └── sources/ │ │ │ │ │ │ │ │ │ ├── MigrateAnimeSourceScreenModel.kt │ │ │ │ │ │ │ │ │ └── MigrateAnimeSourceTab.kt │ │ │ │ │ │ │ │ └── source/ │ │ │ │ │ │ │ │ ├── AnimeSourcesFilterScreen.kt │ │ │ │ │ │ │ │ ├── AnimeSourcesFilterScreenModel.kt │ │ │ │ │ │ │ │ ├── AnimeSourcesScreenModel.kt │ │ │ │ │ │ │ │ ├── AnimeSourcesTab.kt │ │ │ │ │ │ │ │ ├── browse/ │ │ │ │ │ │ │ │ │ ├── BrowseAnimeSourceScreen.kt │ │ │ │ │ │ │ │ │ ├── BrowseAnimeSourceScreenModel.kt │ │ │ │ │ │ │ │ │ └── SourceFilterAnimeDialog.kt │ │ │ │ │ │ │ │ └── globalsearch/ │ │ │ │ │ │ │ │ ├── AnimeSearchScreenModel.kt │ │ │ │ │ │ │ │ ├── GlobalAnimeSearchScreen.kt │ │ │ │ │ │ │ │ └── GlobalAnimeSearchScreenModel.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── extension/ │ │ │ │ │ │ │ │ ├── MangaExtensionFilterScreen.kt │ │ │ │ │ │ │ │ ├── MangaExtensionFilterScreenModel.kt │ │ │ │ │ │ │ │ ├── MangaExtensionsScreenModel.kt │ │ │ │ │ │ │ │ ├── MangaExtensionsTab.kt │ │ │ │ │ │ │ │ └── details/ │ │ │ │ │ │ │ │ ├── MangaExtensionDetailsScreen.kt │ │ │ │ │ │ │ │ ├── MangaExtensionDetailsScreenModel.kt │ │ │ │ │ │ │ │ └── MangaSourcePreferencesScreen.kt │ │ │ │ │ │ │ ├── migration/ │ │ │ │ │ │ │ │ ├── MangaMigrationFlags.kt │ │ │ │ │ │ │ │ ├── manga/ │ │ │ │ │ │ │ │ │ ├── MigrateMangaScreen.kt │ │ │ │ │ │ │ │ │ └── MigrateMangaScreenModel.kt │ │ │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ │ │ ├── MangaMigrateSearchScreenDialogScreenModel.kt │ │ │ │ │ │ │ │ │ ├── MangaSourceSearchScreen.kt │ │ │ │ │ │ │ │ │ ├── MigrateMangaDialog.kt │ │ │ │ │ │ │ │ │ ├── MigrateMangaSearchScreen.kt │ │ │ │ │ │ │ │ │ └── MigrateMangaSearchScreenModel.kt │ │ │ │ │ │ │ │ └── sources/ │ │ │ │ │ │ │ │ ├── MigrateMangaSourceScreenModel.kt │ │ │ │ │ │ │ │ └── MigrateMangaSourceTab.kt │ │ │ │ │ │ │ └── source/ │ │ │ │ │ │ │ ├── MangaSourcesFilterScreen.kt │ │ │ │ │ │ │ ├── MangaSourcesFilterScreenModel.kt │ │ │ │ │ │ │ ├── MangaSourcesScreenModel.kt │ │ │ │ │ │ │ ├── MangaSourcesTab.kt │ │ │ │ │ │ │ ├── browse/ │ │ │ │ │ │ │ │ ├── BrowseMangaSourceScreen.kt │ │ │ │ │ │ │ │ ├── BrowseMangaSourceScreenModel.kt │ │ │ │ │ │ │ │ └── SourceFilterMangaDialog.kt │ │ │ │ │ │ │ └── globalsearch/ │ │ │ │ │ │ │ ├── GlobalMangaSearchScreen.kt │ │ │ │ │ │ │ ├── GlobalMangaSearchScreenModel.kt │ │ │ │ │ │ │ └── MangaSearchScreenModel.kt │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── CategoriesTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeCategoryScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeCategoryTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaCategoryScreenModel.kt │ │ │ │ │ │ │ └── MangaCategoryTab.kt │ │ │ │ │ │ ├── deeplink/ │ │ │ │ │ │ │ ├── DeepLinkScreenType.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── DeepLinkAnimeActivity.kt │ │ │ │ │ │ │ │ ├── DeepLinkAnimeScreen.kt │ │ │ │ │ │ │ │ └── DeepLinkAnimeScreenModel.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── DeepLinkMangaActivity.kt │ │ │ │ │ │ │ ├── DeepLinkMangaScreen.kt │ │ │ │ │ │ │ └── DeepLinkMangaScreenModel.kt │ │ │ │ │ │ ├── download/ │ │ │ │ │ │ │ ├── DownloadsTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeDownloadAdapter.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadHeaderHolder.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadHeaderItem.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadHolder.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadItem.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadQueueScreen.kt │ │ │ │ │ │ │ │ ├── AnimeDownloadQueueScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeDownloadQueueTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaDownloadAdapter.kt │ │ │ │ │ │ │ ├── MangaDownloadHeaderHolder.kt │ │ │ │ │ │ │ ├── MangaDownloadHeaderItem.kt │ │ │ │ │ │ │ ├── MangaDownloadHolder.kt │ │ │ │ │ │ │ ├── MangaDownloadItem.kt │ │ │ │ │ │ │ ├── MangaDownloadQueueScreen.kt │ │ │ │ │ │ │ ├── MangaDownloadQueueScreenModel.kt │ │ │ │ │ │ │ └── MangaDownloadQueueTab.kt │ │ │ │ │ │ ├── entries/ │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeImageScreenModel.kt │ │ │ │ │ │ │ │ ├── AnimeScreen.kt │ │ │ │ │ │ │ │ ├── AnimeScreenModel.kt │ │ │ │ │ │ │ │ ├── AnimeSeasonItem.kt │ │ │ │ │ │ │ │ └── track/ │ │ │ │ │ │ │ │ ├── AnimeTrackInfoDialog.kt │ │ │ │ │ │ │ │ └── AnimeTrackItem.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaCoverScreenModel.kt │ │ │ │ │ │ │ ├── MangaScreen.kt │ │ │ │ │ │ │ ├── MangaScreenModel.kt │ │ │ │ │ │ │ └── track/ │ │ │ │ │ │ │ ├── MangaTrackInfoDialog.kt │ │ │ │ │ │ │ └── MangaTrackItem.kt │ │ │ │ │ │ ├── history/ │ │ │ │ │ │ │ ├── HistoriesTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeHistoryScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeHistoryTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaHistoryScreenModel.kt │ │ │ │ │ │ │ └── MangaHistoryTab.kt │ │ │ │ │ │ ├── home/ │ │ │ │ │ │ │ └── HomeScreen.kt │ │ │ │ │ │ ├── library/ │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeLibraryItem.kt │ │ │ │ │ │ │ │ ├── AnimeLibraryScreenModel.kt │ │ │ │ │ │ │ │ ├── AnimeLibrarySettingsScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeLibraryTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaLibraryItem.kt │ │ │ │ │ │ │ ├── MangaLibraryScreenModel.kt │ │ │ │ │ │ │ ├── MangaLibrarySettingsScreenModel.kt │ │ │ │ │ │ │ └── MangaLibraryTab.kt │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ │ ├── more/ │ │ │ │ │ │ │ ├── MoreTab.kt │ │ │ │ │ │ │ ├── NewUpdateScreen.kt │ │ │ │ │ │ │ └── OnboardingScreen.kt │ │ │ │ │ │ ├── player/ │ │ │ │ │ │ │ ├── AniyomiMPVView.kt │ │ │ │ │ │ │ ├── ExternalIntents.kt │ │ │ │ │ │ │ ├── PipActions.kt │ │ │ │ │ │ │ ├── PlayerActivity.kt │ │ │ │ │ │ │ ├── PlayerEnums.kt │ │ │ │ │ │ │ ├── PlayerObserver.kt │ │ │ │ │ │ │ ├── PlayerUtils.kt │ │ │ │ │ │ │ ├── PlayerViewModel.kt │ │ │ │ │ │ │ ├── controls/ │ │ │ │ │ │ │ │ ├── BottomLeftPlayerControls.kt │ │ │ │ │ │ │ │ ├── BottomRightPlayerControls.kt │ │ │ │ │ │ │ │ ├── GestureHandler.kt │ │ │ │ │ │ │ │ ├── MiddlePlayerControls.kt │ │ │ │ │ │ │ │ ├── PlayerControls.kt │ │ │ │ │ │ │ │ ├── PlayerDialogs.kt │ │ │ │ │ │ │ │ ├── PlayerPanels.kt │ │ │ │ │ │ │ │ ├── PlayerSheets.kt │ │ │ │ │ │ │ │ ├── TopLeftPlayerControls.kt │ │ │ │ │ │ │ │ ├── TopRightPlayerControls.kt │ │ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ │ │ ├── AutoPlaySwitch.kt │ │ │ │ │ │ │ │ ├── BrightnessOverlay.kt │ │ │ │ │ │ │ │ ├── ControlsButton.kt │ │ │ │ │ │ │ │ ├── CurrentChapter.kt │ │ │ │ │ │ │ │ ├── DoubleTapSeekTriangles.kt │ │ │ │ │ │ │ │ ├── PlayerUpdates.kt │ │ │ │ │ │ │ │ ├── SeekBar.kt │ │ │ │ │ │ │ │ ├── VerticalSliders.kt │ │ │ │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ │ │ │ ├── EpisodeListDialog.kt │ │ │ │ │ │ │ │ │ ├── IntegerPickerDialog.kt │ │ │ │ │ │ │ │ │ └── PlayerDialog.kt │ │ │ │ │ │ │ │ ├── panels/ │ │ │ │ │ │ │ │ │ ├── AudioDelayPanel.kt │ │ │ │ │ │ │ │ │ ├── SubtitleDelayPanel.kt │ │ │ │ │ │ │ │ │ ├── SubtitleSettingsColorsCard.kt │ │ │ │ │ │ │ │ │ ├── SubtitleSettingsMiscellaneousCard.kt │ │ │ │ │ │ │ │ │ ├── SubtitleSettingsPanel.kt │ │ │ │ │ │ │ │ │ ├── SubtitleSettingsTypographyCard.kt │ │ │ │ │ │ │ │ │ └── VideoFiltersPanel.kt │ │ │ │ │ │ │ │ └── sheets/ │ │ │ │ │ │ │ │ ├── AudioTracksSheet.kt │ │ │ │ │ │ │ │ ├── ChaptersSheet.kt │ │ │ │ │ │ │ │ ├── GenericTracksSheet.kt │ │ │ │ │ │ │ │ ├── MoreSheet.kt │ │ │ │ │ │ │ │ ├── PlaybackSpeedSheet.kt │ │ │ │ │ │ │ │ ├── QualitySheet.kt │ │ │ │ │ │ │ │ ├── ScreenshotSheet.kt │ │ │ │ │ │ │ │ └── SubtitleTracksSheet.kt │ │ │ │ │ │ │ ├── loader/ │ │ │ │ │ │ │ │ ├── EpisodeLoader.kt │ │ │ │ │ │ │ │ └── HosterLoader.kt │ │ │ │ │ │ │ ├── settings/ │ │ │ │ │ │ │ │ ├── AdvancedPlayerPreferences.kt │ │ │ │ │ │ │ │ ├── AudioPreferences.kt │ │ │ │ │ │ │ │ ├── DecoderPreferences.kt │ │ │ │ │ │ │ │ ├── GesturePreferences.kt │ │ │ │ │ │ │ │ ├── PlayerPreferences.kt │ │ │ │ │ │ │ │ └── SubtitlePreferences.kt │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── AniSkipApi.kt │ │ │ │ │ │ │ ├── ChapterUtils.kt │ │ │ │ │ │ │ └── TrackSelect.kt │ │ │ │ │ │ ├── reader/ │ │ │ │ │ │ │ ├── ReaderActivity.kt │ │ │ │ │ │ │ ├── ReaderNavigationOverlayView.kt │ │ │ │ │ │ │ ├── ReaderViewModel.kt │ │ │ │ │ │ │ ├── SaveImageNotifier.kt │ │ │ │ │ │ │ ├── loader/ │ │ │ │ │ │ │ │ ├── ArchivePageLoader.kt │ │ │ │ │ │ │ │ ├── ChapterLoader.kt │ │ │ │ │ │ │ │ ├── DirectoryPageLoader.kt │ │ │ │ │ │ │ │ ├── DownloadPageLoader.kt │ │ │ │ │ │ │ │ ├── EpubPageLoader.kt │ │ │ │ │ │ │ │ ├── HttpPageLoader.kt │ │ │ │ │ │ │ │ └── PageLoader.kt │ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ │ ├── ChapterTransition.kt │ │ │ │ │ │ │ │ ├── InsertPage.kt │ │ │ │ │ │ │ │ ├── ReaderChapter.kt │ │ │ │ │ │ │ │ ├── ReaderPage.kt │ │ │ │ │ │ │ │ └── ViewerChapters.kt │ │ │ │ │ │ │ ├── setting/ │ │ │ │ │ │ │ │ ├── ReaderOrientation.kt │ │ │ │ │ │ │ │ ├── ReaderPreferences.kt │ │ │ │ │ │ │ │ ├── ReaderSettingsScreenModel.kt │ │ │ │ │ │ │ │ └── ReadingMode.kt │ │ │ │ │ │ │ └── viewer/ │ │ │ │ │ │ │ ├── GestureDetectorWithLongTap.kt │ │ │ │ │ │ │ ├── MissingChapters.kt │ │ │ │ │ │ │ ├── ReaderButton.kt │ │ │ │ │ │ │ ├── ReaderPageImageView.kt │ │ │ │ │ │ │ ├── ReaderProgressIndicator.kt │ │ │ │ │ │ │ ├── ReaderTransitionView.kt │ │ │ │ │ │ │ ├── Viewer.kt │ │ │ │ │ │ │ ├── ViewerConfig.kt │ │ │ │ │ │ │ ├── ViewerNavigation.kt │ │ │ │ │ │ │ ├── navigation/ │ │ │ │ │ │ │ │ ├── DisabledNavigation.kt │ │ │ │ │ │ │ │ ├── EdgeNavigation.kt │ │ │ │ │ │ │ │ ├── KindlishNavigation.kt │ │ │ │ │ │ │ │ ├── LNavigation.kt │ │ │ │ │ │ │ │ └── RightAndLeftNavigation.kt │ │ │ │ │ │ │ ├── pager/ │ │ │ │ │ │ │ │ ├── Pager.kt │ │ │ │ │ │ │ │ ├── PagerConfig.kt │ │ │ │ │ │ │ │ ├── PagerPageHolder.kt │ │ │ │ │ │ │ │ ├── PagerTransitionHolder.kt │ │ │ │ │ │ │ │ ├── PagerViewer.kt │ │ │ │ │ │ │ │ ├── PagerViewerAdapter.kt │ │ │ │ │ │ │ │ └── PagerViewers.kt │ │ │ │ │ │ │ └── webtoon/ │ │ │ │ │ │ │ ├── WebtoonAdapter.kt │ │ │ │ │ │ │ ├── WebtoonBaseHolder.kt │ │ │ │ │ │ │ ├── WebtoonConfig.kt │ │ │ │ │ │ │ ├── WebtoonFrame.kt │ │ │ │ │ │ │ ├── WebtoonLayoutManager.kt │ │ │ │ │ │ │ ├── WebtoonPageHolder.kt │ │ │ │ │ │ │ ├── WebtoonRecyclerView.kt │ │ │ │ │ │ │ ├── WebtoonSubsamplingImageView.kt │ │ │ │ │ │ │ ├── WebtoonTransitionHolder.kt │ │ │ │ │ │ │ └── WebtoonViewer.kt │ │ │ │ │ │ ├── security/ │ │ │ │ │ │ │ └── UnlockActivity.kt │ │ │ │ │ │ ├── setting/ │ │ │ │ │ │ │ ├── PlayerSettingsScreen.kt │ │ │ │ │ │ │ ├── SettingsScreen.kt │ │ │ │ │ │ │ └── track/ │ │ │ │ │ │ │ ├── BaseOAuthLoginActivity.kt │ │ │ │ │ │ │ └── TrackLoginActivity.kt │ │ │ │ │ │ ├── stats/ │ │ │ │ │ │ │ ├── StatsTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeStatsScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeStatsTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaStatsScreenModel.kt │ │ │ │ │ │ │ └── MangaStatsTab.kt │ │ │ │ │ │ ├── storage/ │ │ │ │ │ │ │ ├── CommonStorageScreenModel.kt │ │ │ │ │ │ │ ├── StorageTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeStorageScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeStorageTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaStorageScreenModel.kt │ │ │ │ │ │ │ └── MangaStorageTab.kt │ │ │ │ │ │ ├── updates/ │ │ │ │ │ │ │ ├── UpdatesTab.kt │ │ │ │ │ │ │ ├── anime/ │ │ │ │ │ │ │ │ ├── AnimeUpdatesScreenModel.kt │ │ │ │ │ │ │ │ └── AnimeUpdatesTab.kt │ │ │ │ │ │ │ └── manga/ │ │ │ │ │ │ │ ├── MangaUpdatesScreenModel.kt │ │ │ │ │ │ │ └── MangaUpdatesTab.kt │ │ │ │ │ │ └── webview/ │ │ │ │ │ │ ├── WebViewActivity.kt │ │ │ │ │ │ ├── WebViewScreen.kt │ │ │ │ │ │ └── WebViewScreenModel.kt │ │ │ │ │ ├── util/ │ │ │ │ │ │ ├── AniChartApi.kt │ │ │ │ │ │ ├── AnimeExtensions.kt │ │ │ │ │ │ ├── CrashLogUtil.kt │ │ │ │ │ │ ├── MangaExtensions.kt │ │ │ │ │ │ ├── PkceUtil.kt │ │ │ │ │ │ ├── StorageUtil.kt │ │ │ │ │ │ ├── chapter/ │ │ │ │ │ │ │ ├── ChapterFilterDownloaded.kt │ │ │ │ │ │ │ ├── ChapterGetNextUnread.kt │ │ │ │ │ │ │ └── ChapterRemoveDuplicates.kt │ │ │ │ │ │ ├── episode/ │ │ │ │ │ │ │ ├── EpisodeFilterDownloaded.kt │ │ │ │ │ │ │ └── EpsiodeGetNextUnseen.kt │ │ │ │ │ │ ├── lang/ │ │ │ │ │ │ │ ├── CloseableExtensions.kt │ │ │ │ │ │ │ ├── DateExtensions.kt │ │ │ │ │ │ │ └── RectFExtensions.kt │ │ │ │ │ │ ├── storage/ │ │ │ │ │ │ │ └── OkioExtensions.kt │ │ │ │ │ │ ├── system/ │ │ │ │ │ │ │ ├── AnimationExtensions.kt │ │ │ │ │ │ │ ├── AuthenticatorUtil.kt │ │ │ │ │ │ │ ├── BuildConfig.kt │ │ │ │ │ │ │ ├── ChildFirstPathClassLoader.kt │ │ │ │ │ │ │ ├── ContextExtensions.kt │ │ │ │ │ │ │ ├── DeviceUtilExtensions.kt │ │ │ │ │ │ │ ├── DisplayExtensions.kt │ │ │ │ │ │ │ ├── DrawableExtensions.kt │ │ │ │ │ │ │ ├── IntentExtensions.kt │ │ │ │ │ │ │ ├── InternalResourceHelper.kt │ │ │ │ │ │ │ ├── LocaleHelper.kt │ │ │ │ │ │ │ ├── NetworkExtensions.kt │ │ │ │ │ │ │ ├── NetworkStateTracker.kt │ │ │ │ │ │ │ ├── NotificationExtensions.kt │ │ │ │ │ │ │ ├── TvUtils.kt │ │ │ │ │ │ │ └── WorkManagerExtensions.kt │ │ │ │ │ │ └── view/ │ │ │ │ │ │ ├── EditTextPreferenceExtensions.kt │ │ │ │ │ │ ├── ViewExtensions.kt │ │ │ │ │ │ └── WindowExtensions.kt │ │ │ │ │ └── widget/ │ │ │ │ │ ├── MinMaxNumberPicker.kt │ │ │ │ │ ├── RevealAnimationView.kt │ │ │ │ │ ├── TachiyomiTextInputEditText.kt │ │ │ │ │ ├── ViewPagerAdapter.kt │ │ │ │ │ └── listener/ │ │ │ │ │ ├── IgnoreFirstSpinnerListener.kt │ │ │ │ │ └── SimpleSeekBarListener.kt │ │ │ │ └── test/ │ │ │ │ └── DummyTracker.kt │ │ │ └── mihon/ │ │ │ ├── core/ │ │ │ │ ├── designsystem/ │ │ │ │ │ └── utils/ │ │ │ │ │ └── WindowSize.kt │ │ │ │ └── migration/ │ │ │ │ ├── Migration.kt │ │ │ │ ├── MigrationCompletedListener.kt │ │ │ │ ├── MigrationContext.kt │ │ │ │ ├── MigrationJobFactory.kt │ │ │ │ ├── MigrationStrategy.kt │ │ │ │ ├── MigrationStrategyFactory.kt │ │ │ │ ├── Migrator.kt │ │ │ │ └── migrations/ │ │ │ │ ├── AddAllLangMigration.kt │ │ │ │ ├── CategoryPreferencesCleanupMigration.kt │ │ │ │ ├── CombineUpdateRestrictionMigration.kt │ │ │ │ ├── CoverToExternalFileMigration.kt │ │ │ │ ├── DOHMigration.kt │ │ │ │ ├── DeleteExternalChapterCacheDirMigration.kt │ │ │ │ ├── DontRunJobsMigration.kt │ │ │ │ ├── EnableAutoBackupMigration.kt │ │ │ │ ├── EnumsMigration.kt │ │ │ │ ├── ExternalRepoMigration.kt │ │ │ │ ├── ForceMALLogOutMigration.kt │ │ │ │ ├── InternalChapterCacheDirMigration.kt │ │ │ │ ├── LogOutMALMigration.kt │ │ │ │ ├── MergeSortTypeDirectionMigration.kt │ │ │ │ ├── MigrateRotationViewerValuesMigration.kt │ │ │ │ ├── MigrateSecureScreenMigration.kt │ │ │ │ ├── MigrateSortingModeMigration.kt │ │ │ │ ├── MigrateToTriStateMigration.kt │ │ │ │ ├── MigrateTriStateMigration.kt │ │ │ │ ├── MigrationUtils.kt │ │ │ │ ├── Migrations.kt │ │ │ │ ├── MoveChapterPreferencesMigration.kt │ │ │ │ ├── MovePlayerPreferencesMigration.kt │ │ │ │ ├── NavigationOptionsMigration.kt │ │ │ │ ├── NoAppStateMigration.kt │ │ │ │ ├── PermaTrustExtensionsMigration.kt │ │ │ │ ├── PlayerPreferenceMigration.kt │ │ │ │ ├── PrefLangMigration.kt │ │ │ │ ├── PrivatePreferenceMigration.kt │ │ │ │ ├── RelativeTimestampMigration.kt │ │ │ │ ├── RemoveBackgroundJobsMigration.kt │ │ │ │ ├── RemoveOneTwoHourUpdateMigration.kt │ │ │ │ ├── RemoveQuickUpdateMigration.kt │ │ │ │ ├── RemoveReaderTapMigration.kt │ │ │ │ ├── RenameEnumMigration.kt │ │ │ │ ├── ResetRotationMigration.kt │ │ │ │ ├── ResetSortPreferenceRemovedMigration.kt │ │ │ │ ├── SetupAnimeLibraryUpdateMigration.kt │ │ │ │ ├── SetupBackgroundTasksMigration.kt │ │ │ │ ├── SetupBackupCreateMigration.kt │ │ │ │ ├── SetupMangaLibraryUpdateMigration.kt │ │ │ │ ├── SplitPreferencesMigration.kt │ │ │ │ ├── TrustExtensionRepositoryMigration.kt │ │ │ │ ├── UseWorkManagerMigration.kt │ │ │ │ ├── VideoOrientationMigration.kt │ │ │ │ └── VideoPlayerPreferenceMigration.kt │ │ │ └── feature/ │ │ │ └── upcoming/ │ │ │ ├── anime/ │ │ │ │ ├── UpcomingAnimeScreen.kt │ │ │ │ ├── UpcomingAnimeScreenContent.kt │ │ │ │ ├── UpcomingAnimeScreenModel.kt │ │ │ │ ├── UpcomingAnimeUIModel.kt │ │ │ │ └── components/ │ │ │ │ └── UpcomingItem.kt │ │ │ ├── components/ │ │ │ │ └── calendar/ │ │ │ │ ├── Calendar.kt │ │ │ │ ├── CalendarDay.kt │ │ │ │ ├── CalendarHeader.kt │ │ │ │ └── CalendarIndicator.kt │ │ │ └── manga/ │ │ │ ├── UpcomingMangaScreen.kt │ │ │ ├── UpcomingMangaScreenContent.kt │ │ │ ├── UpcomingMangaScreenModel.kt │ │ │ ├── UpcomingMangaUIModel.kt │ │ │ └── components/ │ │ │ └── UpcomingItem.kt │ │ └── res/ │ │ ├── anim/ │ │ │ ├── player_enter_bottom.xml │ │ │ ├── player_enter_left.xml │ │ │ ├── player_enter_right.xml │ │ │ ├── player_enter_top.xml │ │ │ ├── player_exit_bottom.xml │ │ │ ├── player_exit_left.xml │ │ │ ├── player_exit_right.xml │ │ │ ├── player_exit_top.xml │ │ │ ├── player_fade_in.xml │ │ │ ├── player_fade_out.xml │ │ │ ├── shared_axis_x_pop_enter.xml │ │ │ ├── shared_axis_x_pop_exit.xml │ │ │ ├── shared_axis_x_push_enter.xml │ │ │ └── shared_axis_x_push_exit.xml │ │ ├── anim-v33/ │ │ │ ├── shared_axis_x_pop_enter.xml │ │ │ ├── shared_axis_x_pop_exit.xml │ │ │ ├── shared_axis_x_push_enter.xml │ │ │ └── shared_axis_x_push_exit.xml │ │ ├── color/ │ │ │ └── draggable_card_foreground.xml │ │ ├── drawable/ │ │ │ ├── anim_animelibrary_enter.xml │ │ │ ├── anim_animelibrary_leave.xml │ │ │ ├── anim_browse_enter.xml │ │ │ ├── anim_caret_down.xml │ │ │ ├── anim_history_enter.xml │ │ │ ├── anim_library_enter.xml │ │ │ ├── anim_more_enter.xml │ │ │ ├── anim_play_to_pause.xml │ │ │ ├── anim_updates_enter.xml │ │ │ ├── cover_error.xml │ │ │ ├── ic_ani.xml │ │ │ ├── ic_ani_monochrome_launcher.xml │ │ │ ├── ic_animelibrary_filled_24dp.xml │ │ │ ├── ic_animelibrary_outline_24dp.xml │ │ │ ├── ic_animelibrary_selector_24dp.xml │ │ │ ├── ic_arrow_back_24dp.xml │ │ │ ├── ic_baseline_collections_24.xml │ │ │ ├── ic_baseline_input_24.xml │ │ │ ├── ic_baseline_open_in_new_24.xml │ │ │ ├── ic_book_24dp.xml │ │ │ ├── ic_brightness_negative_20dp.xml │ │ │ ├── ic_chrome_player_mode_24dp.xml │ │ │ ├── ic_circle_200dp.xml │ │ │ ├── ic_circle_right_200dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_collections_baseline_state.xml │ │ │ ├── ic_crop_24dp.xml │ │ │ ├── ic_crop_off_24dp.xml │ │ │ ├── ic_done_24dp.xml │ │ │ ├── ic_done_prev_24dp.xml │ │ │ ├── ic_download_item_24dp.xml │ │ │ ├── ic_drag_handle_24dp.xml │ │ │ ├── ic_extension_24dp.xml │ │ │ ├── ic_folder_24dp.xml │ │ │ ├── ic_forward_10_24dp.xml │ │ │ ├── ic_glasses_24dp.xml │ │ │ ├── ic_info_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ ├── ic_overflow_24dp.xml │ │ │ ├── ic_pause_24dp.xml │ │ │ ├── ic_pause_circle_filled_24.xml │ │ │ ├── ic_photo_24dp.xml │ │ │ ├── ic_play_arrow_24dp.xml │ │ │ ├── ic_play_circle_filled_24.xml │ │ │ ├── ic_play_seek_triangle.xml │ │ │ ├── ic_reader_continuous_vertical_24dp.xml │ │ │ ├── ic_reader_default_24dp.xml │ │ │ ├── ic_reader_ltr_24dp.xml │ │ │ ├── ic_reader_rtl_24dp.xml │ │ │ ├── ic_reader_vertical_24dp.xml │ │ │ ├── ic_reader_webtoon_24dp.xml │ │ │ ├── ic_refresh_24dp.xml │ │ │ ├── ic_share_24dp.xml │ │ │ ├── ic_skip_next_24dp.xml │ │ │ ├── ic_skip_previous_24dp.xml │ │ │ ├── ic_system_update_alt_white_24dp.xml │ │ │ ├── ic_tachi_splash.xml │ │ │ ├── ic_updates_outline_24dp.xml │ │ │ ├── ic_video_chapter_20dp.xml │ │ │ ├── ic_volume_off_24dp.xml │ │ │ ├── ic_warning_white_24dp.xml │ │ │ ├── line_divider.xml │ │ │ ├── material_popup_background.xml │ │ │ ├── outline_brand_family_24.xml │ │ │ ├── sc_collections_baseline_48dp.xml │ │ │ ├── sc_collections_bookmark_48dp.xml │ │ │ ├── sc_explore_48dp.xml │ │ │ ├── sc_history_48dp.xml │ │ │ ├── sc_new_releases_48dp.xml │ │ │ └── sharp_shadow_24.xml │ │ ├── layout/ │ │ │ ├── download_header.xml │ │ │ ├── download_item.xml │ │ │ ├── download_list.xml │ │ │ ├── player_layout.xml │ │ │ ├── pref_widget_switch_material.xml │ │ │ ├── reader_activity.xml │ │ │ └── reader_error.xml │ │ ├── menu/ │ │ │ ├── chapter_download.xml │ │ │ ├── download_single.xml │ │ │ └── main_nav.xml │ │ ├── mipmap/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── raw/ │ │ │ └── keep.xml │ │ ├── values/ │ │ │ ├── attrs.xml │ │ │ ├── bools.xml │ │ │ ├── colors_cottoncandy.xml │ │ │ ├── colors_mocha.xml │ │ │ ├── dimens.xml │ │ │ ├── ids.xml │ │ │ ├── integers.xml │ │ │ ├── styles.xml │ │ │ └── themes.xml │ │ ├── values-night/ │ │ │ ├── bools.xml │ │ │ ├── colors_cottoncandy.xml │ │ │ ├── colors_mocha.xml │ │ │ └── themes.xml │ │ ├── values-night-v31/ │ │ │ └── themes.xml │ │ ├── values-sw720dp/ │ │ │ └── dimens.xml │ │ ├── values-v27/ │ │ │ ├── bools.xml │ │ │ └── themes.xml │ │ ├── values-v31/ │ │ │ └── themes.xml │ │ └── xml/ │ │ ├── network_security_config.xml │ │ ├── provider_paths.xml │ │ ├── s_pen_actions.xml │ │ └── searchable.xml │ └── test/ │ └── java/ │ └── mihon/ │ └── core/ │ └── migration/ │ └── MigratorTest.kt ├── build.gradle.kts ├── buildSrc/ │ ├── build.gradle.kts │ ├── settings.gradle.kts │ └── src/ │ └── main/ │ └── kotlin/ │ ├── mihon/ │ │ └── buildlogic/ │ │ ├── AndroidConfig.kt │ │ ├── BuildConfig.kt │ │ ├── Commands.kt │ │ ├── ProjectExtensions.kt │ │ └── tasks/ │ │ └── LocalesConfigTask.kt │ ├── mihon.android.application.compose.gradle.kts │ ├── mihon.android.application.gradle.kts │ ├── mihon.benchmark.gradle.kts │ ├── mihon.code.lint.gradle.kts │ ├── mihon.library.compose.gradle.kts │ └── mihon.library.gradle.kts ├── core/ │ ├── archive/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── mihon/ │ │ └── core/ │ │ └── archive/ │ │ ├── ArchiveEntry.kt │ │ ├── ArchiveInputStream.kt │ │ ├── ArchiveReader.kt │ │ ├── EpubReader.kt │ │ ├── UniFileExtensions.kt │ │ └── ZipWriter.kt │ └── common/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ ├── eu/ │ │ └── kanade/ │ │ └── tachiyomi/ │ │ ├── core/ │ │ │ ├── Constants.kt │ │ │ └── security/ │ │ │ └── SecurityPreferences.kt │ │ ├── network/ │ │ │ ├── AndroidCookieJar.kt │ │ │ ├── DohProviders.kt │ │ │ ├── JavaScriptEngine.kt │ │ │ ├── NetworkHelper.kt │ │ │ ├── NetworkPreferences.kt │ │ │ ├── OkHttpExtensions.kt │ │ │ ├── ProgressListener.kt │ │ │ ├── ProgressResponseBody.kt │ │ │ ├── Requests.kt │ │ │ └── interceptor/ │ │ │ ├── CloudflareInterceptor.kt │ │ │ ├── IgnoreGzipInterceptor.kt │ │ │ ├── RateLimitInterceptor.kt │ │ │ ├── SpecificHostRateLimitInterceptor.kt │ │ │ ├── UncaughtExceptionInterceptor.kt │ │ │ ├── UserAgentInterceptor.kt │ │ │ └── WebViewInterceptor.kt │ │ └── util/ │ │ ├── lang/ │ │ │ ├── Hash.kt │ │ │ └── StringExtensions.kt │ │ ├── storage/ │ │ │ ├── DiskUtil.kt │ │ │ ├── FFmpegUtils.kt │ │ │ └── FileExtensions.kt │ │ └── system/ │ │ ├── DensityExtensions.kt │ │ ├── DeviceUtil.kt │ │ ├── GLUtil.kt │ │ ├── ToastExtensions.kt │ │ └── WebViewUtil.kt │ └── tachiyomi/ │ └── core/ │ └── common/ │ ├── i18n/ │ │ └── Localize.kt │ ├── preference/ │ │ ├── AndroidPreference.kt │ │ ├── AndroidPreferenceStore.kt │ │ ├── CheckboxState.kt │ │ ├── InMemoryPreferenceStore.kt │ │ ├── Preference.kt │ │ ├── PreferenceStore.kt │ │ └── TriState.kt │ ├── storage/ │ │ ├── AndroidStorageFolderProvider.kt │ │ ├── FolderProvider.kt │ │ ├── UniFileExtensions.kt │ │ └── UniFileTempFileManager.kt │ └── util/ │ ├── lang/ │ │ ├── BooleanExtensions.kt │ │ ├── CoroutinesExtensions.kt │ │ ├── RxCoroutineBridge.kt │ │ └── SortUtil.kt │ └── system/ │ ├── ImageUtil.kt │ └── LogcatExtensions.kt ├── core-metadata/ │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── tachiyomi/ │ └── core/ │ └── metadata/ │ ├── comicinfo/ │ │ └── ComicInfo.kt │ └── tachiyomi/ │ ├── AnimeDetails.kt │ ├── ChapterDetails.kt │ ├── EpisodeDetails.kt │ └── MangaDetails.kt ├── data/ │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ ├── mihon/ │ │ │ └── data/ │ │ │ └── repository/ │ │ │ ├── anime/ │ │ │ │ └── AnimeExtensionRepoRepositoryImpl.kt │ │ │ └── manga/ │ │ │ └── MangaExtensionRepoRepositoryImpl.kt │ │ └── tachiyomi/ │ │ └── data/ │ │ ├── DatabaseAdapter.kt │ │ ├── category/ │ │ │ ├── anime/ │ │ │ │ └── AnimeCategoryRepositoryImpl.kt │ │ │ └── manga/ │ │ │ └── MangaCategoryRepositoryImpl.kt │ │ ├── custombutton/ │ │ │ └── CustomButtonRepositoryImpl.kt │ │ ├── entries/ │ │ │ ├── anime/ │ │ │ │ ├── AnimeMapper.kt │ │ │ │ └── AnimeRepositoryImpl.kt │ │ │ └── manga/ │ │ │ ├── MangaMapper.kt │ │ │ └── MangaRepositoryImpl.kt │ │ ├── handlers/ │ │ │ ├── anime/ │ │ │ │ ├── AndroidAnimeDatabaseHandler.kt │ │ │ │ ├── AnimeDatabaseHandler.kt │ │ │ │ ├── AnimeTransactionContext.kt │ │ │ │ └── QueryPagingAnimeSource.kt │ │ │ └── manga/ │ │ │ ├── AndroidMangaDatabaseHandler.kt │ │ │ ├── MangaDatabaseHandler.kt │ │ │ ├── MangaTransactionContext.kt │ │ │ └── QueryPagingMangaSource.kt │ │ ├── history/ │ │ │ ├── anime/ │ │ │ │ ├── AnimeHistoryMapper.kt │ │ │ │ └── AnimeHistoryRepositoryImpl.kt │ │ │ └── manga/ │ │ │ ├── MangaHistoryMapper.kt │ │ │ └── MangaHistoryRepositoryImpl.kt │ │ ├── items/ │ │ │ ├── chapter/ │ │ │ │ ├── ChapterRepositoryImpl.kt │ │ │ │ └── ChapterSanitizer.kt │ │ │ └── episode/ │ │ │ ├── EpisodeRepositoryImpl.kt │ │ │ └── EpisodeSanitizer.kt │ │ ├── release/ │ │ │ ├── GithubRelease.kt │ │ │ └── ReleaseServiceImpl.kt │ │ ├── source/ │ │ │ ├── anime/ │ │ │ │ ├── AnimeSourcePagingSource.kt │ │ │ │ ├── AnimeSourceRepositoryImpl.kt │ │ │ │ └── AnimeStubSourceRepositoryImpl.kt │ │ │ └── manga/ │ │ │ ├── MangaSourcePagingSource.kt │ │ │ ├── MangaSourceRepositoryImpl.kt │ │ │ └── MangaStubSourceRepositoryImpl.kt │ │ ├── track/ │ │ │ ├── anime/ │ │ │ │ ├── AnimeTrackMapper.kt │ │ │ │ └── AnimeTrackRepositoryImpl.kt │ │ │ └── manga/ │ │ │ ├── MangaTrackMapper.kt │ │ │ └── MangaTrackRepositoryImpl.kt │ │ └── updates/ │ │ ├── anime/ │ │ │ └── AnimeUpdatesRepositoryImpl.kt │ │ └── manga/ │ │ └── MangaUpdatesRepositoryImpl.kt │ ├── sqldelight/ │ │ ├── data/ │ │ │ ├── categories.sq │ │ │ ├── chapters.sq │ │ │ ├── excluded_scanlators.sq │ │ │ ├── extension_repos.sq │ │ │ ├── history.sq │ │ │ ├── manga_sync.sq │ │ │ ├── mangas.sq │ │ │ ├── mangas_categories.sq │ │ │ └── sources.sq │ │ ├── migrations/ │ │ │ ├── 1.sqm │ │ │ ├── 10.sqm │ │ │ ├── 11.sqm │ │ │ ├── 12.sqm │ │ │ ├── 13.sqm │ │ │ ├── 14.sqm │ │ │ ├── 15.sqm │ │ │ ├── 16.sqm │ │ │ ├── 17.sqm │ │ │ ├── 18.sqm │ │ │ ├── 19.sqm │ │ │ ├── 2.sqm │ │ │ ├── 20.sqm │ │ │ ├── 21.sqm │ │ │ ├── 22.sqm │ │ │ ├── 23.sqm │ │ │ ├── 24.sqm │ │ │ ├── 25.sqm │ │ │ ├── 26.sqm │ │ │ ├── 27.sqm │ │ │ ├── 28.sqm │ │ │ ├── 29.sqm │ │ │ ├── 3.sqm │ │ │ ├── 30.sqm │ │ │ ├── 31.sqm │ │ │ ├── 32.sqm │ │ │ ├── 4.sqm │ │ │ ├── 5.sqm │ │ │ ├── 6.sqm │ │ │ ├── 7.sqm │ │ │ ├── 8.sqm │ │ │ └── 9.sqm │ │ └── view/ │ │ ├── historyView.sq │ │ ├── libraryView.sq │ │ └── updatesView.sq │ └── sqldelightanime/ │ ├── dataanime/ │ │ ├── anime_sync.sq │ │ ├── animehistory.sq │ │ ├── animes.sq │ │ ├── animes_categories.sq │ │ ├── animesources.sq │ │ ├── categories.sq │ │ ├── custom_buttons.sq │ │ ├── episodes.sq │ │ └── extension_repos.sq │ ├── migrations/ │ │ ├── 113.sqm │ │ ├── 114.sqm │ │ ├── 115.sqm │ │ ├── 116.sqm │ │ ├── 117.sqm │ │ ├── 118.sqm │ │ ├── 119.sqm │ │ ├── 120.sqm │ │ ├── 121.sqm │ │ ├── 122.sqm │ │ ├── 123.sqm │ │ ├── 124.sqm │ │ ├── 125.sqm │ │ ├── 126.sqm │ │ ├── 127.sqm │ │ ├── 128.sqm │ │ ├── 129.sqm │ │ ├── 130.sqm │ │ ├── 131.sqm │ │ ├── 132.sqm │ │ ├── 133.sqm │ │ ├── 134.sqm │ │ └── 135.sqm │ └── view/ │ ├── animedeletableView.sq │ ├── animehistoryView.sq │ ├── animehistorystatsView.sq │ ├── animelibView.sq │ ├── animeseasonsView.sq │ ├── animeseasonstatsView.sq │ ├── animeupdatesView.sq │ └── episodestatsView.sq ├── domain/ │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ ├── aniyomi/ │ │ │ └── domain/ │ │ │ └── anime/ │ │ │ ├── SeasonAnime.kt │ │ │ └── SeasonDisplayMode.kt │ │ ├── mihon/ │ │ │ └── domain/ │ │ │ ├── extensionrepo/ │ │ │ │ ├── anime/ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ ├── CreateAnimeExtensionRepo.kt │ │ │ │ │ │ ├── DeleteAnimeExtensionRepo.kt │ │ │ │ │ │ ├── GetAnimeExtensionRepo.kt │ │ │ │ │ │ ├── GetAnimeExtensionRepoCount.kt │ │ │ │ │ │ ├── ReplaceAnimeExtensionRepo.kt │ │ │ │ │ │ └── UpdateAnimeExtensionRepo.kt │ │ │ │ │ └── repository/ │ │ │ │ │ └── AnimeExtensionRepoRepository.kt │ │ │ │ ├── exception/ │ │ │ │ │ └── SaveExtensionRepoException.kt │ │ │ │ ├── manga/ │ │ │ │ │ ├── interactor/ │ │ │ │ │ │ ├── CreateMangaExtensionRepo.kt │ │ │ │ │ │ ├── DeleteMangaExtensionRepo.kt │ │ │ │ │ │ ├── GetMangaExtensionRepo.kt │ │ │ │ │ │ ├── GetMangaExtensionRepoCount.kt │ │ │ │ │ │ ├── ReplaceMangaExtensionRepo.kt │ │ │ │ │ │ └── UpdateMangaExtensionRepo.kt │ │ │ │ │ └── repository/ │ │ │ │ │ └── MangaExtensionRepoRepository.kt │ │ │ │ ├── model/ │ │ │ │ │ └── ExtensionRepo.kt │ │ │ │ └── service/ │ │ │ │ ├── ExtensionRepoDto.kt │ │ │ │ └── ExtensionRepoService.kt │ │ │ ├── items/ │ │ │ │ ├── chapter/ │ │ │ │ │ └── interactor/ │ │ │ │ │ └── FilterChaptersForDownload.kt │ │ │ │ └── episode/ │ │ │ │ └── interactor/ │ │ │ │ └── FilterEpisodesForDownload.kt │ │ │ └── upcoming/ │ │ │ ├── anime/ │ │ │ │ └── interactor/ │ │ │ │ └── GetUpcomingAnime.kt │ │ │ └── manga/ │ │ │ └── interactor/ │ │ │ └── GetUpcomingManga.kt │ │ └── tachiyomi/ │ │ └── domain/ │ │ ├── backup/ │ │ │ └── service/ │ │ │ ├── BackupPreferences.kt │ │ │ └── PreferenceValues.kt │ │ ├── category/ │ │ │ ├── anime/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── CreateAnimeCategoryWithName.kt │ │ │ │ │ ├── DeleteAnimeCategory.kt │ │ │ │ │ ├── GetAnimeCategories.kt │ │ │ │ │ ├── GetVisibleAnimeCategories.kt │ │ │ │ │ ├── HideAnimeCategory.kt │ │ │ │ │ ├── RenameAnimeCategory.kt │ │ │ │ │ ├── ReorderAnimeCategory.kt │ │ │ │ │ ├── ResetAnimeCategoryFlags.kt │ │ │ │ │ ├── SetAnimeCategories.kt │ │ │ │ │ ├── SetAnimeDisplayMode.kt │ │ │ │ │ ├── SetSortModeForAnimeCategory.kt │ │ │ │ │ └── UpdateAnimeCategory.kt │ │ │ │ └── repository/ │ │ │ │ └── AnimeCategoryRepository.kt │ │ │ ├── manga/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── CreateMangaCategoryWithName.kt │ │ │ │ │ ├── DeleteMangaCategory.kt │ │ │ │ │ ├── GetMangaCategories.kt │ │ │ │ │ ├── GetVisibleMangaCategories.kt │ │ │ │ │ ├── HideMangaCategory.kt │ │ │ │ │ ├── RenameMangaCategory.kt │ │ │ │ │ ├── ReorderMangaCategory.kt │ │ │ │ │ ├── ResetMangaCategoryFlags.kt │ │ │ │ │ ├── SetMangaCategories.kt │ │ │ │ │ ├── SetMangaDisplayMode.kt │ │ │ │ │ ├── SetSortModeForMangaCategory.kt │ │ │ │ │ └── UpdateMangaCategory.kt │ │ │ │ └── repository/ │ │ │ │ └── MangaCategoryRepository.kt │ │ │ └── model/ │ │ │ ├── Category.kt │ │ │ └── CategoryUpdate.kt │ │ ├── custombuttons/ │ │ │ ├── exception/ │ │ │ │ └── SaveCustomButtonException.kt │ │ │ ├── interactor/ │ │ │ │ ├── CreateCustomButton.kt │ │ │ │ ├── DeleteCustomButton.kt │ │ │ │ ├── GetCustomButtons.kt │ │ │ │ ├── ReorderCustomButton.kt │ │ │ │ ├── ToggleFavoriteCustomButton.kt │ │ │ │ └── UpdateCustomButton.kt │ │ │ ├── model/ │ │ │ │ ├── CustomButton.kt │ │ │ │ └── CustomButtonUpdate.kt │ │ │ └── repository/ │ │ │ └── CustomButtonRepository.kt │ │ ├── download/ │ │ │ └── service/ │ │ │ └── DownloadPreferences.kt │ │ ├── entries/ │ │ │ ├── EntryCover.kt │ │ │ ├── TriState.kt │ │ │ ├── anime/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── AnimeFetchInterval.kt │ │ │ │ │ ├── GetAnime.kt │ │ │ │ │ ├── GetAnimeByUrlAndSourceId.kt │ │ │ │ │ ├── GetAnimeFavorites.kt │ │ │ │ │ ├── GetAnimeWithEpisodesAndSeasons.kt │ │ │ │ │ ├── GetDuplicateLibraryAnime.kt │ │ │ │ │ ├── GetLibraryAnime.kt │ │ │ │ │ ├── NetworkToLocalAnime.kt │ │ │ │ │ ├── ResetAnimeViewerFlags.kt │ │ │ │ │ ├── SetAnimeEpisodeFlags.kt │ │ │ │ │ └── SetAnimeSeasonFlags.kt │ │ │ │ ├── model/ │ │ │ │ │ ├── Anime.kt │ │ │ │ │ ├── AnimeCover.kt │ │ │ │ │ ├── AnimeUpdate.kt │ │ │ │ │ └── NoSeasonsException.kt │ │ │ │ └── repository/ │ │ │ │ └── AnimeRepository.kt │ │ │ └── manga/ │ │ │ ├── interactor/ │ │ │ │ ├── GetDuplicateLibraryManga.kt │ │ │ │ ├── GetLibraryManga.kt │ │ │ │ ├── GetManga.kt │ │ │ │ ├── GetMangaByUrlAndSourceId.kt │ │ │ │ ├── GetMangaFavorites.kt │ │ │ │ ├── GetMangaWithChapters.kt │ │ │ │ ├── MangaFetchInterval.kt │ │ │ │ ├── NetworkToLocalManga.kt │ │ │ │ ├── ResetMangaViewerFlags.kt │ │ │ │ └── SetMangaChapterFlags.kt │ │ │ ├── model/ │ │ │ │ ├── Manga.kt │ │ │ │ ├── MangaCover.kt │ │ │ │ └── MangaUpdate.kt │ │ │ └── repository/ │ │ │ └── MangaRepository.kt │ │ ├── history/ │ │ │ ├── anime/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── GetAnimeHistory.kt │ │ │ │ │ ├── GetNextEpisodes.kt │ │ │ │ │ ├── RemoveAnimeHistory.kt │ │ │ │ │ └── UpsertAnimeHistory.kt │ │ │ │ ├── model/ │ │ │ │ │ ├── AnimeHistory.kt │ │ │ │ │ ├── AnimeHistoryUpdate.kt │ │ │ │ │ └── AnimeHistoryWithRelations.kt │ │ │ │ └── repository/ │ │ │ │ └── AnimeHistoryRepository.kt │ │ │ └── manga/ │ │ │ ├── interactor/ │ │ │ │ ├── GetMangaHistory.kt │ │ │ │ ├── GetNextChapters.kt │ │ │ │ ├── GetTotalReadDuration.kt │ │ │ │ ├── RemoveMangaHistory.kt │ │ │ │ └── UpsertMangaHistory.kt │ │ │ ├── model/ │ │ │ │ ├── MangaHistory.kt │ │ │ │ ├── MangaHistoryUpdate.kt │ │ │ │ └── MangaHistoryWithRelations.kt │ │ │ └── repository/ │ │ │ └── MangaHistoryRepository.kt │ │ ├── items/ │ │ │ ├── chapter/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── GetChapter.kt │ │ │ │ │ ├── GetChapterByUrlAndMangaId.kt │ │ │ │ │ ├── GetChaptersByMangaId.kt │ │ │ │ │ ├── SetMangaDefaultChapterFlags.kt │ │ │ │ │ ├── ShouldUpdateDbChapter.kt │ │ │ │ │ └── UpdateChapter.kt │ │ │ │ ├── model/ │ │ │ │ │ ├── Chapter.kt │ │ │ │ │ ├── ChapterUpdate.kt │ │ │ │ │ └── NoChaptersException.kt │ │ │ │ ├── repository/ │ │ │ │ │ └── ChapterRepository.kt │ │ │ │ └── service/ │ │ │ │ ├── ChapterRecognition.kt │ │ │ │ ├── ChapterSorter.kt │ │ │ │ └── MissingChapters.kt │ │ │ ├── episode/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── GetEpisode.kt │ │ │ │ │ ├── GetEpisodeByUrlAndAnimeId.kt │ │ │ │ │ ├── GetEpisodesByAnimeId.kt │ │ │ │ │ ├── SetAnimeDefaultEpisodeFlags.kt │ │ │ │ │ ├── ShouldUpdateDbEpisode.kt │ │ │ │ │ └── UpdateEpisode.kt │ │ │ │ ├── model/ │ │ │ │ │ ├── Episode.kt │ │ │ │ │ ├── EpisodeUpdate.kt │ │ │ │ │ └── NoEpisodesException.kt │ │ │ │ ├── repository/ │ │ │ │ │ └── EpisodeRepository.kt │ │ │ │ └── service/ │ │ │ │ ├── EpisodeRecognition.kt │ │ │ │ ├── EpisodeSorter.kt │ │ │ │ └── MissingEpisodes.kt │ │ │ └── season/ │ │ │ ├── interactor/ │ │ │ │ ├── GetAnimeSeasonsByParentId.kt │ │ │ │ ├── SetAnimeDefaultSeasonFlags.kt │ │ │ │ └── ShouldUpdateDbSeason.kt │ │ │ └── service/ │ │ │ ├── SeasonRecognition.kt │ │ │ └── SeasonSorter.kt │ │ ├── library/ │ │ │ ├── anime/ │ │ │ │ ├── LibraryAnime.kt │ │ │ │ └── model/ │ │ │ │ └── AnimeLibrarySortMode.kt │ │ │ ├── manga/ │ │ │ │ ├── LibraryManga.kt │ │ │ │ └── model/ │ │ │ │ └── MangaLibrarySortMode.kt │ │ │ ├── model/ │ │ │ │ ├── Flag.kt │ │ │ │ └── LibraryDisplayMode.kt │ │ │ └── service/ │ │ │ └── LibraryPreferences.kt │ │ ├── release/ │ │ │ ├── interactor/ │ │ │ │ └── GetApplicationRelease.kt │ │ │ ├── model/ │ │ │ │ └── Release.kt │ │ │ └── service/ │ │ │ └── ReleaseService.kt │ │ ├── source/ │ │ │ ├── anime/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── GetAnimeSourcesWithNonLibraryAnime.kt │ │ │ │ │ └── GetRemoteAnime.kt │ │ │ │ ├── model/ │ │ │ │ │ ├── AnimeSource.kt │ │ │ │ │ ├── AnimeSourceWithIds.kt │ │ │ │ │ ├── DeletableAnime.kt │ │ │ │ │ ├── Pin.kt │ │ │ │ │ └── StubAnimeSource.kt │ │ │ │ ├── repository/ │ │ │ │ │ ├── AnimeSourceRepository.kt │ │ │ │ │ └── AnimeStubSourceRepository.kt │ │ │ │ └── service/ │ │ │ │ └── AnimeSourceManager.kt │ │ │ └── manga/ │ │ │ ├── interactor/ │ │ │ │ ├── GetMangaSourcesWithNonLibraryManga.kt │ │ │ │ └── GetRemoteManga.kt │ │ │ ├── model/ │ │ │ │ ├── MangaSourceWithCount.kt │ │ │ │ ├── Pin.kt │ │ │ │ ├── Source.kt │ │ │ │ └── StubMangaSource.kt │ │ │ ├── repository/ │ │ │ │ ├── MangaSourceRepository.kt │ │ │ │ └── MangaStubSourceRepository.kt │ │ │ └── service/ │ │ │ └── MangaSourceManager.kt │ │ ├── storage/ │ │ │ └── service/ │ │ │ ├── StorageManager.kt │ │ │ └── StoragePreferences.kt │ │ ├── track/ │ │ │ ├── anime/ │ │ │ │ ├── interactor/ │ │ │ │ │ ├── DeleteAnimeTrack.kt │ │ │ │ │ ├── GetAnimeTracks.kt │ │ │ │ │ ├── GetTracksPerAnime.kt │ │ │ │ │ └── InsertAnimeTrack.kt │ │ │ │ ├── model/ │ │ │ │ │ └── AnimeTrack.kt │ │ │ │ └── repository/ │ │ │ │ └── AnimeTrackRepository.kt │ │ │ └── manga/ │ │ │ ├── interactor/ │ │ │ │ ├── DeleteMangaTrack.kt │ │ │ │ ├── GetMangaTracks.kt │ │ │ │ ├── GetTracksPerManga.kt │ │ │ │ └── InsertMangaTrack.kt │ │ │ ├── model/ │ │ │ │ └── MangaTrack.kt │ │ │ └── repository/ │ │ │ └── MangaTrackRepository.kt │ │ └── updates/ │ │ ├── anime/ │ │ │ ├── interactor/ │ │ │ │ └── GetAnimeUpdates.kt │ │ │ ├── model/ │ │ │ │ └── AnimeUpdatesWithRelations.kt │ │ │ └── repository/ │ │ │ └── AnimeUpdatesRepository.kt │ │ └── manga/ │ │ ├── interactor/ │ │ │ └── GetMangaUpdates.kt │ │ ├── model/ │ │ │ └── MangaUpdatesWithRelations.kt │ │ └── repository/ │ │ └── MangaUpdatesRepository.kt │ └── test/ │ └── java/ │ └── tachiyomi/ │ └── domain/ │ ├── entries/ │ │ ├── anime/ │ │ │ └── interactor/ │ │ │ └── AnimeFetchIntervalTest.kt │ │ └── manga/ │ │ └── interactor/ │ │ └── MangaFetchIntervalTest.kt │ ├── items/ │ │ ├── chapter/ │ │ │ └── service/ │ │ │ └── ChapterRecognitionTest.kt │ │ └── service/ │ │ └── MissingItemsTest.kt │ ├── library/ │ │ └── model/ │ │ └── LibraryFlagsTest.kt │ └── release/ │ └── interactor/ │ └── GetApplicationReleaseTest.kt ├── fastlane/ │ └── metadata/ │ └── android/ │ └── en-US/ │ ├── full_description.txt │ └── short_description.txt ├── gradle/ │ ├── androidx.versions.toml │ ├── aniyomi.versions.toml │ ├── compose.versions.toml │ ├── gradle-daemon-jvm.properties │ ├── kotlinx.versions.toml │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── i18n/ │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ ├── commonMain/ │ │ └── moko-resources/ │ │ ├── am/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ar/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── as/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── base/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── be/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── bg/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── bn/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ca/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ceb/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── cs/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── cv/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── da/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── de/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── el/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── eo/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── es/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── eu/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── fa/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── fi/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── fil/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── fr/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── gl/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── he/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── hi/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── hr/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── hu/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── in/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── it/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ja/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── jv/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ka-rGE/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── kk/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── km/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── kn/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ko/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── lt/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── lv/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ml/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── mr/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ms/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── my/ │ │ │ └── strings.xml │ │ ├── nb-rNO/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ne/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── nl/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── nn/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── pl/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── pt/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── pt-rBR/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ro/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ru/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sa/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sah/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sc/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sdh/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sk/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sq/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sr/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── sv/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── ta/ │ │ │ └── strings.xml │ │ ├── te/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── th/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── tr/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── uk/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── uz/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── vi/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ ├── zh-rCN/ │ │ │ ├── plurals.xml │ │ │ └── strings.xml │ │ └── zh-rTW/ │ │ ├── plurals.xml │ │ └── strings.xml │ └── main/ │ └── AndroidManifest.xml ├── i18n-aniyomi/ │ ├── build.gradle.kts │ └── src/ │ └── commonMain/ │ └── moko-resources/ │ ├── am/ │ │ └── strings.xml │ ├── ar/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── as/ │ │ └── strings.xml │ ├── base/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── be/ │ │ └── strings.xml │ ├── bg/ │ │ └── strings.xml │ ├── bn/ │ │ └── strings.xml │ ├── ca/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── ceb/ │ │ └── strings.xml │ ├── cs/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── cv/ │ │ └── strings.xml │ ├── da/ │ │ └── strings.xml │ ├── de/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── el/ │ │ └── strings.xml │ ├── eo/ │ │ └── strings.xml │ ├── es/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── eu/ │ │ └── strings.xml │ ├── fa/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── fi/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── fil/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── fr/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── gl/ │ │ └── strings.xml │ ├── he/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── hi/ │ │ └── strings.xml │ ├── hr/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── hu/ │ │ └── strings.xml │ ├── in/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── it/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── ja/ │ │ └── strings.xml │ ├── jv/ │ │ └── strings.xml │ ├── ka-rGE/ │ │ └── strings.xml │ ├── kk/ │ │ └── strings.xml │ ├── km/ │ │ └── strings.xml │ ├── kn/ │ │ └── strings.xml │ ├── ko/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── lt/ │ │ └── strings.xml │ ├── lv/ │ │ └── strings.xml │ ├── ml/ │ │ └── strings.xml │ ├── mr/ │ │ └── strings.xml │ ├── ms/ │ │ └── strings.xml │ ├── my/ │ │ └── strings.xml │ ├── nb-rNO/ │ │ └── strings.xml │ ├── ne/ │ │ └── strings.xml │ ├── nl/ │ │ └── strings.xml │ ├── nn/ │ │ └── strings.xml │ ├── pl/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── pt/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── pt-rBR/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── ro/ │ │ └── strings.xml │ ├── ru/ │ │ └── strings.xml │ ├── sa/ │ │ └── strings.xml │ ├── sah/ │ │ └── strings.xml │ ├── sc/ │ │ └── strings.xml │ ├── sdh/ │ │ └── strings.xml │ ├── sk/ │ │ └── strings.xml │ ├── sq/ │ │ └── strings.xml │ ├── sr/ │ │ └── strings.xml │ ├── sv/ │ │ └── strings.xml │ ├── ta/ │ │ └── strings.xml │ ├── te/ │ │ └── strings.xml │ ├── th/ │ │ └── strings.xml │ ├── tr/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── uk/ │ │ ├── plurals.xml │ │ └── strings.xml │ ├── ur/ │ │ └── strings.xml │ ├── uz/ │ │ └── strings.xml │ ├── vi/ │ │ └── strings.xml │ ├── zh-rCN/ │ │ ├── plurals.xml │ │ └── strings.xml │ └── zh-rTW/ │ └── strings.xml ├── macrobenchmark/ │ ├── README.md │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── tachiyomi/ │ └── macrobenchmark/ │ ├── BaselineProfileGenerator.kt │ └── StartupBenchmark.kt ├── presentation-core/ │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ ├── mihon/ │ │ │ └── presentation/ │ │ │ └── core/ │ │ │ └── util/ │ │ │ └── PagingDataUtil.kt │ │ └── tachiyomi/ │ │ └── presentation/ │ │ └── core/ │ │ ├── components/ │ │ │ ├── ActionButton.kt │ │ │ ├── AdaptiveSheet.kt │ │ │ ├── Badges.kt │ │ │ ├── CircularProgressIndicator.kt │ │ │ ├── CollapsibleBox.kt │ │ │ ├── LabeledCheckbox.kt │ │ │ ├── LazyColumnWithAction.kt │ │ │ ├── LazyGrid.kt │ │ │ ├── LazyList.kt │ │ │ ├── LinkIcon.kt │ │ │ ├── ListGroupHeader.kt │ │ │ ├── Pill.kt │ │ │ ├── SectionCard.kt │ │ │ ├── SettingsItems.kt │ │ │ ├── TwoPanelBox.kt │ │ │ ├── VerticalFastScroller.kt │ │ │ ├── WheelPicker.kt │ │ │ └── material/ │ │ │ ├── AlertDialog.kt │ │ │ ├── Button.kt │ │ │ ├── Constants.kt │ │ │ ├── FloatingActionButton.kt │ │ │ ├── IconButtonTokens.kt │ │ │ ├── IconToggleButton.kt │ │ │ ├── NavigationBar.kt │ │ │ ├── NavigationRail.kt │ │ │ ├── PullRefresh.kt │ │ │ ├── Scaffold.kt │ │ │ ├── Slider.kt │ │ │ ├── Surface.kt │ │ │ └── Tabs.kt │ │ ├── i18n/ │ │ │ └── Localize.kt │ │ ├── icons/ │ │ │ ├── CustomIcons.kt │ │ │ ├── Discord.kt │ │ │ └── Github.kt │ │ ├── screens/ │ │ │ ├── EmptyScreen.kt │ │ │ ├── InfoScreen.kt │ │ │ └── LoadingScreen.kt │ │ ├── theme/ │ │ │ ├── Color.kt │ │ │ └── Typography.kt │ │ └── util/ │ │ ├── Elevation.kt │ │ ├── LazyListState.kt │ │ ├── Modifier.kt │ │ ├── PaddingValues.kt │ │ ├── Preference.kt │ │ ├── Scrollbar.kt │ │ └── ThemePreviews.kt │ └── res/ │ ├── values/ │ │ ├── color_cloudflare.xml │ │ ├── color_doom.xml │ │ ├── color_lavender.xml │ │ ├── color_matrix.xml │ │ ├── color_sapphire.xml │ │ ├── colors.xml │ │ ├── colors_greenapple.xml │ │ ├── colors_midnightdusk.xml │ │ ├── colors_monochrome.xml │ │ ├── colors_nord.xml │ │ ├── colors_strawberry.xml │ │ ├── colors_tachiyomi.xml │ │ ├── colors_tako.xml │ │ ├── colors_tealturqoise.xml │ │ ├── colors_tidalwave.xml │ │ ├── colors_yinyang.xml │ │ └── colors_yotsuba.xml │ └── values-night/ │ ├── color_cloudflare.xml │ ├── color_doom.xml │ ├── color_lavender.xml │ ├── color_matrix.xml │ ├── color_sapphire.xml │ ├── colors.xml │ ├── colors_greenapple.xml │ ├── colors_midnightdusk.xml │ ├── colors_monochrome.xml │ ├── colors_nord.xml │ ├── colors_strawberry.xml │ ├── colors_tachiyomi.xml │ ├── colors_tako.xml │ ├── colors_tealturqoise.xml │ ├── colors_tidalwave.xml │ ├── colors_yinyang.xml │ └── colors_yotsuba.xml ├── presentation-widget/ │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── tachiyomi/ │ │ └── presentation/ │ │ └── widget/ │ │ ├── components/ │ │ │ ├── anime/ │ │ │ │ ├── LockedAnimeWidget.kt │ │ │ │ ├── UpdatesAnimeCover.kt │ │ │ │ └── UpdatesAnimeWidget.kt │ │ │ └── manga/ │ │ │ ├── LockedMangaWidget.kt │ │ │ ├── UpdatesMangaCover.kt │ │ │ └── UpdatesMangaWidget.kt │ │ ├── entries/ │ │ │ ├── anime/ │ │ │ │ ├── AnimeUpdatesGridCoverScreenGlanceReceiver.kt │ │ │ │ ├── AnimeUpdatesGridCoverScreenGlanceWidget.kt │ │ │ │ ├── AnimeUpdatesGridGlanceReceiver.kt │ │ │ │ ├── AnimeUpdatesGridGlanceWidget.kt │ │ │ │ ├── AnimeWidgetManager.kt │ │ │ │ └── BaseAnimeUpdatesGridGlanceWidget.kt │ │ │ └── manga/ │ │ │ ├── BaseMangaUpdatesGridGlanceWidget.kt │ │ │ ├── MangaUpdatesGridCoverScreenGlanceReceiver.kt │ │ │ ├── MangaUpdatesGridCoverScreenGlanceWidget.kt │ │ │ ├── MangaUpdatesGridGlanceReceiver.kt │ │ │ ├── MangaUpdatesGridGlanceWidget.kt │ │ │ └── MangaWidgetManager.kt │ │ └── util/ │ │ └── GlanceUtils.kt │ └── res/ │ ├── drawable/ │ │ ├── appwidget_background.xml │ │ ├── appwidget_cover_error.xml │ │ └── appwidget_coverscreen_background.xml │ ├── layout/ │ │ ├── appwidget_coverscreen_loading.xml │ │ └── appwidget_loading.xml │ ├── values/ │ │ ├── colors_appwidget.xml │ │ └── dimens.xml │ ├── values-night-v31/ │ │ └── colors_appwidget.xml │ ├── values-v31/ │ │ ├── colors_appwidget.xml │ │ └── dimens.xml │ └── xml/ │ ├── updates_grid_homescreen_widget_info.xml │ ├── updates_grid_lockscreen_widget_info.xml │ └── updates_grid_samsung_cover_widget_info.xml ├── settings.gradle.kts ├── source-api/ │ ├── build.gradle.kts │ ├── consumer-proguard.pro │ └── src/ │ ├── androidMain/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── eu/ │ │ └── kanade/ │ │ └── tachiyomi/ │ │ ├── animesource/ │ │ │ └── PreferenceScreen.kt │ │ ├── source/ │ │ │ └── PreferenceScreen.kt │ │ └── util/ │ │ └── RxExtension.kt │ └── commonMain/ │ └── kotlin/ │ └── eu/ │ └── kanade/ │ └── tachiyomi/ │ ├── animesource/ │ │ ├── AnimeCatalogueSource.kt │ │ ├── AnimeSource.kt │ │ ├── AnimeSourceFactory.kt │ │ ├── ConfigurableAnimeSource.kt │ │ ├── PreferenceScreen.kt │ │ ├── UnmeteredSource.kt │ │ ├── model/ │ │ │ ├── AnimeFilter.kt │ │ │ ├── AnimeFilterList.kt │ │ │ ├── AnimeUpdateStrategy.kt │ │ │ ├── AnimesPage.kt │ │ │ ├── FetchType.kt │ │ │ ├── Hoster.kt │ │ │ ├── SAnime.kt │ │ │ ├── SAnimeImpl.kt │ │ │ ├── SEpisode.kt │ │ │ ├── SEpisodeImpl.kt │ │ │ └── Video.kt │ │ ├── online/ │ │ │ ├── AnimeHttpSource.kt │ │ │ ├── ParsedAnimeHttpSource.kt │ │ │ └── ResolvableAnimeSource.kt │ │ └── utils/ │ │ └── Preferences.kt │ ├── source/ │ │ ├── CatalogueSource.kt │ │ ├── ConfigurableSource.kt │ │ ├── MangaSource.kt │ │ ├── PreferenceScreen.kt │ │ ├── SourceFactory.kt │ │ ├── UnmeteredSource.kt │ │ ├── model/ │ │ │ ├── Filter.kt │ │ │ ├── FilterList.kt │ │ │ ├── MangasPage.kt │ │ │ ├── Page.kt │ │ │ ├── SChapter.kt │ │ │ ├── SChapterImpl.kt │ │ │ ├── SManga.kt │ │ │ ├── SMangaImpl.kt │ │ │ └── UpdateStrategy.kt │ │ └── online/ │ │ ├── HttpSource.kt │ │ ├── ParsedHttpSource.kt │ │ └── ResolvableSource.kt │ └── util/ │ ├── JsonExtensions.kt │ ├── JsoupExtensions.kt │ ├── RxExtension.kt │ └── VideoInfo.kt └── source-local/ ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src/ ├── androidMain/ │ ├── AndroidManifest.xml │ └── kotlin/ │ └── tachiyomi/ │ └── source/ │ └── local/ │ ├── entries/ │ │ ├── anime/ │ │ │ ├── LocalAnimeFetchTypeManager.kt │ │ │ └── LocalAnimeSource.kt │ │ └── manga/ │ │ └── LocalMangaSource.kt │ ├── filter/ │ │ ├── anime/ │ │ │ └── AnimeOrderBy.kt │ │ └── manga/ │ │ └── MangaOrderBy.kt │ ├── image/ │ │ ├── anime/ │ │ │ ├── LocalAnimeBackgroundManager.kt │ │ │ ├── LocalAnimeCoverManager.kt │ │ │ └── LocalEpisodeThumbnailManager.kt │ │ └── manga/ │ │ └── LocalMangaCoverManager.kt │ ├── io/ │ │ ├── anime/ │ │ │ └── LocalAnimeSourceFileSystem.kt │ │ └── manga/ │ │ └── LocalMangaSourceFileSystem.kt │ └── metadata/ │ └── EpubReaderExtensions.kt └── commonMain/ └── kotlin/ └── tachiyomi/ └── source/ └── local/ ├── entries/ │ ├── anime/ │ │ ├── LocalAnimeFetchTypeManager.kt │ │ └── LocalAnimeSource.kt │ └── manga/ │ └── LocalMangaSource.kt ├── image/ │ ├── anime/ │ │ ├── LocalAnimeBackgroundManager.kt │ │ ├── LocalAnimeCoverManager.kt │ │ └── LocalEpisodeThumbnailManager.kt │ └── manga/ │ └── LocalMangaCoverManager.kt └── io/ ├── Archive.kt ├── Format.kt ├── anime/ │ └── LocalAnimeSourceFileSystem.kt └── manga/ └── LocalMangaSourceFileSystem.kt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true [*.xml] indent_size = 4 # noinspection EditorConfigKeyCorrectness [*.{kt,kts}] indent_size = 4 max_line_length = 120 ij_kotlin_allow_trailing_comma = true ij_kotlin_allow_trailing_comma_on_call_site = true ij_kotlin_name_count_to_use_star_import = 2147483647 ij_kotlin_name_count_to_use_star_import_for_members = 2147483647 ktlint_code_style = intellij_idea ktlint_function_naming_ignore_when_annotated_with = Composable ktlint_standard_class-signature = disabled ktlint_standard_discouraged-comment-location = disabled ktlint_standard_function-expression-body = disabled ktlint_standard_function-signature = disabled ================================================ FILE: .gitattributes ================================================ * text=auto * text eol=lf # Windows forced line-endings /.idea/* text eol=crlf # Gradle wrapper *.jar binary # Images *.webp binary *.png binary *.jpg binary *.jpeg binary *.gif binary *.ico binary *.gz binary *.zip binary *.7z binary *.ttf binary *.eot binary *.woff binary *.pyc binary *.swp binary ================================================ FILE: .github/FUNDING.yml ================================================ github: jmir1 ko_fi: jmir1 ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: ❌ Help with Extensions url: https://aniyomi.org/docs/faq/browse/extensions about: For extension-related questions/issues - name: 🧑‍💻 Aniyomi help discord url: https://discord.gg/F32UjdJZrR about: Common questions are answered here - name: 🖥️ Aniyomi website url: https://aniyomi.org/ about: Guides, troubleshooting, and answers to common questions ================================================ FILE: .github/ISSUE_TEMPLATE/report_issue.yml ================================================ name: 🐞 Issue report description: Report an issue in Aniyomi labels: [Bug] body: - type: textarea id: reproduce-steps attributes: label: Steps to reproduce description: Provide an example of the issue. placeholder: | Example: 1. First step 2. Second step 3. Issue here validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: Explain what you should expect to happen. placeholder: | Example: "This should happen..." validations: required: true - type: textarea id: actual-behavior attributes: label: Actual behavior description: Explain what actually happens. placeholder: | Example: "This happened instead..." validations: required: true - type: textarea id: crash-logs attributes: label: Crash logs description: | If you're experiencing crashes, if possible, go to the app's **More → Settings → Advanced** page, press **Dump crash logs** and share the crash logs here. placeholder: | You can upload the crash log file as an attachment, or paste the crash logs in plain text if needed. - type: input id: aniyomi-version attributes: label: Aniyomi version description: You can find your Aniyomi version in **More → About**. placeholder: | Example: "0.18.1.2" validations: required: true - type: input id: android-version attributes: label: Android version description: You can find this somewhere in your Android settings. placeholder: | Example: "Android 11" validations: required: true - type: input id: device attributes: label: Device description: List your device and model. placeholder: | Example: "Google Pixel 5" validations: required: true - type: textarea id: other-details attributes: label: Other details placeholder: | Additional details and attachments. - type: checkboxes id: acknowledgements attributes: label: Acknowledgements description: Read this carefully, we will close and ignore your issue if you skimmed through this. options: - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue. required: true - label: I have written a short but informative title. required: true - label: If this is an issue with an extension, I should be opening an issue in the extension's repository. required: true - label: I have gone through the [FAQ](https://aniyomi.org/docs/faq/general) and [troubleshooting guide](https://aniyomi.org/docs/guides/troubleshooting/). required: true - label: I have updated the app to version **[0.18.1.2](https://github.com/aniyomiorg/aniyomi/releases/latest)**. required: true - label: I have filled out all of the requested information in this form, including specific version numbers. required: true - label: I understand that **Aniyomi does not have or fix any extensions**, and I **will not receive help** for any issues related to sources or extensions. required: true ================================================ FILE: .github/ISSUE_TEMPLATE/request_feature.yml ================================================ name: ⭐ Feature request description: Suggest a feature to improve Aniyomi labels: [Feature request] body: - type: textarea id: feature-description attributes: label: Describe your suggested feature description: How can Aniyomi be improved? placeholder: | Example: "It should work like this..." validations: required: true - type: textarea id: other-details attributes: label: Other details placeholder: | Additional details and attachments. - type: checkboxes id: acknowledgements attributes: label: Acknowledgements description: Read this carefully, we will close and ignore your issue if you skimmed through this. options: - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue. required: true - label: I have written a short but informative title. required: true - label: If this is a request regarding an extension, I should be opening an issue in the extension's repository. required: true - label: I have updated the app to version **[0.18.1.2](https://github.com/aniyomiorg/aniyomi/releases/latest)**. required: true - label: I will fill out all of the requested information in this form. required: true ================================================ FILE: .github/pull_request_template.md ================================================ ================================================ FILE: .github/renovate.json5 ================================================ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["config:recommended"], "labels": ["Dependencies"], "includePaths": ["gradle/aniyomi.versions.toml"], "semanticCommits": "disabled", } ================================================ FILE: .github/workflows/build_pull_request.yml ================================================ name: PR build check on: pull_request: paths: - '**' - '!**.md' - '!i18n/src/commonMain/moko-resources/**/strings-aniyomi.xml' - '!i18n/src/commonMain/moko-resources/**/strings.xml' - '!i18n/src/commonMain/moko-resources/**/plurals-aniyomi.xml' - '!i18n/src/commonMain/moko-resources/**/plurals.xml' - 'i18n/src/commonMain/moko-resources/base/strings-aniyomi.xml' - 'i18n/src/commonMain/moko-resources/base/strings.xml' - 'i18n/src/commonMain/moko-resources/base/plurals-aniyomi.xml' - 'i18n/src/commonMain/moko-resources/base/plurals.xml' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number }} cancel-in-progress: true permissions: contents: read jobs: build: name: Build app runs-on: 'ubuntu-24.04' steps: - name: Clone repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Dependency Review uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 - name: Set up JDK uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 with: java-version: 17 distribution: temurin - name: Set up gradle uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - name: Check code format run: ./gradlew spotlessCheck - name: Build app run: ./gradlew assembleRelease - name: Run unit tests run: ./gradlew testReleaseUnitTest - name: Upload APK uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: arm64-v8a-${{ github.sha }} path: app/build/outputs/apk/release/app-arm64-v8a-release-unsigned.apk - name: Upload mapping uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: mapping-${{ github.sha }} path: app/build/outputs/mapping/release ================================================ FILE: .github/workflows/build_push.yml ================================================ name: CI permissions: contents: write on: push: branches: - '*' tags: - v* concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: name: Build app runs-on: ubuntu-latest steps: - name: Clone repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up JDK uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 with: java-version: 17 distribution: temurin - name: Set up gradle uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - name: Check code format run: ./gradlew spotlessCheck - name: Build app run: ./gradlew assembleRelease -Penable-updater - name: Run unit tests run: ./gradlew testReleaseUnitTest - name: Upload APK uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: arm64-v8a-${{ github.sha }} path: app/build/outputs/apk/release/app-arm64-v8a-release-unsigned.apk - name: Upload mapping uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: mapping-${{ github.sha }} path: app/build/outputs/mapping/release # Sign APK and create release for tags - name: Get tag name if: startsWith(github.ref, 'refs/tags/') && github.repository == 'aniyomiorg/aniyomi' run: | set -x echo "VERSION_TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV - name: Sign APK if: startsWith(github.ref, 'refs/tags/') && github.repository == 'aniyomiorg/aniyomi' uses: r0adkll/sign-android-release@f30bdd30588842ac76044ecdbd4b6d0e3e813478 with: releaseDirectory: app/build/outputs/apk/release signingKeyBase64: ${{ secrets.SIGNING_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} keyPassword: ${{ secrets.KEY_PASSWORD }} env: BUILD_TOOLS_VERSION: '35.0.1' - name: Clean up build artifacts if: startsWith(github.ref, 'refs/tags/') && github.repository == 'aniyomiorg/aniyomi' run: | set -e mv app/build/outputs/apk/release/app-universal-release-unsigned-signed.apk aniyomi-${{ env.VERSION_TAG }}.apk sha=`sha256sum aniyomi-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_UNIVERSAL_SHA=$sha" >> $GITHUB_ENV mv app/build/outputs/apk/release/app-arm64-v8a-release-unsigned-signed.apk aniyomi-arm64-v8a-${{ env.VERSION_TAG }}.apk sha=`sha256sum aniyomi-arm64-v8a-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_ARM64_V8A_SHA=$sha" >> $GITHUB_ENV mv app/build/outputs/apk/release/app-armeabi-v7a-release-unsigned-signed.apk aniyomi-armeabi-v7a-${{ env.VERSION_TAG }}.apk sha=`sha256sum aniyomi-armeabi-v7a-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_ARMEABI_V7A_SHA=$sha" >> $GITHUB_ENV mv app/build/outputs/apk/release/app-x86-release-unsigned-signed.apk aniyomi-x86-${{ env.VERSION_TAG }}.apk sha=`sha256sum aniyomi-x86-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_X86_SHA=$sha" >> $GITHUB_ENV mv app/build/outputs/apk/release/app-x86_64-release-unsigned-signed.apk aniyomi-x86_64-${{ env.VERSION_TAG }}.apk sha=`sha256sum aniyomi-x86_64-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_X86_64_SHA=$sha" >> $GITHUB_ENV - name: Create Release if: startsWith(github.ref, 'refs/tags/') && github.repository == 'aniyomiorg/aniyomi' uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1 with: tag_name: ${{ env.VERSION_TAG }} name: Aniyomi ${{ env.VERSION_TAG }} body: | --- ### Checksums | Variant | SHA-256 | | ------- | ------- | | Universal | ${{ env.APK_UNIVERSAL_SHA }} | arm64-v8a | ${{ env.APK_ARM64_V8A_SHA }} | armeabi-v7a | ${{ env.APK_ARMEABI_V7A_SHA }} | x86 | ${{ env.APK_X86_SHA }} | x86_64 | ${{ env.APK_X86_64_SHA }} | files: | aniyomi-${{ env.VERSION_TAG }}.apk aniyomi-arm64-v8a-${{ env.VERSION_TAG }}.apk aniyomi-armeabi-v7a-${{ env.VERSION_TAG }}.apk aniyomi-x86-${{ env.VERSION_TAG }}.apk aniyomi-x86_64-${{ env.VERSION_TAG }}.apk draft: true prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ # Build files .gradle .kotlin build # IDE files *.iml .idea/* !.idea/icon.png /captures # Configuration files local.properties # macOS specific files .DS_Store ================================================ FILE: CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file. The format is a modified version of [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - `Added` - for new features. - `Changed ` - for changes in existing functionality. - `Improved` - for enhancement or optimization in existing functionality. - `Removed` - for now removed features. - `Fixed` - for any bug fixes. - `Other` - for technical stuff. ## Unreleased ### Added - Added a description for the horizontal seek gesture setting ([@kenkoro](https://github.com/kenkoro)) ([#2224](https://github.com/aniyomiorg/aniyomi/pull/2224)) ### Fixed - Swapped keyEvent listeners for left and right keyboard arrow keys as they were swapped in the code causing the opposite of the desired behavior([@alphastark](https://github.com/alphastark)) ([#2219](https://github.com/aniyomiorg/aniyomi/pull/2219)) - Fix some malformed translated strings that made the player quit when Aniskip was enabled ([@686udjie](https://github.com/686udjie)) ([#2217](https://github.com/aniyomiorg/aniyomi/pull/2217)) ## [v0.18.1.2] - 2025-10-28 ### Fixed - Fix Hosters feature detection (again) ([@hollowshiroyuki](https://github.com/hollowshiroyuki)) ([#2216](https://github.com/aniyomiorg/aniyomi/pull/2216)) ## [v0.18.1.1] - 2025-10-26 ### Fixed - Fix source Seasons/Hosters feature detection ([@hollowshiroyuki](https://github.com/hollowshiroyuki)) ([#2195](https://github.com/aniyomiorg/aniyomi/pull/2195)) - Fix shared download cache messing up downloaded episodes detection ([@choppeh](https://github.com/choppeh)) ([#2184](https://github.com/aniyomiorg/aniyomi/pull/2184)) - Fix Shikimori anime tracking ([@danya140](https://github.com/danya140)) ([#2205](https://github.com/aniyomiorg/aniyomi/pull/2205)) ### Improved - Make volume gesture the same sensitivity as brightness ([@jmir1](https://github.com/jmir1)) ## [v0.18.1.0] - 2025-10-02 ### Fixed - Fix list view resetting scroll upon exiting child ([@quickdesh](https://github.com/quickdesh)) ([#1982](https://github.com/aniyomiorg/aniyomi/pull/1982)) - Fix episode number parsing ([@Secozzi](https://github.com/Secozzi)) ([#2096](https://github.com/aniyomiorg/aniyomi/pull/2096)) - Fix tracking menu not opening on add to library ([@Secozzi](https://github.com/Secozzi)) ([#2098](https://github.com/aniyomiorg/aniyomi/pull/2098)) - Fix stop/continue anime download button ([@Secozzi](https://github.com/Secozzi)) ([#2099](https://github.com/aniyomiorg/aniyomi/pull/2099)) - Fix creating/restoring backups between mihon and aniyomi ([@Secozzi](https://github.com/Secozzi)) ([#2117](https://github.com/aniyomiorg/aniyomi/pull/2117)) ### Added - Add support for new parameters from ext lib 16 ([@quickdesh](https://github.com/quickdesh)) ([#1982](https://github.com/aniyomiorg/aniyomi/pull/1982)) - Add player settings to the main settings screen ([@jmir1](https://github.com/jmir1)) ([#2081](https://github.com/aniyomiorg/aniyomi/pull/2081)) - Add seasons support ([@Secozzi](https://github.com/Secozzi)) ([#2095](https://github.com/aniyomiorg/aniyomi/pull/2095)) ## [v0.18.0.1] - 2025-07-06 ### Fixed - Fix crash on migration ([@Secozzi](https://github.com/Secozzi)) ([#2079](https://github.com/aniyomiorg/aniyomi/pull/2079)) ## [v0.18.0.0] - 2025-07-05 ### Added - Set mpv's media-title property ([@Secozzi](https://github.com/Secozzi)) ([#1672](https://github.com/aniyomiorg/aniyomi/pull/1672)) - Add mpvKt to external players ([@Secozzi](https://github.com/Secozzi)) ([#1674](https://github.com/aniyomiorg/aniyomi/pull/1674)) - Add video filters ([@abdallahmehiz](https://github.com/abdallahmehiz)) ([#1698](https://github.com/aniyomiorg/aniyomi/pull/1698)) - Show hours and minutes in relative time strings ([@jmir1](https://github.com/jmir1)) ([`1f3be7b`](https://github.com/aniyomiorg/aniyomi/commit/1f3be7b523136039b3b60213f2cee7959a9367d7)) - Fix some issues with relative date calculations ([@jmir1](https://github.com/jmir1)) ([`03e1ecd`](https://github.com/aniyomiorg/aniyomi/commit/03e1ecd75edd2ea15dc8732ffeab32c6af26b202)) - Add better auto sub select ([@Secozzi](https://github.com/Secozzi)) ([#1706](https://github.com/aniyomiorg/aniyomi/pull/1706)) - Copy the file location when using ext downloader ([@quickdesh](https://github.com/quickdesh)) ([#1758](https://github.com/aniyomiorg/aniyomi/pull/1758)) - Replace player with mpvKt ([@Secozzi](https://github.com/Secozzi)) ([#1834](https://github.com/aniyomiorg/aniyomi/pull/1834), [#1855](https://github.com/aniyomiorg/aniyomi/pull/1855), [#1859](https://github.com/aniyomiorg/aniyomi/pull/1859), [#1860](https://github.com/aniyomiorg/aniyomi/pull/1860)) - Move player preferences to separate section ([@Secozzi](https://github.com/Secozzi)) ([#1819](https://github.com/aniyomiorg/aniyomi/pull/1819)) - Implement video hosters ([@Secozzi](https://github.com/Secozzi)) ([#1892](https://github.com/aniyomiorg/aniyomi/pull/1892)) - Add size slider for the "List Display" Mode ([@MavikBow](https://github.com/MavikBow)) ([#1906](https://github.com/aniyomiorg/aniyomi/pull/1906)) - Make the default list a set size and make browse list scale ([@MavikBow](https://github.com/MavikBow)) ([#1914](https://github.com/aniyomiorg/aniyomi/pull/1914)) - Allow negative brightness values (dimming) ([@jmir1](https://github.com/jmir1)) ([#1915](https://github.com/aniyomiorg/aniyomi/pull/1915)) - Add new lua functions for custom buttons ([@Secozzi](https://github.com/Secozzi)) ([#1980](https://github.com/aniyomiorg/aniyomi/pull/1980)) - Use timestamps provided by extensions ([@Secozzi](https://github.com/Secozzi)) ([#1983](https://github.com/aniyomiorg/aniyomi/pull/1983)) - Add titles to player sheets + consistency with More sheet ([@quickdesh](https://github.com/quickdesh)) ([#2015](https://github.com/aniyomiorg/aniyomi/pull/2015)) - Add script & script-opts editor to player settings ([@Secozzi](https://github.com/Secozzi)) ([#2019](https://github.com/aniyomiorg/aniyomi/pull/2019)) ### Improved - Show "Now" instead of "0 minutes ago" ([@Secozzi](https://github.com/Secozzi)) ([#1715](https://github.com/aniyomiorg/aniyomi/pull/1715)) - Add headers when using 1dm as external player ([@Secozzi](https://github.com/Secozzi)) ([#2032](https://github.com/aniyomiorg/aniyomi/pull/2032)) ### Fixed - Fix enhanced tracking for jellyfin ([@Secozzi](https://github.com/Secozzi)) ([#1656](https://github.com/aniyomiorg/aniyomi/pull/1656), [#1658](https://github.com/aniyomiorg/aniyomi/pull/1658)) - Use different status strings for anime trackers ([@jmir1](https://github.com/jmir1)) ([`74b32a3`](https://github.com/aniyomiorg/aniyomi/commit/74b32a3a0b323ed2f6f7929e131dcb4901e7bf9b)) - Fix Shikimori tracking for anime ([@jmir1](https://github.com/jmir1)) ([`58817c7`](https://github.com/aniyomiorg/aniyomi/commit/58817c724e2808072ff273329cee261d12084927)) - Group updates by date and not time ([@jmir1](https://github.com/jmir1)) ([`c83ebf3`](https://github.com/aniyomiorg/aniyomi/commit/c83ebf322f48d41ca1ad0105262160ecb7cde991)) - Fix airing time not showing ([@Secozzi](https://github.com/Secozzi)) ([#1720](https://github.com/aniyomiorg/aniyomi/pull/1720)) - Don't invalidate anime downloads on startup ([@Secozzi](https://github.com/Secozzi)) ([#1753](https://github.com/aniyomiorg/aniyomi/pull/1753)) - Fix hidden categories getting reset after delete/reorder ([@cuong-tran](https://github.com/cuong-tran)) ([#1780](https://github.com/aniyomiorg/aniyomi/pull/1780)) - Fix episode progress not being saved and duplicate tracks ([@perokhe](https://github.com/perokhe)) ([#1784](https://github.com/aniyomiorg/aniyomi/pull/1784), [#1785](https://github.com/aniyomiorg/aniyomi/pull/1785)) - Fix subtitle select not matching two letter language codes ([@Secozzi](https://github.com/Secozzi)) ([#1805](https://github.com/aniyomiorg/aniyomi/pull/1805)) - Fix potential intent extra npe ([@quickdesh](https://github.com/quickdesh)) ([#1816](https://github.com/aniyomiorg/aniyomi/pull/1816)) - Fix history date header duplication ([@quickdesh](https://github.com/quickdesh)) ([#1817](https://github.com/aniyomiorg/aniyomi/pull/1817)) - Fix migrations not getting context correctly ([@Secozzi](https://github.com/Secozzi)) ([#1820](https://github.com/aniyomiorg/aniyomi/pull/1820)) - Fix various issues due to replacing the player with mpvKt - Fix gesture seeking not seeking to start and end ([@perokhe](https://github.com/perokhe)) ([#1865](https://github.com/aniyomiorg/aniyomi/pull/1865)) - Fix crash when opening player settings in tablet ui ([@Secozzi](https://github.com/Secozzi)) ([#1868](https://github.com/aniyomiorg/aniyomi/pull/1868)) - Fix episode list in player not respecting filters & crash when exiting while stuff is loading ([@Secozzi](https://github.com/Secozzi)) ([#1869](https://github.com/aniyomiorg/aniyomi/pull/1869)) - Fix episode being marked as seen at start ([@perokhe](https://github.com/perokhe)) ([#1871](https://github.com/aniyomiorg/aniyomi/pull/1871)) - Fix player not being paused when loading tracks after changing quality ([@Secozzi](https://github.com/Secozzi)) ([#1878](https://github.com/aniyomiorg/aniyomi/pull/1878)) - Fix lag when toggling player ui ([@Secozzi](https://github.com/Secozzi)) ([#1887](https://github.com/aniyomiorg/aniyomi/pull/1887)) - Fix audio selection not working on external audio tracks ([@Secozzi](https://github.com/Secozzi)) ([#1901](https://github.com/aniyomiorg/aniyomi/pull/1901)) - Reset "hide player controls time" when pressing custom button ([@Secozzi](https://github.com/Secozzi)) ([#1902](https://github.com/aniyomiorg/aniyomi/pull/1902)) - Don't unpause on share and save ([@Secozzi](https://github.com/Secozzi)) ([#1905](https://github.com/aniyomiorg/aniyomi/pull/1905)) - Fix player pausing with gesture seek ([@perokhe](https://github.com/perokhe)) ([#1916](https://github.com/aniyomiorg/aniyomi/pull/1916)) - Fix potential npe issues with mpv-lib ([@Secozzi](https://github.com/Secozzi)) ([#1921](https://github.com/aniyomiorg/aniyomi/pull/1921)) - Dismiss chapter sheet on chapter select ([@Secozzi](https://github.com/Secozzi)) ([#1976](https://github.com/aniyomiorg/aniyomi/pull/1976)) - Fix some issues caused by [`10e28cc`](https://github.com/aniyomiorg/aniyomi/commit/10e28cc4092758cf38d27cc14aadf539698738f2) ([@Secozzi](https://github.com/Secozzi)) ([#1981](https://github.com/aniyomiorg/aniyomi/pull/1981)) - Fix npe issue caused in player controls ([@Secozzi](https://github.com/Secozzi)) ([#1986](https://github.com/aniyomiorg/aniyomi/pull/1986)) - Replace some manga strings with respective anime strings ([@perokhe](https://github.com/perokhe)) ([#1864](https://github.com/aniyomiorg/aniyomi/pull/1864)) - Open correct tab from extension update notifications ([@jmir1](https://github.com/jmir1)) ([`161471d`](https://github.com/aniyomiorg/aniyomi/commit/161471d94a2350c0c983eeeccd3b7ac0dc66d429)) - Fix sub-auto not loading all external subtitle files ([@perokhe](https://github.com/perokhe)) ([#1866](https://github.com/aniyomiorg/aniyomi/pull/1866)) - Fix `ALSearchItem.format` nullability ([@Secozzi](https://github.com/Secozzi)) ([#1910](https://github.com/aniyomiorg/aniyomi/pull/1910)) - Don't format mpv preferences ([@Secozzi](https://github.com/Secozzi)) ([#1939](https://github.com/aniyomiorg/aniyomi/pull/1939)) - Prevent crash on app death when watching in external player ([@Secozzi](https://github.com/Secozzi)) ([#1945](https://github.com/aniyomiorg/aniyomi/pull/1945)) - Don't run unnecessary stuff when exiting the player ([@Secozzi](https://github.com/Secozzi)) ([#1961](https://github.com/aniyomiorg/aniyomi/pull/1961)) - Fix some downloader issues ([@Secozzi](https://github.com/Secozzi)) ([#1964](https://github.com/aniyomiorg/aniyomi/pull/1964)) - Fix downloader not working for certain types of tracks & duration sometimes not being logged ([@Secozzi](https://github.com/Secozzi)) ([#2001](https://github.com/aniyomiorg/aniyomi/pull/2001)) - Fix some issues with intro skip length ([@jmir1](https://github.com/jmir1)) ([`72cac57`](https://github.com/aniyomiorg/aniyomi/commit/72cac57d8e66366cbc0f3106eb351c82250c460b), [`25dd3ea`](https://github.com/aniyomiorg/aniyomi/commit/25dd3ea69fb217de7b0485c29e4a9b970737fd45)) - Force clipboard to use UI thread when copying path for external players ([@quickdesh](https://github.com/quickdesh)) ([#1994](https://github.com/aniyomiorg/aniyomi/pull/1994)) - Use application directory for storing files used by mpv ([@Secozzi](https://github.com/Secozzi)) ([#1995](https://github.com/aniyomiorg/aniyomi/pull/1995)) - Update backup warning string (follow Mihon) ([@cuong-tran](https://github.com/cuong-tran)) ([#2012](https://github.com/aniyomiorg/aniyomi/pull/2012)) - Fix issues with episode deletion & more ([@quickdesh](https://github.com/quickdesh)) ([#2017](https://github.com/aniyomiorg/aniyomi/pull/2017)) - Fix vertical slider width issues and shift boost volume value to slider ([@quickdesh](https://github.com/quickdesh)) ([#2018](https://github.com/aniyomiorg/aniyomi/pull/2018)) - Fix MyAnimeList login ([@choppeh](https://github.com/choppeh)) ([#2035](https://github.com/aniyomiorg/aniyomi/pull/2035)) - Call sort methods for videos and hosters ([@cuong-tran](https://github.com/cuong-tran)) ([#2058](https://github.com/aniyomiorg/aniyomi/pull/2058)) - Invalidate preferred languages in settings ([@Secozzi](https://github.com/Secozzi)) ([#2075](https://github.com/aniyomiorg/aniyomi/pull/2075)) - Fix crash when using sort by airing time ([@quickdesh](https://github.com/quickdesh)) ([#2076](https://github.com/aniyomiorg/aniyomi/pull/2076)) ### Other - Merge from mihon until 0.16.5 ([@Secozzi](https://github.com/Secozzi)) ([#1663](https://github.com/aniyomiorg/aniyomi/pull/1663)) - Merge until latest mihon commits ([@Secozzi](https://github.com/Secozzi)) ([#1693](https://github.com/aniyomiorg/aniyomi/pull/1693)) - Merge until latest mihon commits (v0.17.0) ([@Secozzi](https://github.com/Secozzi)) ([#1804](https://github.com/aniyomiorg/aniyomi/pull/1804)) - Merge until latest mihon commits (v0.18.0) ([@Secozzi](https://github.com/Secozzi)) ([#1863](https://github.com/aniyomiorg/aniyomi/pull/1863)) - Remove ACRA crash report analytics ([@jmir1](https://github.com/jmir1)) ([`d3c6a15`](https://github.com/aniyomiorg/aniyomi/commit/d3c6a159d82ca239c10e8f5822c3b2046c5545f2), [`5ae35c8`](https://github.com/aniyomiorg/aniyomi/commit/5ae35c891b90ae927200185641240280effaf667)) ## [v0.16.4.3] - 2024-07-01 ### Fixed - Fix extensions disappearing due to errors with the ClassLoader ([@jmir1](https://github.com/jmir1)) ([`959f84a`](https://github.com/aniyomiorg/aniyomi/commit/959f84ab41859f90c458c076d83d363ae086e47f)) ## [v0.16.4.2] - 2024-07-01 ### Fixed - Hotfix to eliminate all proguard issues causing errors and crashes ([@jmir1](https://github.com/jmir1)) ([`a8cd723`](https://github.com/aniyomiorg/aniyomi/commit/a8cd7233dfdf26c98ff86b1871a7ac5774379b5e), [`a7644c2`](https://github.com/aniyomiorg/aniyomi/commit/a7644c268153fc0b9f10c27202591f960c6f6384), [`5045fa1`](https://github.com/aniyomiorg/aniyomi/commit/5045fa18ce5a1faa2130f1a33609e43d8453f078)) ## [v0.16.4.1] - 2024-07-01 ### Fixed - Hotfix release to address errors with extensions ([@jmir1](https://github.com/jmir1)) ([`98d2528`](https://github.com/aniyomiorg/aniyomi/commit/98d252866e17beba7d9a4d094797e23c05ead6c1)) ## [v0.16.4.0] - 2024-07-01 ### Fixed - Fix pip not broadcasting intent in A14+ ([@quickdesh](https://github.com/quickdesh)) ([#1603](https://github.com/aniyomiorg/aniyomi/pull/1603)) - Fix advanced player settings crash in android ≤ 10 ([@perokhe](https://github.com/perokhe)) ([#1627](https://github.com/aniyomiorg/aniyomi/pull/1627)) ### Improved - Hide the skip intro button if the skipped amount == 0 ([@abdallahmehiz](https://github.com/abdallahmehiz)) ([#1598](https://github.com/aniyomiorg/aniyomi/pull/1598)) ### Other - Merge from mihon until mihon 0.16.2 ([@Secozzi](https://github.com/Secozzi)) ([#1578](https://github.com/aniyomiorg/aniyomi/pull/1578)) - Merge from mihon until 0.16.4 ([@Secozzi](https://github.com/Secozzi)) ([#1601](https://github.com/aniyomiorg/aniyomi/pull/1601)) ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community moderators are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community moderators have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community moderators responsible for enforcement at the [Tachiyomi Discord server](https://discord.gg/tachiyomi). All complaints will be reviewed and investigated promptly and fairly. All community moderators are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community moderators will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community moderators, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, available at [v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html). Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). For answers to common questions about this code of conduct, see the FAQ at [FAQ](https://www.contributor-covenant.org/faq). Translations are available at [translations](https://www.contributor-covenant.org/translations). ================================================ FILE: CONTRIBUTING.md ================================================ Looking to report an issue/bug or make a feature request? Please refer to the [README file](https://github.com/aniyomiorg/aniyomi#issues-feature-requests-and-contributing). --- Thanks for your interest in contributing to Aniyomi! # Code contributions Pull requests are welcome! If you're interested in taking on [an open issue](https://github.com/aniyomiorg/aniyomi/issues), please comment on it so others are aware. You do not need to ask for permission nor an assignment. ## Prerequisites Before you start, please note that the ability to use following technologies is **required** and that existing contributors will not actively teach them to you. - Basic [Android development](https://developer.android.com/) - [Kotlin](https://kotlinlang.org/) ### Tools - [Android Studio](https://developer.android.com/studio) - Emulator or phone with developer options enabled to test changes. ## Getting help - Join [the Discord server](https://discord.gg/F32UjdJZrR) for online help and to ask questions while developing. # Translations Translations are done externally via Weblate. See [our website](https://aniyomi.org/docs/contribute#translation) for more details. # Forks Forks are allowed so long as they abide by [the project's LICENSE](https://github.com/aniyomiorg/aniyomi/blob/main/LICENSE). When creating a fork, remember to: - To avoid confusion with the main app: - Change the app name - Change the app icon - Change or disable the [app update checker](https://github.com/aniyomiorg/aniyomi/blob/main/app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt) - To avoid installation conflicts: - Change the `applicationId` in [`build.gradle.kts`](https://github.com/aniyomiorg/aniyomi/blob/main/app/build.gradle.kts) - To avoid having your data polluting the main app's analytics and crash report services: - If you want to use Firebase analytics, replace [`google-services.json`](https://github.com/aniyomiorg/aniyomi/blob/main/app/src/standard/google-services.json) with your own - If you want to use ACRA crash reporting, replace the `ACRA_URI` endpoint in [`build.gradle.kts`](https://github.com/aniyomiorg/aniyomi/blob/main/app/build.gradle.kts) with your own ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS ================================================ FILE: README.md ================================================
Aniyomi logo # Aniyomi [App](#) ### Full-featured player and reader, based on ~~Tachiyomi~~ Mihon. Discover and watch anime, cartoons, series, and more – easier than ever on your Android device. [![Discord server](https://img.shields.io/discord/841701076242530374.svg?label=&labelColor=6A7EC2&color=7389D8&logo=discord&logoColor=FFFFFF)](https://discord.gg/F32UjdJZrR) [![GitHub downloads](https://img.shields.io/github/downloads/aniyomiorg/aniyomi/total?label=downloads&labelColor=27303D&color=0D1117&logo=github&logoColor=FFFFFF&style=flat)](https://github.com/aniyomiorg/aniyomi/releases) [![CI](https://img.shields.io/github/actions/workflow/status/aniyomiorg/aniyomi/build_push.yml?labelColor=27303D)](https://github.com/aniyomiorg/aniyomi/actions/workflows/build_push.yml) [![License: Apache-2.0](https://img.shields.io/github/license/aniyomiorg/aniyomi?labelColor=27303D&color=818cf8)](/LICENSE) [![Translation status](https://img.shields.io/weblate/progress/aniyomi?labelColor=27303D&color=946300)](https://hosted.weblate.org/engage/aniyomi/) ## Download [![Aniyomi Stable](https://img.shields.io/github/release/aniyomiorg/aniyomi.svg?maxAge=3600&label=Stable&labelColor=06599d&color=043b69)](https://github.com/aniyomiorg/aniyomi/releases) [![Aniyomi Preview](https://img.shields.io/github/v/release/aniyomiorg/aniyomi-preview.svg?maxAge=3600&label=Beta&labelColor=2c2c47&color=1c1c39)](https://github.com/aniyomiorg/aniyomi-preview/releases) *Requires Android 8.0 or higher.* ## Features
* Local reading and watching of content. * A configurable reader with multiple viewers, reading directions and other settings. * A configurable player built on mpv-android with multiple options and settings. * Tracker support: [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.app/), [MangaUpdates](https://mangaupdates.com), [Shikimori](https://shikimori.one), [Simkl](https://simkl.com/), and [Bangumi](https://bgm.tv/) support. * Categories to organize your library. * Light and dark themes. * Schedule updating your library for new chapters/episodes. * Create backups locally to read/watch offline or to your desired cloud service. * Plus much more...
## Contributing [Code of conduct](./CODE_OF_CONDUCT.md) · [Contributing guide](./CONTRIBUTING.md) Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Before reporting a new issue, take a look at the [FAQ](https://aniyomi.org/docs/faq/general), the [changelog](https://aniyomi.org/changelogs/) and the already opened [issues](https://github.com/aniyomiorg/aniyomi/issues); if you got any questions, join our [Discord server](https://discord.gg/F32UjdJZrR). ### Repositories [![aniyomiorg/aniyomi-website - GitHub](https://github-readme-stats.vercel.app/api/pin/?username=aniyomiorg&repo=aniyomi-website&bg_color=161B22&text_color=c9d1d9&title_color=818cf8&icon_color=818cf8&border_radius=8&hide_border=true&description_lines_count=2)](https://github.com/aniyomiorg/aniyomi-website/) [![aniyomiorg/aniyomi-mpv-lib - GitHub](https://github-readme-stats.vercel.app/api/pin/?username=aniyomiorg&repo=aniyomi-mpv-lib&bg_color=161B22&text_color=c9d1d9&title_color=818cf8&icon_color=818cf8&border_radius=8&hide_border=true&description_lines_count=2)](https://github.com/aniyomiorg/aniyomi-mpv-lib/) ### Credits Thank you to all the people who have contributed! Aniyomi app contributors ### Disclaimer The developer(s) of this application does not have any affiliation with the content providers available, and this application hosts zero content. ### License
Copyright © 2015 Javier Tomás
Copyright © 2024 Mihon Open Source Project
Copyright © 2024 Aniyomi Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================ FILE: app/.idea/.gitignore ================================================ # Default ignored files /shelf/ /workspace.xml ================================================ FILE: app/.idea/.name ================================================ MangaDownloader.kt ================================================ FILE: app/.idea/discord.xml ================================================ ================================================ FILE: app/.idea/gradle.xml ================================================ ================================================ FILE: app/.idea/misc.xml ================================================ ================================================ FILE: app/.idea/vcs.xml ================================================ ================================================ FILE: app/build.gradle.kts ================================================ import mihon.buildlogic.Config import mihon.buildlogic.getBuildTime import mihon.buildlogic.getCommitCount import mihon.buildlogic.getGitSha plugins { id("mihon.android.application") id("mihon.android.application.compose") id("com.github.zellius.shortcut-helper") kotlin("plugin.serialization") alias(libs.plugins.aboutLibraries) } shortcutHelper.setFilePath("./shortcuts.xml") android { namespace = "eu.kanade.tachiyomi" defaultConfig { applicationId = "xyz.jmir.tachiyomi.mi" versionCode = 131 versionName = "0.18.1.2" buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"") buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLastCommitTime = false)}\"") buildConfigField("boolean", "UPDATER_ENABLED", "${Config.enableUpdater}") // Put these fields in acra.properties // val acraProperties = Properties() // rootProject.file("acra.properties") // .takeIf { it.exists() } // ?.let { acraProperties.load(FileInputStream(it)) } // val acraUri = acraProperties.getProperty("ACRA_URI", "") // val acraLogin = acraProperties.getProperty("ACRA_LOGIN", "") // val acraPassword = acraProperties.getProperty("ACRA_PASSWORD", "") // buildConfigField("String", "ACRA_URI", "\"$acraUri\"") // buildConfigField("String", "ACRA_LOGIN", "\"$acraLogin\"") // buildConfigField("String", "ACRA_PASSWORD", "\"$acraPassword\"") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { val debug by getting { applicationIdSuffix = ".dev" versionNameSuffix = "-${getCommitCount()}" isPseudoLocalesEnabled = true } val release by getting { isMinifyEnabled = Config.enableCodeShrink isShrinkResources = Config.enableCodeShrink proguardFiles("proguard-android-optimize.txt", "proguard-rules.pro") buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLastCommitTime = true)}\"") } val commonMatchingFallbacks = listOf(release.name) create("preview") { initWith(release) applicationIdSuffix = ".debug" versionNameSuffix = debug.versionNameSuffix signingConfig = debug.signingConfig matchingFallbacks.addAll(commonMatchingFallbacks) buildConfigField("String", "BUILD_TIME", "\"${getBuildTime(useLastCommitTime = false)}\"") } create("benchmark") { initWith(release) isDebuggable = false isProfileable = true versionNameSuffix = "-benchmark" applicationIdSuffix = ".benchmark" signingConfig = debug.signingConfig matchingFallbacks.addAll(commonMatchingFallbacks) } } sourceSets { getByName("preview").res.srcDirs("src/debug/res") getByName("benchmark").res.srcDirs("src/debug/res") } splits { abi { isEnable = true isUniversalApk = true reset() include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") } } packaging { jniLibs { keepDebugSymbols += listOf( "libandroidx.graphics.path", "libarchive-jni", "libavcodec", "libavdevice", "libavfilter", "libavformat", "libavutil", "libconscrypt_jni", "libc++_shared", "libffmpegkit_abidetect", "libffmpegkit", "libimagedecoder", "libmpv", "libplayer", "libpostproc", "libquickjs", "libsqlite3x", "libswresample", "libswscale", "libxml2", ) .map { "**/$it.so" } } resources { excludes += setOf( "kotlin-tooling-metadata.json", "LICENSE.txt", "META-INF/**/*.properties", "META-INF/**/LICENSE.txt", "META-INF/*.properties", "META-INF/*.version", "META-INF/DEPENDENCIES", "META-INF/LICENSE", "META-INF/NOTICE", "META-INF/README.md", ) } } dependenciesInfo { includeInApk = Config.includeDependencyInfo includeInBundle = Config.includeDependencyInfo } buildFeatures { viewBinding = true buildConfig = true // Disable some unused things aidl = false renderScript = false shaders = false } lint { abortOnError = false checkReleaseBuilds = false } } kotlin { compilerOptions { freeCompilerArgs.addAll( "-opt-in=androidx.compose.animation.ExperimentalAnimationApi", "-opt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi", "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi", "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi", "-opt-in=coil3.annotation.ExperimentalCoilApi", "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", "-opt-in=kotlinx.coroutines.FlowPreview", "-opt-in=kotlinx.coroutines.InternalCoroutinesApi", "-opt-in=kotlinx.serialization.ExperimentalSerializationApi", ) } } dependencies { implementation(projects.i18n) implementation(projects.i18nAniyomi) implementation(projects.core.archive) implementation(projects.core.common) implementation(projects.coreMetadata) implementation(projects.sourceApi) implementation(projects.sourceLocal) implementation(projects.data) implementation(projects.domain) implementation(projects.presentationCore) implementation(projects.presentationWidget) // Compose implementation(compose.activity) implementation(compose.foundation) implementation(compose.material3.core) implementation(compose.material.icons) implementation(compose.animation) implementation(compose.animation.graphics) debugImplementation(compose.ui.tooling) implementation(compose.ui.tooling.preview) implementation(compose.ui.util) implementation(androidx.interpolator) implementation(androidx.paging.runtime) implementation(androidx.paging.compose) implementation(libs.bundles.sqlite) implementation(kotlinx.reflect) implementation(kotlinx.immutables) implementation(platform(kotlinx.coroutines.bom)) implementation(kotlinx.bundles.coroutines) // AndroidX libraries implementation(androidx.annotation) implementation(androidx.appcompat) implementation(androidx.biometricktx) implementation(androidx.constraintlayout) implementation(aniyomilibs.compose.constraintlayout) implementation(androidx.corektx) implementation(androidx.splashscreen) implementation(androidx.recyclerview) implementation(androidx.viewpager) implementation(androidx.profileinstaller) implementation(aniyomilibs.mediasession) implementation(androidx.bundles.lifecycle) // Job scheduling implementation(androidx.workmanager) // RxJava implementation(libs.rxjava) // Networking implementation(libs.bundles.okhttp) implementation(libs.okio) implementation(libs.conscrypt.android) // TLS 1.3 support for Android < 10 // Data serialization (JSON, protobuf, xml) implementation(kotlinx.bundles.serialization) // HTML parser implementation(libs.jsoup) // Disk implementation(libs.disklrucache) implementation(libs.unifile) // Preferences implementation(libs.preferencektx) // Dependency injection implementation(libs.injekt) // Image loading implementation(platform(libs.coil.bom)) implementation(libs.bundles.coil) implementation(libs.subsamplingscaleimageview) { exclude(module = "image-decoder") } implementation(libs.image.decoder) // UI libraries implementation(libs.material) implementation(libs.flexible.adapter.core) implementation(libs.photoview) implementation(libs.directionalviewpager) { exclude(group = "androidx.viewpager", module = "viewpager") } implementation(libs.insetter) implementation(libs.bundles.richtext) implementation(libs.aboutLibraries.compose) implementation(libs.bundles.voyager) implementation(libs.compose.materialmotion) implementation(libs.swipe) implementation(libs.compose.webview) implementation(libs.compose.grid) implementation(libs.reorderable) // Logging implementation(libs.logcat) // Shizuku implementation(libs.bundles.shizuku) // Tests testImplementation(libs.bundles.test) // For detecting memory leaks; see https://square.github.io/leakcanary/ // debugImplementation(libs.leakcanary.android) implementation(libs.leakcanary.plumber) testImplementation(kotlinx.coroutines.test) // mpv-android implementation(aniyomilibs.aniyomi.mpv) // FFmpeg-kit implementation(aniyomilibs.ffmpeg.kit) implementation(aniyomilibs.arthenica.smartexceptions) // seeker seek bar implementation(aniyomilibs.seeker) // true type parser implementation(aniyomilibs.truetypeparser) } androidComponents { beforeVariants { variantBuilder -> // Disables standardBenchmark if (variantBuilder.buildType == "benchmark") { variantBuilder.enable = variantBuilder.productFlavors.containsAll( listOf("default" to "dev"), ) } } onVariants(selector().withFlavor("default" to "standard")) { // Only excluding in standard flavor because this breaks // Layout Inspector's Compose tree it.packaging.resources.excludes.add("META-INF/*.version") } } buildscript { dependencies { classpath(kotlinx.gradle) } } ================================================ FILE: app/proguard-android-optimize.txt ================================================ -dontusemixedcaseclassnames -ignorewarnings -verbose -keepattributes *Annotation* -keepclasseswithmembernames,includedescriptorclasses class * { native ; } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keepclassmembers class * implements android.os.Parcelable { public static final ** CREATOR; } -keep class androidx.annotation.Keep -keep @androidx.annotation.Keep class * {*;} -keepclasseswithmembers class * { @androidx.annotation.Keep ; } -keepclasseswithmembers class * { @androidx.annotation.Keep ; } -keepclasseswithmembers class * { @androidx.annotation.Keep (...); } ================================================ FILE: app/proguard-rules.pro ================================================ -dontobfuscate -keep,allowoptimization class eu.kanade.** -keep,allowoptimization class tachiyomi.** -keep,allowoptimization class mihon.** # Keep common dependencies used in extensions -keep,allowoptimization class androidx.preference.** { public protected *; } -keep,allowoptimization class android.content.** { *; } -keep,allowoptimization class uy.kohesive.injekt.** { public protected *; } -keep,allowoptimization class android.test.base.** { *; } -keep,allowoptimization class kotlin.** { public protected *; } -keep,allowoptimization class kotlinx.coroutines.** { public protected *; } -keep,allowoptimization class kotlinx.serialization.** { public protected *; } -keep,allowoptimization class okhttp3.** { public protected *; } -keep,allowoptimization class okio.** { public protected *; } -keep,allowoptimization class org.jsoup.** { public protected *; } -keep,allowoptimization class rx.** { public protected *; } -keep,allowoptimization class app.cash.quickjs.** { public protected *; } -keep,allowoptimization class uy.kohesive.injekt.** { public protected *; } -keep,allowoptimization class is.xyz.mpv.** { public protected *; } -keep,allowoptimization class com.arthenica.** { public protected *; } # From extensions-lib -keep,allowoptimization class eu.kanade.tachiyomi.network.interceptor.RateLimitInterceptorKt { public protected *; } -keep,allowoptimization class eu.kanade.tachiyomi.network.interceptor.SpecificHostRateLimitInterceptorKt { public protected *; } -keep,allowoptimization class eu.kanade.tachiyomi.network.NetworkHelper { public protected *; } -keep,allowoptimization class eu.kanade.tachiyomi.network.OkHttpExtensionsKt { public protected *; } -keep,allowoptimization class eu.kanade.tachiyomi.network.RequestsKt { public protected *; } -keep,allowoptimization class eu.kanade.tachiyomi.AppInfo { public protected *; } ##---------------Begin: proguard configuration for RxJava 1.x ---------- -dontwarn sun.misc.** -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; } -dontnote rx.internal.util.PlatformDependent ##---------------End: proguard configuration for RxJava 1.x ---------- ##---------------Begin: proguard configuration for okhttp ---------- -keepclasseswithmembers class okhttp3.MultipartBody$Builder { *; } ##---------------End: proguard configuration for okhttp ---------- ##---------------Begin: proguard configuration for kotlinx.serialization ---------- -keepattributes *Annotation*, InnerClasses -dontnote kotlinx.serialization.** # core serialization annotations # kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer -keepclassmembers class kotlinx.serialization.json.** { *** Companion; } -keepclasseswithmembers class kotlinx.serialization.json.** { kotlinx.serialization.KSerializer serializer(...); } -keep,includedescriptorclasses class eu.kanade.**$$serializer { *; } -keepclassmembers class eu.kanade.** { *** Companion; } -keepclasseswithmembers class eu.kanade.** { kotlinx.serialization.KSerializer serializer(...); } -keep class kotlinx.serialization.** -keepclassmembers class kotlinx.serialization.** { ; } ##---------------End: proguard configuration for kotlinx.serialization ---------- # XmlUtil -keep public enum nl.adaptivity.xmlutil.EventType { *; } ================================================ FILE: app/shortcuts.xml ================================================ ================================================ FILE: app/src/debug/res/drawable/ic_launcher_foreground.xml ================================================ ================================================ FILE: app/src/debug/res/mipmap/ic_launcher.xml ================================================ ================================================ FILE: app/src/debug/res/mipmap/ic_launcher_round.xml ================================================ ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/assets/aniyomi.lua ================================================ aniyomi = {} -- UI function aniyomi.show_text(text) mp.set_property("user-data/aniyomi/show_text", text) end function aniyomi.hide_ui() mp.set_property("user-data/aniyomi/toggle_ui", "hide") end function aniyomi.show_ui() mp.set_property("user-data/aniyomi/toggle_ui", "show") end function aniyomi.toggle_ui() mp.set_property("user-data/aniyomi/toggle_ui", "toggle") end function aniyomi.show_subtitle_settings() mp.set_property("user-data/aniyomi/show_panel", "subtitle_settings") end function aniyomi.show_subtitle_delay() mp.set_property("user-data/aniyomi/show_panel", "subtitle_delay") end function aniyomi.show_audio_delay() mp.set_property("user-data/aniyomi/show_panel", "audio_delay") end function aniyomi.show_video_filters() mp.set_property("user-data/aniyomi/show_panel", "video_filters") end function aniyomi.show_software_keyboard() mp.set_property("user-data/aniyomi/software_keyboard", "show") end function aniyomi.hide_software_keyboard() mp.set_property("user-data/aniyomi/software_keyboard", "hide") end function aniyomi.toggle_software_keyboard() mp.set_property("user-data/aniyomi/software_keyboard", "toggle") end -- Custom buttons function aniyomi.set_button_title(text) mp.set_property("user-data/aniyomi/set_button_title", text) end function aniyomi.reset_button_title() mp.set_property("user-data/aniyomi/reset_button_title", "unused") end function aniyomi.hide_button() mp.set_property("user-data/aniyomi/toggle_button", "hide") end function aniyomi.show_button() mp.set_property("user-data/aniyomi/toggle_button", "show") end function aniyomi.toggle_button() mp.set_property("user-data/aniyomi/toggle_button", "toggle") end -- Controls function aniyomi.previous_episode() mp.set_property("user-data/aniyomi/switch_episode", "p") end function aniyomi.next_episode() mp.set_property("user-data/aniyomi/switch_episode", "n") end function aniyomi.pause() mp.set_property("user-data/aniyomi/pause", "pause") end function aniyomi.unpause() mp.set_property("user-data/aniyomi/pause", "unpause") end function aniyomi.pauseunpause() mp.set_property("user-data/aniyomi/pause", "pauseunpause") end function aniyomi.seek_by(value) mp.set_property("user-data/aniyomi/seek_by", value) end function aniyomi.seek_to(value) mp.set_property("user-data/aniyomi/seek_to", value) end function aniyomi.seek_by_with_text(value, text) mp.set_property("user-data/aniyomi/seek_by_with_text", value .. "|" .. text) end function aniyomi.seek_to_with_text(value, text) mp.set_property("user-data/aniyomi/seek_to_with_text", value .. "|" .. text) end function aniyomi.int_picker(title, name_format, start, stop, step, property) mp.set_property("user-data/aniyomi/launch_int_picker", title .. "|" .. name_format .. "|" .. start .. "|" .. stop .. "|" .. step .. "|" .. property) end -- Legacy function aniyomi.left_seek_by(value) aniyomi.seek_by(-value) end function aniyomi.right_seek_by(value) aniyomi.seek_by(value) end return aniyomi ================================================ FILE: app/src/main/baseline-prof.txt ================================================ Landroidx/activity/Cancellable; Landroidx/activity/ComponentActivity; PLandroidx/activity/ComponentActivity;->$r8$lambda$OnwlVMZzrLePIRy-6IUDTtLLUV0(Landroidx/activity/ComponentActivity;)Landroid/os/Bundle; HSPLandroidx/activity/ComponentActivity;->$r8$lambda$h2i_RK2mddCIbAsGubaI4eL8_cU(Landroidx/activity/ComponentActivity;)V PLandroidx/activity/ComponentActivity;->$r8$lambda$h2i_RK2mddCIbAsGubaI4eL8_cU(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity;->()V HPLandroidx/activity/ComponentActivity;->()V HSPLandroidx/activity/ComponentActivity;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V PLandroidx/activity/ComponentActivity;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V HSPLandroidx/activity/ComponentActivity;->addOnNewIntentListener(Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0;)V PLandroidx/activity/ComponentActivity;->addOnNewIntentListener(Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0;)V HSPLandroidx/activity/ComponentActivity;->ensureViewModelStore()V PLandroidx/activity/ComponentActivity;->ensureViewModelStore()V HSPLandroidx/activity/ComponentActivity;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; PLandroidx/activity/ComponentActivity;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; HSPLandroidx/activity/ComponentActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; PLandroidx/activity/ComponentActivity;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; HSPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/Lifecycle; HPLandroidx/activity/ComponentActivity;->getLifecycle()Landroidx/lifecycle/Lifecycle; HSPLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; PLandroidx/activity/ComponentActivity;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; HSPLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/activity/ComponentActivity;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; HSPLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; PLandroidx/activity/ComponentActivity;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; HSPLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/activity/ComponentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/activity/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V PLandroidx/activity/ComponentActivity;->onTrimMemory(I)V PLandroidx/activity/ComponentActivity;->removeOnNewIntentListener(Landroidx/core/util/Consumer;)V Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0; HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;->(Landroidx/fragment/app/FragmentActivity;)V Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda1; HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda1;->saveState()Landroid/os/Bundle; Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda2; HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->(Landroidx/fragment/app/FragmentActivity;)V HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->onContextAvailable(Landroid/content/Context;)V PLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda2;->onContextAvailable(Landroid/content/Context;)V Landroidx/activity/ComponentActivity$1; HSPLandroidx/activity/ComponentActivity$1;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$1;->(Landroidx/fragment/app/FragmentActivity;)V Landroidx/activity/ComponentActivity$2; HSPLandroidx/activity/ComponentActivity$2;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$2;->(Landroidx/fragment/app/FragmentActivity;)V Landroidx/activity/ComponentActivity$3; HSPLandroidx/activity/ComponentActivity$3;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$3;->(Landroidx/fragment/app/FragmentActivity;)V HSPLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/activity/ComponentActivity$4; HSPLandroidx/activity/ComponentActivity$4;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$4;->(Landroidx/fragment/app/FragmentActivity;)V HSPLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/activity/ComponentActivity$5; HSPLandroidx/activity/ComponentActivity$5;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$5;->(Landroidx/fragment/app/FragmentActivity;)V HSPLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/activity/ComponentActivity$NonConfigurationInstances; Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl; HSPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->(Landroidx/fragment/app/FragmentActivity;)V PLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->(Landroidx/fragment/app/FragmentActivity;)V Landroidx/activity/ComponentDialog$$ExternalSyntheticLambda0; HSPLandroidx/activity/ComponentDialog$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLandroidx/activity/ComponentDialog$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V Landroidx/activity/FullyDrawnReporter; HSPLandroidx/activity/FullyDrawnReporter;->(Ljava/util/concurrent/Executor;Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;)V PLandroidx/activity/FullyDrawnReporter;->(Ljava/util/concurrent/Executor;Landroidx/activity/ComponentActivity$$ExternalSyntheticLambda0;)V Landroidx/activity/OnBackPressedCallback; HSPLandroidx/activity/OnBackPressedCallback;->(Z)V PLandroidx/activity/OnBackPressedCallback;->(Z)V HSPLandroidx/activity/OnBackPressedCallback;->addCancellable(Landroidx/activity/Cancellable;)V HPLandroidx/activity/OnBackPressedCallback;->addCancellable(Landroidx/activity/Cancellable;)V HSPLandroidx/activity/OnBackPressedCallback;->remove()V HPLandroidx/activity/OnBackPressedCallback;->remove()V HSPLandroidx/activity/OnBackPressedCallback;->removeCancellable(Landroidx/activity/Cancellable;)V HPLandroidx/activity/OnBackPressedCallback;->removeCancellable(Landroidx/activity/Cancellable;)V HSPLandroidx/activity/OnBackPressedCallback;->setEnabled(Z)V PLandroidx/activity/OnBackPressedCallback;->setEnabled(Z)V Landroidx/activity/OnBackPressedDispatcher; HSPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V PLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V HSPLandroidx/activity/OnBackPressedDispatcher;->access$getOnBackPressedCallbacks$p(Landroidx/activity/OnBackPressedDispatcher;)Lkotlin/collections/ArrayDeque; PLandroidx/activity/OnBackPressedDispatcher;->access$getOnBackPressedCallbacks$p(Landroidx/activity/OnBackPressedDispatcher;)Lkotlin/collections/ArrayDeque; HSPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V HPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V HSPLandroidx/activity/OnBackPressedDispatcher;->addCancellableCallback$activity_release(Landroidx/activity/OnBackPressedCallback;)Landroidx/activity/Cancellable; HPLandroidx/activity/OnBackPressedDispatcher;->addCancellableCallback$activity_release(Landroidx/activity/OnBackPressedCallback;)Landroidx/activity/Cancellable; Landroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable; HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;Landroidx/activity/OnBackPressedCallback;)V HPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;Landroidx/activity/OnBackPressedCallback;)V HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V PLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable; HSPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V HPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V HSPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V PLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V Landroidx/activity/OnBackPressedDispatcherKt; HSPLandroidx/activity/OnBackPressedDispatcherKt;->get(Landroid/view/View;)Landroidx/activity/OnBackPressedDispatcherOwner; PLandroidx/activity/OnBackPressedDispatcherKt;->get(Landroid/view/View;)Landroidx/activity/OnBackPressedDispatcherOwner; Landroidx/activity/OnBackPressedDispatcherOwner; Landroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1; HSPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1;->()V PLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1;->()V HSPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1;->(I)V PLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1;->(I)V HSPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner$findViewTreeOnBackPressedDispatcherOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/activity/compose/BackHandlerKt; HSPLandroidx/activity/compose/BackHandlerKt;->BackHandler(ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HPLandroidx/activity/compose/BackHandlerKt;->BackHandler(ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V Landroidx/activity/compose/BackHandlerKt$BackHandler$1$1; HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$1$1;->(Landroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1;Z)V PLandroidx/activity/compose/BackHandlerKt$BackHandler$1$1;->(Landroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1;Z)V HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$1$1;->invoke()Ljava/lang/Object; HPLandroidx/activity/compose/BackHandlerKt$BackHandler$1$1;->invoke()Ljava/lang/Object; Landroidx/activity/compose/BackHandlerKt$BackHandler$2; HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$2;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1;)V PLandroidx/activity/compose/BackHandlerKt$BackHandler$2;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1;)V HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/activity/compose/BackHandlerKt$BackHandler$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/activity/compose/BackHandlerKt$BackHandler$2$invoke$$inlined$onDispose$1; HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$2$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;I)V PLandroidx/activity/compose/BackHandlerKt$BackHandler$2$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;I)V HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$2$invoke$$inlined$onDispose$1;->dispose()V PLandroidx/activity/compose/BackHandlerKt$BackHandler$2$invoke$$inlined$onDispose$1;->dispose()V Landroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1; HSPLandroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1;->(ZLandroidx/compose/runtime/MutableState;)V PLandroidx/activity/compose/BackHandlerKt$BackHandler$backCallback$1$1;->(ZLandroidx/compose/runtime/MutableState;)V Landroidx/activity/compose/ComponentActivityKt; HSPLandroidx/activity/compose/ComponentActivityKt;->()V PLandroidx/activity/compose/ComponentActivityKt;->()V HSPLandroidx/activity/compose/ComponentActivityKt;->setContent(Landroidx/activity/ComponentActivity;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLandroidx/activity/compose/ComponentActivityKt;->setContent(Landroidx/activity/ComponentActivity;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V Landroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1; HSPLandroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1;->()V PLandroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1;->()V HSPLandroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1;->(I)V PLandroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1;->(I)V HSPLandroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1;->invoke()Ljava/lang/Object; PLandroidx/activity/compose/LocalActivityResultRegistryOwner$LocalComposition$1;->invoke()Ljava/lang/Object; Landroidx/activity/compose/LocalOnBackPressedDispatcherOwner; HSPLandroidx/activity/compose/LocalOnBackPressedDispatcherOwner;->()V PLandroidx/activity/compose/LocalOnBackPressedDispatcherOwner;->()V HSPLandroidx/activity/compose/LocalOnBackPressedDispatcherOwner;->getCurrent(Landroidx/compose/runtime/Composer;)Landroidx/activity/OnBackPressedDispatcherOwner; HPLandroidx/activity/compose/LocalOnBackPressedDispatcherOwner;->getCurrent(Landroidx/compose/runtime/Composer;)Landroidx/activity/OnBackPressedDispatcherOwner; Landroidx/activity/contextaware/ContextAwareHelper; HSPLandroidx/activity/contextaware/ContextAwareHelper;->()V PLandroidx/activity/contextaware/ContextAwareHelper;->()V HSPLandroidx/activity/contextaware/ContextAwareHelper;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V PLandroidx/activity/contextaware/ContextAwareHelper;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V PLandroidx/activity/contextaware/ContextAwareHelper;->clearAvailableContext()V HSPLandroidx/activity/contextaware/ContextAwareHelper;->dispatchOnContextAvailable(Landroid/content/Context;)V HPLandroidx/activity/contextaware/ContextAwareHelper;->dispatchOnContextAvailable(Landroid/content/Context;)V Landroidx/activity/contextaware/OnContextAvailableListener; Landroidx/activity/result/ActivityResult; Landroidx/activity/result/ActivityResultCallback; Landroidx/activity/result/ActivityResultLauncher; HSPLandroidx/activity/result/ActivityResultLauncher;->()V PLandroidx/activity/result/ActivityResultLauncher;->()V Landroidx/activity/result/ActivityResultRegistry; HSPLandroidx/activity/result/ActivityResultRegistry;->()V PLandroidx/activity/result/ActivityResultRegistry;->()V HPLandroidx/activity/result/ActivityResultRegistry;->onSaveInstanceState(Landroid/os/Bundle;)V HSPLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; PLandroidx/activity/result/ActivityResultRegistry;->register(Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher; HSPLandroidx/activity/result/ActivityResultRegistry;->registerKey(Ljava/lang/String;)V HPLandroidx/activity/result/ActivityResultRegistry;->registerKey(Ljava/lang/String;)V HPLandroidx/activity/result/ActivityResultRegistry;->unregister(Ljava/lang/String;)V Landroidx/activity/result/ActivityResultRegistry$2; HSPLandroidx/activity/result/ActivityResultRegistry$2;->(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;I)V PLandroidx/activity/result/ActivityResultRegistry$2;->(Landroidx/activity/result/ActivityResultRegistry;Ljava/lang/String;Landroidx/activity/result/contract/ActivityResultContract;I)V PLandroidx/activity/result/ActivityResultRegistry$2;->unregister()V Landroidx/activity/result/ActivityResultRegistry$CallbackAndContract; HSPLandroidx/activity/result/ActivityResultRegistry$CallbackAndContract;->(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)V PLandroidx/activity/result/ActivityResultRegistry$CallbackAndContract;->(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)V Landroidx/activity/result/ActivityResultRegistryOwner; Landroidx/activity/result/contract/ActivityResultContract; HSPLandroidx/activity/result/contract/ActivityResultContract;->()V PLandroidx/activity/result/contract/ActivityResultContract;->()V Landroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions; HSPLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions;->()V PLandroidx/activity/result/contract/ActivityResultContracts$RequestMultiplePermissions;->()V Landroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult; HSPLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult;->()V PLandroidx/activity/result/contract/ActivityResultContracts$StartActivityForResult;->()V Landroidx/appcompat/R$styleable; HSPLandroidx/appcompat/R$styleable;->()V PLandroidx/appcompat/R$styleable;->()V Landroidx/appcompat/app/ActionBar; HSPLandroidx/appcompat/app/ActionBar;->readLocales(Landroid/content/Context;)Ljava/lang/String; PLandroidx/appcompat/app/ActionBar;->readLocales(Landroid/content/Context;)Ljava/lang/String; Landroidx/appcompat/app/AppCompatActivity; HSPLandroidx/appcompat/app/AppCompatActivity;->()V PLandroidx/appcompat/app/AppCompatActivity;->()V HSPLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/content/Context;)V PLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/content/Context;)V HSPLandroidx/appcompat/app/AppCompatActivity;->findViewById(I)Landroid/view/View; PLandroidx/appcompat/app/AppCompatActivity;->findViewById(I)Landroid/view/View; HSPLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate; PLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate; HSPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources; HPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources; HSPLandroidx/appcompat/app/AppCompatActivity;->initViewTreeOwners()V HPLandroidx/appcompat/app/AppCompatActivity;->initViewTreeOwners()V HSPLandroidx/appcompat/app/AppCompatActivity;->onContentChanged()V PLandroidx/appcompat/app/AppCompatActivity;->onContentChanged()V PLandroidx/appcompat/app/AppCompatActivity;->onDestroy()V HSPLandroidx/appcompat/app/AppCompatActivity;->onPostCreate(Landroid/os/Bundle;)V PLandroidx/appcompat/app/AppCompatActivity;->onPostCreate(Landroid/os/Bundle;)V HSPLandroidx/appcompat/app/AppCompatActivity;->onPostResume()V PLandroidx/appcompat/app/AppCompatActivity;->onPostResume()V HSPLandroidx/appcompat/app/AppCompatActivity;->onStart()V PLandroidx/appcompat/app/AppCompatActivity;->onStart()V PLandroidx/appcompat/app/AppCompatActivity;->onStop()V HSPLandroidx/appcompat/app/AppCompatActivity;->onTitleChanged(Ljava/lang/CharSequence;I)V PLandroidx/appcompat/app/AppCompatActivity;->onTitleChanged(Ljava/lang/CharSequence;I)V HSPLandroidx/appcompat/app/AppCompatActivity;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V PLandroidx/appcompat/app/AppCompatActivity;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/appcompat/app/AppCompatActivity;->setTheme(I)V PLandroidx/appcompat/app/AppCompatActivity;->setTheme(I)V Landroidx/appcompat/app/AppCompatActivity$1; HSPLandroidx/appcompat/app/AppCompatActivity$1;->(Leu/kanade/tachiyomi/ui/base/activity/BaseActivity;)V PLandroidx/appcompat/app/AppCompatActivity$1;->(Leu/kanade/tachiyomi/ui/base/activity/BaseActivity;)V PLandroidx/appcompat/app/AppCompatActivity$1;->saveState()Landroid/os/Bundle; Landroidx/appcompat/app/AppCompatActivity$2; HSPLandroidx/appcompat/app/AppCompatActivity$2;->(Leu/kanade/tachiyomi/ui/base/activity/BaseActivity;)V PLandroidx/appcompat/app/AppCompatActivity$2;->(Leu/kanade/tachiyomi/ui/base/activity/BaseActivity;)V HSPLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable(Landroid/content/Context;)V PLandroidx/appcompat/app/AppCompatActivity$2;->onContextAvailable(Landroid/content/Context;)V Landroidx/appcompat/app/AppCompatCallback; Landroidx/appcompat/app/AppCompatDelegate; HSPLandroidx/appcompat/app/AppCompatDelegate;->()V PLandroidx/appcompat/app/AppCompatDelegate;->()V HSPLandroidx/appcompat/app/AppCompatDelegate;->()V PLandroidx/appcompat/app/AppCompatDelegate;->()V HSPLandroidx/appcompat/app/AppCompatDelegate;->addActiveDelegate(Landroidx/appcompat/app/AppCompatDelegate;)V PLandroidx/appcompat/app/AppCompatDelegate;->addActiveDelegate(Landroidx/appcompat/app/AppCompatDelegate;)V HSPLandroidx/appcompat/app/AppCompatDelegate;->getDefaultNightMode()I PLandroidx/appcompat/app/AppCompatDelegate;->getDefaultNightMode()I HSPLandroidx/appcompat/app/AppCompatDelegate;->getRequestedAppLocales()Landroidx/core/os/LocaleListCompat; PLandroidx/appcompat/app/AppCompatDelegate;->getRequestedAppLocales()Landroidx/core/os/LocaleListCompat; HSPLandroidx/appcompat/app/AppCompatDelegate;->isAutoStorageOptedIn(Landroid/content/Context;)Z PLandroidx/appcompat/app/AppCompatDelegate;->isAutoStorageOptedIn(Landroid/content/Context;)Z PLandroidx/appcompat/app/AppCompatDelegate;->removeActivityDelegate(Landroidx/appcompat/app/AppCompatDelegate;)V HSPLandroidx/appcompat/app/AppCompatDelegate;->removeDelegateFromActives(Landroidx/appcompat/app/AppCompatDelegate;)V PLandroidx/appcompat/app/AppCompatDelegate;->removeDelegateFromActives(Landroidx/appcompat/app/AppCompatDelegate;)V HSPLandroidx/appcompat/app/AppCompatDelegate;->setDefaultNightMode(I)V PLandroidx/appcompat/app/AppCompatDelegate;->setDefaultNightMode(I)V HSPLandroidx/appcompat/app/AppCompatDelegate;->syncRequestedAndStoredLocales(Landroid/content/Context;)V PLandroidx/appcompat/app/AppCompatDelegate;->syncRequestedAndStoredLocales(Landroid/content/Context;)V Landroidx/appcompat/app/AppCompatDelegateImpl; HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/app/Activity;Landroidx/appcompat/app/AppCompatCallback;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/app/Activity;Landroidx/appcompat/app/AppCompatCallback;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;Ljava/lang/Object;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->(Landroid/content/Context;Landroid/view/Window;Landroidx/appcompat/app/AppCompatCallback;Ljava/lang/Object;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->applyApplicationSpecificConfig(ZZ)Z PLandroidx/appcompat/app/AppCompatDelegateImpl;->applyApplicationSpecificConfig(ZZ)Z HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->attachBaseContext2(Landroid/content/Context;)Landroid/content/Context; PLandroidx/appcompat/app/AppCompatDelegateImpl;->attachBaseContext2(Landroid/content/Context;)Landroid/content/Context; HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->attachToWindow(Landroid/view/Window;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->attachToWindow(Landroid/view/Window;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->calculateApplicationLocales(Landroid/content/Context;)Landroidx/core/os/LocaleListCompat; PLandroidx/appcompat/app/AppCompatDelegateImpl;->calculateApplicationLocales(Landroid/content/Context;)Landroidx/core/os/LocaleListCompat; HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->createOverrideAppConfiguration(Landroid/content/Context;ILandroidx/core/os/LocaleListCompat;Landroid/content/res/Configuration;Z)Landroid/content/res/Configuration; PLandroidx/appcompat/app/AppCompatDelegateImpl;->createOverrideAppConfiguration(Landroid/content/Context;ILandroidx/core/os/LocaleListCompat;Landroid/content/res/Configuration;Z)Landroid/content/res/Configuration; PLandroidx/appcompat/app/AppCompatDelegateImpl;->dismissPopups()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->doInvalidatePanelMenu(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->doInvalidatePanelMenu(I)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V HPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureWindow()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->ensureWindow()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->findViewById(I)Landroid/view/View; PLandroidx/appcompat/app/AppCompatDelegateImpl;->findViewById(I)Landroid/view/View; HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(I)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; PLandroidx/appcompat/app/AppCompatDelegateImpl;->getPanelState(I)Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->initWindowDecorActionBar()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->initWindowDecorActionBar()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->installViewFactory()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->installViewFactory()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->mapNightMode(Landroid/content/Context;I)I PLandroidx/appcompat/app/AppCompatDelegateImpl;->mapNightMode(Landroid/content/Context;I)I HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreate()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreate()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/appcompat/app/AppCompatDelegateImpl;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; PLandroidx/appcompat/app/AppCompatDelegateImpl;->onDestroy()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostCreate()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostCreate()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostResume()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->onPostResume()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->onStart()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->onStart()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->onStop()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->requestWindowFeature(I)Z PLandroidx/appcompat/app/AppCompatDelegateImpl;->requestWindowFeature(I)Z HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTheme(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->setTheme(I)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V PLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V PLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I PLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I Landroidx/appcompat/app/AppCompatDelegateImpl$3; HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; Landroidx/appcompat/app/AppCompatDelegateImpl$4; HSPLandroidx/appcompat/app/AppCompatDelegateImpl$4;->(Landroidx/appcompat/app/AppCompatDelegateImpl;I)V PLandroidx/appcompat/app/AppCompatDelegateImpl$4;->(Landroidx/appcompat/app/AppCompatDelegateImpl;I)V PLandroidx/appcompat/app/AppCompatDelegateImpl$4;->onDetachedFromWindow()V Landroidx/appcompat/app/AppCompatDelegateImpl$Api24Impl; HSPLandroidx/appcompat/app/AppCompatDelegateImpl$Api24Impl;->getLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; PLandroidx/appcompat/app/AppCompatDelegateImpl$Api24Impl;->getLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->(Landroidx/appcompat/app/AppCompatDelegateImpl;Landroid/view/Window$Callback;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->(Landroidx/appcompat/app/AppCompatDelegateImpl;Landroid/view/Window$Callback;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->bypassOnContentChanged(Landroid/view/Window$Callback;)V PLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->bypassOnContentChanged(Landroid/view/Window$Callback;)V HSPLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onContentChanged()V PLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->onContentChanged()V Landroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState; HSPLandroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;->(I)V PLandroidx/appcompat/app/AppCompatDelegateImpl$PanelFeatureState;->(I)V Landroidx/appcompat/app/AppCompatViewInflater; HSPLandroidx/appcompat/app/AppCompatViewInflater;->()V PLandroidx/appcompat/app/AppCompatViewInflater;->()V HSPLandroidx/appcompat/app/AppCompatViewInflater;->()V PLandroidx/appcompat/app/AppCompatViewInflater;->()V HSPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/appcompat/app/AppCompatViewInflater;->createView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; Landroidx/appcompat/app/AppLocalesMetadataHolderService; Landroidx/appcompat/app/AppLocalesMetadataHolderService$Api24Impl; HSPLandroidx/appcompat/app/AppLocalesMetadataHolderService$Api24Impl;->getDisabledComponentFlag()I PLandroidx/appcompat/app/AppLocalesMetadataHolderService$Api24Impl;->getDisabledComponentFlag()I Landroidx/appcompat/app/AppLocalesStorageHelper$SerialExecutor; HSPLandroidx/appcompat/app/AppLocalesStorageHelper$SerialExecutor;->(Ljava/util/concurrent/Executor;)V PLandroidx/appcompat/app/AppLocalesStorageHelper$SerialExecutor;->(Ljava/util/concurrent/Executor;)V Landroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor; HSPLandroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor;->()V PLandroidx/appcompat/app/AppLocalesStorageHelper$ThreadPerTaskExecutor;->()V Landroidx/appcompat/app/ToolbarActionBar$1; HSPLandroidx/appcompat/app/ToolbarActionBar$1;->(Ljava/lang/Object;I)V PLandroidx/appcompat/app/ToolbarActionBar$1;->(Ljava/lang/Object;I)V HSPLandroidx/appcompat/app/ToolbarActionBar$1;->run()V PLandroidx/appcompat/app/ToolbarActionBar$1;->run()V Landroidx/appcompat/view/ContextThemeWrapper; HSPLandroidx/appcompat/view/ContextThemeWrapper;->(Landroid/content/Context;I)V PLandroidx/appcompat/view/ContextThemeWrapper;->(Landroid/content/Context;I)V HSPLandroidx/appcompat/view/ContextThemeWrapper;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V PLandroidx/appcompat/view/ContextThemeWrapper;->applyOverrideConfiguration(Landroid/content/res/Configuration;)V HSPLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources; PLandroidx/appcompat/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources; HSPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; HPLandroidx/appcompat/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; HSPLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme; PLandroidx/appcompat/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme; HSPLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V PLandroidx/appcompat/view/ContextThemeWrapper;->initializeTheme()V Landroidx/appcompat/view/WindowCallbackWrapper; HSPLandroidx/appcompat/view/WindowCallbackWrapper;->(Landroid/view/Window$Callback;)V PLandroidx/appcompat/view/WindowCallbackWrapper;->(Landroid/view/Window$Callback;)V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z HSPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z HPLandroidx/appcompat/view/WindowCallbackWrapper;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/appcompat/view/WindowCallbackWrapper;->getWrapped()Landroid/view/Window$Callback; PLandroidx/appcompat/view/WindowCallbackWrapper;->getWrapped()Landroid/view/Window$Callback; HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onAttachedToWindow()V PLandroidx/appcompat/view/WindowCallbackWrapper;->onAttachedToWindow()V PLandroidx/appcompat/view/WindowCallbackWrapper;->onDetachedFromWindow()V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V HPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V PLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V Landroidx/appcompat/view/menu/MenuBuilder$Callback; Landroidx/appcompat/view/menu/MenuPresenter$Callback; Landroidx/appcompat/widget/AppCompatBackgroundHelper; HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V PLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V Landroidx/appcompat/widget/AppCompatDrawableManager; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V PLandroidx/appcompat/widget/AppCompatDrawableManager;->()V HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->()V PLandroidx/appcompat/widget/AppCompatDrawableManager;->()V HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->access$000()Landroid/graphics/PorterDuff$Mode; PLandroidx/appcompat/widget/AppCompatDrawableManager;->access$000()Landroid/graphics/PorterDuff$Mode; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager; PLandroidx/appcompat/widget/AppCompatDrawableManager;->get()Landroidx/appcompat/widget/AppCompatDrawableManager; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable$1(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/AppCompatDrawableManager;->getDrawable$1(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V PLandroidx/appcompat/widget/AppCompatDrawableManager;->preload()V Landroidx/appcompat/widget/AppCompatDrawableManager$1; HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->()V PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->()V HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->arrayContains(I[I)Z PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->arrayContains(I[I)Z HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->createDrawableFor(Landroidx/appcompat/widget/ResourceManagerInternal;Landroid/content/Context;I)Landroid/graphics/drawable/LayerDrawable; PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->createDrawableFor(Landroidx/appcompat/widget/ResourceManagerInternal;Landroid/content/Context;I)Landroid/graphics/drawable/LayerDrawable; HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList; PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintListForDrawableRes(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawable(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawable(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z HSPLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z Landroidx/appcompat/widget/AppCompatImageHelper; HSPLandroidx/appcompat/widget/AppCompatImageHelper;->(Landroid/widget/ImageView;)V PLandroidx/appcompat/widget/AppCompatImageHelper;->(Landroid/widget/ImageView;)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applyImageLevel()V PLandroidx/appcompat/widget/AppCompatImageHelper;->applyImageLevel()V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V PLandroidx/appcompat/widget/AppCompatImageHelper;->applySupportImageTint()V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->hasOverlappingRendering()Z PLandroidx/appcompat/widget/AppCompatImageHelper;->hasOverlappingRendering()Z HSPLandroidx/appcompat/widget/AppCompatImageHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V PLandroidx/appcompat/widget/AppCompatImageHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatImageHelper;->obtainLevelFromDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatImageHelper;->obtainLevelFromDrawable(Landroid/graphics/drawable/Drawable;)V Landroidx/appcompat/widget/AppCompatImageView; HSPLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/appcompat/widget/AppCompatImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V PLandroidx/appcompat/widget/AppCompatImageView;->drawableStateChanged()V HSPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z PLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V Landroidx/appcompat/widget/ContentFrameLayout; HSPLandroidx/appcompat/widget/ContentFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ContentFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMajor()Landroid/util/TypedValue; PLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMajor()Landroid/util/TypedValue; HSPLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMinor()Landroid/util/TypedValue; PLandroidx/appcompat/widget/ContentFrameLayout;->getMinWidthMinor()Landroid/util/TypedValue; HSPLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V PLandroidx/appcompat/widget/ContentFrameLayout;->onAttachedToWindow()V PLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V HSPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V HPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V HSPLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V PLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V HSPLandroidx/appcompat/widget/ContentFrameLayout;->setDecorPadding(IIII)V PLandroidx/appcompat/widget/ContentFrameLayout;->setDecorPadding(IIII)V Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener; Landroidx/appcompat/widget/DrawableUtils; HSPLandroidx/appcompat/widget/DrawableUtils;->()V PLandroidx/appcompat/widget/DrawableUtils;->()V HSPLandroidx/appcompat/widget/DrawableUtils;->fixDrawable(Landroid/graphics/drawable/Drawable;)V HPLandroidx/appcompat/widget/DrawableUtils;->fixDrawable(Landroid/graphics/drawable/Drawable;)V Landroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0; HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Insets;)I PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/Insets;)I HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/Insets;)I HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/Insets;)I PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/Insets;)I HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/BlendMode; PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/BlendMode; HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I PLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I Landroidx/appcompat/widget/FitWindowsFrameLayout; HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/FitWindowsFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z PLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z Landroidx/appcompat/widget/ResourceManagerInternal; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->()V PLandroidx/appcompat/widget/ResourceManagerInternal;->()V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->()V PLandroidx/appcompat/widget/ResourceManagerInternal;->()V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->createDrawableIfNeeded(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->get()Landroidx/appcompat/widget/ResourceManagerInternal; PLandroidx/appcompat/widget/ResourceManagerInternal;->get()Landroidx/appcompat/widget/ResourceManagerInternal; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getCachedDrawable(Landroid/content/Context;J)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->getCachedDrawable(Landroid/content/Context;J)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->getDrawable(Landroid/content/Context;IZ)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; PLandroidx/appcompat/widget/ResourceManagerInternal;->getTintList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->loadDrawableFromDelegates(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->loadDrawableFromDelegates(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->setHooks(Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks;)V PLandroidx/appcompat/widget/ResourceManagerInternal;->setHooks(Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks;)V HSPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawable(Landroid/content/Context;IZLandroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawable(Landroid/content/Context;IZLandroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z PLandroidx/appcompat/widget/ResourceManagerInternal;->tintDrawableUsingColorFilter(Landroid/content/Context;ILandroid/graphics/drawable/Drawable;)Z Landroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache; HSPLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->()V PLandroidx/appcompat/widget/ResourceManagerInternal$ColorFilterLruCache;->()V Landroidx/appcompat/widget/ResourceManagerInternal$ResourceManagerHooks; Landroidx/appcompat/widget/ResourcesWrapper; Landroidx/appcompat/widget/ThemeUtils; HSPLandroidx/appcompat/widget/ThemeUtils;->()V PLandroidx/appcompat/widget/ThemeUtils;->()V HSPLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V PLandroidx/appcompat/widget/ThemeUtils;->checkAppCompatTheme(Landroid/view/View;Landroid/content/Context;)V Landroidx/appcompat/widget/TintContextWrapper; HSPLandroidx/appcompat/widget/TintContextWrapper;->()V PLandroidx/appcompat/widget/TintContextWrapper;->()V HSPLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)V PLandroidx/appcompat/widget/TintContextWrapper;->wrap(Landroid/content/Context;)V Landroidx/appcompat/widget/TintResources; Landroidx/appcompat/widget/TintTypedArray; HSPLandroidx/appcompat/widget/TintTypedArray;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V PLandroidx/appcompat/widget/TintTypedArray;->(Landroid/content/Context;Landroid/content/res/TypedArray;)V HSPLandroidx/appcompat/widget/TintTypedArray;->getDrawableIfKnown(I)Landroid/graphics/drawable/Drawable; PLandroidx/appcompat/widget/TintTypedArray;->getDrawableIfKnown(I)Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/TintTypedArray;->getResourceId(II)I PLandroidx/appcompat/widget/TintTypedArray;->getResourceId(II)I HSPLandroidx/appcompat/widget/TintTypedArray;->getWrappedTypeArray()Landroid/content/res/TypedArray; PLandroidx/appcompat/widget/TintTypedArray;->getWrappedTypeArray()Landroid/content/res/TypedArray; HSPLandroidx/appcompat/widget/TintTypedArray;->hasValue(I)Z PLandroidx/appcompat/widget/TintTypedArray;->hasValue(I)Z HSPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[II)Landroidx/appcompat/widget/TintTypedArray; PLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[II)Landroidx/appcompat/widget/TintTypedArray; HSPLandroidx/appcompat/widget/TintTypedArray;->recycle()V PLandroidx/appcompat/widget/TintTypedArray;->recycle()V Landroidx/appcompat/widget/VectorEnabledTintResources; Landroidx/appcompat/widget/ViewStubCompat; HSPLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ViewStubCompat;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/ViewStubCompat;->setVisibility(I)V PLandroidx/appcompat/widget/ViewStubCompat;->setVisibility(I)V Landroidx/appcompat/widget/ViewUtils; HSPLandroidx/appcompat/widget/ViewUtils;->()V PLandroidx/appcompat/widget/ViewUtils;->()V Landroidx/arch/core/executor/ArchTaskExecutor; HSPLandroidx/arch/core/executor/ArchTaskExecutor;->()V PLandroidx/arch/core/executor/ArchTaskExecutor;->()V HSPLandroidx/arch/core/executor/ArchTaskExecutor;->()V PLandroidx/arch/core/executor/ArchTaskExecutor;->()V HSPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor; HPLandroidx/arch/core/executor/ArchTaskExecutor;->getInstance()Landroidx/arch/core/executor/ArchTaskExecutor; HSPLandroidx/arch/core/executor/ArchTaskExecutor;->isMainThread()Z HPLandroidx/arch/core/executor/ArchTaskExecutor;->isMainThread()Z HSPLandroidx/arch/core/executor/ArchTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V PLandroidx/arch/core/executor/ArchTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V Landroidx/arch/core/executor/DefaultTaskExecutor; HSPLandroidx/arch/core/executor/DefaultTaskExecutor;->()V PLandroidx/arch/core/executor/DefaultTaskExecutor;->()V HSPLandroidx/arch/core/executor/DefaultTaskExecutor;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/arch/core/executor/DefaultTaskExecutor;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; HSPLandroidx/arch/core/executor/DefaultTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V PLandroidx/arch/core/executor/DefaultTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V Landroidx/arch/core/executor/DefaultTaskExecutor$1; HSPLandroidx/arch/core/executor/DefaultTaskExecutor$1;->()V PLandroidx/arch/core/executor/DefaultTaskExecutor$1;->()V Landroidx/arch/core/internal/FastSafeIterableMap; HSPLandroidx/arch/core/internal/FastSafeIterableMap;->()V PLandroidx/arch/core/internal/FastSafeIterableMap;->()V HSPLandroidx/arch/core/internal/FastSafeIterableMap;->ceil(Ljava/lang/Object;)Ljava/util/Map$Entry; HPLandroidx/arch/core/internal/FastSafeIterableMap;->ceil(Ljava/lang/Object;)Ljava/util/Map$Entry; HSPLandroidx/arch/core/internal/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z HPLandroidx/arch/core/internal/FastSafeIterableMap;->contains(Ljava/lang/Object;)Z HSPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HPLandroidx/arch/core/internal/FastSafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HSPLandroidx/arch/core/internal/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/arch/core/internal/FastSafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/arch/core/internal/FastSafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/arch/core/internal/SafeIterableMap; HSPLandroidx/arch/core/internal/SafeIterableMap;->()V HPLandroidx/arch/core/internal/SafeIterableMap;->()V HSPLandroidx/arch/core/internal/SafeIterableMap;->descendingIterator()Ljava/util/Iterator; PLandroidx/arch/core/internal/SafeIterableMap;->descendingIterator()Ljava/util/Iterator; HSPLandroidx/arch/core/internal/SafeIterableMap;->eldest()Ljava/util/Map$Entry; PLandroidx/arch/core/internal/SafeIterableMap;->eldest()Ljava/util/Map$Entry; HSPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HPLandroidx/arch/core/internal/SafeIterableMap;->get(Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HSPLandroidx/arch/core/internal/SafeIterableMap;->iterator()Ljava/util/Iterator; PLandroidx/arch/core/internal/SafeIterableMap;->iterator()Ljava/util/Iterator; HSPLandroidx/arch/core/internal/SafeIterableMap;->iteratorWithAdditions()Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; HPLandroidx/arch/core/internal/SafeIterableMap;->iteratorWithAdditions()Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; HSPLandroidx/arch/core/internal/SafeIterableMap;->newest()Ljava/util/Map$Entry; PLandroidx/arch/core/internal/SafeIterableMap;->newest()Ljava/util/Map$Entry; HSPLandroidx/arch/core/internal/SafeIterableMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; PLandroidx/arch/core/internal/SafeIterableMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Landroidx/arch/core/internal/SafeIterableMap$Entry; HSPLandroidx/arch/core/internal/SafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/arch/core/internal/SafeIterableMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/arch/core/internal/SafeIterableMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/arch/core/internal/SafeIterableMap;->size()I PLandroidx/arch/core/internal/SafeIterableMap;->size()I Landroidx/arch/core/internal/SafeIterableMap$AscendingIterator; HSPLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;I)V PLandroidx/arch/core/internal/SafeIterableMap$AscendingIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;I)V Landroidx/arch/core/internal/SafeIterableMap$Entry; HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/arch/core/internal/SafeIterableMap$Entry;->(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object; PLandroidx/arch/core/internal/SafeIterableMap$Entry;->getKey()Ljava/lang/Object; HSPLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object; PLandroidx/arch/core/internal/SafeIterableMap$Entry;->getValue()Ljava/lang/Object; Landroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions; HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->(Landroidx/arch/core/internal/SafeIterableMap;)V PLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->(Landroidx/arch/core/internal/SafeIterableMap;)V HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z PLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->hasNext()Z HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object; PLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->next()Ljava/lang/Object; HSPLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V PLandroidx/arch/core/internal/SafeIterableMap$IteratorWithAdditions;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V Landroidx/arch/core/internal/SafeIterableMap$ListIterator; HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->(Landroidx/arch/core/internal/SafeIterableMap$Entry;Landroidx/arch/core/internal/SafeIterableMap$Entry;)V HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->hasNext()Z HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object; PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->next()Ljava/lang/Object; HSPLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->nextNode()Landroidx/arch/core/internal/SafeIterableMap$Entry; PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->nextNode()Landroidx/arch/core/internal/SafeIterableMap$Entry; PLandroidx/arch/core/internal/SafeIterableMap$ListIterator;->supportRemove(Landroidx/arch/core/internal/SafeIterableMap$Entry;)V Landroidx/arch/core/internal/SafeIterableMap$SupportRemove; HSPLandroidx/arch/core/internal/SafeIterableMap$SupportRemove;->()V HPLandroidx/arch/core/internal/SafeIterableMap$SupportRemove;->()V Landroidx/arch/core/util/Function; Landroidx/collection/ArrayMap; HSPLandroidx/collection/ArrayMap;->()V PLandroidx/collection/ArrayMap;->()V Landroidx/collection/ArrayMap$KeyIterator; HSPLandroidx/collection/ArrayMap$KeyIterator;->(Landroidx/collection/ArraySet;)V PLandroidx/collection/ArrayMap$KeyIterator;->(Landroidx/collection/ArraySet;)V Landroidx/collection/ArraySet; HSPLandroidx/collection/ArraySet;->()V PLandroidx/collection/ArraySet;->()V HSPLandroidx/collection/ArraySet;->(I)V PLandroidx/collection/ArraySet;->(I)V HSPLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z PLandroidx/collection/ArraySet;->add(Ljava/lang/Object;)Z HSPLandroidx/collection/ArraySet;->allocArrays(I)V PLandroidx/collection/ArraySet;->allocArrays(I)V HSPLandroidx/collection/ArraySet;->clear()V PLandroidx/collection/ArraySet;->clear()V HSPLandroidx/collection/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V PLandroidx/collection/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V HSPLandroidx/collection/ArraySet;->indexOf(ILjava/lang/Object;)I PLandroidx/collection/ArraySet;->indexOf(ILjava/lang/Object;)I HSPLandroidx/collection/ArraySet;->iterator()Ljava/util/Iterator; PLandroidx/collection/ArraySet;->iterator()Ljava/util/Iterator; PLandroidx/collection/ArraySet;->removeAt(I)V HSPLandroidx/collection/ArraySet;->toArray()[Ljava/lang/Object; PLandroidx/collection/ArraySet;->toArray()[Ljava/lang/Object; Landroidx/collection/ContainerHelpers; HSPLandroidx/collection/ContainerHelpers;->()V PLandroidx/collection/ContainerHelpers;->()V PLandroidx/collection/ContainerHelpers;->binarySearch([III)I HSPLandroidx/collection/ContainerHelpers;->binarySearch([JIJ)I HPLandroidx/collection/ContainerHelpers;->binarySearch([JIJ)I Landroidx/collection/IndexBasedArrayIterator; HSPLandroidx/collection/IndexBasedArrayIterator;->(I)V PLandroidx/collection/IndexBasedArrayIterator;->(I)V HSPLandroidx/collection/IndexBasedArrayIterator;->hasNext()Z PLandroidx/collection/IndexBasedArrayIterator;->hasNext()Z PLandroidx/collection/IndexBasedArrayIterator;->next()Ljava/lang/Object; PLandroidx/collection/IndexBasedArrayIterator;->remove()V Landroidx/collection/LongSparseArray; HSPLandroidx/collection/LongSparseArray;->()V PLandroidx/collection/LongSparseArray;->()V HSPLandroidx/collection/LongSparseArray;->()V PLandroidx/collection/LongSparseArray;->()V HSPLandroidx/collection/LongSparseArray;->(I)V HPLandroidx/collection/LongSparseArray;->(I)V HSPLandroidx/collection/LongSparseArray;->clear()V PLandroidx/collection/LongSparseArray;->clear()V HSPLandroidx/collection/LongSparseArray;->get(JLjava/lang/Long;)Ljava/lang/Object; HPLandroidx/collection/LongSparseArray;->get(JLjava/lang/Long;)Ljava/lang/Object; HSPLandroidx/collection/LongSparseArray;->indexOfKey(J)I PLandroidx/collection/LongSparseArray;->indexOfKey(J)I HSPLandroidx/collection/LongSparseArray;->keyAt(I)J PLandroidx/collection/LongSparseArray;->keyAt(I)J HSPLandroidx/collection/LongSparseArray;->put(JLjava/lang/Object;)V HPLandroidx/collection/LongSparseArray;->put(JLjava/lang/Object;)V HSPLandroidx/collection/LongSparseArray;->remove(J)V PLandroidx/collection/LongSparseArray;->remove(J)V HSPLandroidx/collection/LongSparseArray;->size()I PLandroidx/collection/LongSparseArray;->size()I HSPLandroidx/collection/LongSparseArray;->valueAt(I)Ljava/lang/Object; PLandroidx/collection/LongSparseArray;->valueAt(I)Ljava/lang/Object; Landroidx/collection/LruCache; HSPLandroidx/collection/LruCache;->(I)V PLandroidx/collection/LruCache;->(I)V HSPLandroidx/collection/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/collection/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I PLandroidx/collection/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroidx/collection/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I PLandroidx/collection/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroidx/collection/LruCache;->trimToSize(I)V PLandroidx/collection/LruCache;->trimToSize(I)V Landroidx/collection/SimpleArrayMap; HSPLandroidx/collection/SimpleArrayMap;->()V PLandroidx/collection/SimpleArrayMap;->()V HSPLandroidx/collection/SimpleArrayMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/collection/SimpleArrayMap;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/collection/SimpleArrayMap;->indexOf(ILjava/lang/Object;)I PLandroidx/collection/SimpleArrayMap;->indexOf(ILjava/lang/Object;)I HSPLandroidx/collection/SimpleArrayMap;->indexOfKey(Ljava/lang/Object;)I PLandroidx/collection/SimpleArrayMap;->indexOfKey(Ljava/lang/Object;)I PLandroidx/collection/SimpleArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/collection/SparseArrayCompat; HSPLandroidx/collection/SparseArrayCompat;->()V PLandroidx/collection/SparseArrayCompat;->()V HSPLandroidx/collection/SparseArrayCompat;->()V PLandroidx/collection/SparseArrayCompat;->()V Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$2; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;->()V PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;->()V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;->()V PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;->()V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$3; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;II)V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;II)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;II)V PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;II)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$4; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$5; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/jvm/functions/Function4;)V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/jvm/functions/Function4;)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$4$1; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$4$1;->(Landroidx/compose/animation/ExitTransition;)V PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$4$1;->(Landroidx/compose/animation/ExitTransition;)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Ljava/lang/Object;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/jvm/functions/Function4;I)V PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Ljava/lang/Object;Landroidx/compose/runtime/snapshots/SnapshotStateList;Lkotlin/jvm/functions/Function4;I)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;Ljava/lang/Object;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;)V PLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;Ljava/lang/Object;Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$6$1$5$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/animation/AnimatedContentKt$AnimatedContent$9; HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$9;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;II)V HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$9;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;II)V HSPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$9;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$AnimatedContent$9;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentKt$SizeTransform$1; HSPLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->()V PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->()V HSPLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->()V PLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->()V HSPLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentKt$SizeTransform$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentMeasurePolicy; HSPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;)V PLandroidx/compose/animation/AnimatedContentMeasurePolicy;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;)V HSPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->getRootScope()Landroidx/compose/animation/AnimatedContentTransitionScopeImpl; PLandroidx/compose/animation/AnimatedContentMeasurePolicy;->getRootScope()Landroidx/compose/animation/AnimatedContentTransitionScopeImpl; HSPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/animation/AnimatedContentMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3; HSPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/animation/AnimatedContentMeasurePolicy;II)V PLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->([Landroidx/compose/ui/layout/Placeable;Landroidx/compose/animation/AnimatedContentMeasurePolicy;II)V HSPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedContentMeasurePolicy$measure$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedContentScope; Landroidx/compose/animation/AnimatedContentScopeImpl; HSPLandroidx/compose/animation/AnimatedContentScopeImpl;->()V PLandroidx/compose/animation/AnimatedContentScopeImpl;->()V Landroidx/compose/animation/AnimatedContentTransitionScopeImpl; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Alignment;)V PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Alignment;)V HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->createSizeAnimationModifier$animation_release(Landroidx/compose/animation/ContentTransform;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->createSizeAnimationModifier$animation_release(Landroidx/compose/animation/ContentTransform;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->getContentAlignment$animation_release()Landroidx/compose/ui/Alignment; PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->getContentAlignment$animation_release()Landroidx/compose/ui/Alignment; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->getTargetSizeMap$animation_release()Ljava/util/LinkedHashMap; PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->getTargetSizeMap$animation_release()Ljava/util/LinkedHashMap; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->setContentAlignment$animation_release(Landroidx/compose/ui/Alignment;)V PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->setContentAlignment$animation_release(Landroidx/compose/ui/Alignment;)V HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->setMeasuredSize-ozmzZPI$animation_release(J)V PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl;->setMeasuredSize-ozmzZPI$animation_release(J)V Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->(Z)V PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->(Z)V HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->isTarget()Z PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->isTarget()Z HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->setTarget(Z)V PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$ChildData;->setTarget(Z)V Landroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/runtime/MutableState;)V PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier;->(Landroidx/compose/animation/AnimatedContentTransitionScopeImpl;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/runtime/MutableState;)V HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier;->getSizeTransform()Landroidx/compose/runtime/State; PLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier;->getSizeTransform()Landroidx/compose/runtime/State; HSPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/animation/AnimatedContentTransitionScopeImpl$SizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/animation/AnimatedEnterExitMeasurePolicy; HSPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->(Landroidx/compose/animation/AnimatedVisibilityScopeImpl;)V PLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->(Landroidx/compose/animation/AnimatedVisibilityScopeImpl;)V HSPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/animation/AnimatedEnterExitMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1;->()V PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1;->()V HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1;->()V PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1;->()V HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$1; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$1;->(Landroidx/compose/animation/core/Transition;)V HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$1;->(Landroidx/compose/animation/core/Transition;)V HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$2; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$2;->(Landroidx/compose/runtime/ProduceStateScope;Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/State;)V HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$2;->(Landroidx/compose/runtime/ProduceStateScope;Landroidx/compose/animation/core/Transition;Landroidx/compose/runtime/State;)V HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedEnterExitImpl$shouldDisposeAfterExit$2$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$2; HSPLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$2;->(ZLandroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Ljava/lang/String;Lkotlin/jvm/functions/Function3;II)V PLandroidx/compose/animation/AnimatedVisibilityKt$AnimatedVisibility$2;->(ZLandroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Ljava/lang/String;Lkotlin/jvm/functions/Function3;II)V Landroidx/compose/animation/AnimatedVisibilityScope; Landroidx/compose/animation/AnimatedVisibilityScopeImpl; HSPLandroidx/compose/animation/AnimatedVisibilityScopeImpl;->()V PLandroidx/compose/animation/AnimatedVisibilityScopeImpl;->()V HSPLandroidx/compose/animation/AnimatedVisibilityScopeImpl;->getTargetSize$animation_release()Landroidx/compose/runtime/ParcelableSnapshotMutableState; PLandroidx/compose/animation/AnimatedVisibilityScopeImpl;->getTargetSize$animation_release()Landroidx/compose/runtime/ParcelableSnapshotMutableState; Landroidx/compose/animation/AnimationModifierKt; HSPLandroidx/compose/animation/AnimationModifierKt;->()V PLandroidx/compose/animation/AnimationModifierKt;->()V HSPLandroidx/compose/animation/AnimationModifierKt;->getInvalidSize()J PLandroidx/compose/animation/AnimationModifierKt;->getInvalidSize()J HSPLandroidx/compose/animation/AnimationModifierKt;->isValid-ozmzZPI(J)Z PLandroidx/compose/animation/AnimationModifierKt;->isValid-ozmzZPI(J)Z Landroidx/compose/animation/ChangeSize; HSPLandroidx/compose/animation/ChangeSize;->(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Z)V HPLandroidx/compose/animation/ChangeSize;->(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Z)V Landroidx/compose/animation/ColorVectorConverterKt; HSPLandroidx/compose/animation/ColorVectorConverterKt;->()V PLandroidx/compose/animation/ColorVectorConverterKt;->()V HSPLandroidx/compose/animation/ColorVectorConverterKt;->getVectorConverter()Lkotlin/jvm/functions/Function1; PLandroidx/compose/animation/ColorVectorConverterKt;->getVectorConverter()Lkotlin/jvm/functions/Function1; Landroidx/compose/animation/ContentTransform; HSPLandroidx/compose/animation/ContentTransform;->(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;)V HPLandroidx/compose/animation/ContentTransform;->(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;)V HSPLandroidx/compose/animation/ContentTransform;->getInitialContentExit()Landroidx/compose/animation/ExitTransition; PLandroidx/compose/animation/ContentTransform;->getInitialContentExit()Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/ContentTransform;->getSizeTransform()Landroidx/compose/animation/SizeTransform; PLandroidx/compose/animation/ContentTransform;->getSizeTransform()Landroidx/compose/animation/SizeTransform; HSPLandroidx/compose/animation/ContentTransform;->getTargetContentEnter()Landroidx/compose/animation/EnterTransition; PLandroidx/compose/animation/ContentTransform;->getTargetContentEnter()Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/ContentTransform;->getTargetContentZIndex()F PLandroidx/compose/animation/ContentTransform;->getTargetContentZIndex()F Landroidx/compose/animation/CrossfadeKt; HSPLandroidx/compose/animation/CrossfadeKt;->AnimatedContent(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/animation/CrossfadeKt;->AnimatedContent(Landroidx/compose/animation/core/Transition;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/animation/CrossfadeKt;->AnimatedContent(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/animation/CrossfadeKt;->AnimatedContent(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Alignment;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/animation/CrossfadeKt;->AnimatedEnterExitImpl(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/animation/CrossfadeKt;->AnimatedEnterExitImpl(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/animation/CrossfadeKt;->AnimatedVisibility(ZLandroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/animation/CrossfadeKt;->AnimatedVisibility(ZLandroidx/compose/ui/Modifier;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/animation/CrossfadeKt;->access$getExitFinished(Landroidx/compose/animation/core/Transition;)Z HPLandroidx/compose/animation/CrossfadeKt;->access$getExitFinished(Landroidx/compose/animation/core/Transition;)Z HSPLandroidx/compose/animation/CrossfadeKt;->targetEnterExit(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/EnterExitState; HPLandroidx/compose/animation/CrossfadeKt;->targetEnterExit(Landroidx/compose/animation/core/Transition;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/EnterExitState; Landroidx/compose/animation/CrossfadeKt$Crossfade$4$1; HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; HPLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/CrossfadeKt$Crossfade$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1; HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->(Landroidx/compose/runtime/State;I)V HPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->(Landroidx/compose/runtime/State;I)V HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->invoke(Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope;)V HPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->invoke(Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope;)V HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/CrossfadeKt$Crossfade$5$1$alpha$2; HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$alpha$2;->(Ljava/lang/Object;I)V PLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$alpha$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$alpha$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/CrossfadeKt$Crossfade$5$1$alpha$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/EnterExitState; HSPLandroidx/compose/animation/EnterExitState;->()V PLandroidx/compose/animation/EnterExitState;->()V HSPLandroidx/compose/animation/EnterExitState;->(Ljava/lang/String;I)V PLandroidx/compose/animation/EnterExitState;->(Ljava/lang/String;I)V Landroidx/compose/animation/EnterExitTransitionElement; HSPLandroidx/compose/animation/EnterExitTransitionElement;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/animation/EnterExitTransitionElement;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/EnterExitTransitionElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/animation/EnterExitTransitionElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/animation/EnterExitTransitionElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/EnterExitTransitionElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/EnterExitTransitionElement;->update(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/animation/EnterExitTransitionElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/animation/EnterExitTransitionKt; HSPLandroidx/compose/animation/EnterExitTransitionKt;->()V PLandroidx/compose/animation/EnterExitTransitionKt;->()V HSPLandroidx/compose/animation/EnterExitTransitionKt;->createModifier(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Landroidx/compose/runtime/Composer;I)Landroidx/compose/ui/Modifier; HPLandroidx/compose/animation/EnterExitTransitionKt;->createModifier(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Landroidx/compose/runtime/Composer;I)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/animation/EnterExitTransitionKt;->expandIn(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/animation/EnterTransition; PLandroidx/compose/animation/EnterExitTransitionKt;->expandIn(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->expandVertically$default(Landroidx/compose/animation/core/TweenSpec;Landroidx/compose/ui/BiasAlignment$Vertical;I)Landroidx/compose/animation/EnterTransition; HPLandroidx/compose/animation/EnterExitTransitionKt;->expandVertically$default(Landroidx/compose/animation/core/TweenSpec;Landroidx/compose/ui/BiasAlignment$Vertical;I)Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->fadeIn$default(Landroidx/compose/animation/core/TweenSpec;FI)Landroidx/compose/animation/EnterTransition; HPLandroidx/compose/animation/EnterExitTransitionKt;->fadeIn$default(Landroidx/compose/animation/core/TweenSpec;FI)Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->fadeOut$default(Landroidx/compose/animation/core/TweenSpec;I)Landroidx/compose/animation/ExitTransition; HPLandroidx/compose/animation/EnterExitTransitionKt;->fadeOut$default(Landroidx/compose/animation/core/TweenSpec;I)Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->scaleIn-L8ZKh-E$default(Landroidx/compose/animation/core/TweenSpec;F)Landroidx/compose/animation/EnterTransition; PLandroidx/compose/animation/EnterExitTransitionKt;->scaleIn-L8ZKh-E$default(Landroidx/compose/animation/core/TweenSpec;F)Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->shrinkOut(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/animation/ExitTransition; PLandroidx/compose/animation/EnterExitTransitionKt;->shrinkOut(Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/ui/Alignment;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->shrinkVertically$default(Landroidx/compose/animation/core/TweenSpec;Landroidx/compose/ui/BiasAlignment$Vertical;I)Landroidx/compose/animation/ExitTransition; HPLandroidx/compose/animation/EnterExitTransitionKt;->shrinkVertically$default(Landroidx/compose/animation/core/TweenSpec;Landroidx/compose/ui/BiasAlignment$Vertical;I)Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->slideInHorizontally(Landroidx/compose/animation/core/TweenSpec;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/EnterTransition; PLandroidx/compose/animation/EnterExitTransitionKt;->slideInHorizontally(Landroidx/compose/animation/core/TweenSpec;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->slideOutHorizontally(Landroidx/compose/animation/core/TweenSpec;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/ExitTransition; PLandroidx/compose/animation/EnterExitTransitionKt;->slideOutHorizontally(Landroidx/compose/animation/core/TweenSpec;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/EnterExitTransitionKt;->toAlignment(Landroidx/compose/ui/Alignment$Vertical;)Landroidx/compose/ui/BiasAlignment; HPLandroidx/compose/animation/EnterExitTransitionKt;->toAlignment(Landroidx/compose/ui/Alignment$Vertical;)Landroidx/compose/ui/BiasAlignment; Landroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1; HSPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1;->()V PLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1;->()V HSPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1;->()V PLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1;->()V HSPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$$inlined$animateValue$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2; HSPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2;->(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;I)V HPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2;->(Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;I)V HSPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2;->invoke(Landroidx/compose/animation/core/Transition$Segment;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/FiniteAnimationSpec; HPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2;->invoke(Landroidx/compose/animation/core/Transition$Segment;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/FiniteAnimationSpec; HSPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionKt$createGraphicsLayerBlock$alpha$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/EnterExitTransitionKt$expandIn$1; HSPLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->()V PLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->()V HSPLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->(I)V PLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->(I)V HSPLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->invoke(Z)Ljava/lang/Boolean; PLandroidx/compose/animation/EnterExitTransitionKt$expandIn$1;->invoke(Z)Ljava/lang/Boolean; Landroidx/compose/animation/EnterExitTransitionKt$expandVertically$2; HSPLandroidx/compose/animation/EnterExitTransitionKt$expandVertically$2;->(ILkotlin/jvm/functions/Function1;)V HPLandroidx/compose/animation/EnterExitTransitionKt$expandVertically$2;->(ILkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/EnterExitTransitionKt$expandVertically$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionKt$expandVertically$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionKt$expandVertically$2;->invoke-mHKZG7I(J)J Landroidx/compose/animation/EnterExitTransitionModifierNode; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/EnterTransition;Landroidx/compose/animation/ExitTransition;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->getAlignment()Landroidx/compose/ui/Alignment; HPLandroidx/compose/animation/EnterExitTransitionModifierNode;->getAlignment()Landroidx/compose/ui/Alignment; PLandroidx/compose/animation/EnterExitTransitionModifierNode;->getEnter()Landroidx/compose/animation/EnterTransition; PLandroidx/compose/animation/EnterExitTransitionModifierNode;->getExit()Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->getGraphicsLayerBlock()Lkotlin/jvm/functions/Function1; PLandroidx/compose/animation/EnterExitTransitionModifierNode;->getGraphicsLayerBlock()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/animation/EnterExitTransitionModifierNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->onAttach()V HPLandroidx/compose/animation/EnterExitTransitionModifierNode;->onAttach()V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setEnter(Landroidx/compose/animation/EnterTransition;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setEnter(Landroidx/compose/animation/EnterTransition;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setExit(Landroidx/compose/animation/ExitTransition;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setExit(Landroidx/compose/animation/ExitTransition;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setGraphicsLayerBlock(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setGraphicsLayerBlock(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setOffsetAnimation(Landroidx/compose/animation/core/Transition$DeferredAnimation;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setOffsetAnimation(Landroidx/compose/animation/core/Transition$DeferredAnimation;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setSizeAnimation(Landroidx/compose/animation/core/Transition$DeferredAnimation;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setSizeAnimation(Landroidx/compose/animation/core/Transition$DeferredAnimation;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setSlideAnimation(Landroidx/compose/animation/core/Transition$DeferredAnimation;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setSlideAnimation(Landroidx/compose/animation/core/Transition$DeferredAnimation;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode;->setTransition(Landroidx/compose/animation/core/Transition;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->setTransition(Landroidx/compose/animation/core/Transition;)V PLandroidx/compose/animation/EnterExitTransitionModifierNode;->slideTargetValueByState-oFUgxo0(Landroidx/compose/animation/EnterExitState;J)J HPLandroidx/compose/animation/EnterExitTransitionModifierNode;->slideTargetValueByState-oFUgxo0(Landroidx/compose/animation/EnterExitState;J)J Landroidx/compose/animation/EnterExitTransitionModifierNode$measure$2; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$2;->(Landroidx/compose/ui/layout/Placeable;JJLandroidx/compose/animation/EnterExitTransitionModifierNode;)V HPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$2;->(Landroidx/compose/ui/layout/Placeable;JJLandroidx/compose/animation/EnterExitTransitionModifierNode;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1;->(IJLjava/lang/Object;)V HPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1;->(IJLjava/lang/Object;)V HSPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1;->invoke-Bjo55l4(Landroidx/compose/animation/EnterExitState;)J HPLandroidx/compose/animation/EnterExitTransitionModifierNode$measure$animSize$1;->invoke-Bjo55l4(Landroidx/compose/animation/EnterExitState;)J Landroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1; HSPLandroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1;->(Landroidx/compose/animation/EnterExitTransitionModifierNode;I)V HPLandroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1;->(Landroidx/compose/animation/EnterExitTransitionModifierNode;I)V PLandroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1;->invoke(Landroidx/compose/animation/core/Transition$Segment;)Landroidx/compose/animation/core/FiniteAnimationSpec; HPLandroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1;->invoke(Landroidx/compose/animation/core/Transition$Segment;)Landroidx/compose/animation/core/FiniteAnimationSpec; PLandroidx/compose/animation/EnterExitTransitionModifierNode$slideSpec$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterTransition;->()V PLandroidx/compose/animation/EnterTransition;->()V HSPLandroidx/compose/animation/EnterTransition;->()V HPLandroidx/compose/animation/EnterTransition;->()V HSPLandroidx/compose/animation/EnterTransition;->access$getNone$cp()Landroidx/compose/animation/EnterTransition; HPLandroidx/compose/animation/EnterTransition;->access$getNone$cp()Landroidx/compose/animation/EnterTransition; HSPLandroidx/compose/animation/EnterTransition;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/EnterTransition;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/EnterTransition;->plus(Landroidx/compose/animation/EnterTransition;)Landroidx/compose/animation/EnterTransition; HPLandroidx/compose/animation/EnterTransition;->plus(Landroidx/compose/animation/EnterTransition;)Landroidx/compose/animation/EnterTransition; Landroidx/compose/animation/EnterTransitionImpl; HSPLandroidx/compose/animation/EnterTransitionImpl;->(Landroidx/compose/animation/TransitionData;)V HPLandroidx/compose/animation/EnterTransitionImpl;->(Landroidx/compose/animation/TransitionData;)V HSPLandroidx/compose/animation/EnterTransitionImpl;->getData$animation_release()Landroidx/compose/animation/TransitionData; HPLandroidx/compose/animation/EnterTransitionImpl;->getData$animation_release()Landroidx/compose/animation/TransitionData; Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/ExitTransition;->()V PLandroidx/compose/animation/ExitTransition;->()V HSPLandroidx/compose/animation/ExitTransition;->()V HPLandroidx/compose/animation/ExitTransition;->()V HSPLandroidx/compose/animation/ExitTransition;->access$getNone$cp()Landroidx/compose/animation/ExitTransition; HPLandroidx/compose/animation/ExitTransition;->access$getNone$cp()Landroidx/compose/animation/ExitTransition; HSPLandroidx/compose/animation/ExitTransition;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/ExitTransition;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/ExitTransition;->plus(Landroidx/compose/animation/ExitTransition;)Landroidx/compose/animation/ExitTransition; HPLandroidx/compose/animation/ExitTransition;->plus(Landroidx/compose/animation/ExitTransition;)Landroidx/compose/animation/ExitTransition; Landroidx/compose/animation/ExitTransitionImpl; HSPLandroidx/compose/animation/ExitTransitionImpl;->(Landroidx/compose/animation/TransitionData;)V HPLandroidx/compose/animation/ExitTransitionImpl;->(Landroidx/compose/animation/TransitionData;)V HSPLandroidx/compose/animation/ExitTransitionImpl;->getData$animation_release()Landroidx/compose/animation/TransitionData; HPLandroidx/compose/animation/ExitTransitionImpl;->getData$animation_release()Landroidx/compose/animation/TransitionData; Landroidx/compose/animation/Fade; HSPLandroidx/compose/animation/Fade;->(FLandroidx/compose/animation/core/FiniteAnimationSpec;)V HPLandroidx/compose/animation/Fade;->(FLandroidx/compose/animation/core/FiniteAnimationSpec;)V HSPLandroidx/compose/animation/Fade;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/Fade;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/Fade;->getAlpha()F HPLandroidx/compose/animation/Fade;->getAlpha()F HSPLandroidx/compose/animation/Fade;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; PLandroidx/compose/animation/Fade;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; Landroidx/compose/animation/FlingCalculator; HSPLandroidx/compose/animation/FlingCalculator;->(FLandroidx/compose/ui/unit/Density;)V HPLandroidx/compose/animation/FlingCalculator;->(FLandroidx/compose/ui/unit/Density;)V Landroidx/compose/animation/FlingCalculatorKt; HSPLandroidx/compose/animation/FlingCalculatorKt;->()V PLandroidx/compose/animation/FlingCalculatorKt;->()V Landroidx/compose/animation/LayoutModifierNodeWithPassThroughIntrinsics; HSPLandroidx/compose/animation/LayoutModifierNodeWithPassThroughIntrinsics;->()V HPLandroidx/compose/animation/LayoutModifierNodeWithPassThroughIntrinsics;->()V Landroidx/compose/animation/LayoutModifierWithPassThroughIntrinsics; HSPLandroidx/compose/animation/LayoutModifierWithPassThroughIntrinsics;->()V PLandroidx/compose/animation/LayoutModifierWithPassThroughIntrinsics;->()V Landroidx/compose/animation/Scale; HSPLandroidx/compose/animation/Scale;->(FJLandroidx/compose/animation/core/FiniteAnimationSpec;)V HPLandroidx/compose/animation/Scale;->(FJLandroidx/compose/animation/core/FiniteAnimationSpec;)V HSPLandroidx/compose/animation/Scale;->equals(Ljava/lang/Object;)Z PLandroidx/compose/animation/Scale;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/Scale;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; PLandroidx/compose/animation/Scale;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; HSPLandroidx/compose/animation/Scale;->getScale()F PLandroidx/compose/animation/Scale;->getScale()F HSPLandroidx/compose/animation/Scale;->getTransformOrigin-SzJe1aQ()J HPLandroidx/compose/animation/Scale;->getTransformOrigin-SzJe1aQ()J Landroidx/compose/animation/Scale$$ExternalSyntheticOutline0; HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(FFFF)F PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(FFFF)F HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(FII)I HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(II)Lkotlin/collections/IntIterator; PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(II)Lkotlin/collections/IntIterator; HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(III)I HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(III)I HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(ILandroidx/compose/runtime/ComposerImpl;ILkotlin/jvm/functions/Function2;)V HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(ILandroidx/compose/runtime/ComposerImpl;ILkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/SkippableUpdater;Landroidx/compose/runtime/ComposerImpl;I)V HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/SkippableUpdater;Landroidx/compose/runtime/ComposerImpl;I)V HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/SkippableUpdater;Landroidx/compose/runtime/ComposerImpl;II)V HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/SkippableUpdater;Landroidx/compose/runtime/ComposerImpl;II)V HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(JII)I PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(JII)I HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(JII)J HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(JII)J HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;)V HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;)V HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;IZLandroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;IZLandroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/layout/MeasurePolicy;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/PersistentCompositionLocalMap;)Lkotlin/jvm/functions/Function2; HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/ui/layout/MeasurePolicy;Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/PersistentCompositionLocalMap;)Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/Object;)V PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/Object;)V HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/String;I)Ljava/lang/String; PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/String;I)Ljava/lang/String; HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/String;II)I PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/String;II)I HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/util/List;II)I PLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Ljava/util/List;II)I HSPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller; HPLandroidx/compose/animation/Scale$$ExternalSyntheticOutline0;->m(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller; Landroidx/compose/animation/SingleValueAnimationKt; HSPLandroidx/compose/animation/SingleValueAnimationKt;->()V PLandroidx/compose/animation/SingleValueAnimationKt;->()V HSPLandroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; HPLandroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; Landroidx/compose/animation/SizeTransform; Landroidx/compose/animation/SizeTransformImpl; HSPLandroidx/compose/animation/SizeTransformImpl;->(ZLkotlin/jvm/functions/Function2;)V HPLandroidx/compose/animation/SizeTransformImpl;->(ZLkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/animation/SizeTransformImpl;->createAnimationSpec-TemP2vQ(JJ)Landroidx/compose/animation/core/FiniteAnimationSpec; PLandroidx/compose/animation/SizeTransformImpl;->createAnimationSpec-TemP2vQ(JJ)Landroidx/compose/animation/core/FiniteAnimationSpec; HSPLandroidx/compose/animation/SizeTransformImpl;->getClip()Z PLandroidx/compose/animation/SizeTransformImpl;->getClip()Z Landroidx/compose/animation/Slide; HSPLandroidx/compose/animation/Slide;->(Landroidx/compose/animation/core/FiniteAnimationSpec;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/animation/Slide;->(Landroidx/compose/animation/core/FiniteAnimationSpec;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/Slide;->equals(Ljava/lang/Object;)Z PLandroidx/compose/animation/Slide;->getAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; PLandroidx/compose/animation/Slide;->getSlideOffset()Lkotlin/jvm/functions/Function1; Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec; HSPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->(Landroidx/compose/ui/unit/Density;)V HPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;->(Landroidx/compose/ui/unit/Density;)V Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt; HSPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->()V PLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->()V HSPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->getPlatformFlingScrollFriction()F PLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->getPlatformFlingScrollFriction()F HSPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->rememberSplineBasedDecay(Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/DecayAnimationSpec; HPLandroidx/compose/animation/SplineBasedFloatDecayAnimationSpec_androidKt;->rememberSplineBasedDecay(Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/DecayAnimationSpec; Landroidx/compose/animation/TransitionData; HSPLandroidx/compose/animation/TransitionData;->(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;Z)V HPLandroidx/compose/animation/TransitionData;->(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;Z)V HSPLandroidx/compose/animation/TransitionData;->(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;ZI)V HPLandroidx/compose/animation/TransitionData;->(Landroidx/compose/animation/Fade;Landroidx/compose/animation/Slide;Landroidx/compose/animation/ChangeSize;Landroidx/compose/animation/Scale;ZI)V HSPLandroidx/compose/animation/TransitionData;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/TransitionData;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/TransitionData;->getChangeSize()Landroidx/compose/animation/ChangeSize; HPLandroidx/compose/animation/TransitionData;->getChangeSize()Landroidx/compose/animation/ChangeSize; HSPLandroidx/compose/animation/TransitionData;->getFade()Landroidx/compose/animation/Fade; HPLandroidx/compose/animation/TransitionData;->getFade()Landroidx/compose/animation/Fade; HSPLandroidx/compose/animation/TransitionData;->getHold()Z PLandroidx/compose/animation/TransitionData;->getHold()Z HSPLandroidx/compose/animation/TransitionData;->getScale()Landroidx/compose/animation/Scale; HPLandroidx/compose/animation/TransitionData;->getScale()Landroidx/compose/animation/Scale; HSPLandroidx/compose/animation/TransitionData;->getSlide()Landroidx/compose/animation/Slide; HPLandroidx/compose/animation/TransitionData;->getSlide()Landroidx/compose/animation/Slide; Landroidx/compose/animation/core/Animatable; HSPLandroidx/compose/animation/core/Animatable;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;)V HPLandroidx/compose/animation/core/Animatable;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/Animatable;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;I)V PLandroidx/compose/animation/core/Animatable;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;I)V HSPLandroidx/compose/animation/core/Animatable;->access$clampToBounds(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/core/Animatable;->access$clampToBounds(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/core/Animatable;->access$endAnimation(Landroidx/compose/animation/core/Animatable;)V PLandroidx/compose/animation/core/Animatable;->access$endAnimation(Landroidx/compose/animation/core/Animatable;)V HSPLandroidx/compose/animation/core/Animatable;->access$setRunning(Landroidx/compose/animation/core/Animatable;)V PLandroidx/compose/animation/core/Animatable;->access$setRunning(Landroidx/compose/animation/core/Animatable;)V HSPLandroidx/compose/animation/core/Animatable;->access$setTargetValue(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;)V PLandroidx/compose/animation/core/Animatable;->access$setTargetValue(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/Animatable;->animateTo$default(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;I)Ljava/lang/Object; HPLandroidx/compose/animation/core/Animatable;->animateTo$default(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationSpec;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;I)Ljava/lang/Object; HSPLandroidx/compose/animation/core/Animatable;->asState()Landroidx/compose/animation/core/AnimationState; PLandroidx/compose/animation/core/Animatable;->asState()Landroidx/compose/animation/core/AnimationState; HSPLandroidx/compose/animation/core/Animatable;->clampToBounds(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/Animatable;->clampToBounds(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/core/Animatable;->getInternalState$animation_core_release()Landroidx/compose/animation/core/AnimationState; PLandroidx/compose/animation/core/Animatable;->getInternalState$animation_core_release()Landroidx/compose/animation/core/AnimationState; HSPLandroidx/compose/animation/core/Animatable;->getTargetValue()Ljava/lang/Object; HPLandroidx/compose/animation/core/Animatable;->getTargetValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Animatable;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/Animatable;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/Animatable;->getValue()Ljava/lang/Object; HPLandroidx/compose/animation/core/Animatable;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Animatable;->isRunning()Z PLandroidx/compose/animation/core/Animatable;->isRunning()Z HSPLandroidx/compose/animation/core/Animatable;->updateBounds$default(Landroidx/compose/animation/core/Animatable;Ljava/lang/Float;)V HPLandroidx/compose/animation/core/Animatable;->updateBounds$default(Landroidx/compose/animation/core/Animatable;Ljava/lang/Float;)V Landroidx/compose/animation/core/Animatable$runAnimation$2; HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;->(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/animation/core/Animatable$runAnimation$2;->(Landroidx/compose/animation/core/Animatable;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/animation/core/Animatable$runAnimation$2;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/core/Animatable$runAnimation$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/Animatable$runAnimation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/Animatable$runAnimation$2$1; HSPLandroidx/compose/animation/core/Animatable$runAnimation$2$1;->(Landroidx/compose/animation/core/Animatable;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/Ref$BooleanRef;)V PLandroidx/compose/animation/core/Animatable$runAnimation$2$1;->(Landroidx/compose/animation/core/Animatable;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/Ref$BooleanRef;)V HSPLandroidx/compose/animation/core/Animatable$runAnimation$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/Animatable$runAnimation$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/AnimateAsStateKt; HSPLandroidx/compose/animation/core/AnimateAsStateKt;->()V PLandroidx/compose/animation/core/AnimateAsStateKt;->()V HSPLandroidx/compose/animation/core/AnimateAsStateKt;->animateFloatAsState(FLandroidx/compose/animation/core/FiniteAnimationSpec;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; HPLandroidx/compose/animation/core/AnimateAsStateKt;->animateFloatAsState(FLandroidx/compose/animation/core/FiniteAnimationSpec;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; HSPLandroidx/compose/animation/core/AnimateAsStateKt;->animateValueAsState(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationSpec;Ljava/lang/Float;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; HPLandroidx/compose/animation/core/AnimateAsStateKt;->animateValueAsState(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationSpec;Ljava/lang/Float;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2; HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;->(Lkotlinx/coroutines/channels/Channel;Ljava/lang/Object;)V PLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;->(Lkotlinx/coroutines/channels/Channel;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$2;->invoke()Ljava/lang/Object; Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3; HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->(Lkotlinx/coroutines/channels/Channel;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->(Lkotlinx/coroutines/channels/Channel;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1; HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->(Ljava/lang/Object;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->(Ljava/lang/Object;Landroidx/compose/animation/core/Animatable;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/AnimateAsStateKt$animateValueAsState$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/Animation; HSPLandroidx/compose/animation/core/Animation;->isFinishedFromNanos(J)Z HPLandroidx/compose/animation/core/Animation;->isFinishedFromNanos(J)Z Landroidx/compose/animation/core/AnimationResult; HSPLandroidx/compose/animation/core/AnimationResult;->(Landroidx/compose/animation/core/AnimationState;I)V PLandroidx/compose/animation/core/AnimationResult;->(Landroidx/compose/animation/core/AnimationState;I)V Landroidx/compose/animation/core/AnimationScope; HSPLandroidx/compose/animation/core/AnimationScope;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationVector;JLjava/lang/Object;JLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/animation/core/AnimationScope;->(Ljava/lang/Object;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationVector;JLjava/lang/Object;JLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/animation/core/AnimationScope;->getFinishedTimeNanos()J PLandroidx/compose/animation/core/AnimationScope;->getFinishedTimeNanos()J HSPLandroidx/compose/animation/core/AnimationScope;->getLastFrameTimeNanos()J PLandroidx/compose/animation/core/AnimationScope;->getLastFrameTimeNanos()J HSPLandroidx/compose/animation/core/AnimationScope;->getStartTimeNanos()J PLandroidx/compose/animation/core/AnimationScope;->getStartTimeNanos()J HSPLandroidx/compose/animation/core/AnimationScope;->getValue()Ljava/lang/Object; HPLandroidx/compose/animation/core/AnimationScope;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/AnimationScope;->getVelocityVector()Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/AnimationScope;->getVelocityVector()Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationScope;->isRunning()Z HPLandroidx/compose/animation/core/AnimationScope;->isRunning()Z HSPLandroidx/compose/animation/core/AnimationScope;->setFinishedTimeNanos$animation_core_release(J)V PLandroidx/compose/animation/core/AnimationScope;->setFinishedTimeNanos$animation_core_release(J)V HSPLandroidx/compose/animation/core/AnimationScope;->setLastFrameTimeNanos$animation_core_release(J)V PLandroidx/compose/animation/core/AnimationScope;->setLastFrameTimeNanos$animation_core_release(J)V HSPLandroidx/compose/animation/core/AnimationScope;->setRunning$animation_core_release()V PLandroidx/compose/animation/core/AnimationScope;->setRunning$animation_core_release()V HSPLandroidx/compose/animation/core/AnimationScope;->setValue$animation_core_release(Ljava/lang/Object;)V HPLandroidx/compose/animation/core/AnimationScope;->setValue$animation_core_release(Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/AnimationScope;->setVelocityVector$animation_core_release(Landroidx/compose/animation/core/AnimationVector;)V PLandroidx/compose/animation/core/AnimationScope;->setVelocityVector$animation_core_release(Landroidx/compose/animation/core/AnimationVector;)V Landroidx/compose/animation/core/AnimationSpec; Landroidx/compose/animation/core/AnimationState; HSPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;I)V HPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;I)V HSPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;JJZ)V HPLandroidx/compose/animation/core/AnimationState;->(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;JJZ)V HSPLandroidx/compose/animation/core/AnimationState;->getLastFrameTimeNanos()J PLandroidx/compose/animation/core/AnimationState;->getLastFrameTimeNanos()J HSPLandroidx/compose/animation/core/AnimationState;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/AnimationState;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/AnimationState;->getValue()Ljava/lang/Object; HPLandroidx/compose/animation/core/AnimationState;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/AnimationState;->getVelocityVector()Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/AnimationState;->getVelocityVector()Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationState;->isRunning()Z PLandroidx/compose/animation/core/AnimationState;->isRunning()Z HSPLandroidx/compose/animation/core/AnimationState;->setFinishedTimeNanos$animation_core_release(J)V PLandroidx/compose/animation/core/AnimationState;->setFinishedTimeNanos$animation_core_release(J)V HSPLandroidx/compose/animation/core/AnimationState;->setLastFrameTimeNanos$animation_core_release(J)V PLandroidx/compose/animation/core/AnimationState;->setLastFrameTimeNanos$animation_core_release(J)V HSPLandroidx/compose/animation/core/AnimationState;->setRunning$animation_core_release(Z)V PLandroidx/compose/animation/core/AnimationState;->setRunning$animation_core_release(Z)V HSPLandroidx/compose/animation/core/AnimationState;->setValue$animation_core_release(Ljava/lang/Object;)V HPLandroidx/compose/animation/core/AnimationState;->setValue$animation_core_release(Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/AnimationState;->setVelocityVector$animation_core_release(Landroidx/compose/animation/core/AnimationVector;)V PLandroidx/compose/animation/core/AnimationState;->setVelocityVector$animation_core_release(Landroidx/compose/animation/core/AnimationVector;)V Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationVector;->()V HPLandroidx/compose/animation/core/AnimationVector;->()V Landroidx/compose/animation/core/AnimationVector1D; HSPLandroidx/compose/animation/core/AnimationVector1D;->(F)V HPLandroidx/compose/animation/core/AnimationVector1D;->(F)V HSPLandroidx/compose/animation/core/AnimationVector1D;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/AnimationVector1D;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/AnimationVector1D;->get$animation_core_release(I)F HPLandroidx/compose/animation/core/AnimationVector1D;->get$animation_core_release(I)F HSPLandroidx/compose/animation/core/AnimationVector1D;->getSize$animation_core_release()I HPLandroidx/compose/animation/core/AnimationVector1D;->getSize$animation_core_release()I HSPLandroidx/compose/animation/core/AnimationVector1D;->getValue()F PLandroidx/compose/animation/core/AnimationVector1D;->getValue()F HSPLandroidx/compose/animation/core/AnimationVector1D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/AnimationVector1D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationVector1D;->reset$animation_core_release()V HPLandroidx/compose/animation/core/AnimationVector1D;->reset$animation_core_release()V HSPLandroidx/compose/animation/core/AnimationVector1D;->set$animation_core_release(FI)V HPLandroidx/compose/animation/core/AnimationVector1D;->set$animation_core_release(FI)V Landroidx/compose/animation/core/AnimationVector2D; HSPLandroidx/compose/animation/core/AnimationVector2D;->(FF)V PLandroidx/compose/animation/core/AnimationVector2D;->(FF)V HSPLandroidx/compose/animation/core/AnimationVector2D;->get$animation_core_release(I)F PLandroidx/compose/animation/core/AnimationVector2D;->get$animation_core_release(I)F HSPLandroidx/compose/animation/core/AnimationVector2D;->getSize$animation_core_release()I PLandroidx/compose/animation/core/AnimationVector2D;->getSize$animation_core_release()I HSPLandroidx/compose/animation/core/AnimationVector2D;->getV1()F PLandroidx/compose/animation/core/AnimationVector2D;->getV1()F HSPLandroidx/compose/animation/core/AnimationVector2D;->getV2()F PLandroidx/compose/animation/core/AnimationVector2D;->getV2()F HSPLandroidx/compose/animation/core/AnimationVector2D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/AnimationVector2D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationVector2D;->reset$animation_core_release()V PLandroidx/compose/animation/core/AnimationVector2D;->reset$animation_core_release()V HSPLandroidx/compose/animation/core/AnimationVector2D;->set$animation_core_release(FI)V HPLandroidx/compose/animation/core/AnimationVector2D;->set$animation_core_release(FI)V Landroidx/compose/animation/core/AnimationVector3D; HSPLandroidx/compose/animation/core/AnimationVector3D;->(FFF)V PLandroidx/compose/animation/core/AnimationVector3D;->(FFF)V Landroidx/compose/animation/core/AnimationVector4D; HSPLandroidx/compose/animation/core/AnimationVector4D;->(FFFF)V HPLandroidx/compose/animation/core/AnimationVector4D;->(FFFF)V HSPLandroidx/compose/animation/core/AnimationVector4D;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/AnimationVector4D;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/AnimationVector4D;->get$animation_core_release(I)F HPLandroidx/compose/animation/core/AnimationVector4D;->get$animation_core_release(I)F HSPLandroidx/compose/animation/core/AnimationVector4D;->getSize$animation_core_release()I HPLandroidx/compose/animation/core/AnimationVector4D;->getSize$animation_core_release()I HSPLandroidx/compose/animation/core/AnimationVector4D;->getV1()F PLandroidx/compose/animation/core/AnimationVector4D;->getV1()F HSPLandroidx/compose/animation/core/AnimationVector4D;->getV2()F PLandroidx/compose/animation/core/AnimationVector4D;->getV2()F HSPLandroidx/compose/animation/core/AnimationVector4D;->getV3()F PLandroidx/compose/animation/core/AnimationVector4D;->getV3()F HSPLandroidx/compose/animation/core/AnimationVector4D;->getV4()F PLandroidx/compose/animation/core/AnimationVector4D;->getV4()F HSPLandroidx/compose/animation/core/AnimationVector4D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/AnimationVector4D;->newVector$animation_core_release()Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/AnimationVector4D;->reset$animation_core_release()V HPLandroidx/compose/animation/core/AnimationVector4D;->reset$animation_core_release()V HSPLandroidx/compose/animation/core/AnimationVector4D;->set$animation_core_release(FI)V HPLandroidx/compose/animation/core/AnimationVector4D;->set$animation_core_release(FI)V Landroidx/compose/animation/core/Animations; Landroidx/compose/animation/core/ComplexDouble; HSPLandroidx/compose/animation/core/ComplexDouble;->(DD)V HPLandroidx/compose/animation/core/ComplexDouble;->(DD)V HSPLandroidx/compose/animation/core/ComplexDouble;->access$get_imaginary$p(Landroidx/compose/animation/core/ComplexDouble;)D HPLandroidx/compose/animation/core/ComplexDouble;->access$get_imaginary$p(Landroidx/compose/animation/core/ComplexDouble;)D HSPLandroidx/compose/animation/core/ComplexDouble;->access$get_real$p(Landroidx/compose/animation/core/ComplexDouble;)D HPLandroidx/compose/animation/core/ComplexDouble;->access$get_real$p(Landroidx/compose/animation/core/ComplexDouble;)D HSPLandroidx/compose/animation/core/ComplexDouble;->access$set_imaginary$p(Landroidx/compose/animation/core/ComplexDouble;D)V HPLandroidx/compose/animation/core/ComplexDouble;->access$set_imaginary$p(Landroidx/compose/animation/core/ComplexDouble;D)V HSPLandroidx/compose/animation/core/ComplexDouble;->access$set_real$p(Landroidx/compose/animation/core/ComplexDouble;D)V HPLandroidx/compose/animation/core/ComplexDouble;->access$set_real$p(Landroidx/compose/animation/core/ComplexDouble;D)V Landroidx/compose/animation/core/CubicBezierEasing; HSPLandroidx/compose/animation/core/CubicBezierEasing;->(FFFF)V PLandroidx/compose/animation/core/CubicBezierEasing;->(FFFF)V HSPLandroidx/compose/animation/core/CubicBezierEasing;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/CubicBezierEasing;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/CubicBezierEasing;->transform(F)F HPLandroidx/compose/animation/core/CubicBezierEasing;->transform(F)F Landroidx/compose/animation/core/DecayAnimationSpec; Landroidx/compose/animation/core/DecayAnimationSpecImpl; HSPLandroidx/compose/animation/core/DecayAnimationSpecImpl;->(Landroidx/compose/animation/core/FloatDecayAnimationSpec;)V HPLandroidx/compose/animation/core/DecayAnimationSpecImpl;->(Landroidx/compose/animation/core/FloatDecayAnimationSpec;)V Landroidx/compose/animation/core/DurationBasedAnimationSpec; Landroidx/compose/animation/core/Easing; Landroidx/compose/animation/core/EasingKt; HSPLandroidx/compose/animation/core/EasingKt;->()V PLandroidx/compose/animation/core/EasingKt;->()V HSPLandroidx/compose/animation/core/EasingKt;->getFastOutLinearInEasing()Landroidx/compose/animation/core/CubicBezierEasing; PLandroidx/compose/animation/core/EasingKt;->getFastOutLinearInEasing()Landroidx/compose/animation/core/CubicBezierEasing; HSPLandroidx/compose/animation/core/EasingKt;->getFastOutSlowInEasing()Landroidx/compose/animation/core/CubicBezierEasing; PLandroidx/compose/animation/core/EasingKt;->getFastOutSlowInEasing()Landroidx/compose/animation/core/CubicBezierEasing; HSPLandroidx/compose/animation/core/EasingKt;->getLinearEasing()Landroidx/compose/animation/core/Easing; PLandroidx/compose/animation/core/EasingKt;->getLinearEasing()Landroidx/compose/animation/core/Easing; HSPLandroidx/compose/animation/core/EasingKt;->getLinearOutSlowInEasing()Landroidx/compose/animation/core/CubicBezierEasing; PLandroidx/compose/animation/core/EasingKt;->getLinearOutSlowInEasing()Landroidx/compose/animation/core/CubicBezierEasing; Landroidx/compose/animation/core/EasingKt$LinearEasing$1; HSPLandroidx/compose/animation/core/EasingKt$LinearEasing$1;->()V PLandroidx/compose/animation/core/EasingKt$LinearEasing$1;->()V HSPLandroidx/compose/animation/core/EasingKt$LinearEasing$1;->()V PLandroidx/compose/animation/core/EasingKt$LinearEasing$1;->()V HSPLandroidx/compose/animation/core/EasingKt$LinearEasing$1;->transform(F)F PLandroidx/compose/animation/core/EasingKt$LinearEasing$1;->transform(F)F Landroidx/compose/animation/core/FiniteAnimationSpec; Landroidx/compose/animation/core/FloatAnimationSpec; Landroidx/compose/animation/core/FloatDecayAnimationSpec; Landroidx/compose/animation/core/FloatSpringSpec; HSPLandroidx/compose/animation/core/FloatSpringSpec;->(FFF)V HPLandroidx/compose/animation/core/FloatSpringSpec;->(FFF)V HSPLandroidx/compose/animation/core/FloatSpringSpec;->getDurationNanos(FFF)J HPLandroidx/compose/animation/core/FloatSpringSpec;->getDurationNanos(FFF)J HSPLandroidx/compose/animation/core/FloatSpringSpec;->getEndVelocity(FFF)F PLandroidx/compose/animation/core/FloatSpringSpec;->getEndVelocity(FFF)F Landroidx/compose/animation/core/FloatTweenSpec; HSPLandroidx/compose/animation/core/FloatTweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HPLandroidx/compose/animation/core/FloatTweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HSPLandroidx/compose/animation/core/FloatTweenSpec;->getValueFromNanos(JFFF)F HPLandroidx/compose/animation/core/FloatTweenSpec;->getValueFromNanos(JFFF)F HSPLandroidx/compose/animation/core/FloatTweenSpec;->getVelocityFromNanos(JFFF)F HPLandroidx/compose/animation/core/FloatTweenSpec;->getVelocityFromNanos(JFFF)F Landroidx/compose/animation/core/InfiniteRepeatableSpec; HSPLandroidx/compose/animation/core/InfiniteRepeatableSpec;->(Landroidx/compose/animation/core/DurationBasedAnimationSpec;IJ)V PLandroidx/compose/animation/core/InfiniteRepeatableSpec;->(Landroidx/compose/animation/core/DurationBasedAnimationSpec;IJ)V HSPLandroidx/compose/animation/core/InfiniteRepeatableSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; PLandroidx/compose/animation/core/InfiniteRepeatableSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; Landroidx/compose/animation/core/InfiniteTransition; HSPLandroidx/compose/animation/core/InfiniteTransition;->()V PLandroidx/compose/animation/core/InfiniteTransition;->()V HSPLandroidx/compose/animation/core/InfiniteTransition;->access$getStartTimeNanos$p(Landroidx/compose/animation/core/InfiniteTransition;)J PLandroidx/compose/animation/core/InfiniteTransition;->access$getStartTimeNanos$p(Landroidx/compose/animation/core/InfiniteTransition;)J HSPLandroidx/compose/animation/core/InfiniteTransition;->access$get_animations$p(Landroidx/compose/animation/core/InfiniteTransition;)Landroidx/compose/runtime/collection/MutableVector; PLandroidx/compose/animation/core/InfiniteTransition;->access$get_animations$p(Landroidx/compose/animation/core/InfiniteTransition;)Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/animation/core/InfiniteTransition;->access$onFrame(Landroidx/compose/animation/core/InfiniteTransition;J)V PLandroidx/compose/animation/core/InfiniteTransition;->access$onFrame(Landroidx/compose/animation/core/InfiniteTransition;J)V HSPLandroidx/compose/animation/core/InfiniteTransition;->access$setRefreshChildNeeded(Landroidx/compose/animation/core/InfiniteTransition;Z)V PLandroidx/compose/animation/core/InfiniteTransition;->access$setRefreshChildNeeded(Landroidx/compose/animation/core/InfiniteTransition;Z)V HSPLandroidx/compose/animation/core/InfiniteTransition;->access$setStartTimeNanos$p(Landroidx/compose/animation/core/InfiniteTransition;J)V PLandroidx/compose/animation/core/InfiniteTransition;->access$setStartTimeNanos$p(Landroidx/compose/animation/core/InfiniteTransition;J)V HSPLandroidx/compose/animation/core/InfiniteTransition;->addAnimation$animation_core_release(Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;)V PLandroidx/compose/animation/core/InfiniteTransition;->addAnimation$animation_core_release(Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;)V HSPLandroidx/compose/animation/core/InfiniteTransition;->removeAnimation$animation_core_release(Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;)V PLandroidx/compose/animation/core/InfiniteTransition;->removeAnimation$animation_core_release(Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;)V HSPLandroidx/compose/animation/core/InfiniteTransition;->run$animation_core_release(Landroidx/compose/runtime/Composer;I)V PLandroidx/compose/animation/core/InfiniteTransition;->run$animation_core_release(Landroidx/compose/runtime/Composer;I)V Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState; HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->(Landroidx/compose/animation/core/InfiniteTransition;Ljava/lang/Number;Ljava/lang/Number;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationSpec;)V PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->(Landroidx/compose/animation/core/InfiniteTransition;Ljava/lang/Number;Ljava/lang/Number;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/AnimationSpec;)V HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->getInitialValue$animation_core_release()Ljava/lang/Object; PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->getInitialValue$animation_core_release()Ljava/lang/Object; HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->getTargetValue$animation_core_release()Ljava/lang/Object; PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->getTargetValue$animation_core_release()Ljava/lang/Object; HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->getValue()Ljava/lang/Object; PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->isFinished$animation_core_release()Z PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->isFinished$animation_core_release()Z HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->onPlayTimeChanged$animation_core_release(J)V PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->onPlayTimeChanged$animation_core_release(J)V HSPLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->reset$animation_core_release()V PLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;->reset$animation_core_release()V Landroidx/compose/animation/core/InfiniteTransition$run$1; HSPLandroidx/compose/animation/core/InfiniteTransition$run$1;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/animation/core/InfiniteTransition;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/animation/core/InfiniteTransition$run$1;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/animation/core/InfiniteTransition;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/InfiniteTransition$run$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/animation/core/InfiniteTransition$run$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/core/InfiniteTransition$run$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/core/InfiniteTransition$run$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/InfiniteTransition$run$1$1; HSPLandroidx/compose/animation/core/InfiniteTransition$run$1$1;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/animation/core/InfiniteTransition;Lkotlin/jvm/internal/Ref$FloatRef;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/animation/core/InfiniteTransition$run$1$1;->(Landroidx/compose/runtime/MutableState;Landroidx/compose/animation/core/InfiniteTransition;Lkotlin/jvm/internal/Ref$FloatRef;Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/animation/core/InfiniteTransition$run$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/core/InfiniteTransition$run$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/InfiniteTransition$run$1$2; HSPLandroidx/compose/animation/core/InfiniteTransition$run$1$2;->(Ljava/lang/Object;I)V HPLandroidx/compose/animation/core/InfiniteTransition$run$1$2;->(Ljava/lang/Object;I)V Landroidx/compose/animation/core/InfiniteTransition$run$2; HSPLandroidx/compose/animation/core/InfiniteTransition$run$2;->(Landroidx/compose/animation/core/InfiniteTransition;I)V PLandroidx/compose/animation/core/InfiniteTransition$run$2;->(Landroidx/compose/animation/core/InfiniteTransition;I)V Landroidx/compose/animation/core/InfiniteTransitionKt$animateValue$1; HSPLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$1;->(Ljava/lang/Number;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Ljava/lang/Number;Landroidx/compose/animation/core/InfiniteRepeatableSpec;)V PLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$1;->(Ljava/lang/Number;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Ljava/lang/Number;Landroidx/compose/animation/core/InfiniteRepeatableSpec;)V HSPLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$1;->invoke()Ljava/lang/Object; PLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$1;->invoke()Ljava/lang/Object; Landroidx/compose/animation/core/InfiniteTransitionKt$animateValue$2$invoke$$inlined$onDispose$1; HSPLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$2$invoke$$inlined$onDispose$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$2$invoke$$inlined$onDispose$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$2$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/animation/core/InfiniteTransitionKt$animateValue$2$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/animation/core/KeyframesSpec; HSPLandroidx/compose/animation/core/KeyframesSpec;->(Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;)V HPLandroidx/compose/animation/core/KeyframesSpec;->(Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;)V HSPLandroidx/compose/animation/core/KeyframesSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; PLandroidx/compose/animation/core/KeyframesSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; HSPLandroidx/compose/animation/core/KeyframesSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; PLandroidx/compose/animation/core/KeyframesSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; HSPLandroidx/compose/animation/core/KeyframesSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedKeyframesSpec; HPLandroidx/compose/animation/core/KeyframesSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedKeyframesSpec; Landroidx/compose/animation/core/KeyframesSpec$KeyframeEntity; HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;->(Ljava/lang/Object;)V HPLandroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;->(Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;->setEasing$animation_core_release(Landroidx/compose/animation/core/Easing;)V PLandroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;->setEasing$animation_core_release(Landroidx/compose/animation/core/Easing;)V HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;->toPair$animation_core_release(Lkotlin/jvm/functions/Function1;)Lkotlin/Pair; PLandroidx/compose/animation/core/KeyframesSpec$KeyframeEntity;->toPair$animation_core_release(Lkotlin/jvm/functions/Function1;)Lkotlin/Pair; Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig; HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->()V HPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->()V HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->at(ILjava/lang/Object;)Landroidx/compose/animation/core/KeyframesSpec$KeyframeEntity; HPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->at(ILjava/lang/Object;)Landroidx/compose/animation/core/KeyframesSpec$KeyframeEntity; HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->getDurationMillis()I PLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->getDurationMillis()I HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->getKeyframes$animation_core_release()Ljava/util/LinkedHashMap; PLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->getKeyframes$animation_core_release()Ljava/util/LinkedHashMap; HSPLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->setDurationMillis(I)V PLandroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;->setDurationMillis(I)V Landroidx/compose/animation/core/Motion; HSPLandroidx/compose/animation/core/Motion;->()V PLandroidx/compose/animation/core/Motion;->()V HSPLandroidx/compose/animation/core/Motion;->Animatable$default(F)Landroidx/compose/animation/core/Animatable; HPLandroidx/compose/animation/core/Motion;->Animatable$default(F)Landroidx/compose/animation/core/Animatable; HSPLandroidx/compose/animation/core/Motion;->AnimationState$default(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Float;Ljava/lang/Float;)Landroidx/compose/animation/core/AnimationState; PLandroidx/compose/animation/core/Motion;->AnimationState$default(Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Float;Ljava/lang/Float;)Landroidx/compose/animation/core/AnimationState; HSPLandroidx/compose/animation/core/Motion;->access$getNegativeInfinityBounds1D$p()Landroidx/compose/animation/core/AnimationVector1D; PLandroidx/compose/animation/core/Motion;->access$getNegativeInfinityBounds1D$p()Landroidx/compose/animation/core/AnimationVector1D; HSPLandroidx/compose/animation/core/Motion;->access$getNegativeInfinityBounds4D$p()Landroidx/compose/animation/core/AnimationVector4D; PLandroidx/compose/animation/core/Motion;->access$getNegativeInfinityBounds4D$p()Landroidx/compose/animation/core/AnimationVector4D; HSPLandroidx/compose/animation/core/Motion;->access$getPositiveInfinityBounds1D$p()Landroidx/compose/animation/core/AnimationVector1D; PLandroidx/compose/animation/core/Motion;->access$getPositiveInfinityBounds1D$p()Landroidx/compose/animation/core/AnimationVector1D; HSPLandroidx/compose/animation/core/Motion;->access$getPositiveInfinityBounds4D$p()Landroidx/compose/animation/core/AnimationVector4D; PLandroidx/compose/animation/core/Motion;->access$getPositiveInfinityBounds4D$p()Landroidx/compose/animation/core/AnimationVector4D; HSPLandroidx/compose/animation/core/Motion;->animateFloat(Landroidx/compose/animation/core/InfiniteTransition;FLandroidx/compose/animation/core/InfiniteRepeatableSpec;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState; PLandroidx/compose/animation/core/Motion;->animateFloat(Landroidx/compose/animation/core/InfiniteTransition;FLandroidx/compose/animation/core/InfiniteRepeatableSpec;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState; HSPLandroidx/compose/animation/core/Motion;->animateValue(Landroidx/compose/animation/core/InfiniteTransition;Ljava/lang/Number;Ljava/lang/Number;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/InfiniteRepeatableSpec;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState; PLandroidx/compose/animation/core/Motion;->animateValue(Landroidx/compose/animation/core/InfiniteTransition;Ljava/lang/Number;Ljava/lang/Number;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/animation/core/InfiniteRepeatableSpec;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState; HSPLandroidx/compose/animation/core/Motion;->complexSqrt(D)Landroidx/compose/animation/core/ComplexDouble; HPLandroidx/compose/animation/core/Motion;->complexSqrt(D)Landroidx/compose/animation/core/ComplexDouble; HSPLandroidx/compose/animation/core/Motion;->copy(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/Motion;->copy(Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/Motion;->createChildTransitionInternal(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/EnterExitState;Landroidx/compose/animation/EnterExitState;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; HPLandroidx/compose/animation/core/Motion;->createChildTransitionInternal(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/EnterExitState;Landroidx/compose/animation/EnterExitState;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition; HSPLandroidx/compose/animation/core/Motion;->createDeferredAnimation(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition$DeferredAnimation; HPLandroidx/compose/animation/core/Motion;->createDeferredAnimation(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/Transition$DeferredAnimation; HSPLandroidx/compose/animation/core/Motion;->createTransitionAnimation(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/Transition$TransitionAnimationState; HPLandroidx/compose/animation/core/Motion;->createTransitionAnimation(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Landroidx/compose/runtime/Composer;)Landroidx/compose/animation/core/Transition$TransitionAnimationState; HSPLandroidx/compose/animation/core/Motion;->generateDecayAnimationSpec(Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;)Landroidx/compose/animation/core/DecayAnimationSpec; PLandroidx/compose/animation/core/Motion;->generateDecayAnimationSpec(Landroidx/compose/animation/SplineBasedFloatDecayAnimationSpec;)Landroidx/compose/animation/core/DecayAnimationSpec; HSPLandroidx/compose/animation/core/Motion;->infiniteRepeatable-9IiC70o$default(Landroidx/compose/animation/core/DurationBasedAnimationSpec;II)Landroidx/compose/animation/core/InfiniteRepeatableSpec; PLandroidx/compose/animation/core/Motion;->infiniteRepeatable-9IiC70o$default(Landroidx/compose/animation/core/DurationBasedAnimationSpec;II)Landroidx/compose/animation/core/InfiniteRepeatableSpec; HSPLandroidx/compose/animation/core/Motion;->keyframes(Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/KeyframesSpec; PLandroidx/compose/animation/core/Motion;->keyframes(Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/KeyframesSpec; HSPLandroidx/compose/animation/core/Motion;->rememberInfiniteTransition(Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/InfiniteTransition; PLandroidx/compose/animation/core/Motion;->rememberInfiniteTransition(Ljava/lang/String;Landroidx/compose/runtime/Composer;I)Landroidx/compose/animation/core/InfiniteTransition; HSPLandroidx/compose/animation/core/Motion;->spring$default(FLjava/lang/Object;I)Landroidx/compose/animation/core/SpringSpec; HPLandroidx/compose/animation/core/Motion;->spring$default(FLjava/lang/Object;I)Landroidx/compose/animation/core/SpringSpec; HSPLandroidx/compose/animation/core/Motion;->tween$default(IILandroidx/compose/animation/core/Easing;I)Landroidx/compose/animation/core/TweenSpec; HPLandroidx/compose/animation/core/Motion;->tween$default(IILandroidx/compose/animation/core/Easing;I)Landroidx/compose/animation/core/TweenSpec; HSPLandroidx/compose/animation/core/Motion;->updateTransition(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/animation/core/Transition; HPLandroidx/compose/animation/core/Motion;->updateTransition(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)Landroidx/compose/animation/core/Transition; Landroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0; HSPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->()V PLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->()V HSPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;II)Ljava/lang/Object; HPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;II)Ljava/lang/Object; HSPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->m(Lkotlin/coroutines/CoroutineContext$Element;)V PLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->m(Lkotlin/coroutines/CoroutineContext$Element;)V HSPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->ordinal(I)I HPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->ordinal(I)I HSPLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->values(I)[I PLandroidx/compose/animation/core/Motion$$ExternalSyntheticOutline0;->values(I)[I Landroidx/compose/animation/core/MutableTransitionState; HSPLandroidx/compose/animation/core/MutableTransitionState;->(Ljava/lang/Object;)V PLandroidx/compose/animation/core/MutableTransitionState;->(Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/MutableTransitionState;->getCurrentState()Ljava/lang/Object; HPLandroidx/compose/animation/core/MutableTransitionState;->getCurrentState()Ljava/lang/Object; HSPLandroidx/compose/animation/core/MutableTransitionState;->getTargetState()Ljava/lang/Object; PLandroidx/compose/animation/core/MutableTransitionState;->getTargetState()Ljava/lang/Object; HSPLandroidx/compose/animation/core/MutableTransitionState;->setCurrentState$animation_core_release(Ljava/lang/Object;)V HPLandroidx/compose/animation/core/MutableTransitionState;->setCurrentState$animation_core_release(Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/MutableTransitionState;->setRunning$animation_core_release(Z)V HPLandroidx/compose/animation/core/MutableTransitionState;->setRunning$animation_core_release(Z)V HSPLandroidx/compose/animation/core/MutableTransitionState;->setTargetState(Ljava/lang/Boolean;)V PLandroidx/compose/animation/core/MutableTransitionState;->setTargetState(Ljava/lang/Boolean;)V Landroidx/compose/animation/core/MutatorMutex; HSPLandroidx/compose/animation/core/MutatorMutex;->()V PLandroidx/compose/animation/core/MutatorMutex;->()V HSPLandroidx/compose/animation/core/MutatorMutex;->access$getCurrentMutator$p(Landroidx/compose/animation/core/MutatorMutex;)Ljava/util/concurrent/atomic/AtomicReference; PLandroidx/compose/animation/core/MutatorMutex;->access$getCurrentMutator$p(Landroidx/compose/animation/core/MutatorMutex;)Ljava/util/concurrent/atomic/AtomicReference; HSPLandroidx/compose/animation/core/MutatorMutex;->access$getMutex$p(Landroidx/compose/animation/core/MutatorMutex;)Lkotlinx/coroutines/sync/Mutex; PLandroidx/compose/animation/core/MutatorMutex;->access$getMutex$p(Landroidx/compose/animation/core/MutatorMutex;)Lkotlinx/coroutines/sync/Mutex; HSPLandroidx/compose/animation/core/MutatorMutex;->access$tryMutateOrCancel(Landroidx/compose/animation/core/MutatorMutex;Landroidx/compose/animation/core/MutatorMutex$Mutator;)V HPLandroidx/compose/animation/core/MutatorMutex;->access$tryMutateOrCancel(Landroidx/compose/animation/core/MutatorMutex;Landroidx/compose/animation/core/MutatorMutex$Mutator;)V Landroidx/compose/animation/core/MutatorMutex$Mutator; HSPLandroidx/compose/animation/core/MutatorMutex$Mutator;->(ILkotlinx/coroutines/Job;)V PLandroidx/compose/animation/core/MutatorMutex$Mutator;->(ILkotlinx/coroutines/Job;)V Landroidx/compose/animation/core/MutatorMutex$mutate$2; HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->(ILandroidx/compose/animation/core/MutatorMutex;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->(ILandroidx/compose/animation/core/MutatorMutex;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/animation/core/MutatorMutex$mutate$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/MutatorMutex$mutate$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/RepeatableSpec; Landroidx/compose/animation/core/SpringSimulation; HSPLandroidx/compose/animation/core/SpringSimulation;->()V HPLandroidx/compose/animation/core/SpringSimulation;->()V HSPLandroidx/compose/animation/core/SpringSimulation;->getDampingRatio()F PLandroidx/compose/animation/core/SpringSimulation;->getDampingRatio()F HSPLandroidx/compose/animation/core/SpringSimulation;->getStiffness()F PLandroidx/compose/animation/core/SpringSimulation;->getStiffness()F HSPLandroidx/compose/animation/core/SpringSimulation;->setDampingRatio(F)V HPLandroidx/compose/animation/core/SpringSimulation;->setDampingRatio(F)V HSPLandroidx/compose/animation/core/SpringSimulation;->setStiffness(F)V HPLandroidx/compose/animation/core/SpringSimulation;->setStiffness(F)V Landroidx/compose/animation/core/SpringSpec; HSPLandroidx/compose/animation/core/SpringSpec;->(FFLjava/lang/Object;)V HPLandroidx/compose/animation/core/SpringSpec;->(FFLjava/lang/Object;)V HSPLandroidx/compose/animation/core/SpringSpec;->(Ljava/lang/Object;)V PLandroidx/compose/animation/core/SpringSpec;->(Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/SpringSpec;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/SpringSpec;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/SpringSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; PLandroidx/compose/animation/core/SpringSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; Landroidx/compose/animation/core/SuspendAnimationKt; HSPLandroidx/compose/animation/core/SuspendAnimationKt;->access$doAnimationFrameWithScale(Landroidx/compose/animation/core/AnimationScope;JFLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/animation/core/SuspendAnimationKt;->access$doAnimationFrameWithScale(Landroidx/compose/animation/core/AnimationScope;JFLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/SuspendAnimationKt;->animate(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/animation/core/SuspendAnimationKt;->animate(Landroidx/compose/animation/core/AnimationState;Landroidx/compose/animation/core/Animation;JLkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/animation/core/SuspendAnimationKt;->doAnimationFrameWithScale(Landroidx/compose/animation/core/AnimationScope;JFLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/animation/core/SuspendAnimationKt;->doAnimationFrameWithScale(Landroidx/compose/animation/core/AnimationScope;JFLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/SuspendAnimationKt;->getDurationScale(Lkotlin/coroutines/CoroutineContext;)F HPLandroidx/compose/animation/core/SuspendAnimationKt;->getDurationScale(Lkotlin/coroutines/CoroutineContext;)F HSPLandroidx/compose/animation/core/SuspendAnimationKt;->updateState(Landroidx/compose/animation/core/AnimationScope;Landroidx/compose/animation/core/AnimationState;)V HPLandroidx/compose/animation/core/SuspendAnimationKt;->updateState(Landroidx/compose/animation/core/AnimationScope;Landroidx/compose/animation/core/AnimationState;)V Landroidx/compose/animation/core/SuspendAnimationKt$animate$3; HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->invoke(Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->invoke(Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/SuspendAnimationKt$animate$4; HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;->(Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/SuspendAnimationKt$animate$5; HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$5;->()V PLandroidx/compose/animation/core/SuspendAnimationKt$animate$5;->()V HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$5;->(I)V PLandroidx/compose/animation/core/SuspendAnimationKt$animate$5;->(I)V HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/SuspendAnimationKt$animate$6; HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$6;->(Lkotlin/jvm/internal/Ref$ObjectRef;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationState;FLkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/core/SuspendAnimationKt$animate$6;->(Lkotlin/jvm/internal/Ref$ObjectRef;Ljava/lang/Object;Landroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationState;FLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/SuspendAnimationKt$animate$9; HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$9;->(Lkotlin/jvm/internal/Ref$ObjectRef;FLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$9;->(Lkotlin/jvm/internal/Ref$ObjectRef;FLandroidx/compose/animation/core/Animation;Landroidx/compose/animation/core/AnimationState;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/SuspendAnimationKt$animate$9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/SuspendAnimationKt$animate$9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/TargetBasedAnimation; HSPLandroidx/compose/animation/core/TargetBasedAnimation;->(Landroidx/compose/animation/core/AnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/animation/core/TargetBasedAnimation;->(Landroidx/compose/animation/core/AnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/TargetBasedAnimation;->(Landroidx/compose/animation/core/AnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;)V HPLandroidx/compose/animation/core/TargetBasedAnimation;->(Landroidx/compose/animation/core/AnimationSpec;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;)V HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getDurationNanos()J HPLandroidx/compose/animation/core/TargetBasedAnimation;->getDurationNanos()J HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getTargetValue()Ljava/lang/Object; PLandroidx/compose/animation/core/TargetBasedAnimation;->getTargetValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/TargetBasedAnimation;->getTypeConverter()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getValueFromNanos(J)Ljava/lang/Object; HPLandroidx/compose/animation/core/TargetBasedAnimation;->getValueFromNanos(J)Ljava/lang/Object; HSPLandroidx/compose/animation/core/TargetBasedAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/TargetBasedAnimation;->getVelocityVectorFromNanos(J)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/TargetBasedAnimation;->isInfinite()Z PLandroidx/compose/animation/core/TargetBasedAnimation;->isInfinite()Z Landroidx/compose/animation/core/Transition; HSPLandroidx/compose/animation/core/Transition;->(Landroidx/compose/animation/core/MutableTransitionState;Ljava/lang/String;)V HPLandroidx/compose/animation/core/Transition;->(Landroidx/compose/animation/core/MutableTransitionState;Ljava/lang/String;)V HSPLandroidx/compose/animation/core/Transition;->access$onChildAnimationUpdated(Landroidx/compose/animation/core/Transition;)V HPLandroidx/compose/animation/core/Transition;->access$onChildAnimationUpdated(Landroidx/compose/animation/core/Transition;)V HSPLandroidx/compose/animation/core/Transition;->addAnimation$animation_core_release(Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V HPLandroidx/compose/animation/core/Transition;->addAnimation$animation_core_release(Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V HSPLandroidx/compose/animation/core/Transition;->addTransition$animation_core_release(Landroidx/compose/animation/core/Transition;)V PLandroidx/compose/animation/core/Transition;->addTransition$animation_core_release(Landroidx/compose/animation/core/Transition;)V HSPLandroidx/compose/animation/core/Transition;->animateTo$animation_core_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/animation/core/Transition;->animateTo$animation_core_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/animation/core/Transition;->getCurrentState()Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition;->getCurrentState()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Transition;->getLabel()Ljava/lang/String; PLandroidx/compose/animation/core/Transition;->getLabel()Ljava/lang/String; HSPLandroidx/compose/animation/core/Transition;->getPlayTimeNanos()J PLandroidx/compose/animation/core/Transition;->getPlayTimeNanos()J HSPLandroidx/compose/animation/core/Transition;->getSegment()Landroidx/compose/animation/core/Transition$Segment; HPLandroidx/compose/animation/core/Transition;->getSegment()Landroidx/compose/animation/core/Transition$Segment; HSPLandroidx/compose/animation/core/Transition;->getTargetState()Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition;->getTargetState()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Transition;->isSeeking()Z HPLandroidx/compose/animation/core/Transition;->isSeeking()Z HSPLandroidx/compose/animation/core/Transition;->onFrame$animation_core_release(JF)V HPLandroidx/compose/animation/core/Transition;->onFrame$animation_core_release(JF)V HSPLandroidx/compose/animation/core/Transition;->onTransitionEnd$animation_core_release()V HPLandroidx/compose/animation/core/Transition;->onTransitionEnd$animation_core_release()V HSPLandroidx/compose/animation/core/Transition;->removeAnimation$animation_core_release(Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V PLandroidx/compose/animation/core/Transition;->removeAnimation$animation_core_release(Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V HSPLandroidx/compose/animation/core/Transition;->removeTransition$animation_core_release(Landroidx/compose/animation/core/Transition;)V PLandroidx/compose/animation/core/Transition;->removeTransition$animation_core_release(Landroidx/compose/animation/core/Transition;)V HSPLandroidx/compose/animation/core/Transition;->setSeeking$animation_core_release(Z)V PLandroidx/compose/animation/core/Transition;->setSeeking$animation_core_release(Z)V HSPLandroidx/compose/animation/core/Transition;->updateTarget$animation_core_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/animation/core/Transition;->updateTarget$animation_core_release(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)V Landroidx/compose/animation/core/Transition$DeferredAnimation; HSPLandroidx/compose/animation/core/Transition$DeferredAnimation;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/String;)V PLandroidx/compose/animation/core/Transition$DeferredAnimation;->(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/core/TwoWayConverter;Ljava/lang/String;)V HSPLandroidx/compose/animation/core/Transition$DeferredAnimation;->animate(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData; HPLandroidx/compose/animation/core/Transition$DeferredAnimation;->animate(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData; HSPLandroidx/compose/animation/core/Transition$DeferredAnimation;->getData$animation_core_release()Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData; HPLandroidx/compose/animation/core/Transition$DeferredAnimation;->getData$animation_core_release()Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData; Landroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData; HSPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$TransitionAnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->(Landroidx/compose/animation/core/Transition$DeferredAnimation;Landroidx/compose/animation/core/Transition$TransitionAnimationState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->getAnimation()Landroidx/compose/animation/core/Transition$TransitionAnimationState; PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->getAnimation()Landroidx/compose/animation/core/Transition$TransitionAnimationState; HSPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->getValue()Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->setTargetValueByState(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->setTargetValueByState(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->setTransitionSpec(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->setTransitionSpec(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->updateAnimationStates(Landroidx/compose/animation/core/Transition$Segment;)V HPLandroidx/compose/animation/core/Transition$DeferredAnimation$DeferredAnimationData;->updateAnimationStates(Landroidx/compose/animation/core/Transition$Segment;)V Landroidx/compose/animation/core/Transition$Segment; HSPLandroidx/compose/animation/core/Transition$Segment;->isTransitioningTo(Ljava/lang/Object;Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/Transition$Segment;->isTransitioningTo(Ljava/lang/Object;Ljava/lang/Object;)Z Landroidx/compose/animation/core/Transition$SegmentImpl; HSPLandroidx/compose/animation/core/Transition$SegmentImpl;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/animation/core/Transition$SegmentImpl;->(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/animation/core/Transition$SegmentImpl;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/Transition$SegmentImpl;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/Transition$SegmentImpl;->getInitialState()Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$SegmentImpl;->getInitialState()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Transition$SegmentImpl;->getTargetState()Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$SegmentImpl;->getTargetState()Ljava/lang/Object; Landroidx/compose/animation/core/Transition$TransitionAnimationState; HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/TwoWayConverter;)V HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/TwoWayConverter;)V HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getAnimation()Landroidx/compose/animation/core/TargetBasedAnimation; HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getAnimation()Landroidx/compose/animation/core/TargetBasedAnimation; HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getValue()Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->getValue()Ljava/lang/Object; HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->isFinished$animation_core_release()Z HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->isFinished$animation_core_release()Z HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->onPlayTimeChanged$animation_core_release(JF)V HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->onPlayTimeChanged$animation_core_release(JF)V HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->resetAnimation$animation_core_release()V PLandroidx/compose/animation/core/Transition$TransitionAnimationState;->resetAnimation$animation_core_release()V HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateAnimation$default(Landroidx/compose/animation/core/Transition$TransitionAnimationState;Ljava/lang/Object;ZI)V HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateAnimation$default(Landroidx/compose/animation/core/Transition$TransitionAnimationState;Ljava/lang/Object;ZI)V HSPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateTargetValue$animation_core_release(Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;)V HPLandroidx/compose/animation/core/Transition$TransitionAnimationState;->updateTargetValue$animation_core_release(Ljava/lang/Object;Landroidx/compose/animation/core/FiniteAnimationSpec;)V Landroidx/compose/animation/core/Transition$animateTo$1$1; HSPLandroidx/compose/animation/core/Transition$animateTo$1$1;->(Landroidx/compose/animation/core/Transition;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/animation/core/Transition$animateTo$1$1;->(Landroidx/compose/animation/core/Transition;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/animation/core/Transition$animateTo$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/animation/core/Transition$animateTo$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/animation/core/Transition$animateTo$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$animateTo$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/Transition$animateTo$1$1$1; HSPLandroidx/compose/animation/core/Transition$animateTo$1$1$1;->(Landroidx/compose/animation/core/Transition;F)V HPLandroidx/compose/animation/core/Transition$animateTo$1$1$1;->(Landroidx/compose/animation/core/Transition;F)V HSPLandroidx/compose/animation/core/Transition$animateTo$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$animateTo$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/Transition$animateTo$2; HSPLandroidx/compose/animation/core/Transition$animateTo$2;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;II)V HPLandroidx/compose/animation/core/Transition$animateTo$2;->(Landroidx/compose/animation/core/Transition;Ljava/lang/Object;II)V HSPLandroidx/compose/animation/core/Transition$animateTo$2;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/animation/core/Transition$animateTo$2;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/animation/core/Transition$animateTo$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/Transition$animateTo$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/Transition$totalDurationNanos$2; HSPLandroidx/compose/animation/core/Transition$totalDurationNanos$2;->(Landroidx/compose/animation/core/Transition;)V PLandroidx/compose/animation/core/Transition$totalDurationNanos$2;->(Landroidx/compose/animation/core/Transition;)V Landroidx/compose/animation/core/TransitionKt$updateTransition$1$1; HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->(Ljava/lang/Object;I)V PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->invoke(Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->invoke(Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/animation/core/Transition;I)V PLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/animation/core/Transition;I)V HSPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/animation/core/TransitionKt$updateTransition$1$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/animation/core/TweenSpec; HSPLandroidx/compose/animation/core/TweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HPLandroidx/compose/animation/core/TweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HSPLandroidx/compose/animation/core/TweenSpec;->(ILandroidx/compose/animation/core/Easing;I)V PLandroidx/compose/animation/core/TweenSpec;->(ILandroidx/compose/animation/core/Easing;I)V HSPLandroidx/compose/animation/core/TweenSpec;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/animation/core/TweenSpec;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; PLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; HSPLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; PLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; HSPLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; PLandroidx/compose/animation/core/TweenSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; Landroidx/compose/animation/core/TwoWayConverter; Landroidx/compose/animation/core/TwoWayConverterImpl; HSPLandroidx/compose/animation/core/TwoWayConverterImpl;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/animation/core/TwoWayConverterImpl;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/animation/core/TwoWayConverterImpl;->getConvertFromVector()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/animation/core/TwoWayConverterImpl;->getConvertFromVector()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/animation/core/TwoWayConverterImpl;->getConvertToVector()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/animation/core/TwoWayConverterImpl;->getConvertToVector()Lkotlin/jvm/functions/Function1; Landroidx/compose/animation/core/VectorConvertersKt; HSPLandroidx/compose/animation/core/VectorConvertersKt;->()V PLandroidx/compose/animation/core/VectorConvertersKt;->()V HSPLandroidx/compose/animation/core/VectorConvertersKt;->TwoWayConverter(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->TwoWayConverter(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$1$1()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$1$1()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$1$2()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$1$2()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$1()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$1()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$2$1()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$2$1()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$2$2()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$2$2()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$2()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$2()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$3$1()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$3$1()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$3()Landroidx/compose/animation/core/TwoWayConverter; PLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter$3()Landroidx/compose/animation/core/TwoWayConverter; HSPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter()Landroidx/compose/animation/core/TwoWayConverter; HPLandroidx/compose/animation/core/VectorConvertersKt;->getVectorConverter()Landroidx/compose/animation/core/TwoWayConverter; Landroidx/compose/animation/core/VectorizedAnimationSpec; HSPLandroidx/compose/animation/core/VectorizedAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/VectorizedAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec; HSPLandroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HPLandroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; HSPLandroidx/compose/animation/core/VectorizedFiniteAnimationSpec;->isInfinite()Z HPLandroidx/compose/animation/core/VectorizedFiniteAnimationSpec;->isInfinite()Z Landroidx/compose/animation/core/VectorizedFloatAnimationSpec; HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->(Landroidx/compose/animation/core/Animations;)V HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->(Landroidx/compose/animation/core/Animations;)V HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->(Landroidx/compose/animation/core/FloatAnimationSpec;)V PLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->(Landroidx/compose/animation/core/FloatAnimationSpec;)V HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/core/VectorizedFloatAnimationSpec$1; HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec$1;->(Landroidx/compose/animation/core/FloatAnimationSpec;)V HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec$1;->(Landroidx/compose/animation/core/FloatAnimationSpec;)V HSPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec$1;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec; HPLandroidx/compose/animation/core/VectorizedFloatAnimationSpec$1;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec; Landroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec; HSPLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->(Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec;IJ)V PLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->(Landroidx/compose/animation/core/VectorizedDurationBasedAnimationSpec;IJ)V HSPLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J PLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HSPLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->repetitionPlayTimeNanos(J)J PLandroidx/compose/animation/core/VectorizedInfiniteRepeatableSpec;->repetitionPlayTimeNanos(J)J Landroidx/compose/animation/core/VectorizedKeyframesSpec; HSPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->(ILjava/util/LinkedHashMap;)V PLandroidx/compose/animation/core/VectorizedKeyframesSpec;->(ILjava/util/LinkedHashMap;)V HSPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getDelayMillis()I PLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getDelayMillis()I HSPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getDurationMillis()I PLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getDurationMillis()I HSPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedKeyframesSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/core/VectorizedSpringSpec; HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->(FFLandroidx/compose/animation/core/AnimationVector;)V HPLandroidx/compose/animation/core/VectorizedSpringSpec;->(FFLandroidx/compose/animation/core/AnimationVector;)V HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J PLandroidx/compose/animation/core/VectorizedSpringSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HSPLandroidx/compose/animation/core/VectorizedSpringSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/core/VectorizedSpringSpec;->getEndVelocity(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/core/VectorizedTweenSpec; HSPLandroidx/compose/animation/core/VectorizedTweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HPLandroidx/compose/animation/core/VectorizedTweenSpec;->(IILandroidx/compose/animation/core/Easing;)V HSPLandroidx/compose/animation/core/VectorizedTweenSpec;->getDelayMillis()I PLandroidx/compose/animation/core/VectorizedTweenSpec;->getDelayMillis()I HSPLandroidx/compose/animation/core/VectorizedTweenSpec;->getDurationMillis()I PLandroidx/compose/animation/core/VectorizedTweenSpec;->getDurationMillis()I HSPLandroidx/compose/animation/core/VectorizedTweenSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedTweenSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/core/VectorizedTweenSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/core/VectorizedTweenSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/core/VisibilityThresholdsKt; HSPLandroidx/compose/animation/core/VisibilityThresholdsKt;->()V PLandroidx/compose/animation/core/VisibilityThresholdsKt;->()V HSPLandroidx/compose/animation/core/VisibilityThresholdsKt;->getVisibilityThresholdMap()Ljava/util/Map; PLandroidx/compose/animation/core/VisibilityThresholdsKt;->getVisibilityThresholdMap()Ljava/util/Map; Landroidx/compose/animation/graphics/res/AnimatedVectorPainterResources_androidKt$rememberAnimatedVectorPainter$1; HSPLandroidx/compose/animation/graphics/res/AnimatedVectorPainterResources_androidKt$rememberAnimatedVectorPainter$1;->(ZLandroidx/compose/animation/graphics/vector/AnimatedImageVector;ILandroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLandroidx/compose/animation/graphics/res/AnimatedVectorPainterResources_androidKt$rememberAnimatedVectorPainter$1;->(ZLandroidx/compose/animation/graphics/vector/AnimatedImageVector;ILandroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/animation/graphics/res/AnimatedVectorPainterResources_androidKt$rememberAnimatedVectorPainter$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/graphics/res/AnimatedVectorPainterResources_androidKt$rememberAnimatedVectorPainter$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/graphics/res/AnimatedVectorResources_androidKt; HSPLandroidx/compose/animation/graphics/res/AnimatedVectorResources_androidKt;->animatedVectorResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/animation/graphics/vector/AnimatedImageVector; HPLandroidx/compose/animation/graphics/res/AnimatedVectorResources_androidKt;->animatedVectorResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/animation/graphics/vector/AnimatedImageVector; HSPLandroidx/compose/animation/graphics/res/AnimatedVectorResources_androidKt;->rememberAnimatedVectorPainter(Landroidx/compose/animation/graphics/vector/AnimatedImageVector;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/vector/VectorPainter; HPLandroidx/compose/animation/graphics/res/AnimatedVectorResources_androidKt;->rememberAnimatedVectorPainter(Landroidx/compose/animation/graphics/vector/AnimatedImageVector;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/vector/VectorPainter; Landroidx/compose/animation/graphics/res/AnimatorResources_androidKt; HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->()V PLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->()V HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->getAccelerateDecelerateEasing()Landroidx/compose/animation/core/Easing; PLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->getAccelerateDecelerateEasing()Landroidx/compose/animation/core/Easing; HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->loadAnimatorResource(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroidx/compose/animation/graphics/vector/Animator; HPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->loadAnimatorResource(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroidx/compose/animation/graphics/vector/Animator; HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->loadInterpolatorResource(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroidx/compose/animation/core/Easing; HPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt;->loadInterpolatorResource(Landroid/content/res/Resources;ILandroid/content/res/Resources$Theme;)Landroidx/compose/animation/core/Easing; Landroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1; HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1;->()V PLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1;->()V HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1;->(I)V PLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1;->(I)V HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1;->transform(F)F HPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$AccelerateEasing$1;->transform(F)F Landroidx/compose/animation/graphics/res/AnimatorResources_androidKt$toEasing$1; HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$toEasing$1;->(Landroid/view/animation/BaseInterpolator;)V PLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$toEasing$1;->(Landroid/view/animation/BaseInterpolator;)V HSPLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$toEasing$1;->transform(F)F PLandroidx/compose/animation/graphics/res/AnimatorResources_androidKt$toEasing$1;->transform(F)F Landroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt; HSPLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt;->()V PLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt;->()V Landroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1; HSPLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1;->()V PLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1;->()V HSPLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1;->()V PLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1;->()V HSPLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/graphics/res/ComposableSingletons$AnimatedVectorPainterResources_androidKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/AnimatedImageVector; HSPLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->()V PLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->()V HSPLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->(Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/util/ArrayList;)V HPLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->(Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/util/ArrayList;)V HSPLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->getImageVector()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->getImageVector()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->getTargets$animation_graphics_release()Ljava/util/List; PLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->getTargets$animation_graphics_release()Ljava/util/List; HSPLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->getTotalDuration()I PLandroidx/compose/animation/graphics/vector/AnimatedImageVector;->getTotalDuration()I Landroidx/compose/animation/graphics/vector/AnimatedVectorTarget; HSPLandroidx/compose/animation/graphics/vector/AnimatedVectorTarget;->(Ljava/lang/String;Landroidx/compose/animation/graphics/vector/Animator;)V PLandroidx/compose/animation/graphics/vector/AnimatedVectorTarget;->(Ljava/lang/String;Landroidx/compose/animation/graphics/vector/Animator;)V HSPLandroidx/compose/animation/graphics/vector/AnimatedVectorTarget;->getAnimator()Landroidx/compose/animation/graphics/vector/Animator; PLandroidx/compose/animation/graphics/vector/AnimatedVectorTarget;->getAnimator()Landroidx/compose/animation/graphics/vector/Animator; HSPLandroidx/compose/animation/graphics/vector/AnimatedVectorTarget;->getName()Ljava/lang/String; PLandroidx/compose/animation/graphics/vector/AnimatedVectorTarget;->getName()Ljava/lang/String; Landroidx/compose/animation/graphics/vector/Animator; HSPLandroidx/compose/animation/graphics/vector/Animator;->()V HPLandroidx/compose/animation/graphics/vector/Animator;->()V HSPLandroidx/compose/animation/graphics/vector/Animator;->Configure(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/graphics/vector/StateVectorConfig;ILandroidx/compose/runtime/Composer;I)V HPLandroidx/compose/animation/graphics/vector/Animator;->Configure(Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/graphics/vector/StateVectorConfig;ILandroidx/compose/runtime/Composer;I)V Landroidx/compose/animation/graphics/vector/Animator$Configure$2; HSPLandroidx/compose/animation/graphics/vector/Animator$Configure$2;->(Landroidx/compose/animation/graphics/vector/Animator;Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/graphics/vector/StateVectorConfig;II)V PLandroidx/compose/animation/graphics/vector/Animator$Configure$2;->(Landroidx/compose/animation/graphics/vector/Animator;Landroidx/compose/animation/core/Transition;Landroidx/compose/animation/graphics/vector/StateVectorConfig;II)V HSPLandroidx/compose/animation/graphics/vector/Animator$Configure$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/graphics/vector/Animator$Configure$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/AnimatorSet; HSPLandroidx/compose/animation/graphics/vector/AnimatorSet;->(Ljava/util/ArrayList;I)V HPLandroidx/compose/animation/graphics/vector/AnimatorSet;->(Ljava/util/ArrayList;I)V HSPLandroidx/compose/animation/graphics/vector/AnimatorSet;->collectPropertyValues(IILjava/util/LinkedHashMap;)V HPLandroidx/compose/animation/graphics/vector/AnimatorSet;->collectPropertyValues(IILjava/util/LinkedHashMap;)V HSPLandroidx/compose/animation/graphics/vector/AnimatorSet;->getTotalDuration()I PLandroidx/compose/animation/graphics/vector/AnimatorSet;->getTotalDuration()I Landroidx/compose/animation/graphics/vector/CombinedSpec; HSPLandroidx/compose/animation/graphics/vector/CombinedSpec;->(Ljava/util/ArrayList;)V PLandroidx/compose/animation/graphics/vector/CombinedSpec;->(Ljava/util/ArrayList;)V HSPLandroidx/compose/animation/graphics/vector/CombinedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; PLandroidx/compose/animation/graphics/vector/CombinedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; HSPLandroidx/compose/animation/graphics/vector/CombinedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; HPLandroidx/compose/animation/graphics/vector/CombinedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; Landroidx/compose/animation/graphics/vector/FloatPropertyValues; HSPLandroidx/compose/animation/graphics/vector/FloatPropertyValues;->()V PLandroidx/compose/animation/graphics/vector/FloatPropertyValues;->()V HSPLandroidx/compose/animation/graphics/vector/FloatPropertyValues;->createState(Landroidx/compose/animation/core/Transition;Ljava/lang/String;ILandroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/State; HPLandroidx/compose/animation/graphics/vector/FloatPropertyValues;->createState(Landroidx/compose/animation/core/Transition;Ljava/lang/String;ILandroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/State; Landroidx/compose/animation/graphics/vector/Keyframe; HSPLandroidx/compose/animation/graphics/vector/Keyframe;->(FLjava/lang/Object;Landroidx/compose/animation/core/Easing;)V HPLandroidx/compose/animation/graphics/vector/Keyframe;->(FLjava/lang/Object;Landroidx/compose/animation/core/Easing;)V HSPLandroidx/compose/animation/graphics/vector/Keyframe;->getFraction()F PLandroidx/compose/animation/graphics/vector/Keyframe;->getFraction()F HSPLandroidx/compose/animation/graphics/vector/Keyframe;->getInterpolator()Landroidx/compose/animation/core/Easing; PLandroidx/compose/animation/graphics/vector/Keyframe;->getInterpolator()Landroidx/compose/animation/core/Easing; HSPLandroidx/compose/animation/graphics/vector/Keyframe;->getValue()Ljava/lang/Object; PLandroidx/compose/animation/graphics/vector/Keyframe;->getValue()Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/ObjectAnimator; HSPLandroidx/compose/animation/graphics/vector/ObjectAnimator;->(IIIILjava/util/ArrayList;)V PLandroidx/compose/animation/graphics/vector/ObjectAnimator;->(IIIILjava/util/ArrayList;)V HSPLandroidx/compose/animation/graphics/vector/ObjectAnimator;->collectPropertyValues(IILjava/util/LinkedHashMap;)V HPLandroidx/compose/animation/graphics/vector/ObjectAnimator;->collectPropertyValues(IILjava/util/LinkedHashMap;)V HSPLandroidx/compose/animation/graphics/vector/ObjectAnimator;->getTotalDuration()I PLandroidx/compose/animation/graphics/vector/ObjectAnimator;->getTotalDuration()I Landroidx/compose/animation/graphics/vector/PathPropertyValues; HSPLandroidx/compose/animation/graphics/vector/PathPropertyValues;->()V PLandroidx/compose/animation/graphics/vector/PathPropertyValues;->()V HSPLandroidx/compose/animation/graphics/vector/PathPropertyValues;->createState(Landroidx/compose/animation/core/Transition;Ljava/lang/String;ILandroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/State; HPLandroidx/compose/animation/graphics/vector/PathPropertyValues;->createState(Landroidx/compose/animation/core/Transition;Ljava/lang/String;ILandroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/State; Landroidx/compose/animation/graphics/vector/PathPropertyValues$createState$1$1; HSPLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$1$1;->(Landroidx/compose/animation/graphics/vector/PathPropertyValues;Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V PLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$1$1;->(Landroidx/compose/animation/graphics/vector/PathPropertyValues;Landroidx/compose/animation/core/Transition$TransitionAnimationState;)V HSPLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$1$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/PathPropertyValues$createState$timeState$1; HSPLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$timeState$1;->(I)V PLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$timeState$1;->(I)V HSPLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$timeState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/graphics/vector/PathPropertyValues$createState$timeState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/PropertyValues; HSPLandroidx/compose/animation/graphics/vector/PropertyValues;->()V PLandroidx/compose/animation/graphics/vector/PropertyValues;->()V HSPLandroidx/compose/animation/graphics/vector/PropertyValues;->getTimestamps()Ljava/util/ArrayList; PLandroidx/compose/animation/graphics/vector/PropertyValues;->getTimestamps()Ljava/util/ArrayList; Landroidx/compose/animation/graphics/vector/PropertyValues$createAnimationSpec$1; HSPLandroidx/compose/animation/graphics/vector/PropertyValues$createAnimationSpec$1;->(Landroidx/compose/animation/graphics/vector/PropertyValues;I)V PLandroidx/compose/animation/graphics/vector/PropertyValues$createAnimationSpec$1;->(Landroidx/compose/animation/graphics/vector/PropertyValues;I)V HSPLandroidx/compose/animation/graphics/vector/PropertyValues$createAnimationSpec$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/graphics/vector/PropertyValues$createAnimationSpec$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/PropertyValuesHolder; HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolder;->()V HPLandroidx/compose/animation/graphics/vector/PropertyValuesHolder;->()V Landroidx/compose/animation/graphics/vector/PropertyValuesHolder1D; HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolder1D;->(Ljava/lang/String;)V PLandroidx/compose/animation/graphics/vector/PropertyValuesHolder1D;->(Ljava/lang/String;)V HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolder1D;->getPropertyName()Ljava/lang/String; PLandroidx/compose/animation/graphics/vector/PropertyValuesHolder1D;->getPropertyName()Ljava/lang/String; Landroidx/compose/animation/graphics/vector/PropertyValuesHolder2D; Landroidx/compose/animation/graphics/vector/PropertyValuesHolderColor; Landroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1; HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1;->(ILandroidx/compose/animation/graphics/vector/PropertyValuesHolder1D;I)V HPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1;->(ILandroidx/compose/animation/graphics/vector/PropertyValuesHolder1D;I)V HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1;->invoke(Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;)V HPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1;->invoke(Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;)V HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/graphics/vector/PropertyValuesHolderColor$asKeyframeSpec$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/animation/graphics/vector/PropertyValuesHolderFloat; HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderFloat;->(Ljava/lang/String;Ljava/util/ArrayList;)V PLandroidx/compose/animation/graphics/vector/PropertyValuesHolderFloat;->(Ljava/lang/String;Ljava/util/ArrayList;)V HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderFloat;->getAnimatorKeyframes()Ljava/util/List; PLandroidx/compose/animation/graphics/vector/PropertyValuesHolderFloat;->getAnimatorKeyframes()Ljava/util/List; Landroidx/compose/animation/graphics/vector/PropertyValuesHolderPath; HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderPath;->(Ljava/lang/String;Ljava/util/ArrayList;)V PLandroidx/compose/animation/graphics/vector/PropertyValuesHolderPath;->(Ljava/lang/String;Ljava/util/ArrayList;)V HSPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderPath;->interpolate(F)Ljava/util/ArrayList; HPLandroidx/compose/animation/graphics/vector/PropertyValuesHolderPath;->interpolate(F)Ljava/util/ArrayList; Landroidx/compose/animation/graphics/vector/ReversedSpec; HSPLandroidx/compose/animation/graphics/vector/ReversedSpec;->(Landroidx/compose/animation/core/FiniteAnimationSpec;I)V HPLandroidx/compose/animation/graphics/vector/ReversedSpec;->(Landroidx/compose/animation/core/FiniteAnimationSpec;I)V HSPLandroidx/compose/animation/graphics/vector/ReversedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; PLandroidx/compose/animation/graphics/vector/ReversedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedAnimationSpec; HSPLandroidx/compose/animation/graphics/vector/ReversedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; PLandroidx/compose/animation/graphics/vector/ReversedSpec;->vectorize(Landroidx/compose/animation/core/TwoWayConverter;)Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec; Landroidx/compose/animation/graphics/vector/StateVectorConfig; HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->()V PLandroidx/compose/animation/graphics/vector/StateVectorConfig;->()V HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->getOrDefault(Landroidx/compose/ui/graphics/vector/PathNodeKt;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->getOrDefault(Landroidx/compose/ui/graphics/vector/PathNodeKt;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setPathDataState(Landroidx/compose/runtime/State;)V PLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setPathDataState(Landroidx/compose/runtime/State;)V HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setRotationState(Landroidx/compose/runtime/State;)V PLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setRotationState(Landroidx/compose/runtime/State;)V HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setScaleXState(Landroidx/compose/runtime/State;)V PLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setScaleXState(Landroidx/compose/runtime/State;)V HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setScaleYState(Landroidx/compose/runtime/State;)V PLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setScaleYState(Landroidx/compose/runtime/State;)V HSPLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setTranslateXState(Landroidx/compose/runtime/State;)V PLandroidx/compose/animation/graphics/vector/StateVectorConfig;->setTranslateXState(Landroidx/compose/runtime/State;)V Landroidx/compose/animation/graphics/vector/Timestamp; HSPLandroidx/compose/animation/graphics/vector/Timestamp;->(IIIILandroidx/compose/animation/graphics/vector/PropertyValuesHolder;)V PLandroidx/compose/animation/graphics/vector/Timestamp;->(IIIILandroidx/compose/animation/graphics/vector/PropertyValuesHolder;)V HSPLandroidx/compose/animation/graphics/vector/Timestamp;->asAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; HPLandroidx/compose/animation/graphics/vector/Timestamp;->asAnimationSpec()Landroidx/compose/animation/core/FiniteAnimationSpec; HSPLandroidx/compose/animation/graphics/vector/Timestamp;->getDurationMillis()I PLandroidx/compose/animation/graphics/vector/Timestamp;->getDurationMillis()I HSPLandroidx/compose/animation/graphics/vector/Timestamp;->getHolder()Landroidx/compose/animation/graphics/vector/PropertyValuesHolder; PLandroidx/compose/animation/graphics/vector/Timestamp;->getHolder()Landroidx/compose/animation/graphics/vector/PropertyValuesHolder; HSPLandroidx/compose/animation/graphics/vector/Timestamp;->getRepeatCount()I PLandroidx/compose/animation/graphics/vector/Timestamp;->getRepeatCount()I HSPLandroidx/compose/animation/graphics/vector/Timestamp;->getTimeMillis()I PLandroidx/compose/animation/graphics/vector/Timestamp;->getTimeMillis()I Landroidx/compose/animation/graphics/vector/VectorizedCombinedSpec; HSPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->(Ljava/util/ArrayList;)V PLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->(Ljava/util/ArrayList;)V HSPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->chooseAnimation(J)Lkotlin/Pair; HPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->chooseAnimation(J)Lkotlin/Pair; HSPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J PLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HSPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/graphics/vector/VectorizedCombinedSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/graphics/vector/VectorizedReversedSpec; HSPLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->(Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec;J)V PLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->(Landroidx/compose/animation/core/VectorizedFiniteAnimationSpec;J)V HSPLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J PLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->getDurationNanos(Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)J HSPLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; PLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->getValueFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HSPLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; HPLandroidx/compose/animation/graphics/vector/VectorizedReversedSpec;->getVelocityFromNanos(JLandroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;Landroidx/compose/animation/core/AnimationVector;)Landroidx/compose/animation/core/AnimationVector; Landroidx/compose/animation/graphics/vector/compat/AndroidVectorResources; HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->()V PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->()V HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getKeyframe(Landroid/content/res/TypedArray;FLandroidx/compose/animation/core/Easing;Landroidx/compose/animation/graphics/vector/compat/ValueType;I)Landroidx/compose/animation/graphics/vector/Keyframe; HPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getKeyframe(Landroid/content/res/TypedArray;FLandroidx/compose/animation/core/Easing;Landroidx/compose/animation/graphics/vector/compat/ValueType;I)Landroidx/compose/animation/graphics/vector/Keyframe; HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getPropertyValuesHolder1D(Landroid/content/res/TypedArray;Ljava/lang/String;IIILandroidx/compose/animation/core/Easing;Lkotlin/jvm/functions/Function2;)Landroidx/compose/animation/graphics/vector/PropertyValuesHolder1D; HPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getPropertyValuesHolder1D(Landroid/content/res/TypedArray;Ljava/lang/String;IIILandroidx/compose/animation/core/Easing;Lkotlin/jvm/functions/Function2;)Landroidx/compose/animation/graphics/vector/PropertyValuesHolder1D; HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATED_VECTOR_DRAWABLE()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATED_VECTOR_DRAWABLE()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATED_VECTOR_DRAWABLE_TARGET()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATOR()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATOR()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATOR_SET()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_ANIMATOR_SET()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_DECELERATE_INTERPOLATOR()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_DECELERATE_INTERPOLATOR()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_PATH_INTERPOLATOR()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_PATH_INTERPOLATOR()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_PROPERTY_ANIMATOR()[I PLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_PROPERTY_ANIMATOR()[I HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->inferValueType(I[I)Landroidx/compose/animation/graphics/vector/compat/ValueType; HPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->inferValueType(I[I)Landroidx/compose/animation/graphics/vector/compat/ValueType; HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->parseAnimatorSet(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroidx/compose/animation/graphics/vector/AnimatorSet; HPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->parseAnimatorSet(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroidx/compose/animation/graphics/vector/AnimatorSet; HSPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->parseObjectAnimator(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroidx/compose/animation/graphics/vector/ObjectAnimator; HPLandroidx/compose/animation/graphics/vector/compat/AndroidVectorResources;->parseObjectAnimator(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroidx/compose/animation/graphics/vector/ObjectAnimator; Landroidx/compose/animation/graphics/vector/compat/ValueType; HSPLandroidx/compose/animation/graphics/vector/compat/ValueType;->()V PLandroidx/compose/animation/graphics/vector/compat/ValueType;->()V HSPLandroidx/compose/animation/graphics/vector/compat/ValueType;->(Ljava/lang/String;I)V PLandroidx/compose/animation/graphics/vector/compat/ValueType;->(Ljava/lang/String;I)V Landroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1; HSPLandroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1;->()V PLandroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1;->()V HSPLandroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1;->()V PLandroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1;->()V HSPLandroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/animation/graphics/vector/compat/XmlAnimatorParser_androidKt$getPropertyValuesHolder1D$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/AbstractClickableNode; HSPLandroidx/compose/foundation/AbstractClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/AbstractClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/AbstractClickableNode;->disposeInteractionSource()V HPLandroidx/compose/foundation/AbstractClickableNode;->disposeInteractionSource()V HSPLandroidx/compose/foundation/AbstractClickableNode;->getInteractionData()Landroidx/compose/foundation/AbstractClickableNode$InteractionData; PLandroidx/compose/foundation/AbstractClickableNode;->getInteractionData()Landroidx/compose/foundation/AbstractClickableNode$InteractionData; HSPLandroidx/compose/foundation/AbstractClickableNode;->onDetach()V HPLandroidx/compose/foundation/AbstractClickableNode;->onDetach()V HSPLandroidx/compose/foundation/AbstractClickableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V PLandroidx/compose/foundation/AbstractClickableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V HSPLandroidx/compose/foundation/AbstractClickableNode;->updateCommon-XHw0xAI(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/AbstractClickableNode;->updateCommon-XHw0xAI(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;)V Landroidx/compose/foundation/AbstractClickableNode$InteractionData; HSPLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->()V HPLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->()V HSPLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->getCurrentKeyPressInteractions()Ljava/util/LinkedHashMap; PLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->getCurrentKeyPressInteractions()Ljava/util/LinkedHashMap; HSPLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->getPressInteraction()Landroidx/compose/foundation/interaction/PressInteraction$Press; PLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->getPressInteraction()Landroidx/compose/foundation/interaction/PressInteraction$Press; HSPLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->setCentreOffset-k-4lQ0M(J)V PLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->setCentreOffset-k-4lQ0M(J)V HSPLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->setPressInteraction(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V PLandroidx/compose/foundation/AbstractClickableNode$InteractionData;->setPressInteraction(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V Landroidx/compose/foundation/AbstractClickablePointerInputNode; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;)V HPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;)V HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->getEnabled()Z PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->getEnabled()Z HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->getInteractionData()Landroidx/compose/foundation/AbstractClickableNode$InteractionData; PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->getInteractionData()Landroidx/compose/foundation/AbstractClickableNode$InteractionData; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->getOnClick()Lkotlin/jvm/functions/Function0; PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->getOnClick()Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->handlePressInteraction-d-4ec7I(Landroidx/compose/foundation/gestures/PressGestureScope;JLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->handlePressInteraction-d-4ec7I(Landroidx/compose/foundation/gestures/PressGestureScope;JLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->setEnabled(Z)V PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->setEnabled(Z)V HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->setInteractionSource(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->setInteractionSource(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode;->setOnClick(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/foundation/AbstractClickablePointerInputNode;->setOnClick(Lkotlin/jvm/functions/Function0;)V Landroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->(Landroidx/compose/foundation/AbstractClickablePointerInputNode;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->(Landroidx/compose/foundation/AbstractClickablePointerInputNode;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/AbstractClickablePointerInputNode$pointerInputNode$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->(Landroid/content/Context;Landroidx/compose/foundation/OverscrollConfiguration;)V HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->(Landroid/content/Context;Landroidx/compose/foundation/OverscrollConfiguration;)V HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$animateToRelease(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$animateToRelease(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)V HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getBottomEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getBottomEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getBottomEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getBottomEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getContainerSize$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)J PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getContainerSize$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)J HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getLeftEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getLeftEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getLeftEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getLeftEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getRightEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getRightEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getRightEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getRightEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getTopEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getTopEffect$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getTopEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$getTopEffectNegation$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$invalidateOverscroll(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$invalidateOverscroll(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;)V HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$setContainerSize$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;J)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$setContainerSize$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;J)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$setPointerId$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/ui/input/pointer/PointerId;)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->access$setPointerPosition$p(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Landroidx/compose/ui/geometry/Offset;)V HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->animateToRelease()V HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->animateToRelease()V HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->drawOverscroll(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->drawOverscroll(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->getEffectModifier()Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->getEffectModifier()Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->invalidateOverscroll()V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->invalidateOverscroll()V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;->isInProgress()Z Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1; HSPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect$effectModifier$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/AndroidOverscrollKt; HSPLandroidx/compose/foundation/AndroidOverscrollKt;->()V PLandroidx/compose/foundation/AndroidOverscrollKt;->()V HSPLandroidx/compose/foundation/AndroidOverscrollKt;->access$getStretchOverscrollNonClippingLayer$p()Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/AndroidOverscrollKt;->access$getStretchOverscrollNonClippingLayer$p()Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/BackgroundElement; HSPLandroidx/compose/foundation/BackgroundElement;->(JLandroidx/compose/ui/graphics/ShaderBrush;FLandroidx/compose/ui/graphics/Shape;Lkotlin/jvm/functions/Function1;I)V HPLandroidx/compose/foundation/BackgroundElement;->(JLandroidx/compose/ui/graphics/ShaderBrush;FLandroidx/compose/ui/graphics/Shape;Lkotlin/jvm/functions/Function1;I)V HSPLandroidx/compose/foundation/BackgroundElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/BackgroundElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/BackgroundElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/BackgroundElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/BackgroundElement;->update(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/foundation/BackgroundElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/foundation/BackgroundNode; HSPLandroidx/compose/foundation/BackgroundNode;->(JLandroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Shape;)V HPLandroidx/compose/foundation/BackgroundNode;->(JLandroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Shape;)V HSPLandroidx/compose/foundation/BackgroundNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/foundation/BackgroundNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/foundation/BackgroundNode;->setAlpha(F)V PLandroidx/compose/foundation/BackgroundNode;->setAlpha(F)V HSPLandroidx/compose/foundation/BackgroundNode;->setBrush(Landroidx/compose/ui/graphics/Brush;)V PLandroidx/compose/foundation/BackgroundNode;->setBrush(Landroidx/compose/ui/graphics/Brush;)V HSPLandroidx/compose/foundation/BackgroundNode;->setColor-8_81llA(J)V PLandroidx/compose/foundation/BackgroundNode;->setColor-8_81llA(J)V HSPLandroidx/compose/foundation/BackgroundNode;->setShape(Landroidx/compose/ui/graphics/Shape;)V PLandroidx/compose/foundation/BackgroundNode;->setShape(Landroidx/compose/ui/graphics/Shape;)V Landroidx/compose/foundation/BorderModifierNode; HSPLandroidx/compose/foundation/BorderModifierNode;->(FLandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Shape;)V PLandroidx/compose/foundation/BorderModifierNode;->(FLandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Shape;)V HSPLandroidx/compose/foundation/BorderModifierNode;->access$drawRoundRectBorder-JqoCqck(Landroidx/compose/foundation/BorderModifierNode;Landroidx/compose/ui/draw/CacheDrawScope;Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Outline$Rounded;JJZF)Landroidx/compose/ui/draw/DrawResult; PLandroidx/compose/foundation/BorderModifierNode;->access$drawRoundRectBorder-JqoCqck(Landroidx/compose/foundation/BorderModifierNode;Landroidx/compose/ui/draw/CacheDrawScope;Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Outline$Rounded;JJZF)Landroidx/compose/ui/draw/DrawResult; HSPLandroidx/compose/foundation/BorderModifierNode;->getBrush()Landroidx/compose/ui/graphics/Brush; PLandroidx/compose/foundation/BorderModifierNode;->getBrush()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/foundation/BorderModifierNode;->getShape()Landroidx/compose/ui/graphics/Shape; PLandroidx/compose/foundation/BorderModifierNode;->getShape()Landroidx/compose/ui/graphics/Shape; HSPLandroidx/compose/foundation/BorderModifierNode;->getWidth-D9Ej5fM()F PLandroidx/compose/foundation/BorderModifierNode;->getWidth-D9Ej5fM()F Landroidx/compose/foundation/BorderModifierNode$drawRoundRectBorder$1; HSPLandroidx/compose/foundation/BorderModifierNode$drawRoundRectBorder$1;->(ZLandroidx/compose/ui/graphics/Brush;JFFJJLandroidx/compose/ui/graphics/drawscope/Stroke;)V PLandroidx/compose/foundation/BorderModifierNode$drawRoundRectBorder$1;->(ZLandroidx/compose/ui/graphics/Brush;JFFJJLandroidx/compose/ui/graphics/drawscope/Stroke;)V HSPLandroidx/compose/foundation/BorderModifierNode$drawRoundRectBorder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/BorderModifierNode$drawRoundRectBorder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/BorderModifierNodeElement; HSPLandroidx/compose/foundation/BorderModifierNodeElement;->(FLandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Shape;)V PLandroidx/compose/foundation/BorderModifierNodeElement;->(FLandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Shape;)V HSPLandroidx/compose/foundation/BorderModifierNodeElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/BorderModifierNodeElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/foundation/ClickableElement; HSPLandroidx/compose/foundation/ClickableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/ClickableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/ClickableElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/ClickableElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/ClickableElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/ClickableElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/ClickableElement;->update(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/foundation/ClickableElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/foundation/ClickableKt$clickable$2; HSPLandroidx/compose/foundation/ClickableKt$clickable$2;->(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/ClickableKt$clickable$2;->(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/ClickableKt$clickable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ClickableKt$clickable$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ClickableKt$handlePressInteraction$2; HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->(Landroidx/compose/foundation/gestures/PressGestureScope;JLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->(Landroidx/compose/foundation/gestures/PressGestureScope;JLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1; HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1;->(Lkotlin/jvm/functions/Function0;JLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1;->(Lkotlin/jvm/functions/Function0;JLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ClickableKt$handlePressInteraction$2$delayJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ClickableNode; HSPLandroidx/compose/foundation/ClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/ClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/ClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)V HPLandroidx/compose/foundation/ClickableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)V HSPLandroidx/compose/foundation/ClickableNode;->getClickablePointerInputNode()Landroidx/compose/foundation/AbstractClickablePointerInputNode; PLandroidx/compose/foundation/ClickableNode;->getClickablePointerInputNode()Landroidx/compose/foundation/AbstractClickablePointerInputNode; HSPLandroidx/compose/foundation/ClickableNode;->update-XHw0xAI(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/foundation/ClickableNode;->update-XHw0xAI(Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)V Landroidx/compose/foundation/ClickablePointerInputNode; HSPLandroidx/compose/foundation/ClickablePointerInputNode;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;)V HPLandroidx/compose/foundation/ClickablePointerInputNode;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Landroidx/compose/foundation/AbstractClickableNode$InteractionData;)V HSPLandroidx/compose/foundation/ClickablePointerInputNode;->pointerInput(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/ClickablePointerInputNode;->pointerInput(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2; HSPLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->(Landroidx/compose/foundation/AbstractClickablePointerInputNode;Lkotlin/coroutines/Continuation;I)V HPLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->(Landroidx/compose/foundation/AbstractClickablePointerInputNode;Lkotlin/coroutines/Continuation;I)V HSPLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->invoke-d-4ec7I(Landroidx/compose/foundation/gestures/PressGestureScope;JLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->invoke-d-4ec7I(Landroidx/compose/foundation/gestures/PressGestureScope;JLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ClickablePointerInputNode$pointerInput$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ClickableSemanticsNode; HSPLandroidx/compose/foundation/ClickableSemanticsNode;->(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/ClickableSemanticsNode;->(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/ClickableSemanticsNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HPLandroidx/compose/foundation/ClickableSemanticsNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/foundation/ClickableSemanticsNode;->getShouldMergeDescendantSemantics()Z HPLandroidx/compose/foundation/ClickableSemanticsNode;->getShouldMergeDescendantSemantics()Z HSPLandroidx/compose/foundation/ClickableSemanticsNode;->update-UMe6uN4(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/foundation/ClickableSemanticsNode;->update-UMe6uN4(ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V Landroidx/compose/foundation/ClickableSemanticsNode$applySemantics$1; HSPLandroidx/compose/foundation/ClickableSemanticsNode$applySemantics$1;->(Landroidx/compose/foundation/ClickableSemanticsNode;I)V HPLandroidx/compose/foundation/ClickableSemanticsNode$applySemantics$1;->(Landroidx/compose/foundation/ClickableSemanticsNode;I)V Landroidx/compose/foundation/Clickable_androidKt; HSPLandroidx/compose/foundation/Clickable_androidKt;->()V PLandroidx/compose/foundation/Clickable_androidKt;->()V PLandroidx/compose/foundation/Clickable_androidKt;->getTapIndicationDelay()J Landroidx/compose/foundation/ClipScrollableContainerKt; HSPLandroidx/compose/foundation/ClipScrollableContainerKt;->()V PLandroidx/compose/foundation/ClipScrollableContainerKt;->()V HSPLandroidx/compose/foundation/ClipScrollableContainerKt;->clipScrollableContainer(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/Orientation;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/ClipScrollableContainerKt;->clipScrollableContainer(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/Orientation;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ClipScrollableContainerKt;->getMaxSupportedElevation()F PLandroidx/compose/foundation/ClipScrollableContainerKt;->getMaxSupportedElevation()F Landroidx/compose/foundation/DrawOverscrollModifier; HSPLandroidx/compose/foundation/DrawOverscrollModifier;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/DrawOverscrollModifier;->(Landroidx/compose/foundation/AndroidEdgeEffectOverscrollEffect;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/DrawOverscrollModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/foundation/DrawOverscrollModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/foundation/DrawOverscrollModifier;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/DrawOverscrollModifier;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/FocusableElement; HSPLandroidx/compose/foundation/FocusableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/FocusableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/FocusableElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/FocusableElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/FocusableElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/FocusableElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/FocusableInNonTouchMode; HSPLandroidx/compose/foundation/FocusableInNonTouchMode;->()V HPLandroidx/compose/foundation/FocusableInNonTouchMode;->()V HSPLandroidx/compose/foundation/FocusableInNonTouchMode;->applyFocusProperties(Landroidx/compose/ui/focus/FocusProperties;)V PLandroidx/compose/foundation/FocusableInNonTouchMode;->applyFocusProperties(Landroidx/compose/ui/focus/FocusProperties;)V Landroidx/compose/foundation/FocusableInteractionNode; HSPLandroidx/compose/foundation/FocusableInteractionNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/FocusableInteractionNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/FocusableInteractionNode;->setFocus(Z)V HPLandroidx/compose/foundation/FocusableInteractionNode;->setFocus(Z)V Landroidx/compose/foundation/FocusableKt; HSPLandroidx/compose/foundation/FocusableKt;->()V PLandroidx/compose/foundation/FocusableKt;->()V HSPLandroidx/compose/foundation/FocusableKt;->focusable(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/FocusableKt;->focusable(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/FocusableKt;->focusableInNonTouchMode(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/FocusableKt;->focusableInNonTouchMode(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1; HSPLandroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1;->()V PLandroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1;->()V HSPLandroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/FocusableKt$FocusableInNonTouchModeElement$1;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$1; HSPLandroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$1;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/FocusableKt$focusableInNonTouchMode$1;->(ZLandroidx/compose/foundation/interaction/MutableInteractionSource;)V Landroidx/compose/foundation/FocusableNode; HSPLandroidx/compose/foundation/FocusableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/FocusableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/FocusableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HPLandroidx/compose/foundation/FocusableNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/foundation/FocusableNode;->onFocusEvent(Landroidx/compose/ui/focus/FocusStateImpl;)V HPLandroidx/compose/foundation/FocusableNode;->onFocusEvent(Landroidx/compose/ui/focus/FocusStateImpl;)V HSPLandroidx/compose/foundation/FocusableNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V PLandroidx/compose/foundation/FocusableNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/foundation/FocusableNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/foundation/FocusableNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V Landroidx/compose/foundation/FocusablePinnableContainerNode; HSPLandroidx/compose/foundation/FocusablePinnableContainerNode;->()V HPLandroidx/compose/foundation/FocusablePinnableContainerNode;->()V HSPLandroidx/compose/foundation/FocusablePinnableContainerNode;->setFocus(Z)V HPLandroidx/compose/foundation/FocusablePinnableContainerNode;->setFocus(Z)V Landroidx/compose/foundation/FocusableSemanticsNode; HSPLandroidx/compose/foundation/FocusableSemanticsNode;->()V HPLandroidx/compose/foundation/FocusableSemanticsNode;->()V HSPLandroidx/compose/foundation/FocusableSemanticsNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HPLandroidx/compose/foundation/FocusableSemanticsNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/foundation/FocusableSemanticsNode;->setFocus(Z)V PLandroidx/compose/foundation/FocusableSemanticsNode;->setFocus(Z)V Landroidx/compose/foundation/FocusedBoundsKt; HSPLandroidx/compose/foundation/FocusedBoundsKt;->()V PLandroidx/compose/foundation/FocusedBoundsKt;->()V HSPLandroidx/compose/foundation/FocusedBoundsKt;->getModifierLocalFocusedBoundsObserver()Landroidx/compose/ui/modifier/ProvidableModifierLocal; PLandroidx/compose/foundation/FocusedBoundsKt;->getModifierLocalFocusedBoundsObserver()Landroidx/compose/ui/modifier/ProvidableModifierLocal; Landroidx/compose/foundation/FocusedBoundsNode; HSPLandroidx/compose/foundation/FocusedBoundsNode;->()V HPLandroidx/compose/foundation/FocusedBoundsNode;->()V HSPLandroidx/compose/foundation/FocusedBoundsNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/foundation/FocusedBoundsNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/foundation/FocusedBoundsNode;->setFocus(Z)V HPLandroidx/compose/foundation/FocusedBoundsNode;->setFocus(Z)V Landroidx/compose/foundation/FocusedBoundsObserverNode; HSPLandroidx/compose/foundation/FocusedBoundsObserverNode;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/FocusedBoundsObserverNode;->(Lkotlin/jvm/functions/Function1;)V Landroidx/compose/foundation/GlowEdgeEffectCompat; HSPLandroidx/compose/foundation/GlowEdgeEffectCompat;->(Landroid/content/Context;)V HPLandroidx/compose/foundation/GlowEdgeEffectCompat;->(Landroid/content/Context;)V HSPLandroidx/compose/foundation/GlowEdgeEffectCompat;->onRelease()V HPLandroidx/compose/foundation/GlowEdgeEffectCompat;->onRelease()V Landroidx/compose/foundation/HoverableElement; HSPLandroidx/compose/foundation/HoverableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/HoverableElement;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/HoverableElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/HoverableElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/HoverableElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/HoverableElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/HoverableNode; HSPLandroidx/compose/foundation/HoverableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/HoverableNode;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HSPLandroidx/compose/foundation/HoverableNode;->onDetach()V HPLandroidx/compose/foundation/HoverableNode;->onDetach()V HSPLandroidx/compose/foundation/HoverableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V HPLandroidx/compose/foundation/HoverableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V HSPLandroidx/compose/foundation/HoverableNode;->tryEmitExit()V PLandroidx/compose/foundation/HoverableNode;->tryEmitExit()V Landroidx/compose/foundation/ImageKt; HSPLandroidx/compose/foundation/ImageKt;->Canvas(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/ImageKt;->Canvas(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/ImageKt;->access$shrink-Kibmq7A(JF)J PLandroidx/compose/foundation/ImageKt;->access$shrink-Kibmq7A(JF)J HSPLandroidx/compose/foundation/ImageKt;->background-bw27NRU$default(Landroidx/compose/ui/Modifier;J)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/ImageKt;->background-bw27NRU$default(Landroidx/compose/ui/Modifier;J)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/ImageKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->checkScrollableContainerConstraints-K40F9xA(JLandroidx/compose/foundation/gestures/Orientation;)V PLandroidx/compose/foundation/ImageKt;->checkScrollableContainerConstraints-K40F9xA(JLandroidx/compose/foundation/gestures/Orientation;)V HSPLandroidx/compose/foundation/ImageKt;->clickable-O2vRcR0$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/ImageKt;->clickable-O2vRcR0$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->clickable-O2vRcR0(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/ImageKt;->clickable-O2vRcR0(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->clickable-XHw0xAI$default(Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/ImageKt;->clickable-XHw0xAI$default(Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;I)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->create(Landroid/content/Context;)Landroid/widget/EdgeEffect; HPLandroidx/compose/foundation/ImageKt;->create(Landroid/content/Context;)Landroid/widget/EdgeEffect; HSPLandroidx/compose/foundation/ImageKt;->getDistanceCompat(Landroid/widget/EdgeEffect;)F PLandroidx/compose/foundation/ImageKt;->getDistanceCompat(Landroid/widget/EdgeEffect;)F HSPLandroidx/compose/foundation/ImageKt;->hoverable(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/ImageKt;->hoverable(Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/ui/Modifier;Z)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->isSystemInDarkTheme(Landroidx/compose/runtime/Composer;)Z PLandroidx/compose/foundation/ImageKt;->isSystemInDarkTheme(Landroidx/compose/runtime/Composer;)Z HSPLandroidx/compose/foundation/ImageKt;->progressSemantics(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/ImageKt;->progressSemantics(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/ImageKt;->rememberScrollState(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/ScrollState; HPLandroidx/compose/foundation/ImageKt;->rememberScrollState(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/ScrollState; HSPLandroidx/compose/foundation/ImageKt;->shrink-Kibmq7A(JF)J PLandroidx/compose/foundation/ImageKt;->shrink-Kibmq7A(JF)J HSPLandroidx/compose/foundation/ImageKt;->verticalScroll$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/ScrollState;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/ImageKt;->verticalScroll$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/ScrollState;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1; HSPLandroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1;->invoke()Ljava/lang/Boolean; HPLandroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1;->invoke()Ljava/lang/Boolean; HSPLandroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/ImageKt$Image$$inlined$Layout$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/ImageKt$Image$semantics$1$1; HSPLandroidx/compose/foundation/ImageKt$Image$semantics$1$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/ImageKt$Image$semantics$1$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/ImageKt$Image$semantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ImageKt$Image$semantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/Indication; Landroidx/compose/foundation/IndicationInstance; Landroidx/compose/foundation/IndicationKt; HSPLandroidx/compose/foundation/IndicationKt;->()V PLandroidx/compose/foundation/IndicationKt;->()V HSPLandroidx/compose/foundation/IndicationKt;->getLocalIndication()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/foundation/IndicationKt;->getLocalIndication()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/foundation/IndicationKt;->indication(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/foundation/Indication;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/IndicationKt;->indication(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/foundation/Indication;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/IndicationKt$LocalIndication$1; HSPLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->()V PLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->()V HSPLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->(I)V PLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->(I)V HSPLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/IndicationKt$LocalIndication$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/IndicationKt$indication$2; HSPLandroidx/compose/foundation/IndicationKt$indication$2;->(Landroidx/compose/foundation/Indication;Landroidx/compose/foundation/interaction/InteractionSource;)V HPLandroidx/compose/foundation/IndicationKt$indication$2;->(Landroidx/compose/foundation/Indication;Landroidx/compose/foundation/interaction/InteractionSource;)V HSPLandroidx/compose/foundation/IndicationKt$indication$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/IndicationKt$indication$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/IndicationModifier; HSPLandroidx/compose/foundation/IndicationModifier;->(Landroidx/compose/foundation/IndicationInstance;)V PLandroidx/compose/foundation/IndicationModifier;->(Landroidx/compose/foundation/IndicationInstance;)V HSPLandroidx/compose/foundation/IndicationModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/foundation/IndicationModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V Landroidx/compose/foundation/MagnifierNode$draw$1$1; HSPLandroidx/compose/foundation/MagnifierNode$draw$1$1;->()V PLandroidx/compose/foundation/MagnifierNode$draw$1$1;->()V HSPLandroidx/compose/foundation/MagnifierNode$draw$1$1;->(I)V PLandroidx/compose/foundation/MagnifierNode$draw$1$1;->(I)V Landroidx/compose/foundation/MutatorMutex; HSPLandroidx/compose/foundation/MutatorMutex;->()V HPLandroidx/compose/foundation/MutatorMutex;->()V Landroidx/compose/foundation/NoIndication; HSPLandroidx/compose/foundation/NoIndication;->()V PLandroidx/compose/foundation/NoIndication;->()V HSPLandroidx/compose/foundation/NoIndication;->()V PLandroidx/compose/foundation/NoIndication;->()V HSPLandroidx/compose/foundation/NoIndication;->rememberUpdatedInstance(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/IndicationInstance; PLandroidx/compose/foundation/NoIndication;->rememberUpdatedInstance(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/IndicationInstance; Landroidx/compose/foundation/OverscrollConfiguration; HSPLandroidx/compose/foundation/OverscrollConfiguration;->()V PLandroidx/compose/foundation/OverscrollConfiguration;->()V HSPLandroidx/compose/foundation/OverscrollConfiguration;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/OverscrollConfiguration;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/OverscrollConfiguration;->getGlowColor-0d7_KjU()J HPLandroidx/compose/foundation/OverscrollConfiguration;->getGlowColor-0d7_KjU()J Landroidx/compose/foundation/OverscrollConfigurationKt; HSPLandroidx/compose/foundation/OverscrollConfigurationKt;->()V PLandroidx/compose/foundation/OverscrollConfigurationKt;->()V HSPLandroidx/compose/foundation/OverscrollConfigurationKt;->getLocalOverscrollConfiguration()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/foundation/OverscrollConfigurationKt;->getLocalOverscrollConfiguration()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Landroidx/compose/foundation/OverscrollEffect; Landroidx/compose/foundation/PlatformMagnifierFactory; Landroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl; HSPLandroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl;->()V PLandroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl;->()V HSPLandroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl;->()V PLandroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl;->()V HSPLandroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl;->drawIndication(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/foundation/PlatformMagnifierFactoryApi28Impl;->drawIndication(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V Landroidx/compose/foundation/ScrollKt$rememberScrollState$1$1; HSPLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->(I)V PLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->(I)V HSPLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/ScrollKt$rememberScrollState$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/ScrollKt$scroll$$inlined$debugInspectorInfo$1; HSPLandroidx/compose/foundation/ScrollKt$scroll$$inlined$debugInspectorInfo$1;->(ZZZLandroidx/compose/foundation/ScrollState;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/foundation/ScrollKt$scroll$$inlined$debugInspectorInfo$1;->(ZZZLandroidx/compose/foundation/ScrollState;Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/foundation/ScrollKt$scroll$$inlined$debugInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ScrollKt$scroll$$inlined$debugInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ScrollKt$scroll$2; HSPLandroidx/compose/foundation/ScrollKt$scroll$2;->(Landroidx/compose/foundation/ScrollState;Landroidx/compose/foundation/gestures/FlingBehavior;ZZZ)V PLandroidx/compose/foundation/ScrollKt$scroll$2;->(Landroidx/compose/foundation/ScrollState;Landroidx/compose/foundation/gestures/FlingBehavior;ZZZ)V HSPLandroidx/compose/foundation/ScrollKt$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ScrollKt$scroll$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$1; HSPLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$1;->(Lkotlinx/coroutines/CoroutineScope;ZLandroidx/compose/foundation/ScrollState;)V PLandroidx/compose/foundation/ScrollKt$scroll$2$semantics$1$1;->(Lkotlinx/coroutines/CoroutineScope;ZLandroidx/compose/foundation/ScrollState;)V Landroidx/compose/foundation/ScrollState; HSPLandroidx/compose/foundation/ScrollState;->()V PLandroidx/compose/foundation/ScrollState;->()V HSPLandroidx/compose/foundation/ScrollState;->(I)V PLandroidx/compose/foundation/ScrollState;->(I)V HSPLandroidx/compose/foundation/ScrollState;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/foundation/ScrollState;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/foundation/ScrollState;->getInternalInteractionSource$foundation_release()Landroidx/compose/foundation/interaction/MutableInteractionSource; PLandroidx/compose/foundation/ScrollState;->getInternalInteractionSource$foundation_release()Landroidx/compose/foundation/interaction/MutableInteractionSource; HSPLandroidx/compose/foundation/ScrollState;->getMaxValue()I HPLandroidx/compose/foundation/ScrollState;->getMaxValue()I HSPLandroidx/compose/foundation/ScrollState;->getValue()I HPLandroidx/compose/foundation/ScrollState;->getValue()I HSPLandroidx/compose/foundation/ScrollState;->setMaxValue$foundation_release(I)V PLandroidx/compose/foundation/ScrollState;->setMaxValue$foundation_release(I)V HSPLandroidx/compose/foundation/ScrollState;->setViewportSize$foundation_release(I)V PLandroidx/compose/foundation/ScrollState;->setViewportSize$foundation_release(I)V Landroidx/compose/foundation/ScrollState$Companion$Saver$1; HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->()V PLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->()V HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->()V PLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->()V HSPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/ScrollState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/ScrollState$canScrollForward$2; HSPLandroidx/compose/foundation/ScrollState$canScrollForward$2;->(Landroidx/compose/foundation/ScrollState;I)V HPLandroidx/compose/foundation/ScrollState$canScrollForward$2;->(Landroidx/compose/foundation/ScrollState;I)V HSPLandroidx/compose/foundation/ScrollState$canScrollForward$2;->invoke()Ljava/lang/Float; HPLandroidx/compose/foundation/ScrollState$canScrollForward$2;->invoke()Ljava/lang/Float; HSPLandroidx/compose/foundation/ScrollState$canScrollForward$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/foundation/ScrollState$canScrollForward$2;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/ScrollingLayoutElement; HSPLandroidx/compose/foundation/ScrollingLayoutElement;->(Landroidx/compose/foundation/ScrollState;ZZ)V PLandroidx/compose/foundation/ScrollingLayoutElement;->(Landroidx/compose/foundation/ScrollState;ZZ)V HSPLandroidx/compose/foundation/ScrollingLayoutElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/ScrollingLayoutElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/ScrollingLayoutElement;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/ScrollingLayoutElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/ScrollingLayoutNode; HSPLandroidx/compose/foundation/ScrollingLayoutNode;->(Landroidx/compose/foundation/ScrollState;ZZ)V PLandroidx/compose/foundation/ScrollingLayoutNode;->(Landroidx/compose/foundation/ScrollState;ZZ)V HSPLandroidx/compose/foundation/ScrollingLayoutNode;->getScrollerState()Landroidx/compose/foundation/ScrollState; PLandroidx/compose/foundation/ScrollingLayoutNode;->getScrollerState()Landroidx/compose/foundation/ScrollState; HSPLandroidx/compose/foundation/ScrollingLayoutNode;->isReversed()Z PLandroidx/compose/foundation/ScrollingLayoutNode;->isReversed()Z HSPLandroidx/compose/foundation/ScrollingLayoutNode;->isVertical()Z PLandroidx/compose/foundation/ScrollingLayoutNode;->isVertical()Z HSPLandroidx/compose/foundation/ScrollingLayoutNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/ScrollingLayoutNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/ScrollingLayoutNode$measure$1; HSPLandroidx/compose/foundation/ScrollingLayoutNode$measure$1;->(Landroidx/compose/foundation/ScrollingLayoutNode;ILandroidx/compose/ui/layout/Placeable;)V PLandroidx/compose/foundation/ScrollingLayoutNode$measure$1;->(Landroidx/compose/foundation/ScrollingLayoutNode;ILandroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/foundation/ScrollingLayoutNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/ScrollingLayoutNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/AnchoredDragFinishedSignal; Landroidx/compose/foundation/gestures/AndroidConfig; HSPLandroidx/compose/foundation/gestures/AndroidConfig;->()V PLandroidx/compose/foundation/gestures/AndroidConfig;->()V HSPLandroidx/compose/foundation/gestures/AndroidConfig;->()V PLandroidx/compose/foundation/gestures/AndroidConfig;->()V Landroidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue; HSPLandroidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue;->()V HPLandroidx/compose/foundation/gestures/BringIntoViewRequestPriorityQueue;->()V Landroidx/compose/foundation/gestures/BringIntoViewScroller; HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller;->()V PLandroidx/compose/foundation/gestures/BringIntoViewScroller;->()V Landroidx/compose/foundation/gestures/BringIntoViewScroller$Companion; HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->()V PLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->()V HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->()V PLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->()V HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->getDefaultBringIntoViewScroller$foundation_release()Landroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1; PLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->getDefaultBringIntoViewScroller$foundation_release()Landroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1; HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->getDefaultScrollAnimationSpec()Landroidx/compose/animation/core/AnimationSpec; PLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion;->getDefaultScrollAnimationSpec()Landroidx/compose/animation/core/AnimationSpec; Landroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1; HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1;->()V PLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1;->()V HSPLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1;->getScrollAnimationSpec()Landroidx/compose/animation/core/AnimationSpec; PLandroidx/compose/foundation/gestures/BringIntoViewScroller$Companion$DefaultBringIntoViewScroller$1;->getScrollAnimationSpec()Landroidx/compose/animation/core/AnimationSpec; Landroidx/compose/foundation/gestures/ContentInViewNode; HSPLandroidx/compose/foundation/gestures/ContentInViewNode;->(Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;ZLandroidx/compose/foundation/gestures/BringIntoViewScroller;)V PLandroidx/compose/foundation/gestures/ContentInViewNode;->(Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/gestures/ScrollableState;ZLandroidx/compose/foundation/gestures/BringIntoViewScroller;)V HSPLandroidx/compose/foundation/gestures/ContentInViewNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/foundation/gestures/ContentInViewNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/foundation/gestures/ContentInViewNode;->onRemeasured-ozmzZPI(J)V HPLandroidx/compose/foundation/gestures/ContentInViewNode;->onRemeasured-ozmzZPI(J)V Landroidx/compose/foundation/gestures/ContentInViewNode$Request; Landroidx/compose/foundation/gestures/DefaultFlingBehavior; HSPLandroidx/compose/foundation/gestures/DefaultFlingBehavior;->(Landroidx/compose/animation/core/DecayAnimationSpec;)V HPLandroidx/compose/foundation/gestures/DefaultFlingBehavior;->(Landroidx/compose/animation/core/DecayAnimationSpec;)V HSPLandroidx/compose/foundation/gestures/DefaultFlingBehavior;->setFlingDecay(Landroidx/compose/animation/core/DecayAnimationSpec;)V PLandroidx/compose/foundation/gestures/DefaultFlingBehavior;->setFlingDecay(Landroidx/compose/animation/core/DecayAnimationSpec;)V Landroidx/compose/foundation/gestures/DefaultScrollableState; HSPLandroidx/compose/foundation/gestures/DefaultScrollableState;->(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/foundation/gestures/DefaultScrollableState;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/gestures/DefaultScrollableState;->isScrollInProgress()Z Landroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1; HSPLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->(Landroidx/compose/foundation/gestures/DefaultScrollableState;)V PLandroidx/compose/foundation/gestures/DefaultScrollableState$scrollScope$1;->(Landroidx/compose/foundation/gestures/DefaultScrollableState;)V PLandroidx/compose/foundation/gestures/DragEvent$DragCancelled;->()V PLandroidx/compose/foundation/gestures/DragEvent$DragCancelled;->()V PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->()V PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->access$isPointerUp-DmW0f2w(Landroidx/compose/ui/input/pointer/PointerEvent;J)Z PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->isPointerUp-DmW0f2w(Landroidx/compose/ui/input/pointer/PointerEvent;J)Z PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->pointerSlop-E8SPZFQ(Landroidx/compose/ui/platform/ViewConfiguration;I)F PLandroidx/compose/foundation/gestures/DragGestureDetectorKt;->toPointerDirectionConfig(Landroidx/compose/foundation/gestures/Orientation;)Landroidx/compose/foundation/gestures/DragGestureDetectorKt$VerticalPointerDirectionConfig$1; PLandroidx/compose/foundation/gestures/DragGestureDetectorKt$VerticalPointerDirectionConfig$1;->(I)V Landroidx/compose/foundation/gestures/DragScope; PLandroidx/compose/foundation/gestures/DraggableKt;->access$awaitDownAndSlop(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/input/pointer/util/VelocityTracker;Landroidx/compose/foundation/gestures/Orientation;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; HPLandroidx/compose/foundation/gestures/DraggableKt;->access$awaitDownAndSlop(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/input/pointer/util/VelocityTracker;Landroidx/compose/foundation/gestures/Orientation;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; PLandroidx/compose/foundation/gestures/DraggableKt$awaitDownAndSlop$1;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/DraggableKt$awaitDownAndSlop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DraggableKt$awaitDownAndSlop$postPointerSlop$1;->(Landroidx/compose/ui/input/pointer/util/VelocityTracker;Lkotlin/jvm/internal/Ref$LongRef;)V Landroidx/compose/foundation/gestures/DraggableKt$draggable$1; HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$1;->(Lkotlin/coroutines/Continuation;I)V PLandroidx/compose/foundation/gestures/DraggableKt$draggable$1;->(Lkotlin/coroutines/Continuation;I)V Landroidx/compose/foundation/gestures/DraggableKt$draggable$3; HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$3;->()V PLandroidx/compose/foundation/gestures/DraggableKt$draggable$3;->()V HSPLandroidx/compose/foundation/gestures/DraggableKt$draggable$3;->(I)V PLandroidx/compose/foundation/gestures/DraggableKt$draggable$3;->(I)V PLandroidx/compose/foundation/gestures/DraggableKt$draggable$3;->invoke(Landroidx/compose/ui/input/pointer/PointerInputChange;)Ljava/lang/Boolean; PLandroidx/compose/foundation/gestures/DraggableKt$draggable$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/DraggableNode; HSPLandroidx/compose/foundation/gestures/DraggableNode;->(Landroidx/compose/foundation/gestures/DraggableState;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Z)V HPLandroidx/compose/foundation/gestures/DraggableNode;->(Landroidx/compose/foundation/gestures/DraggableState;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Z)V PLandroidx/compose/foundation/gestures/DraggableNode;->access$getCanDrag$p(Landroidx/compose/foundation/gestures/DraggableNode;)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/foundation/gestures/DraggableNode;->access$getChannel$p(Landroidx/compose/foundation/gestures/DraggableNode;)Lkotlinx/coroutines/channels/Channel; PLandroidx/compose/foundation/gestures/DraggableNode;->access$getChannel$p(Landroidx/compose/foundation/gestures/DraggableNode;)Lkotlinx/coroutines/channels/Channel; PLandroidx/compose/foundation/gestures/DraggableNode;->access$getEnabled$p(Landroidx/compose/foundation/gestures/DraggableNode;)Z PLandroidx/compose/foundation/gestures/DraggableNode;->access$getOrientation$p(Landroidx/compose/foundation/gestures/DraggableNode;)Landroidx/compose/foundation/gestures/Orientation; PLandroidx/compose/foundation/gestures/DraggableNode;->access$getStartDragImmediately$p(Landroidx/compose/foundation/gestures/DraggableNode;)Lkotlin/jvm/functions/Function0; PLandroidx/compose/foundation/gestures/DraggableNode;->access$getVelocityTracker$p(Landroidx/compose/foundation/gestures/DraggableNode;)Landroidx/compose/ui/input/pointer/util/VelocityTracker; PLandroidx/compose/foundation/gestures/DraggableNode;->access$get_canDrag$p(Landroidx/compose/foundation/gestures/DraggableNode;)Lkotlin/jvm/functions/Function1; PLandroidx/compose/foundation/gestures/DraggableNode;->access$get_startDragImmediately$p(Landroidx/compose/foundation/gestures/DraggableNode;)Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/foundation/gestures/DraggableNode;->disposeInteractionSource()V PLandroidx/compose/foundation/gestures/DraggableNode;->disposeInteractionSource()V HSPLandroidx/compose/foundation/gestures/DraggableNode;->onAttach()V HPLandroidx/compose/foundation/gestures/DraggableNode;->onAttach()V HSPLandroidx/compose/foundation/gestures/DraggableNode;->onDetach()V PLandroidx/compose/foundation/gestures/DraggableNode;->onDetach()V PLandroidx/compose/foundation/gestures/DraggableNode;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V Landroidx/compose/foundation/gestures/DraggableNode$onAttach$1; HSPLandroidx/compose/foundation/gestures/DraggableNode$onAttach$1;->(Landroidx/compose/foundation/gestures/DraggableNode;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/gestures/DraggableNode$onAttach$1;->(Landroidx/compose/foundation/gestures/DraggableNode;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/DraggableNode$onAttach$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/DraggableNode$onAttach$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/DraggableNode$onAttach$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/DraggableNode$onAttach$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1; HSPLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1;->(Landroidx/compose/foundation/gestures/DraggableNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1;->(Landroidx/compose/foundation/gestures/DraggableNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1;->(Landroidx/compose/ui/input/pointer/PointerInputScope;Landroidx/compose/foundation/gestures/DraggableNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1$1;->(Landroidx/compose/foundation/gestures/DraggableNode;Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/DraggableNode$pointerInputNode$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/DraggableState; Landroidx/compose/foundation/gestures/FlingBehavior; Landroidx/compose/foundation/gestures/ForEachGestureKt; PLandroidx/compose/foundation/gestures/ForEachGestureKt;->()V HSPLandroidx/compose/foundation/gestures/ForEachGestureKt;->ScrollableState(Lkotlin/jvm/functions/Function1;)Landroidx/compose/foundation/gestures/ScrollableState; PLandroidx/compose/foundation/gestures/ForEachGestureKt;->ScrollableState(Lkotlin/jvm/functions/Function1;)Landroidx/compose/foundation/gestures/ScrollableState; HSPLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitAllPointersUp(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitAllPointersUp(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitEachGesture(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/ForEachGestureKt;->awaitEachGesture(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/ForEachGestureKt;->overscrollEffect(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/OverscrollEffect; HPLandroidx/compose/foundation/gestures/ForEachGestureKt;->overscrollEffect(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/OverscrollEffect; Landroidx/compose/foundation/gestures/ForEachGestureKt$awaitAllPointersUp$3; HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitAllPointersUp$3;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitAllPointersUp$3;->(Lkotlin/coroutines/Continuation;)V Landroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2; HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/ForEachGestureKt$awaitEachGesture$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider; HSPLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;->(Z)V PLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;->(Z)V PLandroidx/compose/foundation/gestures/ModifierLocalScrollableContainerProvider;->getProvidedValues()Landroidx/compose/ui/text/StringKt; Landroidx/compose/foundation/gestures/MouseWheelScrollNode; HSPLandroidx/compose/foundation/gestures/MouseWheelScrollNode;->(Landroidx/compose/foundation/gestures/ScrollingLogic;)V HPLandroidx/compose/foundation/gestures/MouseWheelScrollNode;->(Landroidx/compose/foundation/gestures/ScrollingLogic;)V HSPLandroidx/compose/foundation/gestures/MouseWheelScrollNode;->onAttach()V PLandroidx/compose/foundation/gestures/MouseWheelScrollNode;->onAttach()V Landroidx/compose/foundation/gestures/MouseWheelScrollNode$1; HSPLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1;->(Landroidx/compose/foundation/gestures/MouseWheelScrollNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1;->(Landroidx/compose/foundation/gestures/MouseWheelScrollNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1$1;->(Landroidx/compose/foundation/gestures/MouseWheelScrollNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/MouseWheelScrollNode$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/Orientation; HSPLandroidx/compose/foundation/gestures/Orientation;->()V PLandroidx/compose/foundation/gestures/Orientation;->()V HSPLandroidx/compose/foundation/gestures/Orientation;->(Ljava/lang/String;I)V PLandroidx/compose/foundation/gestures/Orientation;->(Ljava/lang/String;I)V Landroidx/compose/foundation/gestures/PressGestureScope; Landroidx/compose/foundation/gestures/PressGestureScopeImpl; HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->(Landroidx/compose/ui/unit/Density;)V PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->release()V PLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->release()V HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->reset(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->reset(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->tryAwaitRelease(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/PressGestureScopeImpl;->tryAwaitRelease(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1; HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/PressGestureScopeImpl$reset$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1; HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/PressGestureScopeImpl$tryAwaitRelease$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/ScrollConfig; Landroidx/compose/foundation/gestures/ScrollDraggableState; HSPLandroidx/compose/foundation/gestures/ScrollDraggableState;->(Landroidx/compose/foundation/gestures/ScrollingLogic;)V PLandroidx/compose/foundation/gestures/ScrollDraggableState;->(Landroidx/compose/foundation/gestures/ScrollingLogic;)V Landroidx/compose/foundation/gestures/ScrollScope; Landroidx/compose/foundation/gestures/ScrollableElement; HSPLandroidx/compose/foundation/gestures/ScrollableElement;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/gestures/BringIntoViewScroller;)V HPLandroidx/compose/foundation/gestures/ScrollableElement;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/gestures/BringIntoViewScroller;)V HSPLandroidx/compose/foundation/gestures/ScrollableElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/gestures/ScrollableElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/gestures/ScrollableElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/gestures/ScrollableElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/gestures/ScrollableGesturesNode; HSPLandroidx/compose/foundation/gestures/ScrollableGesturesNode;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V HPLandroidx/compose/foundation/gestures/ScrollableGesturesNode;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Landroidx/compose/foundation/gestures/Orientation;ZLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;Landroidx/compose/foundation/interaction/MutableInteractionSource;)V PLandroidx/compose/foundation/gestures/ScrollableGesturesNode;->getScrollLogic()Landroidx/compose/foundation/gestures/ScrollingLogic; Landroidx/compose/foundation/gestures/ScrollableGesturesNode$onDragStopped$1; HSPLandroidx/compose/foundation/gestures/ScrollableGesturesNode$onDragStopped$1;->(Landroidx/compose/foundation/gestures/ScrollableGesturesNode;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/ScrollableGesturesNode$onDragStopped$1;->(Landroidx/compose/foundation/gestures/ScrollableGesturesNode;Lkotlin/coroutines/Continuation;)V Landroidx/compose/foundation/gestures/ScrollableKt; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->()V PLandroidx/compose/foundation/gestures/ScrollableKt;->()V PLandroidx/compose/foundation/gestures/ScrollableKt;->access$awaitScrollEvent(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->access$getCanDragCalculation$p()Lkotlin/jvm/functions/Function1; PLandroidx/compose/foundation/gestures/ScrollableKt;->access$getCanDragCalculation$p()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->access$getNoOpOnDragStarted$p()Lkotlin/jvm/functions/Function3; PLandroidx/compose/foundation/gestures/ScrollableKt;->access$getNoOpOnDragStarted$p()Lkotlin/jvm/functions/Function3; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->access$getNoOpScrollScope$p()Landroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1; PLandroidx/compose/foundation/gestures/ScrollableKt;->access$getNoOpScrollScope$p()Landroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->access$getUnityDensity$p()Landroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1; PLandroidx/compose/foundation/gestures/ScrollableKt;->access$getUnityDensity$p()Landroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->getDefaultScrollMotionDurationScale()Landroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1; PLandroidx/compose/foundation/gestures/ScrollableKt;->getDefaultScrollMotionDurationScale()Landroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->getModifierLocalScrollableContainer()Landroidx/compose/ui/modifier/ProvidableModifierLocal; PLandroidx/compose/foundation/gestures/ScrollableKt;->getModifierLocalScrollableContainer()Landroidx/compose/ui/modifier/ProvidableModifierLocal; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->scrollable$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/gestures/ScrollableKt;->scrollable$default(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/gestures/ScrollableKt;->scrollable(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/gestures/BringIntoViewScroller;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/gestures/ScrollableKt;->scrollable(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/gestures/BringIntoViewScroller;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;->()V PLandroidx/compose/foundation/gestures/ScrollableKt$DefaultScrollMotionDurationScale$1;->()V Landroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->()V PLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->()V HSPLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->()V PLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->()V HSPLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/gestures/ScrollableKt$ModifierLocalScrollableContainer$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1;->()V PLandroidx/compose/foundation/gestures/ScrollableKt$NoOpScrollScope$1;->()V Landroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1; HSPLandroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1;->()V PLandroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1;->()V HSPLandroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1;->getDensity()F PLandroidx/compose/foundation/gestures/ScrollableKt$UnityDensity$1;->getDensity()F PLandroidx/compose/foundation/gestures/ScrollableKt$awaitScrollEvent$1;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/ScrollableKt$awaitScrollEvent$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/ScrollableNestedScrollConnection; HSPLandroidx/compose/foundation/gestures/ScrollableNestedScrollConnection;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Z)V PLandroidx/compose/foundation/gestures/ScrollableNestedScrollConnection;->(Landroidx/compose/foundation/gestures/ScrollingLogic;Z)V Landroidx/compose/foundation/gestures/ScrollableNode; HSPLandroidx/compose/foundation/gestures/ScrollableNode;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/gestures/BringIntoViewScroller;)V HPLandroidx/compose/foundation/gestures/ScrollableNode;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/gestures/BringIntoViewScroller;)V HSPLandroidx/compose/foundation/gestures/ScrollableNode;->applyFocusProperties(Landroidx/compose/ui/focus/FocusProperties;)V PLandroidx/compose/foundation/gestures/ScrollableNode;->applyFocusProperties(Landroidx/compose/ui/focus/FocusProperties;)V HSPLandroidx/compose/foundation/gestures/ScrollableNode;->onAttach()V HPLandroidx/compose/foundation/gestures/ScrollableNode;->onAttach()V Landroidx/compose/foundation/gestures/ScrollableNode$1; HSPLandroidx/compose/foundation/gestures/ScrollableNode$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/gestures/ScrollableNode$1;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/gestures/ScrollableNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/ScrollableNode$onAttach$1; HSPLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->(ILandroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->(ILandroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->invoke()Ljava/lang/Boolean; HSPLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->invoke()V PLandroidx/compose/foundation/gestures/ScrollableNode$onAttach$1;->invoke()V Landroidx/compose/foundation/gestures/ScrollableState; Landroidx/compose/foundation/gestures/ScrollingLogic; HSPLandroidx/compose/foundation/gestures/ScrollingLogic;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V HPLandroidx/compose/foundation/gestures/ScrollingLogic;->(Landroidx/compose/foundation/gestures/ScrollableState;Landroidx/compose/foundation/gestures/Orientation;Landroidx/compose/foundation/OverscrollEffect;ZLandroidx/compose/foundation/gestures/FlingBehavior;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V PLandroidx/compose/foundation/gestures/ScrollingLogic;->shouldScrollImmediately()Z Landroidx/compose/foundation/gestures/TapGestureDetectorKt; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->()V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->()V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->access$getNoPressGesture$p()Lkotlin/jvm/functions/Function3; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->access$getNoPressGesture$p()Lkotlin/jvm/functions/Function3; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown$default(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;I)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown$default(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;I)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;ZLandroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->awaitFirstDown(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;ZLandroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->detectTapAndPress(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->detectTapAndPress(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->waitForUpOrCancellation(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt;->waitForUpOrCancellation(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;->(Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$awaitFirstDown$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->(Landroidx/compose/ui/input/pointer/PointerInputScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function1;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Landroidx/compose/ui/input/pointer/PointerInputChange;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Landroidx/compose/ui/input/pointer/PointerInputChange;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4;->(Landroidx/compose/foundation/gestures/PressGestureScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$detectTapAndPress$2$1$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/TapGestureDetectorKt$waitForUpOrCancellation$2; HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$waitForUpOrCancellation$2;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$waitForUpOrCancellation$2;->(Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/gestures/TapGestureDetectorKt$waitForUpOrCancellation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/gestures/TapGestureDetectorKt$waitForUpOrCancellation$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/gestures/UpdatableAnimationState; HSPLandroidx/compose/foundation/gestures/UpdatableAnimationState;->()V PLandroidx/compose/foundation/gestures/UpdatableAnimationState;->()V HSPLandroidx/compose/foundation/gestures/UpdatableAnimationState;->(Landroidx/compose/animation/core/AnimationSpec;)V PLandroidx/compose/foundation/gestures/UpdatableAnimationState;->(Landroidx/compose/animation/core/AnimationSpec;)V Landroidx/compose/foundation/interaction/DragInteractionKt; HSPLandroidx/compose/foundation/interaction/DragInteractionKt;->MutableInteractionSource()Landroidx/compose/foundation/interaction/MutableInteractionSource; HPLandroidx/compose/foundation/interaction/DragInteractionKt;->MutableInteractionSource()Landroidx/compose/foundation/interaction/MutableInteractionSource; HSPLandroidx/compose/foundation/interaction/DragInteractionKt;->collectIsPressedAsState(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/foundation/interaction/DragInteractionKt;->collectIsPressedAsState(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;I)Landroidx/compose/runtime/MutableState; Landroidx/compose/foundation/interaction/DragInteractionKt$collectIsDraggedAsState$1$1$1; HSPLandroidx/compose/foundation/interaction/DragInteractionKt$collectIsDraggedAsState$1$1$1;->(Ljava/util/ArrayList;Landroidx/compose/runtime/MutableState;I)V PLandroidx/compose/foundation/interaction/DragInteractionKt$collectIsDraggedAsState$1$1$1;->(Ljava/util/ArrayList;Landroidx/compose/runtime/MutableState;I)V Landroidx/compose/foundation/interaction/Interaction; Landroidx/compose/foundation/interaction/InteractionSource; Landroidx/compose/foundation/interaction/MutableInteractionSource; Landroidx/compose/foundation/interaction/MutableInteractionSourceImpl; HSPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->()V HPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->()V HSPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->emit(Landroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->emit(Landroidx/compose/foundation/interaction/Interaction;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->getInteractions()Lkotlinx/coroutines/flow/Flow; PLandroidx/compose/foundation/interaction/MutableInteractionSourceImpl;->getInteractions()Lkotlinx/coroutines/flow/Flow; Landroidx/compose/foundation/interaction/PressInteraction$Cancel; Landroidx/compose/foundation/interaction/PressInteraction$Press; HSPLandroidx/compose/foundation/interaction/PressInteraction$Press;->(J)V HPLandroidx/compose/foundation/interaction/PressInteraction$Press;->(J)V HSPLandroidx/compose/foundation/interaction/PressInteraction$Press;->getPressPosition-F1C5BW0()J PLandroidx/compose/foundation/interaction/PressInteraction$Press;->getPressPosition-F1C5BW0()J Landroidx/compose/foundation/interaction/PressInteraction$Release; HSPLandroidx/compose/foundation/interaction/PressInteraction$Release;->(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V HPLandroidx/compose/foundation/interaction/PressInteraction$Release;->(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V HSPLandroidx/compose/foundation/interaction/PressInteraction$Release;->getPress()Landroidx/compose/foundation/interaction/PressInteraction$Press; PLandroidx/compose/foundation/interaction/PressInteraction$Release;->getPress()Landroidx/compose/foundation/interaction/PressInteraction$Press; Landroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1; HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/interaction/PressInteractionKt$collectIsPressedAsState$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/AddedInsets; HSPLandroidx/compose/foundation/layout/AddedInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V PLandroidx/compose/foundation/layout/AddedInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V HSPLandroidx/compose/foundation/layout/AddedInsets;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/AddedInsets;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/AddedInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/AddedInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/AddedInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/AddedInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/AddedInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/AddedInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/AddedInsets;->getTop(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/AddedInsets;->getTop(Landroidx/compose/ui/unit/Density;)I Landroidx/compose/foundation/layout/AlignmentLineKt$alignmentLineOffsetMeasure$1; HSPLandroidx/compose/foundation/layout/AlignmentLineKt$alignmentLineOffsetMeasure$1;->(Landroidx/compose/ui/layout/AlignmentLine;FIIILandroidx/compose/ui/layout/Placeable;I)V PLandroidx/compose/foundation/layout/AlignmentLineKt$alignmentLineOffsetMeasure$1;->(Landroidx/compose/ui/layout/AlignmentLine;FIIILandroidx/compose/ui/layout/Placeable;I)V HSPLandroidx/compose/foundation/layout/AlignmentLineKt$alignmentLineOffsetMeasure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/AlignmentLineKt$alignmentLineOffsetMeasure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/AlignmentLineOffsetDpElement; HSPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpElement;->(Landroidx/compose/ui/layout/HorizontalAlignmentLine;FFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpElement;->(Landroidx/compose/ui/layout/HorizontalAlignmentLine;FFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/layout/AlignmentLineOffsetDpElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpElement;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/layout/AlignmentLineOffsetDpElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/AlignmentLineOffsetDpNode; HSPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpNode;->(Landroidx/compose/ui/layout/AlignmentLine;FF)V PLandroidx/compose/foundation/layout/AlignmentLineOffsetDpNode;->(Landroidx/compose/ui/layout/AlignmentLine;FF)V HSPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/AlignmentLineOffsetDpNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->(ILjava/lang/String;)V HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->(ILjava/lang/String;)V HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getInsets$foundation_layout_release()Landroidx/core/graphics/Insets; HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getInsets$foundation_layout_release()Landroidx/core/graphics/Insets; HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getTop(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->getTop(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/AndroidWindowInsets;->update$foundation_layout_release(Landroidx/core/view/WindowInsetsCompat;I)V HPLandroidx/compose/foundation/layout/AndroidWindowInsets;->update$foundation_layout_release(Landroidx/core/view/WindowInsetsCompat;I)V Landroidx/compose/foundation/layout/Arrangement; HSPLandroidx/compose/foundation/layout/Arrangement;->()V PLandroidx/compose/foundation/layout/Arrangement;->()V HSPLandroidx/compose/foundation/layout/Arrangement;->getCenter()Landroidx/compose/foundation/layout/Arrangement$Center$1; PLandroidx/compose/foundation/layout/Arrangement;->getCenter()Landroidx/compose/foundation/layout/Arrangement$Center$1; HSPLandroidx/compose/foundation/layout/Arrangement;->getEnd()Landroidx/compose/foundation/layout/Arrangement$End$1; PLandroidx/compose/foundation/layout/Arrangement;->getEnd()Landroidx/compose/foundation/layout/Arrangement$End$1; HSPLandroidx/compose/foundation/layout/Arrangement;->getStart()Landroidx/compose/foundation/layout/Arrangement$End$1; PLandroidx/compose/foundation/layout/Arrangement;->getStart()Landroidx/compose/foundation/layout/Arrangement$End$1; HSPLandroidx/compose/foundation/layout/Arrangement;->getTop()Landroidx/compose/foundation/layout/Arrangement$Top$1; PLandroidx/compose/foundation/layout/Arrangement;->getTop()Landroidx/compose/foundation/layout/Arrangement$Top$1; HSPLandroidx/compose/foundation/layout/Arrangement;->placeCenter$foundation_layout_release(I[I[IZ)V HPLandroidx/compose/foundation/layout/Arrangement;->placeCenter$foundation_layout_release(I[I[IZ)V HSPLandroidx/compose/foundation/layout/Arrangement;->placeLeftOrTop$foundation_layout_release([I[IZ)V HPLandroidx/compose/foundation/layout/Arrangement;->placeLeftOrTop$foundation_layout_release([I[IZ)V HSPLandroidx/compose/foundation/layout/Arrangement;->placeRightOrBottom$foundation_layout_release(I[I[IZ)V PLandroidx/compose/foundation/layout/Arrangement;->placeRightOrBottom$foundation_layout_release(I[I[IZ)V HSPLandroidx/compose/foundation/layout/Arrangement;->spacedBy-0680j_4(F)Landroidx/compose/foundation/layout/Arrangement$SpacedAligned; PLandroidx/compose/foundation/layout/Arrangement;->spacedBy-0680j_4(F)Landroidx/compose/foundation/layout/Arrangement$SpacedAligned; Landroidx/compose/foundation/layout/Arrangement$Center$1; HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;->(I)V PLandroidx/compose/foundation/layout/Arrangement$Center$1;->(I)V HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V PLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V PLandroidx/compose/foundation/layout/Arrangement$Center$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V HSPLandroidx/compose/foundation/layout/Arrangement$Center$1;->getSpacing-D9Ej5fM()F PLandroidx/compose/foundation/layout/Arrangement$Center$1;->getSpacing-D9Ej5fM()F Landroidx/compose/foundation/layout/Arrangement$End$1; HSPLandroidx/compose/foundation/layout/Arrangement$End$1;->(I)V PLandroidx/compose/foundation/layout/Arrangement$End$1;->(I)V HSPLandroidx/compose/foundation/layout/Arrangement$End$1;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HPLandroidx/compose/foundation/layout/Arrangement$End$1;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V Landroidx/compose/foundation/layout/Arrangement$Horizontal; HSPLandroidx/compose/foundation/layout/Arrangement$Horizontal;->getSpacing-D9Ej5fM()F HPLandroidx/compose/foundation/layout/Arrangement$Horizontal;->getSpacing-D9Ej5fM()F Landroidx/compose/foundation/layout/Arrangement$SpacedAligned; HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->(FZLkotlin/jvm/functions/Function2;)V PLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->(FZLkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V PLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V PLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->getSpacing-D9Ej5fM()F PLandroidx/compose/foundation/layout/Arrangement$SpacedAligned;->getSpacing-D9Ej5fM()F Landroidx/compose/foundation/layout/Arrangement$Top$1; HSPLandroidx/compose/foundation/layout/Arrangement$Top$1;->(I)V PLandroidx/compose/foundation/layout/Arrangement$Top$1;->(I)V HSPLandroidx/compose/foundation/layout/Arrangement$Top$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V PLandroidx/compose/foundation/layout/Arrangement$Top$1;->arrange(Landroidx/compose/ui/unit/Density;I[I[I)V Landroidx/compose/foundation/layout/Arrangement$Vertical; HSPLandroidx/compose/foundation/layout/Arrangement$Vertical;->getSpacing-D9Ej5fM()F PLandroidx/compose/foundation/layout/Arrangement$Vertical;->getSpacing-D9Ej5fM()F Landroidx/compose/foundation/layout/Arrangement$spacedBy$1; HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$1;->()V PLandroidx/compose/foundation/layout/Arrangement$spacedBy$1;->()V HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$1;->(I)V PLandroidx/compose/foundation/layout/Arrangement$spacedBy$1;->(I)V Landroidx/compose/foundation/layout/Arrangement$spacedBy$2; HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$2;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/layout/Arrangement$spacedBy$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/layout/Arrangement$spacedBy$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$2;->invoke-5SAbXVA(JLandroidx/compose/ui/unit/LayoutDirection;)J PLandroidx/compose/foundation/layout/Arrangement$spacedBy$2;->invoke-5SAbXVA(JLandroidx/compose/ui/unit/LayoutDirection;)J Landroidx/compose/foundation/layout/Arrangement$spacedBy$3; HSPLandroidx/compose/foundation/layout/Arrangement$spacedBy$3;->(Landroidx/compose/ui/Alignment$Vertical;I)V PLandroidx/compose/foundation/layout/Arrangement$spacedBy$3;->(Landroidx/compose/ui/Alignment$Vertical;I)V Landroidx/compose/foundation/layout/BoxChildDataElement; HSPLandroidx/compose/foundation/layout/BoxChildDataElement;->(Landroidx/compose/ui/BiasAlignment;ZLkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/layout/BoxChildDataElement;->(Landroidx/compose/ui/BiasAlignment;ZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/layout/BoxChildDataElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/layout/BoxChildDataElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/foundation/layout/BoxChildDataNode; HSPLandroidx/compose/foundation/layout/BoxChildDataNode;->(Landroidx/compose/ui/Alignment;Z)V PLandroidx/compose/foundation/layout/BoxChildDataNode;->(Landroidx/compose/ui/Alignment;Z)V HSPLandroidx/compose/foundation/layout/BoxChildDataNode;->getAlignment()Landroidx/compose/ui/Alignment; PLandroidx/compose/foundation/layout/BoxChildDataNode;->getAlignment()Landroidx/compose/ui/Alignment; HSPLandroidx/compose/foundation/layout/BoxChildDataNode;->getMatchParentSize()Z PLandroidx/compose/foundation/layout/BoxChildDataNode;->getMatchParentSize()Z HSPLandroidx/compose/foundation/layout/BoxChildDataNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/layout/BoxChildDataNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/BoxKt; HSPLandroidx/compose/foundation/layout/BoxKt;->()V PLandroidx/compose/foundation/layout/BoxKt;->()V HSPLandroidx/compose/foundation/layout/BoxKt;->Box(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/layout/BoxKt;->Box(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/layout/BoxKt;->access$getMatchesParentSize(Landroidx/compose/ui/layout/Measurable;)Z PLandroidx/compose/foundation/layout/BoxKt;->access$getMatchesParentSize(Landroidx/compose/ui/layout/Measurable;)Z HSPLandroidx/compose/foundation/layout/BoxKt;->access$placeInBox(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/unit/LayoutDirection;IILandroidx/compose/ui/Alignment;)V HPLandroidx/compose/foundation/layout/BoxKt;->access$placeInBox(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/unit/LayoutDirection;IILandroidx/compose/ui/Alignment;)V HSPLandroidx/compose/foundation/layout/BoxKt;->rememberBoxMeasurePolicy(Landroidx/compose/ui/Alignment;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/foundation/layout/BoxKt;->rememberBoxMeasurePolicy(Landroidx/compose/ui/Alignment;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy; Landroidx/compose/foundation/layout/BoxKt$Box$$inlined$Layout$1; HSPLandroidx/compose/foundation/layout/BoxKt$Box$$inlined$Layout$1;->(Lkotlin/jvm/functions/Function0;I)V PLandroidx/compose/foundation/layout/BoxKt$Box$$inlined$Layout$1;->(Lkotlin/jvm/functions/Function0;I)V HSPLandroidx/compose/foundation/layout/BoxKt$Box$$inlined$Layout$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/layout/BoxKt$Box$$inlined$Layout$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/layout/BoxKt$Box$2; HSPLandroidx/compose/foundation/layout/BoxKt$Box$2;->(Landroidx/compose/ui/Modifier;I)V PLandroidx/compose/foundation/layout/BoxKt$Box$2;->(Landroidx/compose/ui/Modifier;I)V Landroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1; HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->()V PLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->()V HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->()V PLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->()V HSPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/BoxKt$EmptyBoxMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1; HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;->(Landroidx/compose/ui/Alignment;Z)V PLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;->(Landroidx/compose/ui/Alignment;Z)V HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2; HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/layout/MeasureScope;IILandroidx/compose/ui/Alignment;)V HPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Measurable;Landroidx/compose/ui/layout/MeasureScope;IILandroidx/compose/ui/Alignment;)V HSPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/BoxKt$boxMeasurePolicy$1$measure$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/BoxScope; Landroidx/compose/foundation/layout/BoxScopeInstance; HSPLandroidx/compose/foundation/layout/BoxScopeInstance;->()V PLandroidx/compose/foundation/layout/BoxScopeInstance;->()V HSPLandroidx/compose/foundation/layout/BoxScopeInstance;->()V PLandroidx/compose/foundation/layout/BoxScopeInstance;->()V HSPLandroidx/compose/foundation/layout/BoxScopeInstance;->align(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/BiasAlignment;)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/BoxScopeInstance;->align(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/BiasAlignment;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/layout/BoxScopeInstance$align$$inlined$debugInspectorInfo$1; HSPLandroidx/compose/foundation/layout/BoxScopeInstance$align$$inlined$debugInspectorInfo$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/layout/BoxScopeInstance$align$$inlined$debugInspectorInfo$1;->(Ljava/lang/Object;I)V Landroidx/compose/foundation/layout/ColumnKt; HSPLandroidx/compose/foundation/layout/ColumnKt;->()V PLandroidx/compose/foundation/layout/ColumnKt;->()V HSPLandroidx/compose/foundation/layout/ColumnKt;->columnMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/foundation/layout/ColumnKt;->columnMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/BiasAlignment$Horizontal;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy; Landroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1; HSPLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->(Landroidx/compose/foundation/layout/Arrangement$Vertical;I)V PLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->(Landroidx/compose/foundation/layout/Arrangement$Vertical;I)V HSPLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/ColumnKt$columnMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/ColumnScope; Landroidx/compose/foundation/layout/ColumnScopeInstance; HSPLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V PLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V HSPLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V PLandroidx/compose/foundation/layout/ColumnScopeInstance;->()V Landroidx/compose/foundation/layout/ConsumedInsetsModifier; HSPLandroidx/compose/foundation/layout/ConsumedInsetsModifier;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/layout/ConsumedInsetsModifier;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/layout/ConsumedInsetsModifier;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/ConsumedInsetsModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V HPLandroidx/compose/foundation/layout/ConsumedInsetsModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V Landroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment; HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;->align$foundation_layout_release(ILandroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/CrossAxisAlignment$VerticalCrossAxisAlignment;->align$foundation_layout_release(ILandroidx/compose/ui/unit/LayoutDirection;)I Landroidx/compose/foundation/layout/ExcludeInsets; HSPLandroidx/compose/foundation/layout/ExcludeInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V HPLandroidx/compose/foundation/layout/ExcludeInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V HSPLandroidx/compose/foundation/layout/ExcludeInsets;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/ExcludeInsets;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/ExcludeInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/ExcludeInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/ExcludeInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I PLandroidx/compose/foundation/layout/ExcludeInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/ExcludeInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I PLandroidx/compose/foundation/layout/ExcludeInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/ExcludeInsets;->getTop(Landroidx/compose/ui/unit/Density;)I PLandroidx/compose/foundation/layout/ExcludeInsets;->getTop(Landroidx/compose/ui/unit/Density;)I Landroidx/compose/foundation/layout/FillElement; HSPLandroidx/compose/foundation/layout/FillElement;->(IF)V PLandroidx/compose/foundation/layout/FillElement;->(IF)V HSPLandroidx/compose/foundation/layout/FillElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/layout/FillElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/FillElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/FillElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/FillElement$Companion; HSPLandroidx/compose/foundation/layout/FillElement$Companion;->()V PLandroidx/compose/foundation/layout/FillElement$Companion;->()V HSPLandroidx/compose/foundation/layout/FillElement$Companion;->()V PLandroidx/compose/foundation/layout/FillElement$Companion;->()V HSPLandroidx/compose/foundation/layout/FillElement$Companion;->access$systemInsets(ILjava/lang/String;)Landroidx/compose/foundation/layout/AndroidWindowInsets; PLandroidx/compose/foundation/layout/FillElement$Companion;->access$systemInsets(ILjava/lang/String;)Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/FillElement$Companion;->access$valueInsetsIgnoringVisibility(ILjava/lang/String;)Landroidx/compose/foundation/layout/ValueInsets; PLandroidx/compose/foundation/layout/FillElement$Companion;->access$valueInsetsIgnoringVisibility(ILjava/lang/String;)Landroidx/compose/foundation/layout/ValueInsets; HSPLandroidx/compose/foundation/layout/FillElement$Companion;->current(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/WindowInsetsHolder; HPLandroidx/compose/foundation/layout/FillElement$Companion;->current(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/WindowInsetsHolder; HSPLandroidx/compose/foundation/layout/FillElement$Companion;->height(Landroidx/compose/ui/Alignment$Vertical;Z)Landroidx/compose/foundation/layout/WrapContentElement; PLandroidx/compose/foundation/layout/FillElement$Companion;->height(Landroidx/compose/ui/Alignment$Vertical;Z)Landroidx/compose/foundation/layout/WrapContentElement; HSPLandroidx/compose/foundation/layout/FillElement$Companion;->size(Landroidx/compose/ui/Alignment;Z)Landroidx/compose/foundation/layout/WrapContentElement; PLandroidx/compose/foundation/layout/FillElement$Companion;->size(Landroidx/compose/ui/Alignment;Z)Landroidx/compose/foundation/layout/WrapContentElement; Landroidx/compose/foundation/layout/FillNode; HSPLandroidx/compose/foundation/layout/FillNode;->(IF)V HPLandroidx/compose/foundation/layout/FillNode;->(IF)V HSPLandroidx/compose/foundation/layout/FillNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/FillNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/FillNode$measure$1; HSPLandroidx/compose/foundation/layout/FillNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;I)V PLandroidx/compose/foundation/layout/FillNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;I)V HSPLandroidx/compose/foundation/layout/FillNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HPLandroidx/compose/foundation/layout/FillNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/foundation/layout/FillNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/FillNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/FixedIntInsets; HSPLandroidx/compose/foundation/layout/FixedIntInsets;->(IIII)V HPLandroidx/compose/foundation/layout/FixedIntInsets;->(IIII)V HSPLandroidx/compose/foundation/layout/FixedIntInsets;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/FixedIntInsets;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/FixedIntInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I PLandroidx/compose/foundation/layout/FixedIntInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/FixedIntInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I PLandroidx/compose/foundation/layout/FixedIntInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/FixedIntInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I PLandroidx/compose/foundation/layout/FixedIntInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/FixedIntInsets;->getTop(Landroidx/compose/ui/unit/Density;)I PLandroidx/compose/foundation/layout/FixedIntInsets;->getTop(Landroidx/compose/ui/unit/Density;)I Landroidx/compose/foundation/layout/InsetsConsumingModifier; HSPLandroidx/compose/foundation/layout/InsetsConsumingModifier;->()V PLandroidx/compose/foundation/layout/InsetsConsumingModifier;->()V HSPLandroidx/compose/foundation/layout/InsetsConsumingModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; HPLandroidx/compose/foundation/layout/InsetsConsumingModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; HSPLandroidx/compose/foundation/layout/InsetsConsumingModifier;->getValue()Ljava/lang/Object; HPLandroidx/compose/foundation/layout/InsetsConsumingModifier;->getValue()Ljava/lang/Object; HSPLandroidx/compose/foundation/layout/InsetsConsumingModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V PLandroidx/compose/foundation/layout/InsetsConsumingModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V Landroidx/compose/foundation/layout/InsetsListener; HSPLandroidx/compose/foundation/layout/InsetsListener;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;)V PLandroidx/compose/foundation/layout/InsetsListener;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;)V HSPLandroidx/compose/foundation/layout/InsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/compose/foundation/layout/InsetsListener;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/compose/foundation/layout/InsetsListener;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/compose/foundation/layout/InsetsListener;->onViewAttachedToWindow(Landroid/view/View;)V Landroidx/compose/foundation/layout/InsetsPaddingModifier; HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->(Landroidx/compose/foundation/layout/WindowInsets;)V PLandroidx/compose/foundation/layout/InsetsPaddingModifier;->(Landroidx/compose/foundation/layout/WindowInsets;)V HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; PLandroidx/compose/foundation/layout/InsetsPaddingModifier;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V HPLandroidx/compose/foundation/layout/InsetsPaddingModifier;->onModifierLocalsUpdated(Landroidx/compose/ui/modifier/ModifierLocalReadScope;)V Landroidx/compose/foundation/layout/InsetsPaddingModifier$measure$1; HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier$measure$1;->(IILandroidx/compose/ui/layout/Placeable;)V PLandroidx/compose/foundation/layout/InsetsPaddingModifier$measure$1;->(IILandroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/foundation/layout/InsetsPaddingModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/InsetsPaddingModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/InsetsPaddingValues; HSPLandroidx/compose/foundation/layout/InsetsPaddingValues;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/unit/Density;)V PLandroidx/compose/foundation/layout/InsetsPaddingValues;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateBottomPadding-D9Ej5fM()F HPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateBottomPadding-D9Ej5fM()F HSPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F HPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F HSPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F HPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F HSPLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateTopPadding-D9Ej5fM()F PLandroidx/compose/foundation/layout/InsetsPaddingValues;->calculateTopPadding-D9Ej5fM()F Landroidx/compose/foundation/layout/InsetsValues; HSPLandroidx/compose/foundation/layout/InsetsValues;->(IIII)V HPLandroidx/compose/foundation/layout/InsetsValues;->(IIII)V HSPLandroidx/compose/foundation/layout/InsetsValues;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/InsetsValues;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/LayoutWeightElement; HSPLandroidx/compose/foundation/layout/LayoutWeightElement;->(FZ)V HPLandroidx/compose/foundation/layout/LayoutWeightElement;->(FZ)V HSPLandroidx/compose/foundation/layout/LayoutWeightElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/layout/LayoutWeightElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/LayoutWeightElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/LayoutWeightElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/LayoutWeightNode; HSPLandroidx/compose/foundation/layout/LayoutWeightNode;->(FZ)V HPLandroidx/compose/foundation/layout/LayoutWeightNode;->(FZ)V HSPLandroidx/compose/foundation/layout/LayoutWeightNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/layout/LayoutWeightNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/LimitInsets; HSPLandroidx/compose/foundation/layout/LimitInsets;->(Landroidx/compose/foundation/layout/AndroidWindowInsets;I)V HPLandroidx/compose/foundation/layout/LimitInsets;->(Landroidx/compose/foundation/layout/AndroidWindowInsets;I)V HSPLandroidx/compose/foundation/layout/LimitInsets;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/LimitInsets;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/LimitInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/LimitInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/LimitInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/LimitInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/LimitInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/LimitInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/LimitInsets;->getTop(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/LimitInsets;->getTop(Landroidx/compose/ui/unit/Density;)I Landroidx/compose/foundation/layout/MutableWindowInsets; HSPLandroidx/compose/foundation/layout/MutableWindowInsets;->()V HPLandroidx/compose/foundation/layout/MutableWindowInsets;->()V HSPLandroidx/compose/foundation/layout/MutableWindowInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/MutableWindowInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/MutableWindowInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/MutableWindowInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/MutableWindowInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/MutableWindowInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/MutableWindowInsets;->getTop(Landroidx/compose/ui/unit/Density;)I PLandroidx/compose/foundation/layout/MutableWindowInsets;->getTop(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/MutableWindowInsets;->setInsets(Landroidx/compose/foundation/layout/WindowInsets;)V HPLandroidx/compose/foundation/layout/MutableWindowInsets;->setInsets(Landroidx/compose/foundation/layout/WindowInsets;)V Landroidx/compose/foundation/layout/OffsetKt; HSPLandroidx/compose/foundation/layout/OffsetKt;->()V PLandroidx/compose/foundation/layout/OffsetKt;->()V HSPLandroidx/compose/foundation/layout/OffsetKt;->PaddingValues-YgX7TsA$default(FFI)Landroidx/compose/foundation/layout/PaddingValuesImpl; PLandroidx/compose/foundation/layout/OffsetKt;->PaddingValues-YgX7TsA$default(FFI)Landroidx/compose/foundation/layout/PaddingValuesImpl; HSPLandroidx/compose/foundation/layout/OffsetKt;->PaddingValues-a9UjIt4$default(FFFFI)Landroidx/compose/foundation/layout/PaddingValuesImpl; PLandroidx/compose/foundation/layout/OffsetKt;->PaddingValues-a9UjIt4$default(FFFFI)Landroidx/compose/foundation/layout/PaddingValuesImpl; HSPLandroidx/compose/foundation/layout/OffsetKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/foundation/layout/OffsetKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/foundation/layout/OffsetKt;->WindowInsets$default(II)Landroidx/compose/foundation/layout/WindowInsets; PLandroidx/compose/foundation/layout/OffsetKt;->WindowInsets$default(II)Landroidx/compose/foundation/layout/WindowInsets; HSPLandroidx/compose/foundation/layout/OffsetKt;->access$getHorizontal$cp()I PLandroidx/compose/foundation/layout/OffsetKt;->access$getHorizontal$cp()I HSPLandroidx/compose/foundation/layout/OffsetKt;->asPaddingValues(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;)Landroidx/compose/foundation/layout/PaddingValues; PLandroidx/compose/foundation/layout/OffsetKt;->asPaddingValues(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;)Landroidx/compose/foundation/layout/PaddingValues; HSPLandroidx/compose/foundation/layout/OffsetKt;->calculateEndPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F PLandroidx/compose/foundation/layout/OffsetKt;->calculateEndPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F HSPLandroidx/compose/foundation/layout/OffsetKt;->calculateStartPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F PLandroidx/compose/foundation/layout/OffsetKt;->calculateStartPadding(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/unit/LayoutDirection;)F HSPLandroidx/compose/foundation/layout/OffsetKt;->constructor-impl(JI)J HPLandroidx/compose/foundation/layout/OffsetKt;->constructor-impl(JI)J HSPLandroidx/compose/foundation/layout/OffsetKt;->copy-yUG9Ft0$default(JIII)J HPLandroidx/compose/foundation/layout/OffsetKt;->copy-yUG9Ft0$default(JIII)J HSPLandroidx/compose/foundation/layout/OffsetKt;->exclude(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/foundation/layout/WindowInsets; PLandroidx/compose/foundation/layout/OffsetKt;->exclude(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/foundation/layout/WindowInsets; HSPLandroidx/compose/foundation/layout/OffsetKt;->getNavigationBars(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/AndroidWindowInsets; PLandroidx/compose/foundation/layout/OffsetKt;->getNavigationBars(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/OffsetKt;->getSystemBars(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/AndroidWindowInsets; HPLandroidx/compose/foundation/layout/OffsetKt;->getSystemBars(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/OffsetKt;->offset(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/OffsetKt;->offset(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->only-bOOhFvg(Landroidx/compose/foundation/layout/AndroidWindowInsets;I)Landroidx/compose/foundation/layout/WindowInsets; PLandroidx/compose/foundation/layout/OffsetKt;->only-bOOhFvg(Landroidx/compose/foundation/layout/AndroidWindowInsets;I)Landroidx/compose/foundation/layout/WindowInsets; HSPLandroidx/compose/foundation/layout/OffsetKt;->padding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/OffsetKt;->padding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->padding-VpY3zN4$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/OffsetKt;->padding-VpY3zN4$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->padding-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/OffsetKt;->padding-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->padding-qDBjuR0$default(Landroidx/compose/ui/Modifier;FFFFI)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/OffsetKt;->padding-qDBjuR0$default(Landroidx/compose/ui/Modifier;FFFFI)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->padding-qDBjuR0(Landroidx/compose/ui/Modifier;FFFF)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/OffsetKt;->padding-qDBjuR0(Landroidx/compose/ui/Modifier;FFFF)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->paddingFrom-4j6BHR0$default(Landroidx/compose/ui/Modifier$Companion;Landroidx/compose/ui/layout/HorizontalAlignmentLine;FFI)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/OffsetKt;->paddingFrom-4j6BHR0$default(Landroidx/compose/ui/Modifier$Companion;Landroidx/compose/ui/layout/HorizontalAlignmentLine;FFI)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->paddingFromBaseline-VpY3zN4$default(Landroidx/compose/ui/Modifier$Companion;F)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/OffsetKt;->paddingFromBaseline-VpY3zN4$default(Landroidx/compose/ui/Modifier$Companion;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->paddingFromBaseline-VpY3zN4(Landroidx/compose/ui/Modifier$Companion;FF)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/OffsetKt;->paddingFromBaseline-VpY3zN4(Landroidx/compose/ui/Modifier$Companion;FF)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/OffsetKt;->toBoxConstraints-OenEA2s(JI)J HPLandroidx/compose/foundation/layout/OffsetKt;->toBoxConstraints-OenEA2s(JI)J HSPLandroidx/compose/foundation/layout/OffsetKt;->toInsetsValues(Landroidx/core/graphics/Insets;)Landroidx/compose/foundation/layout/InsetsValues; PLandroidx/compose/foundation/layout/OffsetKt;->toInsetsValues(Landroidx/core/graphics/Insets;)Landroidx/compose/foundation/layout/InsetsValues; Landroidx/compose/foundation/layout/OffsetKt$offset$1; HSPLandroidx/compose/foundation/layout/OffsetKt$offset$1;->(FFI)V HPLandroidx/compose/foundation/layout/OffsetKt$offset$1;->(FFI)V Landroidx/compose/foundation/layout/OffsetKt$offset$2; HSPLandroidx/compose/foundation/layout/OffsetKt$offset$2;->(ILkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/layout/OffsetKt$offset$2;->(ILkotlin/jvm/functions/Function1;)V Landroidx/compose/foundation/layout/OffsetNode$measure$1; HSPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->(Landroidx/compose/foundation/layout/OffsetPxNode;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Placeable;)V PLandroidx/compose/foundation/layout/OffsetNode$measure$1;->(Landroidx/compose/foundation/layout/OffsetPxNode;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/foundation/layout/PaddingValuesModifier;)V PLandroidx/compose/foundation/layout/OffsetNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/foundation/layout/PaddingValuesModifier;)V HSPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/ui/layout/MeasureScope;I)V HPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/ui/layout/MeasureScope;I)V HSPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/OffsetNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/OffsetPxElement; HSPLandroidx/compose/foundation/layout/OffsetPxElement;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)V PLandroidx/compose/foundation/layout/OffsetPxElement;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)V HSPLandroidx/compose/foundation/layout/OffsetPxElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/layout/OffsetPxElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/foundation/layout/OffsetPxNode; HSPLandroidx/compose/foundation/layout/OffsetPxNode;->(ZLkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/layout/OffsetPxNode;->(ZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/layout/OffsetPxNode;->getOffset()Lkotlin/jvm/functions/Function1; PLandroidx/compose/foundation/layout/OffsetPxNode;->getOffset()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/foundation/layout/OffsetPxNode;->getRtlAware()Z PLandroidx/compose/foundation/layout/OffsetPxNode;->getRtlAware()Z HSPLandroidx/compose/foundation/layout/OffsetPxNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; PLandroidx/compose/foundation/layout/OffsetPxNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/PaddingElement; HSPLandroidx/compose/foundation/layout/PaddingElement;->(FFFFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/foundation/layout/PaddingElement;->(FFFFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/layout/PaddingElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/layout/PaddingElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/PaddingElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/PaddingElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/PaddingKt$padding$1; HSPLandroidx/compose/foundation/layout/PaddingKt$padding$1;->(FFFF)V HPLandroidx/compose/foundation/layout/PaddingKt$padding$1;->(FFFF)V Landroidx/compose/foundation/layout/PaddingNode; HSPLandroidx/compose/foundation/layout/PaddingNode;->(FFFFZ)V HPLandroidx/compose/foundation/layout/PaddingNode;->(FFFFZ)V HSPLandroidx/compose/foundation/layout/PaddingNode;->getRtlAware()Z PLandroidx/compose/foundation/layout/PaddingNode;->getRtlAware()Z HSPLandroidx/compose/foundation/layout/PaddingNode;->getStart-D9Ej5fM()F PLandroidx/compose/foundation/layout/PaddingNode;->getStart-D9Ej5fM()F HSPLandroidx/compose/foundation/layout/PaddingNode;->getTop-D9Ej5fM()F PLandroidx/compose/foundation/layout/PaddingNode;->getTop-D9Ej5fM()F HSPLandroidx/compose/foundation/layout/PaddingNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/PaddingNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/PaddingValues; Landroidx/compose/foundation/layout/PaddingValuesConsumingModifier; HSPLandroidx/compose/foundation/layout/PaddingValuesConsumingModifier;->(Landroidx/compose/foundation/layout/PaddingValues;)V PLandroidx/compose/foundation/layout/PaddingValuesConsumingModifier;->(Landroidx/compose/foundation/layout/PaddingValues;)V HSPLandroidx/compose/foundation/layout/PaddingValuesConsumingModifier;->calculateInsets(Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/foundation/layout/WindowInsets; PLandroidx/compose/foundation/layout/PaddingValuesConsumingModifier;->calculateInsets(Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/foundation/layout/WindowInsets; HSPLandroidx/compose/foundation/layout/PaddingValuesConsumingModifier;->equals(Ljava/lang/Object;)Z PLandroidx/compose/foundation/layout/PaddingValuesConsumingModifier;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/PaddingValuesElement; HSPLandroidx/compose/foundation/layout/PaddingValuesElement;->(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/layout/BoxScopeInstance$align$$inlined$debugInspectorInfo$1;)V HPLandroidx/compose/foundation/layout/PaddingValuesElement;->(Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/layout/BoxScopeInstance$align$$inlined$debugInspectorInfo$1;)V HSPLandroidx/compose/foundation/layout/PaddingValuesElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/layout/PaddingValuesElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/PaddingValuesElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/PaddingValuesElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/PaddingValuesImpl; HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->(FFFF)V HPLandroidx/compose/foundation/layout/PaddingValuesImpl;->(FFFF)V HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateBottomPadding-D9Ej5fM()F PLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateBottomPadding-D9Ej5fM()F HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F PLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateLeftPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F PLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateRightPadding-u2uoSUM(Landroidx/compose/ui/unit/LayoutDirection;)F HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateTopPadding-D9Ej5fM()F PLandroidx/compose/foundation/layout/PaddingValuesImpl;->calculateTopPadding-D9Ej5fM()F HSPLandroidx/compose/foundation/layout/PaddingValuesImpl;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/PaddingValuesImpl;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/PaddingValuesInsets; HSPLandroidx/compose/foundation/layout/PaddingValuesInsets;->(Landroidx/compose/foundation/layout/PaddingValues;)V PLandroidx/compose/foundation/layout/PaddingValuesInsets;->(Landroidx/compose/foundation/layout/PaddingValues;)V PLandroidx/compose/foundation/layout/PaddingValuesInsets;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getBottom(Landroidx/compose/ui/unit/Density;)I HSPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getLeft(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getRight(Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getTop(Landroidx/compose/ui/unit/Density;)I HPLandroidx/compose/foundation/layout/PaddingValuesInsets;->getTop(Landroidx/compose/ui/unit/Density;)I Landroidx/compose/foundation/layout/PaddingValuesModifier; HSPLandroidx/compose/foundation/layout/PaddingValuesModifier;->(Landroidx/compose/foundation/layout/PaddingValues;)V PLandroidx/compose/foundation/layout/PaddingValuesModifier;->(Landroidx/compose/foundation/layout/PaddingValues;)V HSPLandroidx/compose/foundation/layout/PaddingValuesModifier;->getPaddingValues()Landroidx/compose/foundation/layout/PaddingValues; PLandroidx/compose/foundation/layout/PaddingValuesModifier;->getPaddingValues()Landroidx/compose/foundation/layout/PaddingValues; HSPLandroidx/compose/foundation/layout/PaddingValuesModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/PaddingValuesModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/RowColumnImplKt; HSPLandroidx/compose/foundation/layout/RowColumnImplKt;->getRowColumnParentData(Landroidx/compose/ui/layout/IntrinsicMeasurable;)Landroidx/compose/foundation/layout/RowColumnParentData; PLandroidx/compose/foundation/layout/RowColumnImplKt;->getRowColumnParentData(Landroidx/compose/ui/layout/IntrinsicMeasurable;)Landroidx/compose/foundation/layout/RowColumnParentData; HSPLandroidx/compose/foundation/layout/RowColumnImplKt;->getWeight(Landroidx/compose/foundation/layout/RowColumnParentData;)F PLandroidx/compose/foundation/layout/RowColumnImplKt;->getWeight(Landroidx/compose/foundation/layout/RowColumnParentData;)F Landroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1; HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->(ILkotlin/jvm/functions/Function5;FLandroidx/compose/foundation/layout/OffsetKt;)V PLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->(ILkotlin/jvm/functions/Function5;FLandroidx/compose/foundation/layout/OffsetKt;)V HSPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/RowColumnImplKt$rowColumnMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult; HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->(IIII[I)V PLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->(IIII[I)V HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getCrossAxisSize()I PLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getCrossAxisSize()I HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getEndIndex()I PLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getEndIndex()I HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getMainAxisPositions()[I PLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getMainAxisPositions()[I HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getMainAxisSize()I PLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getMainAxisSize()I HSPLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getStartIndex()I PLandroidx/compose/foundation/layout/RowColumnMeasureHelperResult;->getStartIndex()I Landroidx/compose/foundation/layout/RowColumnMeasurementHelper; HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->(ILkotlin/jvm/functions/Function5;FILandroidx/compose/foundation/layout/OffsetKt;Ljava/util/List;[Landroidx/compose/ui/layout/Placeable;)V HPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->(ILkotlin/jvm/functions/Function5;FILandroidx/compose/foundation/layout/OffsetKt;Ljava/util/List;[Landroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->mainAxisSize(Landroidx/compose/ui/layout/Placeable;)I PLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->mainAxisSize(Landroidx/compose/ui/layout/Placeable;)I HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->measureWithoutPlacing-_EkL_-Y(Landroidx/compose/ui/layout/MeasureScope;JII)Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult; HPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->measureWithoutPlacing-_EkL_-Y(Landroidx/compose/ui/layout/MeasureScope;JII)Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult; HSPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->placeHelper(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult;ILandroidx/compose/ui/unit/LayoutDirection;)V HPLandroidx/compose/foundation/layout/RowColumnMeasurementHelper;->placeHelper(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/foundation/layout/RowColumnMeasureHelperResult;ILandroidx/compose/ui/unit/LayoutDirection;)V Landroidx/compose/foundation/layout/RowColumnParentData; HSPLandroidx/compose/foundation/layout/RowColumnParentData;->()V PLandroidx/compose/foundation/layout/RowColumnParentData;->()V HSPLandroidx/compose/foundation/layout/RowColumnParentData;->getCrossAxisAlignment()Landroidx/compose/foundation/layout/OffsetKt; PLandroidx/compose/foundation/layout/RowColumnParentData;->getCrossAxisAlignment()Landroidx/compose/foundation/layout/OffsetKt; HSPLandroidx/compose/foundation/layout/RowColumnParentData;->getFill()Z PLandroidx/compose/foundation/layout/RowColumnParentData;->getFill()Z HSPLandroidx/compose/foundation/layout/RowColumnParentData;->getWeight()F PLandroidx/compose/foundation/layout/RowColumnParentData;->getWeight()F HSPLandroidx/compose/foundation/layout/RowColumnParentData;->setFill(Z)V PLandroidx/compose/foundation/layout/RowColumnParentData;->setFill(Z)V HSPLandroidx/compose/foundation/layout/RowColumnParentData;->setWeight(F)V PLandroidx/compose/foundation/layout/RowColumnParentData;->setWeight(F)V Landroidx/compose/foundation/layout/RowKt; HSPLandroidx/compose/foundation/layout/RowKt;->()V PLandroidx/compose/foundation/layout/RowKt;->()V HSPLandroidx/compose/foundation/layout/RowKt;->rowMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/foundation/layout/RowKt;->rowMeasurePolicy(Landroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/layout/MeasurePolicy; Landroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1; HSPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->()V PLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->()V HSPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->(I)V PLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->(I)V HSPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->invoke(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->invoke(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HSPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/RowKt$DefaultRowMeasurePolicy$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1; HSPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->(Landroidx/compose/foundation/layout/Arrangement$Horizontal;I)V PLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->(Landroidx/compose/foundation/layout/Arrangement$Horizontal;I)V HSPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->invoke(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->invoke(ILandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;[I[I)V HSPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/RowKt$rowMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/RowScope; Landroidx/compose/foundation/layout/RowScopeInstance; HSPLandroidx/compose/foundation/layout/RowScopeInstance;->()V PLandroidx/compose/foundation/layout/RowScopeInstance;->()V HSPLandroidx/compose/foundation/layout/RowScopeInstance;->()V PLandroidx/compose/foundation/layout/RowScopeInstance;->()V HSPLandroidx/compose/foundation/layout/RowScopeInstance;->weight(Landroidx/compose/ui/Modifier;FZ)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/RowScopeInstance;->weight(Landroidx/compose/ui/Modifier;FZ)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/layout/SizeElement; HSPLandroidx/compose/foundation/layout/SizeElement;->(FFFFZLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/foundation/layout/SizeElement;->(FFFFZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/layout/SizeElement;->(FFFFZLkotlin/jvm/functions/Function1;I)V HPLandroidx/compose/foundation/layout/SizeElement;->(FFFFZLkotlin/jvm/functions/Function1;I)V HSPLandroidx/compose/foundation/layout/SizeElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/layout/SizeElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/SizeElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/SizeElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/SizeKt; HSPLandroidx/compose/foundation/layout/SizeKt;->()V PLandroidx/compose/foundation/layout/SizeKt;->()V HSPLandroidx/compose/foundation/layout/SizeKt;->defaultMinSize-VpY3zN4$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/SizeKt;->defaultMinSize-VpY3zN4$default(Landroidx/compose/ui/Modifier;FFI)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->defaultMinSize-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/SizeKt;->defaultMinSize-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->fillMaxSize$default(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/SizeKt;->fillMaxSize$default(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->fillMaxWidth(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/SizeKt;->fillMaxWidth(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->height-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->height-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->requiredSize-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->requiredSize-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->requiredSize-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->requiredSize-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->size-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->size-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->sizeIn-qDBjuR0$default(Landroidx/compose/ui/Modifier;FFFFI)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/SizeKt;->sizeIn-qDBjuR0$default(Landroidx/compose/ui/Modifier;FFFFI)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->width-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->width-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/SizeKt;->wrapContentSize$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/BiasAlignment;I)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/SizeKt;->wrapContentSize$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/BiasAlignment;I)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/layout/SizeNode; HSPLandroidx/compose/foundation/layout/SizeNode;->(FFFFZ)V HPLandroidx/compose/foundation/layout/SizeNode;->(FFFFZ)V HSPLandroidx/compose/foundation/layout/SizeNode;->getTargetConstraints-OenEA2s(Landroidx/compose/ui/unit/Density;)J HPLandroidx/compose/foundation/layout/SizeNode;->getTargetConstraints-OenEA2s(Landroidx/compose/ui/unit/Density;)J HSPLandroidx/compose/foundation/layout/SizeNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/SizeNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/SpacerMeasurePolicy; HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->()V PLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->()V HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->()V PLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->()V HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/SpacerMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1; HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->()V PLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->()V HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->(I)V PLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->(I)V HSPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/SpacerMeasurePolicy$measure$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/UnionInsets; HSPLandroidx/compose/foundation/layout/UnionInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V PLandroidx/compose/foundation/layout/UnionInsets;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V HSPLandroidx/compose/foundation/layout/UnionInsets;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/UnionInsets;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/UnspecifiedConstraintsElement; HSPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->(FF)V HPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->(FF)V HSPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/layout/UnspecifiedConstraintsElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/layout/UnspecifiedConstraintsNode; HSPLandroidx/compose/foundation/layout/UnspecifiedConstraintsNode;->(FF)V PLandroidx/compose/foundation/layout/UnspecifiedConstraintsNode;->(FF)V HSPLandroidx/compose/foundation/layout/UnspecifiedConstraintsNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/UnspecifiedConstraintsNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/ValueInsets; HSPLandroidx/compose/foundation/layout/ValueInsets;->(Landroidx/compose/foundation/layout/InsetsValues;Ljava/lang/String;)V HPLandroidx/compose/foundation/layout/ValueInsets;->(Landroidx/compose/foundation/layout/InsetsValues;Ljava/lang/String;)V HSPLandroidx/compose/foundation/layout/ValueInsets;->setValue$foundation_layout_release(Landroidx/compose/foundation/layout/InsetsValues;)V HPLandroidx/compose/foundation/layout/ValueInsets;->setValue$foundation_layout_release(Landroidx/compose/foundation/layout/InsetsValues;)V Landroidx/compose/foundation/layout/WindowInsets; HSPLandroidx/compose/foundation/layout/WindowInsets;->()V PLandroidx/compose/foundation/layout/WindowInsets;->()V Landroidx/compose/foundation/layout/WindowInsetsHolder; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->()V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->()V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->(Landroid/view/View;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->(Landroid/view/View;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->access$getViewMap$cp()Ljava/util/WeakHashMap; PLandroidx/compose/foundation/layout/WindowInsetsHolder;->access$getViewMap$cp()Ljava/util/WeakHashMap; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->decrementAccessors(Landroid/view/View;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->decrementAccessors(Landroid/view/View;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->getConsumes()Z PLandroidx/compose/foundation/layout/WindowInsetsHolder;->getConsumes()Z HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->getNavigationBars()Landroidx/compose/foundation/layout/AndroidWindowInsets; PLandroidx/compose/foundation/layout/WindowInsetsHolder;->getNavigationBars()Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->getStatusBars()Landroidx/compose/foundation/layout/AndroidWindowInsets; PLandroidx/compose/foundation/layout/WindowInsetsHolder;->getStatusBars()Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->getSystemBars()Landroidx/compose/foundation/layout/AndroidWindowInsets; PLandroidx/compose/foundation/layout/WindowInsetsHolder;->getSystemBars()Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->incrementAccessors(Landroid/view/View;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->incrementAccessors(Landroid/view/View;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->update$default(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->update$default(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroidx/core/view/WindowInsetsCompat;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->updateImeAnimationSource(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->updateImeAnimationSource(Landroidx/core/view/WindowInsetsCompat;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder;->updateImeAnimationTarget(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder;->updateImeAnimationTarget(Landroidx/core/view/WindowInsetsCompat;)V Landroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroid/view/View;)V PLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroid/view/View;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroid/view/View;)V HPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/foundation/layout/WindowInsetsHolder;Landroid/view/View;)V HSPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/foundation/layout/WindowInsetsHolder$Companion$current$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/foundation/layout/WindowInsetsPaddingKt; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->()V PLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->()V HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->consumeWindowInsets(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->consumeWindowInsets(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->getModifierLocalConsumedWindowInsets()Landroidx/compose/ui/modifier/ProvidableModifierLocal; PLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->getModifierLocalConsumedWindowInsets()Landroidx/compose/ui/modifier/ProvidableModifierLocal; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->onConsumedWindowInsetsChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->onConsumedWindowInsetsChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->windowInsetsPadding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt;->windowInsetsPadding(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/WindowInsets;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->()V PLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->()V HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->()V PLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->()V HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$ModifierLocalConsumedWindowInsets$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2;->(Landroidx/compose/foundation/layout/WindowInsets;I)V HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2;->(Landroidx/compose/foundation/layout/WindowInsets;I)V HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2;->invoke(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2;->invoke(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4;->invoke(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4;->invoke(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/layout/WindowInsetsPaddingKt$consumeWindowInsets$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/layout/WrapContentElement; HSPLandroidx/compose/foundation/layout/WrapContentElement;->(IZLkotlin/jvm/functions/Function2;Ljava/lang/Object;)V PLandroidx/compose/foundation/layout/WrapContentElement;->(IZLkotlin/jvm/functions/Function2;Ljava/lang/Object;)V HSPLandroidx/compose/foundation/layout/WrapContentElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/foundation/layout/WrapContentElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/foundation/layout/WrapContentNode; HSPLandroidx/compose/foundation/layout/WrapContentNode;->(IZLkotlin/jvm/functions/Function2;)V PLandroidx/compose/foundation/layout/WrapContentNode;->(IZLkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/foundation/layout/WrapContentNode;->getAlignmentCallback()Lkotlin/jvm/functions/Function2; PLandroidx/compose/foundation/layout/WrapContentNode;->getAlignmentCallback()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/foundation/layout/WrapContentNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/layout/WrapContentNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/layout/WrapContentNode$measure$1; HSPLandroidx/compose/foundation/layout/WrapContentNode$measure$1;->(Landroidx/compose/foundation/layout/WrapContentNode;ILandroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/MeasureScope;)V PLandroidx/compose/foundation/layout/WrapContentNode$measure$1;->(Landroidx/compose/foundation/layout/WrapContentNode;ILandroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/MeasureScope;)V HSPLandroidx/compose/foundation/layout/WrapContentNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/layout/WrapContentNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo; HSPLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V PLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V HSPLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V PLandroidx/compose/foundation/lazy/EmptyLazyListLayoutInfo;->()V Landroidx/compose/foundation/lazy/LazyDslKt; HSPLandroidx/compose/foundation/lazy/LazyDslKt;->LazyColumn(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/gestures/FlingBehavior;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/foundation/lazy/LazyDslKt;->LazyColumn(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/gestures/FlingBehavior;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/foundation/lazy/LazyDslKt;->LazyList(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZZLandroidx/compose/foundation/gestures/FlingBehavior;ZILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V HPLandroidx/compose/foundation/lazy/LazyDslKt;->LazyList(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZZLandroidx/compose/foundation/gestures/FlingBehavior;ZILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V HSPLandroidx/compose/foundation/lazy/LazyDslKt;->ScrollPositionUpdater(ILandroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/foundation/lazy/LazyDslKt;->ScrollPositionUpdater(ILandroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function0;)V Landroidx/compose/foundation/lazy/LazyItemScopeImpl; HSPLandroidx/compose/foundation/lazy/LazyItemScopeImpl;->()V PLandroidx/compose/foundation/lazy/LazyItemScopeImpl;->()V HSPLandroidx/compose/foundation/lazy/LazyItemScopeImpl;->setMaxSize(II)V HPLandroidx/compose/foundation/lazy/LazyItemScopeImpl;->setMaxSize(II)V Landroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1; HSPLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->(Landroidx/compose/foundation/lazy/LazyListState;Z)V PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->(Landroidx/compose/foundation/lazy/LazyListState;Z)V HSPLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo; PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->collectionInfo()Landroidx/compose/ui/semantics/CollectionInfo; PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->getCanScrollForward()Z PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->getFirstVisibleItemIndex()I PLandroidx/compose/foundation/lazy/LazyLayoutSemanticStateKt$LazyLayoutSemanticState$1;->getFirstVisibleItemScrollOffset()I Landroidx/compose/foundation/lazy/LazyListAnimateScrollScope; HSPLandroidx/compose/foundation/lazy/LazyListAnimateScrollScope;->(Landroidx/compose/foundation/lazy/LazyListState;)V PLandroidx/compose/foundation/lazy/LazyListAnimateScrollScope;->(Landroidx/compose/foundation/lazy/LazyListState;)V Landroidx/compose/foundation/lazy/LazyListBeyondBoundsState; HSPLandroidx/compose/foundation/lazy/LazyListBeyondBoundsState;->(Landroidx/compose/foundation/lazy/LazyListState;I)V PLandroidx/compose/foundation/lazy/LazyListBeyondBoundsState;->(Landroidx/compose/foundation/lazy/LazyListState;I)V Landroidx/compose/foundation/lazy/LazyListInterval; HSPLandroidx/compose/foundation/lazy/LazyListInterval;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/foundation/lazy/LazyListInterval;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/foundation/lazy/LazyListInterval;->getItem()Lkotlin/jvm/functions/Function4; PLandroidx/compose/foundation/lazy/LazyListInterval;->getItem()Lkotlin/jvm/functions/Function4; HSPLandroidx/compose/foundation/lazy/LazyListInterval;->getKey()Lkotlin/jvm/functions/Function1; PLandroidx/compose/foundation/lazy/LazyListInterval;->getKey()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/foundation/lazy/LazyListInterval;->getType()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/foundation/lazy/LazyListInterval;->getType()Lkotlin/jvm/functions/Function1; Landroidx/compose/foundation/lazy/LazyListIntervalContent; HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/foundation/lazy/LazyListIntervalContent;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getHeaderIndexes()Ljava/util/List; PLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getHeaderIndexes()Ljava/util/List; HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getIntervals$1()Landroidx/compose/foundation/lazy/layout/MutableIntervalList; HPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->getIntervals$1()Landroidx/compose/foundation/lazy/layout/MutableIntervalList; HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->item(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/foundation/lazy/LazyListIntervalContent;->item(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLandroidx/compose/foundation/lazy/LazyListIntervalContent;->items(ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V Landroidx/compose/foundation/lazy/LazyListIntervalContent$item$1; HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListIntervalContent$item$3; HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$3;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$3;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListIntervalContent$item$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListItemInfo; Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator; HSPLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->()V HPLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->()V HSPLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->onMeasured(IIILjava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;ZZZ)V HPLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->onMeasured(IIILjava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;ZZZ)V HSPLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->reset()V PLandroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;->reset()V Landroidx/compose/foundation/lazy/LazyListItemProvider; Landroidx/compose/foundation/lazy/LazyListItemProviderImpl; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListIntervalContent;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)V HPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListIntervalContent;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)V HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->Item(ILjava/lang/Object;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->Item(ILjava/lang/Object;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->access$getIntervalContent$p(Landroidx/compose/foundation/lazy/LazyListItemProviderImpl;)Landroidx/compose/foundation/lazy/LazyListIntervalContent; PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->access$getIntervalContent$p(Landroidx/compose/foundation/lazy/LazyListItemProviderImpl;)Landroidx/compose/foundation/lazy/LazyListIntervalContent; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getContentType(I)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getContentType(I)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getHeaderIndexes()Ljava/util/List; PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getHeaderIndexes()Ljava/util/List; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemCount()I PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemCount()I HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemScope()Landroidx/compose/foundation/lazy/LazyItemScopeImpl; PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getItemScope()Landroidx/compose/foundation/lazy/LazyItemScopeImpl; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKey(I)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl;->getKey(I)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListItemProviderImpl$Item$1; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$Item$1;->(Landroidx/compose/foundation/lazy/LazyListItemProviderImpl;I)V PLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$Item$1;->(Landroidx/compose/foundation/lazy/LazyListItemProviderImpl;I)V HSPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$Item$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListItemProviderImpl$Item$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$1; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$1;->(Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$1;->(Ljava/lang/Object;)V HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$1;->get()Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$1;->get()Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1;->(Landroidx/compose/runtime/MutableState;)V PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1;->(Landroidx/compose/runtime/MutableState;)V HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$intervalContentState$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$itemProviderState$1; HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$itemProviderState$1;->(Landroidx/compose/runtime/State;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V PLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$itemProviderState$1;->(Landroidx/compose/runtime/State;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyItemScopeImpl;)V HSPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$itemProviderState$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListItemProviderKt$rememberLazyListItemProviderLambda$1$itemProviderState$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1; HSPLandroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1;->(ILandroidx/compose/foundation/lazy/LazyListState;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/foundation/lazy/LazyListKt$ScrollPositionUpdater$1;->(ILandroidx/compose/foundation/lazy/LazyListState;Lkotlin/jvm/functions/Function0;)V Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1; HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->(Landroidx/compose/foundation/lazy/LazyListState;ZLandroidx/compose/foundation/layout/PaddingValues;ZLkotlin/reflect/KProperty0;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;ILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;)V PLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->(Landroidx/compose/foundation/lazy/LazyListState;ZLandroidx/compose/foundation/layout/PaddingValues;ZLkotlin/reflect/KProperty0;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;ILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;)V HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2; HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;JII)V HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;JII)V HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1; HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->(JZLandroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;IILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;ZIIJ)V HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->(JZLandroidx/compose/foundation/lazy/LazyListItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;IILandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;ZIIJ)V HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->getAndMeasure(I)Landroidx/compose/foundation/lazy/LazyListMeasuredItem; HPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->getAndMeasure(I)Landroidx/compose/foundation/lazy/LazyListMeasuredItem; HSPLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->getChildConstraints-msEJaDk()J PLandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;->getChildConstraints-msEJaDk()J Landroidx/compose/foundation/lazy/LazyListLayoutInfo; Landroidx/compose/foundation/lazy/LazyListMeasureKt; HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt;->measureLazyList-qnDatfE(ILandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;IIIIIIFJZLjava/util/List;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;ZLandroidx/compose/ui/unit/Density;Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;ILjava/util/List;ZZLandroidx/compose/foundation/lazy/LazyListMeasureResult;Lkotlin/jvm/functions/Function3;)Landroidx/compose/foundation/lazy/LazyListMeasureResult; HPLandroidx/compose/foundation/lazy/LazyListMeasureKt;->measureLazyList-qnDatfE(ILandroidx/compose/foundation/lazy/LazyListKt$rememberLazyListMeasurePolicy$1$1$measuredItemProvider$1;IIIIIIFJZLjava/util/List;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;ZLandroidx/compose/ui/unit/Density;Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator;ILjava/util/List;ZZLandroidx/compose/foundation/lazy/LazyListMeasureResult;Lkotlin/jvm/functions/Function3;)Landroidx/compose/foundation/lazy/LazyListMeasureResult; Landroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$8; HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$8;->(Ljava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListMeasuredItem;Z)V HPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$8;->(Ljava/util/ArrayList;Landroidx/compose/foundation/lazy/LazyListMeasuredItem;Z)V HSPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListMeasureKt$measureLazyList$8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListMeasureResult; HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->(Landroidx/compose/foundation/lazy/LazyListMeasuredItem;IZFLandroidx/compose/ui/layout/MeasureResult;FLjava/util/List;IIILandroidx/compose/foundation/gestures/Orientation;II)V HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->(Landroidx/compose/foundation/lazy/LazyListMeasuredItem;IZFLandroidx/compose/ui/layout/MeasureResult;FLjava/util/List;IIILandroidx/compose/foundation/gestures/Orientation;II)V HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAfterContentPadding()I PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAfterContentPadding()I HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAlignmentLines()Ljava/util/Map; HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getAlignmentLines()Ljava/util/Map; HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getBeforeContentPadding()I HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getBeforeContentPadding()I HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getCanScrollForward()Z PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getCanScrollForward()Z HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getConsumedScroll()F PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getConsumedScroll()F HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getFirstVisibleItem()Landroidx/compose/foundation/lazy/LazyListMeasuredItem; PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getFirstVisibleItem()Landroidx/compose/foundation/lazy/LazyListMeasuredItem; HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getFirstVisibleItemScrollOffset()I PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getFirstVisibleItemScrollOffset()I HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getHeight()I HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getHeight()I HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getTotalItemsCount()I HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getTotalItemsCount()I HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getViewportSize-YbymL2g()J PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getViewportSize-YbymL2g()J HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getVisibleItemsInfo()Ljava/util/List; PLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getVisibleItemsInfo()Ljava/util/List; HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getWidth()I HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->getWidth()I HSPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->placeChildren()V HPLandroidx/compose/foundation/lazy/LazyListMeasureResult;->placeChildren()V Landroidx/compose/foundation/lazy/LazyListMeasuredItem; HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->(ILjava/util/List;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/ui/unit/LayoutDirection;ZIIIJLjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->(ILjava/util/List;ZLandroidx/compose/ui/Alignment$Horizontal;Landroidx/compose/ui/Alignment$Vertical;Landroidx/compose/ui/unit/LayoutDirection;ZIIIJLjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getCrossAxisSize()I HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getCrossAxisSize()I HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getIndex()I HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getIndex()I HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getKey()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getKey()Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getOffset()I PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getOffset()I HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getOffset-Bjo55l4(I)J PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getOffset-Bjo55l4(I)J HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getParentData(I)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getParentData(I)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getPlaceablesCount()I HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getPlaceablesCount()I HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getSize()I PLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getSize()I HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getSizeWithSpacings()I HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->getSizeWithSpacings()I HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->place(Landroidx/compose/ui/layout/Placeable$PlacementScope;Z)V HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->place(Landroidx/compose/ui/layout/Placeable$PlacementScope;Z)V HSPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->position(III)V HPLandroidx/compose/foundation/lazy/LazyListMeasuredItem;->position(III)V Landroidx/compose/foundation/lazy/LazyListScope; HSPLandroidx/compose/foundation/lazy/LazyListScope;->item$default(Landroidx/compose/foundation/lazy/LazyListScope;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V HPLandroidx/compose/foundation/lazy/LazyListScope;->item$default(Landroidx/compose/foundation/lazy/LazyListScope;Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;I)V Landroidx/compose/foundation/lazy/LazyListScope$items$1; HSPLandroidx/compose/foundation/lazy/LazyListScope$items$1;->()V PLandroidx/compose/foundation/lazy/LazyListScope$items$1;->()V HSPLandroidx/compose/foundation/lazy/LazyListScope$items$1;->(I)V PLandroidx/compose/foundation/lazy/LazyListScope$items$1;->(I)V Landroidx/compose/foundation/lazy/LazyListScrollPosition; HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->(III)V PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->(III)V HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->getIndex()I HPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->getIndex()I HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->getNearestRangeState()Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState; PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->getNearestRangeState()Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState; HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->getScrollOffset()I HPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->getScrollOffset()I HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->update(II)V HPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->update(II)V HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->updateFromMeasureResult(Landroidx/compose/foundation/lazy/LazyListMeasureResult;)V PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->updateFromMeasureResult(Landroidx/compose/foundation/lazy/LazyListMeasureResult;)V HSPLandroidx/compose/foundation/lazy/LazyListScrollPosition;->updateScrollPositionIfTheFirstItemWasMoved(Landroidx/compose/foundation/lazy/LazyListItemProvider;I)I PLandroidx/compose/foundation/lazy/LazyListScrollPosition;->updateScrollPositionIfTheFirstItemWasMoved(Landroidx/compose/foundation/lazy/LazyListItemProvider;I)I Landroidx/compose/foundation/lazy/LazyListState; HSPLandroidx/compose/foundation/lazy/LazyListState;->()V PLandroidx/compose/foundation/lazy/LazyListState;->()V HSPLandroidx/compose/foundation/lazy/LazyListState;->(II)V HPLandroidx/compose/foundation/lazy/LazyListState;->(II)V HSPLandroidx/compose/foundation/lazy/LazyListState;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/foundation/lazy/LazyListState;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/foundation/lazy/LazyListState;->access$setRemeasurement$p(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/foundation/lazy/LazyListState;->access$setRemeasurement$p(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/foundation/lazy/LazyListState;->applyMeasureResult$foundation_release(Landroidx/compose/foundation/lazy/LazyListMeasureResult;Z)V HPLandroidx/compose/foundation/lazy/LazyListState;->applyMeasureResult$foundation_release(Landroidx/compose/foundation/lazy/LazyListMeasureResult;Z)V HSPLandroidx/compose/foundation/lazy/LazyListState;->getAwaitLayoutModifier$foundation_release()Landroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier; PLandroidx/compose/foundation/lazy/LazyListState;->getAwaitLayoutModifier$foundation_release()Landroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier; HSPLandroidx/compose/foundation/lazy/LazyListState;->getBeyondBoundsInfo$foundation_release()Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo; PLandroidx/compose/foundation/lazy/LazyListState;->getBeyondBoundsInfo$foundation_release()Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo; PLandroidx/compose/foundation/lazy/LazyListState;->getCanScrollForward()Z HSPLandroidx/compose/foundation/lazy/LazyListState;->getFirstVisibleItemIndex()I PLandroidx/compose/foundation/lazy/LazyListState;->getFirstVisibleItemIndex()I HSPLandroidx/compose/foundation/lazy/LazyListState;->getFirstVisibleItemScrollOffset()I PLandroidx/compose/foundation/lazy/LazyListState;->getFirstVisibleItemScrollOffset()I HSPLandroidx/compose/foundation/lazy/LazyListState;->getHasLookaheadPassOccurred$foundation_release()Z PLandroidx/compose/foundation/lazy/LazyListState;->getHasLookaheadPassOccurred$foundation_release()Z HSPLandroidx/compose/foundation/lazy/LazyListState;->getInternalInteractionSource$foundation_release()Landroidx/compose/foundation/interaction/MutableInteractionSource; PLandroidx/compose/foundation/lazy/LazyListState;->getInternalInteractionSource$foundation_release()Landroidx/compose/foundation/interaction/MutableInteractionSource; HSPLandroidx/compose/foundation/lazy/LazyListState;->getLayoutInfo()Landroidx/compose/foundation/lazy/LazyListLayoutInfo; PLandroidx/compose/foundation/lazy/LazyListState;->getLayoutInfo()Landroidx/compose/foundation/lazy/LazyListLayoutInfo; HSPLandroidx/compose/foundation/lazy/LazyListState;->getNearestRange$foundation_release()Lkotlin/ranges/IntRange; PLandroidx/compose/foundation/lazy/LazyListState;->getNearestRange$foundation_release()Lkotlin/ranges/IntRange; HSPLandroidx/compose/foundation/lazy/LazyListState;->getPinnedItems$foundation_release()Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList; PLandroidx/compose/foundation/lazy/LazyListState;->getPinnedItems$foundation_release()Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList; HSPLandroidx/compose/foundation/lazy/LazyListState;->getPlacementAnimator$foundation_release()Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator; PLandroidx/compose/foundation/lazy/LazyListState;->getPlacementAnimator$foundation_release()Landroidx/compose/foundation/lazy/LazyListItemPlacementAnimator; HSPLandroidx/compose/foundation/lazy/LazyListState;->getPostLookaheadLayoutInfo$foundation_release()Landroidx/compose/foundation/lazy/LazyListMeasureResult; PLandroidx/compose/foundation/lazy/LazyListState;->getPostLookaheadLayoutInfo$foundation_release()Landroidx/compose/foundation/lazy/LazyListMeasureResult; HSPLandroidx/compose/foundation/lazy/LazyListState;->getPrefetchState$foundation_release()Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState; PLandroidx/compose/foundation/lazy/LazyListState;->getPrefetchState$foundation_release()Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState; HSPLandroidx/compose/foundation/lazy/LazyListState;->getRemeasurementModifier$foundation_release()Landroidx/compose/ui/layout/RemeasurementModifier; PLandroidx/compose/foundation/lazy/LazyListState;->getRemeasurementModifier$foundation_release()Landroidx/compose/ui/layout/RemeasurementModifier; HSPLandroidx/compose/foundation/lazy/LazyListState;->getScrollToBeConsumed$foundation_release()F PLandroidx/compose/foundation/lazy/LazyListState;->getScrollToBeConsumed$foundation_release()F PLandroidx/compose/foundation/lazy/LazyListState;->isScrollInProgress()Z HSPLandroidx/compose/foundation/lazy/LazyListState;->setCoroutineScope$foundation_release(Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/foundation/lazy/LazyListState;->setCoroutineScope$foundation_release(Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/foundation/lazy/LazyListState;->setDensity$foundation_release(Landroidx/compose/ui/unit/Density;)V PLandroidx/compose/foundation/lazy/LazyListState;->setDensity$foundation_release(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/foundation/lazy/LazyListState;->setPremeasureConstraints-BRTryo0$foundation_release(J)V PLandroidx/compose/foundation/lazy/LazyListState;->setPremeasureConstraints-BRTryo0$foundation_release(J)V HSPLandroidx/compose/foundation/lazy/LazyListState;->updateScrollPositionIfTheFirstItemWasMoved$foundation_release$default(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListItemProvider;)V HPLandroidx/compose/foundation/lazy/LazyListState;->updateScrollPositionIfTheFirstItemWasMoved$foundation_release$default(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/lazy/LazyListItemProvider;)V HSPLandroidx/compose/foundation/lazy/LazyListState;->updateScrollPositionIfTheFirstItemWasMoved$foundation_release(Landroidx/compose/foundation/lazy/LazyListItemProvider;I)I PLandroidx/compose/foundation/lazy/LazyListState;->updateScrollPositionIfTheFirstItemWasMoved$foundation_release(Landroidx/compose/foundation/lazy/LazyListItemProvider;I)I Landroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1; HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V PLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->()V HSPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/LazyListState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1; HSPLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V PLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->(Landroidx/compose/foundation/lazy/LazyListState;)V HSPLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->onRemeasurementAvailable(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/foundation/lazy/LazyListState$remeasurementModifier$1;->onRemeasurementAvailable(Landroidx/compose/ui/node/LayoutNode;)V Landroidx/compose/foundation/lazy/LazyListStateKt; HSPLandroidx/compose/foundation/lazy/LazyListStateKt;->()V PLandroidx/compose/foundation/lazy/LazyListStateKt;->()V HSPLandroidx/compose/foundation/lazy/LazyListStateKt;->rememberLazyListState(ILandroidx/compose/runtime/Composer;I)Landroidx/compose/foundation/lazy/LazyListState; HPLandroidx/compose/foundation/lazy/LazyListStateKt;->rememberLazyListState(ILandroidx/compose/runtime/Composer;I)Landroidx/compose/foundation/lazy/LazyListState; Landroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1; HSPLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->(II)V PLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->(II)V HSPLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/LazyListStateKt$rememberLazyListState$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/lazy/ParentSizeNode$measure$1; HSPLandroidx/compose/foundation/lazy/ParentSizeNode$measure$1;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/lazy/ParentSizeNode$measure$1;->(Ljava/lang/Object;I)V Landroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier; HSPLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->()V PLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->()V HSPLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->onGloballyPositioned()V PLandroidx/compose/foundation/lazy/layout/AwaitFirstLayoutModifier;->onGloballyPositioned()V Landroidx/compose/foundation/lazy/layout/DefaultLazyKey; HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->()V PLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->()V HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->(I)V PLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->(I)V HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->hashCode()I HPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey;->hashCode()I Landroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion; HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion;->()V PLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion;->()V HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion;->()V PLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion;->()V Landroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion$CREATOR$1; HSPLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion$CREATOR$1;->()V PLandroidx/compose/foundation/lazy/layout/DefaultLazyKey$Companion$CREATOR$1;->()V Landroidx/compose/foundation/lazy/layout/IntervalList$Interval; HSPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->(IILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval;)V HPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->(IILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval;)V HSPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->getSize()I PLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->getSize()I HSPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->getStartIndex()I HPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->getStartIndex()I HSPLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->getValue()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/IntervalList$Interval;->getValue()Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyAnimateScrollScope; Landroidx/compose/foundation/lazy/layout/LazyLayoutAnimateItemModifierNode; Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;->()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;->hasIntervals()Z PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;->hasIntervals()Z Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo$Interval; Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal;->()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;ZLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/gestures/Orientation;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;ZLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/gestures/Orientation;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal;->getKey()Landroidx/compose/ui/modifier/ProvidableModifierLocal; Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal$Companion$emptyBeyondBoundsScope$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal$Companion$emptyBeyondBoundsScope$1;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal$Companion$emptyBeyondBoundsScope$1;->()V Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState; Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsStateKt; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsStateKt;->calculateLazyLayoutPinnedIndices(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;)Ljava/util/List; PLandroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsStateKt;->calculateLazyLayoutPinnedIndices(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;Landroidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsInfo;)Ljava/util/List; Landroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->(Landroidx/compose/runtime/saveable/SaveableStateHolder;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->(Landroidx/compose/runtime/saveable/SaveableStateHolder;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->access$getSaveableStateHolder$p(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;)Landroidx/compose/runtime/saveable/SaveableStateHolder; PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->access$getSaveableStateHolder$p(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;)Landroidx/compose/runtime/saveable/SaveableStateHolder; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContent(ILjava/lang/Object;Ljava/lang/Object;)Lkotlin/jvm/functions/Function2; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getContent(ILjava/lang/Object;Ljava/lang/Object;)Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getItemProvider()Lkotlin/jvm/functions/Function0; PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;->getItemProvider()Lkotlin/jvm/functions/Function0; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;ILjava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;ILjava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->access$set_content$p(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getContent()Lkotlin/jvm/functions/Function2; PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getContent()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getContentType()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getContentType()Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getIndex()I PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getIndex()I HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getKey()Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;->getKey()Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent;)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory$CachedItemContent$createContentLambda$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactoryKt$SkippableItem$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactoryKt$SkippableItem$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;ILjava/lang/Object;I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactoryKt$SkippableItem$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;ILjava/lang/Object;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactoryKt$SkippableItem$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactoryKt$SkippableItem$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactoryKt$SkippableItem$2; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider; Landroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutItemReusePolicy;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;)V Landroidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutKeyIndexMap;->()V Landroidx/compose/foundation/lazy/layout/LazyLayoutKt; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->()V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayout(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayout(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayoutPinnableItem(Ljava/lang/Object;ILandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayoutPinnableItem(Ljava/lang/Object;ILandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayoutPrefetcher(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazyLayoutPrefetcher(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazySaveableStateHolderProvider(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->LazySaveableStateHolderProvider(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->access$SkippableItem-JVlU9Rs(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;ILjava/lang/Object;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->access$SkippableItem-JVlU9Rs(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;ILjava/lang/Object;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->access$binarySearch(ILandroidx/compose/runtime/collection/MutableVector;)I HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->access$binarySearch(ILandroidx/compose/runtime/collection/MutableVector;)I HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->findIndexByKey(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;I)I HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->findIndexByKey(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemProvider;Ljava/lang/Object;I)I HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->getContentType(I)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->getContentType(I)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->lazyLayoutSemantics(Landroidx/compose/ui/Modifier;Lkotlin/reflect/KProperty0;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;Landroidx/compose/foundation/gestures/Orientation;ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt;->lazyLayoutSemantics(Landroidx/compose/ui/Modifier;Lkotlin/reflect/KProperty0;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;Landroidx/compose/foundation/gestures/Orientation;ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ILandroidx/compose/runtime/MutableState;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ILandroidx/compose/runtime/MutableState;)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$2$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$2$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$2$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$itemContentFactory$1$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$itemContentFactory$1$1;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$itemContentFactory$1$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$itemContentFactory$1$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutKt$LazyLayout$3$itemContentFactory$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeMeasureScope;)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroidx/compose/ui/layout/SubcomposeMeasureScope;)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->isLookingAhead()Z HPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->isLookingAhead()Z HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; PLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->measure-0kLqBqw(IJ)Ljava/util/List; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->measure-0kLqBqw(IJ)Ljava/util/List; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->roundToPx-0680j_4(F)I HPLandroidx/compose/foundation/lazy/layout/LazyLayoutMeasureScopeImpl;->roundToPx-0680j_4(F)I Landroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->(III)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->(III)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->getValue()Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->getValue()Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->update(I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutNearestRangeState;->update(I)V Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->(Ljava/lang/Object;Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->(Ljava/lang/Object;Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->getPinsCount()I HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->getPinsCount()I PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->onDisposed()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->setIndex(I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->setIndex(I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->setParentPinnableContainer(Landroidx/compose/ui/layout/PinnableContainer;)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItem;->setParentPinnableContainer(Landroidx/compose/ui/layout/PinnableContainer;)V Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1;->invoke(Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1;->invoke(Landroidx/compose/runtime/DisposableEffectScope;)Landroidx/compose/runtime/DisposableEffectResult; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnableItemKt$LazyLayoutPinnableItem$1$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;->()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;->isEmpty()Z PLandroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList;->isEmpty()Z Landroidx/compose/foundation/lazy/layout/LazyLayoutPinnedItemList$PinnedItem; Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;->()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;->()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;->setPrefetcher$foundation_release(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$Prefetcher;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;->setPrefetcher$foundation_release(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$Prefetcher;)V Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$PrefetchHandle; Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState$Prefetcher; Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroid/view/View;)V HPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetchState;Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/foundation/lazy/layout/LazyLayoutItemContentFactory;Landroid/view/View;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->onForgotten()V HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->onRemembered()V PLandroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher;->onRemembered()V Landroidx/compose/foundation/lazy/layout/LazyLayoutPrefetcher$PrefetchRequest; Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState; Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1;->(Lkotlin/jvm/functions/Function1;ZLandroidx/compose/ui/semantics/ScrollAxisRange;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/semantics/CollectionInfo;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1;->(Lkotlin/jvm/functions/Function1;ZLandroidx/compose/ui/semantics/ScrollAxisRange;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/semantics/CollectionInfo;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$accessibilityScrollState$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$accessibilityScrollState$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$accessibilityScrollState$1;->(Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;I)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$accessibilityScrollState$1;->invoke()Ljava/lang/Float; HPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$accessibilityScrollState$1;->invoke()Ljava/lang/Float; PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$accessibilityScrollState$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollByAction$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollByAction$1;->(ZLkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollByAction$1;->(ZLkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;)V Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollToIndexAction$1; HSPLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollToIndexAction$1;->(Lkotlin/reflect/KProperty0;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;)V PLandroidx/compose/foundation/lazy/layout/LazyLayoutSemanticsKt$lazyLayoutSemantics$1$scrollToIndexAction$1;->(Lkotlin/reflect/KProperty0;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/foundation/lazy/layout/LazyLayoutSemanticState;)V Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/util/Map;)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/util/Map;)V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->SaveableStateProvider(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->SaveableStateProvider(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->access$getPreviouslyComposedKeys$p(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;)Ljava/util/LinkedHashSet; PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->access$getPreviouslyComposedKeys$p(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;)Ljava/util/LinkedHashSet; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->canBeSaved(Ljava/lang/Object;)Z PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->canBeSaved(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->performSave()Ljava/util/Map; HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->performSave()Ljava/util/Map; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->setWrappedHolder(Landroidx/compose/runtime/saveable/SaveableStateHolder;)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;->setWrappedHolder(Landroidx/compose/runtime/saveable/SaveableStateHolder;)V Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;I)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;I)V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->()V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->()V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->()V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->()V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$Companion$saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2;->(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2;->(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;)V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2$invoke$$inlined$onDispose$1; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2$invoke$$inlined$onDispose$1;->(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;)V HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2$invoke$$inlined$onDispose$1;->(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Ljava/lang/Object;)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$2$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$3; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$3;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;II)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolder$SaveableStateProvider$3;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;II)V Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1; HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;->(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Lkotlin/jvm/functions/Function3;I)V PLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;->(Landroidx/compose/foundation/lazy/layout/LazySaveableStateHolder;Lkotlin/jvm/functions/Function3;I)V HSPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/LazySaveableStateHolderKt$LazySaveableStateHolderProvider$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/MutableIntervalList; HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->()V HPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->()V HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->addInterval(ILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval;)V HPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->addInterval(ILandroidx/compose/foundation/lazy/layout/LazyLayoutIntervalContent$Interval;)V HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->checkIndexBounds(I)V HPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->checkIndexBounds(I)V HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->forEach(IILkotlin/jvm/functions/Function1;)V HPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->forEach(IILkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->get(I)Landroidx/compose/foundation/lazy/layout/IntervalList$Interval; HPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->get(I)Landroidx/compose/foundation/lazy/layout/IntervalList$Interval; HSPLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->getSize()I PLandroidx/compose/foundation/lazy/layout/MutableIntervalList;->getSize()I Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap; HSPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->(Lkotlin/ranges/IntRange;Landroidx/compose/foundation/lazy/layout/LazyLayoutKt;)V HPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->(Lkotlin/ranges/IntRange;Landroidx/compose/foundation/lazy/layout/LazyLayoutKt;)V HSPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->access$getKeys$p(Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)[Ljava/lang/Object; PLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->access$getKeys$p(Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)[Ljava/lang/Object; HSPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->access$getKeysStartIndex$p(Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)I PLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->access$getKeysStartIndex$p(Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)I HSPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->getKey(I)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;->getKey(I)Ljava/lang/Object; Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap$2$1; HSPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap$2$1;->(IILjava/util/HashMap;Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)V HPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap$2$1;->(IILjava/util/HashMap;Landroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap;)V HSPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/lazy/layout/NearestRangeKeyIndexMap$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/relocation/BringIntoViewChildNode; HSPLandroidx/compose/foundation/relocation/BringIntoViewChildNode;->()V HPLandroidx/compose/foundation/relocation/BringIntoViewChildNode;->()V HSPLandroidx/compose/foundation/relocation/BringIntoViewChildNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/foundation/relocation/BringIntoViewChildNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V Landroidx/compose/foundation/relocation/BringIntoViewKt; HSPLandroidx/compose/foundation/relocation/BringIntoViewKt;->()V PLandroidx/compose/foundation/relocation/BringIntoViewKt;->()V HSPLandroidx/compose/foundation/relocation/BringIntoViewKt;->getModifierLocalBringIntoViewParent()Landroidx/compose/ui/modifier/ProvidableModifierLocal; PLandroidx/compose/foundation/relocation/BringIntoViewKt;->getModifierLocalBringIntoViewParent()Landroidx/compose/ui/modifier/ProvidableModifierLocal; Landroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1; HSPLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;->()V PLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;->()V HSPLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;->()V PLandroidx/compose/foundation/relocation/BringIntoViewKt$ModifierLocalBringIntoViewParent$1;->()V Landroidx/compose/foundation/relocation/BringIntoViewParent; Landroidx/compose/foundation/relocation/BringIntoViewRequester; Landroidx/compose/foundation/relocation/BringIntoViewRequesterImpl; HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;->()V HPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;->()V HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;->getModifiers()Landroidx/compose/runtime/collection/MutableVector; PLandroidx/compose/foundation/relocation/BringIntoViewRequesterImpl;->getModifiers()Landroidx/compose/runtime/collection/MutableVector; Landroidx/compose/foundation/relocation/BringIntoViewRequesterKt; HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt;->BringIntoViewRequester()Landroidx/compose/foundation/relocation/BringIntoViewRequester; PLandroidx/compose/foundation/relocation/BringIntoViewRequesterKt;->BringIntoViewRequester()Landroidx/compose/foundation/relocation/BringIntoViewRequester; Landroidx/compose/foundation/relocation/BringIntoViewRequesterNode; HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->(Landroidx/compose/foundation/relocation/BringIntoViewRequester;)V PLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->(Landroidx/compose/foundation/relocation/BringIntoViewRequester;)V HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->onAttach()V HPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->onAttach()V HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->onDetach()V HPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->onDetach()V HSPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->updateRequester(Landroidx/compose/foundation/relocation/BringIntoViewRequester;)V HPLandroidx/compose/foundation/relocation/BringIntoViewRequesterNode;->updateRequester(Landroidx/compose/foundation/relocation/BringIntoViewRequester;)V Landroidx/compose/foundation/relocation/BringIntoViewResponder; Landroidx/compose/foundation/relocation/BringIntoViewResponderNode; HSPLandroidx/compose/foundation/relocation/BringIntoViewResponderNode;->(Landroidx/compose/foundation/gestures/ContentInViewNode;)V PLandroidx/compose/foundation/relocation/BringIntoViewResponderNode;->(Landroidx/compose/foundation/gestures/ContentInViewNode;)V Landroidx/compose/foundation/relocation/BringIntoViewResponder_androidKt$defaultBringIntoViewParent$1; HSPLandroidx/compose/foundation/relocation/BringIntoViewResponder_androidKt$defaultBringIntoViewParent$1;->(Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode;)V HPLandroidx/compose/foundation/relocation/BringIntoViewResponder_androidKt$defaultBringIntoViewParent$1;->(Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode;)V Landroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1; HSPLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->()V PLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->()V HSPLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->()V PLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->()V HSPLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/foundation/selection/SelectableGroupKt$selectableGroup$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/selection/SelectableKt; HSPLandroidx/compose/foundation/selection/SelectableKt;->selectable-O2vRcR0(Landroidx/compose/ui/Modifier;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/foundation/selection/SelectableKt;->selectable-O2vRcR0(Landroidx/compose/ui/Modifier;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/foundation/Indication;ZLandroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function0;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/foundation/selection/SelectableKt;->selectableGroup(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; PLandroidx/compose/foundation/selection/SelectableKt;->selectableGroup(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Landroidx/compose/foundation/selection/SelectableKt$selectable$4$1; HSPLandroidx/compose/foundation/selection/SelectableKt$selectable$4$1;->(Z)V HPLandroidx/compose/foundation/selection/SelectableKt$selectable$4$1;->(Z)V HSPLandroidx/compose/foundation/selection/SelectableKt$selectable$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/selection/SelectableKt$selectable$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/shape/CornerBasedShape; HSPLandroidx/compose/foundation/shape/CornerBasedShape;->(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V PLandroidx/compose/foundation/shape/CornerBasedShape;->(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V HSPLandroidx/compose/foundation/shape/CornerBasedShape;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/BrushKt; HPLandroidx/compose/foundation/shape/CornerBasedShape;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/BrushKt; Landroidx/compose/foundation/shape/CornerSize; Landroidx/compose/foundation/shape/CornerSizeKt; HSPLandroidx/compose/foundation/shape/CornerSizeKt;->()V PLandroidx/compose/foundation/shape/CornerSizeKt;->()V HSPLandroidx/compose/foundation/shape/CornerSizeKt;->CornerSize(I)Landroidx/compose/foundation/shape/CornerSize; PLandroidx/compose/foundation/shape/CornerSizeKt;->CornerSize(I)Landroidx/compose/foundation/shape/CornerSize; HSPLandroidx/compose/foundation/shape/CornerSizeKt;->CornerSize-0680j_4(F)Landroidx/compose/foundation/shape/CornerSize; PLandroidx/compose/foundation/shape/CornerSizeKt;->CornerSize-0680j_4(F)Landroidx/compose/foundation/shape/CornerSize; Landroidx/compose/foundation/shape/CornerSizeKt$ZeroCornerSize$1; HSPLandroidx/compose/foundation/shape/CornerSizeKt$ZeroCornerSize$1;->()V PLandroidx/compose/foundation/shape/CornerSizeKt$ZeroCornerSize$1;->()V Landroidx/compose/foundation/shape/DpCornerSize; HSPLandroidx/compose/foundation/shape/DpCornerSize;->(F)V PLandroidx/compose/foundation/shape/DpCornerSize;->(F)V Landroidx/compose/foundation/shape/PercentCornerSize; HSPLandroidx/compose/foundation/shape/PercentCornerSize;->(F)V PLandroidx/compose/foundation/shape/PercentCornerSize;->(F)V HSPLandroidx/compose/foundation/shape/PercentCornerSize;->toPx-TmRCtEA(JLandroidx/compose/ui/unit/Density;)F HPLandroidx/compose/foundation/shape/PercentCornerSize;->toPx-TmRCtEA(JLandroidx/compose/ui/unit/Density;)F Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/foundation/shape/RoundedCornerShape;->(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V PLandroidx/compose/foundation/shape/RoundedCornerShape;->(Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;Landroidx/compose/foundation/shape/CornerSize;)V HSPLandroidx/compose/foundation/shape/RoundedCornerShape;->createOutline-LjSzlW0(JFFFFLandroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/graphics/BrushKt; HPLandroidx/compose/foundation/shape/RoundedCornerShape;->createOutline-LjSzlW0(JFFFFLandroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/graphics/BrushKt; HSPLandroidx/compose/foundation/shape/RoundedCornerShape;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/shape/RoundedCornerShape;->equals(Ljava/lang/Object;)Z Landroidx/compose/foundation/shape/RoundedCornerShapeKt; HSPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->()V PLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->()V HSPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->RoundedCornerShape-0680j_4(F)Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->RoundedCornerShape-0680j_4(F)Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->getCircleShape()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/foundation/shape/RoundedCornerShapeKt;->getCircleShape()Landroidx/compose/foundation/shape/RoundedCornerShape; Landroidx/compose/foundation/text/BasicTextKt; HSPLandroidx/compose/foundation/text/BasicTextKt;->()V PLandroidx/compose/foundation/text/BasicTextKt;->()V HSPLandroidx/compose/foundation/text/BasicTextKt;->BasicText-VhcvRP8(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function1;IZIILandroidx/compose/ui/graphics/ColorProducer;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/foundation/text/BasicTextKt;->BasicText-VhcvRP8(Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function1;IZIILandroidx/compose/ui/graphics/ColorProducer;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/foundation/text/BasicTextKt;->ceilToIntPx(F)I HPLandroidx/compose/foundation/text/BasicTextKt;->ceilToIntPx(F)I HSPLandroidx/compose/foundation/text/BasicTextKt;->validateMinMaxLines(II)V HPLandroidx/compose/foundation/text/BasicTextKt;->validateMinMaxLines(II)V Landroidx/compose/foundation/text/BasicTextKt$BasicText$1; Landroidx/compose/foundation/text/BasicTextKt$BasicText-RWo7tUw$$inlined$Layout$1; HSPLandroidx/compose/foundation/text/BasicTextKt$BasicText-RWo7tUw$$inlined$Layout$1;->(Lkotlin/jvm/functions/Function0;I)V HPLandroidx/compose/foundation/text/BasicTextKt$BasicText-RWo7tUw$$inlined$Layout$1;->(Lkotlin/jvm/functions/Function0;I)V HSPLandroidx/compose/foundation/text/BasicTextKt$BasicText-RWo7tUw$$inlined$Layout$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/text/BasicTextKt$BasicText-RWo7tUw$$inlined$Layout$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/text/EmptyMeasurePolicy; HSPLandroidx/compose/foundation/text/EmptyMeasurePolicy;->()V PLandroidx/compose/foundation/text/EmptyMeasurePolicy;->()V HSPLandroidx/compose/foundation/text/EmptyMeasurePolicy;->()V PLandroidx/compose/foundation/text/EmptyMeasurePolicy;->()V HSPLandroidx/compose/foundation/text/EmptyMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/text/EmptyMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/foundation/text/KeyMapping; Landroidx/compose/foundation/text/KeyMapping_androidKt$platformDefaultKeyMapping$1; HSPLandroidx/compose/foundation/text/KeyMapping_androidKt$platformDefaultKeyMapping$1;->()V PLandroidx/compose/foundation/text/KeyMapping_androidKt$platformDefaultKeyMapping$1;->()V Landroidx/compose/foundation/text/TextFieldKeyInput$1; HSPLandroidx/compose/foundation/text/TextFieldKeyInput$1;->()V PLandroidx/compose/foundation/text/TextFieldKeyInput$1;->()V HSPLandroidx/compose/foundation/text/TextFieldKeyInput$1;->(I)V PLandroidx/compose/foundation/text/TextFieldKeyInput$1;->(I)V HSPLandroidx/compose/foundation/text/TextFieldKeyInput$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/text/TextFieldKeyInput$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;IZII)V HPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;IZII)V HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getDidOverflow$foundation_release()Z PLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getDidOverflow$foundation_release()Z HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getLayoutSize-YbymL2g$foundation_release()J PLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getLayoutSize-YbymL2g$foundation_release()J HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getObserveFontChanges$foundation_release()V PLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getObserveFontChanges$foundation_release()V HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getParagraph$foundation_release()Landroidx/compose/ui/text/AndroidParagraph; PLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->getParagraph$foundation_release()Landroidx/compose/ui/text/AndroidParagraph; HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->layoutText-K40F9xA(JLandroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/AndroidParagraph; HPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->layoutText-K40F9xA(JLandroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/AndroidParagraph; HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->layoutWithConstraints-K40F9xA(JLandroidx/compose/ui/unit/LayoutDirection;)Z HPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->layoutWithConstraints-K40F9xA(JLandroidx/compose/ui/unit/LayoutDirection;)Z HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->setDensity$foundation_release(Landroidx/compose/ui/unit/Density;)V HPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->setDensity$foundation_release(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/ParagraphIntrinsics; HPLandroidx/compose/foundation/text/modifiers/ParagraphLayoutCache;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/ParagraphIntrinsics; Landroidx/compose/foundation/text/modifiers/SelectionController; Landroidx/compose/foundation/text/modifiers/TextStringSimpleElement; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;IZIILandroidx/compose/ui/graphics/ColorProducer;)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;IZIILandroidx/compose/ui/graphics/ColorProducer;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->update(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;IZIILandroidx/compose/ui/graphics/ColorProducer;)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->(Ljava/lang/String;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;IZIILandroidx/compose/ui/graphics/ColorProducer;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->doInvalidations(ZZZ)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->doInvalidations(ZZZ)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache()Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache()Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache(Landroidx/compose/ui/unit/Density;)Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->getLayoutCache(Landroidx/compose/ui/unit/Density;)Landroidx/compose/foundation/text/modifiers/ParagraphLayoutCache; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->updateDraw(Landroidx/compose/ui/graphics/ColorProducer;Landroidx/compose/ui/text/TextStyle;)Z HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->updateDraw(Landroidx/compose/ui/graphics/ColorProducer;Landroidx/compose/ui/text/TextStyle;)Z HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->updateLayoutRelatedArgs-HuAbxIM(Landroidx/compose/ui/text/TextStyle;IIZLandroidx/compose/ui/text/font/FontFamilyResolverImpl;I)Z HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->updateLayoutRelatedArgs-HuAbxIM(Landroidx/compose/ui/text/TextStyle;IIZLandroidx/compose/ui/text/font/FontFamilyResolverImpl;I)Z HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->updateText(Ljava/lang/String;)Z HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode;->updateText(Ljava/lang/String;)Z Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$TextSubstitutionValue; Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$1; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$1;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;I)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$1;->(Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode;I)V Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$4; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$4;->(ILandroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$applySemantics$4;->(ILandroidx/compose/ui/Modifier$Node;)V Landroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1; HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;I)V PLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;I)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/foundation/text/modifiers/TextStringSimpleNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/foundation/text/selection/SelectionRegistrarImpl; Landroidx/compose/foundation/text/selection/SelectionRegistrarKt; HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;->()V PLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;->()V HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;->getLocalSelectionRegistrar()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/foundation/text/selection/SelectionRegistrarKt;->getLocalSelectionRegistrar()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Landroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1; HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->()V PLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->()V HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->(I)V PLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->(I)V HSPLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->invoke()Ljava/lang/Object; PLandroidx/compose/foundation/text/selection/SelectionRegistrarKt$LocalSelectionRegistrar$1;->invoke()Ljava/lang/Object; Landroidx/compose/foundation/text/selection/TextSelectionColors; HSPLandroidx/compose/foundation/text/selection/TextSelectionColors;->(JJ)V PLandroidx/compose/foundation/text/selection/TextSelectionColors;->(JJ)V Landroidx/compose/foundation/text/selection/TextSelectionColorsKt; HSPLandroidx/compose/foundation/text/selection/TextSelectionColorsKt;->()V PLandroidx/compose/foundation/text/selection/TextSelectionColorsKt;->()V HSPLandroidx/compose/foundation/text/selection/TextSelectionColorsKt;->getLocalTextSelectionColors()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/foundation/text/selection/TextSelectionColorsKt;->getLocalTextSelectionColors()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Landroidx/compose/material/ripple/AndroidRippleIndicationInstance; HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->(ZFLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroid/view/ViewGroup;)V HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->(ZFLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroid/view/ViewGroup;)V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->access$getInvalidateTick(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)Z HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->access$getInvalidateTick(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)Z HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->access$setInvalidateTick(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;Z)V HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->access$setInvalidateTick(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;Z)V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->addRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;Lkotlinx/coroutines/CoroutineScope;)V HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->addRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->drawIndication(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->drawIndication(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->onForgotten()V HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->onForgotten()V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->onRemembered()V HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->onRemembered()V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->removeRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->removeRipple(Landroidx/compose/foundation/interaction/PressInteraction$Press;)V PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance;->resetHostView()V Landroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1; HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1;->(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)V PLandroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1;->(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)V HSPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/material/ripple/AndroidRippleIndicationInstance$onInvalidateRipple$1;->invoke()Ljava/lang/Object; Landroidx/compose/material/ripple/CommonRippleIndicationInstance; Landroidx/compose/material/ripple/PlatformRipple; HSPLandroidx/compose/material/ripple/PlatformRipple;->(ZFLandroidx/compose/runtime/MutableState;)V PLandroidx/compose/material/ripple/PlatformRipple;->(ZFLandroidx/compose/runtime/MutableState;)V Landroidx/compose/material/ripple/Ripple; HSPLandroidx/compose/material/ripple/Ripple;->(ZFLandroidx/compose/runtime/MutableState;)V PLandroidx/compose/material/ripple/Ripple;->(ZFLandroidx/compose/runtime/MutableState;)V HSPLandroidx/compose/material/ripple/Ripple;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/material/ripple/Ripple;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/material/ripple/Ripple;->rememberUpdatedInstance(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/IndicationInstance; HPLandroidx/compose/material/ripple/Ripple;->rememberUpdatedInstance(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/IndicationInstance; Landroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1; HSPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/material/ripple/RippleIndicationInstance;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->(Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/material/ripple/RippleIndicationInstance;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$1; HSPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$1;->(Landroidx/compose/material/ripple/RippleIndicationInstance;Lkotlinx/coroutines/CoroutineScope;)V HPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$1;->(Landroidx/compose/material/ripple/RippleIndicationInstance;Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/material/ripple/Ripple$rememberUpdatedInstance$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/material/ripple/RippleAlpha; HSPLandroidx/compose/material/ripple/RippleAlpha;->(FFFF)V PLandroidx/compose/material/ripple/RippleAlpha;->(FFFF)V HSPLandroidx/compose/material/ripple/RippleAlpha;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/material/ripple/RippleAlpha;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/material/ripple/RippleAlpha;->getPressedAlpha()F PLandroidx/compose/material/ripple/RippleAlpha;->getPressedAlpha()F Landroidx/compose/material/ripple/RippleAnimationKt; HSPLandroidx/compose/material/ripple/RippleAnimationKt;->()V PLandroidx/compose/material/ripple/RippleAnimationKt;->()V HSPLandroidx/compose/material/ripple/RippleAnimationKt;->getRippleEndRadius-cSwnlzA(Landroidx/compose/ui/unit/Density;ZJ)F HPLandroidx/compose/material/ripple/RippleAnimationKt;->getRippleEndRadius-cSwnlzA(Landroidx/compose/ui/unit/Density;ZJ)F Landroidx/compose/material/ripple/RippleContainer; HSPLandroidx/compose/material/ripple/RippleContainer;->(Landroid/content/Context;)V HPLandroidx/compose/material/ripple/RippleContainer;->(Landroid/content/Context;)V PLandroidx/compose/material/ripple/RippleContainer;->disposeRippleIfNeeded(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)V HSPLandroidx/compose/material/ripple/RippleContainer;->getRippleHostView(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)Landroidx/compose/material/ripple/RippleHostView; HPLandroidx/compose/material/ripple/RippleContainer;->getRippleHostView(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)Landroidx/compose/material/ripple/RippleHostView; Landroidx/compose/material/ripple/RippleHostMap; HSPLandroidx/compose/material/ripple/RippleHostMap;->()V PLandroidx/compose/material/ripple/RippleHostMap;->()V HSPLandroidx/compose/material/ripple/RippleHostMap;->get(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)Landroidx/compose/material/ripple/RippleHostView; HPLandroidx/compose/material/ripple/RippleHostMap;->get(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)Landroidx/compose/material/ripple/RippleHostView; PLandroidx/compose/material/ripple/RippleHostMap;->remove(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;)V HSPLandroidx/compose/material/ripple/RippleHostMap;->set(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;Landroidx/compose/material/ripple/RippleHostView;)V HPLandroidx/compose/material/ripple/RippleHostMap;->set(Landroidx/compose/material/ripple/AndroidRippleIndicationInstance;Landroidx/compose/material/ripple/RippleHostView;)V Landroidx/compose/material/ripple/RippleHostView; PLandroidx/compose/material/ripple/RippleHostView;->$r8$lambda$4nztiuYeQHklB-09QfMAnp7Ay8E(Landroidx/compose/material/ripple/RippleHostView;)V HSPLandroidx/compose/material/ripple/RippleHostView;->()V PLandroidx/compose/material/ripple/RippleHostView;->()V HSPLandroidx/compose/material/ripple/RippleHostView;->(Landroid/content/Context;)V PLandroidx/compose/material/ripple/RippleHostView;->(Landroid/content/Context;)V HSPLandroidx/compose/material/ripple/RippleHostView;->addRipple-KOepWvA(Landroidx/compose/foundation/interaction/PressInteraction$Press;ZJIJFLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/material/ripple/RippleHostView;->addRipple-KOepWvA(Landroidx/compose/foundation/interaction/PressInteraction$Press;ZJIJFLkotlin/jvm/functions/Function0;)V PLandroidx/compose/material/ripple/RippleHostView;->disposeRipple()V HPLandroidx/compose/material/ripple/RippleHostView;->disposeRipple()V HSPLandroidx/compose/material/ripple/RippleHostView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HPLandroidx/compose/material/ripple/RippleHostView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/compose/material/ripple/RippleHostView;->refreshDrawableState()V HPLandroidx/compose/material/ripple/RippleHostView;->refreshDrawableState()V HSPLandroidx/compose/material/ripple/RippleHostView;->removeRipple()V PLandroidx/compose/material/ripple/RippleHostView;->removeRipple()V HSPLandroidx/compose/material/ripple/RippleHostView;->setRippleState(Z)V HPLandroidx/compose/material/ripple/RippleHostView;->setRippleState(Z)V HSPLandroidx/compose/material/ripple/RippleHostView;->updateRippleProperties-biQXAtU(FIJJ)V HPLandroidx/compose/material/ripple/RippleHostView;->updateRippleProperties-biQXAtU(FIJJ)V Landroidx/compose/material/ripple/RippleIndicationInstance; HSPLandroidx/compose/material/ripple/RippleIndicationInstance;->(ZLandroidx/compose/runtime/MutableState;)V PLandroidx/compose/material/ripple/RippleIndicationInstance;->(ZLandroidx/compose/runtime/MutableState;)V HSPLandroidx/compose/material/ripple/RippleIndicationInstance;->drawStateLayer-H2RKhps(Landroidx/compose/ui/graphics/drawscope/DrawScope;FJ)V PLandroidx/compose/material/ripple/RippleIndicationInstance;->drawStateLayer-H2RKhps(Landroidx/compose/ui/graphics/drawscope/DrawScope;FJ)V Landroidx/compose/material/ripple/RippleKt; HSPLandroidx/compose/material/ripple/RippleKt;->()V PLandroidx/compose/material/ripple/RippleKt;->()V HSPLandroidx/compose/material/ripple/RippleKt;->rememberRipple-9IZ8Weo(ZFJLandroidx/compose/runtime/Composer;II)Landroidx/compose/material/ripple/PlatformRipple; HPLandroidx/compose/material/ripple/RippleKt;->rememberRipple-9IZ8Weo(ZFJLandroidx/compose/runtime/Composer;II)Landroidx/compose/material/ripple/PlatformRipple; Landroidx/compose/material/ripple/RippleTheme; Landroidx/compose/material/ripple/RippleThemeKt; HSPLandroidx/compose/material/ripple/RippleThemeKt;->()V PLandroidx/compose/material/ripple/RippleThemeKt;->()V HSPLandroidx/compose/material/ripple/RippleThemeKt;->getLocalRippleTheme()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/material/ripple/RippleThemeKt;->getLocalRippleTheme()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1; HSPLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V PLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V HSPLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V PLandroidx/compose/material/ripple/RippleThemeKt$LocalRippleTheme$1;->()V Landroidx/compose/material/ripple/StateLayer; HSPLandroidx/compose/material/ripple/StateLayer;->(ZLandroidx/compose/runtime/MutableState;)V HPLandroidx/compose/material/ripple/StateLayer;->(ZLandroidx/compose/runtime/MutableState;)V HSPLandroidx/compose/material/ripple/StateLayer;->drawStateLayer-H2RKhps(Landroidx/compose/ui/graphics/drawscope/DrawScope;FJ)V HPLandroidx/compose/material/ripple/StateLayer;->drawStateLayer-H2RKhps(Landroidx/compose/ui/graphics/drawscope/DrawScope;FJ)V Landroidx/compose/material/ripple/UnprojectedRipple; HSPLandroidx/compose/material/ripple/UnprojectedRipple;->(Z)V HPLandroidx/compose/material/ripple/UnprojectedRipple;->(Z)V HSPLandroidx/compose/material/ripple/UnprojectedRipple;->getDirtyBounds()Landroid/graphics/Rect; HPLandroidx/compose/material/ripple/UnprojectedRipple;->getDirtyBounds()Landroid/graphics/Rect; HSPLandroidx/compose/material/ripple/UnprojectedRipple;->isProjected()Z HPLandroidx/compose/material/ripple/UnprojectedRipple;->isProjected()Z HSPLandroidx/compose/material/ripple/UnprojectedRipple;->setColor-DxMtmZc(JF)V HPLandroidx/compose/material/ripple/UnprojectedRipple;->setColor-DxMtmZc(JF)V HSPLandroidx/compose/material/ripple/UnprojectedRipple;->trySetRadius(I)V PLandroidx/compose/material/ripple/UnprojectedRipple;->trySetRadius(I)V Landroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper; HSPLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->()V PLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->()V HSPLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->()V PLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->()V HSPLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->setRadius(Landroid/graphics/drawable/RippleDrawable;I)V PLandroidx/compose/material/ripple/UnprojectedRipple$MRadiusHelper;->setRadius(Landroid/graphics/drawable/RippleDrawable;I)V Landroidx/compose/material3/AndroidMenu_androidKt$DropdownMenu$3; HSPLandroidx/compose/material3/AndroidMenu_androidKt$DropdownMenu$3;->(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/ScrollState;Landroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;II)V PLandroidx/compose/material3/AndroidMenu_androidKt$DropdownMenu$3;->(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/ScrollState;Landroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;II)V Landroidx/compose/material3/AppBarKt; HSPLandroidx/compose/material3/AppBarKt;->()V PLandroidx/compose/material3/AppBarKt;->()V HSPLandroidx/compose/material3/AppBarKt;->SingleRowTopAppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/AppBarKt;->SingleRowTopAppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/AppBarKt;->TopAppBar(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/AppBarKt;->TopAppBar(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/AppBarKt;->access$SingleRowTopAppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V PLandroidx/compose/material3/AppBarKt;->access$SingleRowTopAppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/AppBarKt;->access$TopAppBarLayout-kXwM9vE(Landroidx/compose/ui/Modifier;FJJJLkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;FLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;IZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/AppBarKt;->access$TopAppBarLayout-kXwM9vE(Landroidx/compose/ui/Modifier;FJJJLkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;FLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Horizontal;IZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/AppBarKt;->access$getTopAppBarTitleInset$p()F PLandroidx/compose/material3/AppBarKt;->access$getTopAppBarTitleInset$p()F HSPLandroidx/compose/material3/AppBarKt;->rememberTopAppBarState(Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/TopAppBarState; HPLandroidx/compose/material3/AppBarKt;->rememberTopAppBarState(Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/TopAppBarState; Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2; HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;ILandroidx/compose/material3/TopAppBarScrollBehavior;)V HPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Landroidx/compose/runtime/internal/ComposableLambdaImpl;ILandroidx/compose/material3/TopAppBarScrollBehavior;)V HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3; HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V HPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/text/TextStyle;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->invoke(Landroidx/compose/runtime/Composer;I)V PLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/AppBarKt$SingleRowTopAppBar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/AppBarKt$TopAppBar$1;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/material3/TopAppBarColors;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V Landroidx/compose/material3/AppBarKt$TopAppBarLayout$2; HSPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2;->(FLandroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;I)V HPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2;->(FLandroidx/compose/foundation/layout/Arrangement$Horizontal;Landroidx/compose/foundation/layout/Arrangement$Vertical;I)V HSPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/material3/AppBarKt$TopAppBarLayout$2$measure$1; HSPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$measure$1;->(Landroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/Placeable;Landroidx/compose/foundation/layout/Arrangement$Horizontal;JLandroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/foundation/layout/Arrangement$Vertical;II)V PLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$measure$1;->(Landroidx/compose/ui/layout/Placeable;ILandroidx/compose/ui/layout/Placeable;Landroidx/compose/foundation/layout/Arrangement$Horizontal;JLandroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/foundation/layout/Arrangement$Vertical;II)V HSPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/AppBarKt$TopAppBarLayout$2$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/AppBarKt$rememberTopAppBarState$1$1; HSPLandroidx/compose/material3/AppBarKt$rememberTopAppBarState$1$1;->(FFF)V PLandroidx/compose/material3/AppBarKt$rememberTopAppBarState$1$1;->(FFF)V HSPLandroidx/compose/material3/AppBarKt$rememberTopAppBarState$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/material3/AppBarKt$rememberTopAppBarState$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/material3/BadgeKt; HSPLandroidx/compose/material3/BadgeKt;->()V PLandroidx/compose/material3/BadgeKt;->()V HSPLandroidx/compose/material3/BadgeKt;->BadgedBox(Lkotlin/jvm/functions/Function3;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/BadgeKt;->BadgedBox(Lkotlin/jvm/functions/Function3;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/BadgeKt;->getBadgeOffset()F PLandroidx/compose/material3/BadgeKt;->getBadgeOffset()F Landroidx/compose/material3/BadgeKt$BadgedBox$2$1; HSPLandroidx/compose/material3/BadgeKt$BadgedBox$2$1;->(Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;)V PLandroidx/compose/material3/BadgeKt$BadgedBox$2$1;->(Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;)V HSPLandroidx/compose/material3/BadgeKt$BadgedBox$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/BadgeKt$BadgedBox$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/BadgeKt$BadgedBox$3; HSPLandroidx/compose/material3/BadgeKt$BadgedBox$3;->(Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;)V PLandroidx/compose/material3/BadgeKt$BadgedBox$3;->(Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;)V HSPLandroidx/compose/material3/BadgeKt$BadgedBox$3;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/material3/BadgeKt$BadgedBox$3;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/material3/BadgeKt$BadgedBox$3$measure$1; HSPLandroidx/compose/material3/BadgeKt$BadgedBox$3$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;)V PLandroidx/compose/material3/BadgeKt$BadgedBox$3$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;Landroidx/compose/runtime/MutableFloatState;)V HSPLandroidx/compose/material3/BadgeKt$BadgedBox$3$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/BadgeKt$BadgedBox$3$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/BadgeKt$BadgedBox$4; HSPLandroidx/compose/material3/BadgeKt$BadgedBox$4;->(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;III)V PLandroidx/compose/material3/BadgeKt$BadgedBox$4;->(Ljava/lang/Object;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;III)V Landroidx/compose/material3/ButtonColors; HSPLandroidx/compose/material3/ButtonColors;->(JJJJ)V PLandroidx/compose/material3/ButtonColors;->(JJJJ)V HSPLandroidx/compose/material3/ButtonColors;->containerColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/ButtonColors;->containerColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/material3/ButtonColors;->contentColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/ButtonColors;->contentColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/material3/ButtonColors;->equals(Ljava/lang/Object;)Z PLandroidx/compose/material3/ButtonColors;->equals(Ljava/lang/Object;)Z Landroidx/compose/material3/ButtonDefaults; HSPLandroidx/compose/material3/ButtonDefaults;->()V PLandroidx/compose/material3/ButtonDefaults;->()V HSPLandroidx/compose/material3/ButtonDefaults;->getMinHeight-D9Ej5fM()F PLandroidx/compose/material3/ButtonDefaults;->getMinHeight-D9Ej5fM()F HSPLandroidx/compose/material3/ButtonDefaults;->getMinWidth-D9Ej5fM()F PLandroidx/compose/material3/ButtonDefaults;->getMinWidth-D9Ej5fM()F HSPLandroidx/compose/material3/ButtonDefaults;->getTextButtonContentPadding()Landroidx/compose/foundation/layout/PaddingValuesImpl; PLandroidx/compose/material3/ButtonDefaults;->getTextButtonContentPadding()Landroidx/compose/foundation/layout/PaddingValuesImpl; HSPLandroidx/compose/material3/ButtonDefaults;->getTextShape(Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/Shape; PLandroidx/compose/material3/ButtonDefaults;->getTextShape(Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/Shape; HSPLandroidx/compose/material3/ButtonDefaults;->textButtonColors-ro_MJ88(JLandroidx/compose/runtime/Composer;I)Landroidx/compose/material3/ButtonColors; HPLandroidx/compose/material3/ButtonDefaults;->textButtonColors-ro_MJ88(JLandroidx/compose/runtime/Composer;I)Landroidx/compose/material3/ButtonColors; Landroidx/compose/material3/ButtonKt$Button$3; HSPLandroidx/compose/material3/ButtonKt$Button$3;->(JLandroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;I)V PLandroidx/compose/material3/ButtonKt$Button$3;->(JLandroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;I)V HSPLandroidx/compose/material3/ButtonKt$Button$3;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/ButtonKt$Button$3;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/ButtonKt$Button$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/ButtonKt$Button$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/ButtonKt$Button$3$1; HSPLandroidx/compose/material3/ButtonKt$Button$3$1;->(IILandroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;)V PLandroidx/compose/material3/ButtonKt$Button$3$1;->(IILandroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;)V HSPLandroidx/compose/material3/ButtonKt$Button$3$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/ButtonKt$Button$3$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/ButtonKt$Button$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/ButtonKt$Button$3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/ButtonKt$Button$4; HSPLandroidx/compose/material3/ButtonKt$Button$4;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;III)V PLandroidx/compose/material3/ButtonKt$Button$4;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;III)V Landroidx/compose/material3/CardKt; HSPLandroidx/compose/material3/CardKt;->()V PLandroidx/compose/material3/CardKt;->()V HSPLandroidx/compose/material3/CardKt;->Button(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->Button(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->DropdownMenu-4kj-_NE(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/ScrollState;Landroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->DropdownMenu-4kj-_NE(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/ScrollState;Landroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->FadeInFadeOutWithScale(Landroidx/compose/material3/SnackbarData;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->FadeInFadeOutWithScale(Landroidx/compose/material3/SnackbarData;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->HorizontalDivider-9IZ8Weo(Landroidx/compose/ui/Modifier;FJLandroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->HorizontalDivider-9IZ8Weo(Landroidx/compose/ui/Modifier;FJLandroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->IconButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->IconButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->MaterialTheme(Landroidx/compose/material3/ColorScheme;Landroidx/compose/material3/Shapes;Landroidx/compose/material3/Typography;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->MaterialTheme(Landroidx/compose/material3/ColorScheme;Landroidx/compose/material3/Shapes;Landroidx/compose/material3/Typography;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->SnackbarHost(Landroidx/compose/material3/SnackbarHostState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->SnackbarHost(Landroidx/compose/material3/SnackbarHostState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->TextButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/CardKt;->TextButton(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/ButtonColors;Landroidx/compose/material3/ButtonElevation;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/CardKt;->access$getDefaultRippleAlpha$p()Landroidx/compose/material/ripple/RippleAlpha; PLandroidx/compose/material3/CardKt;->access$getDefaultRippleAlpha$p()Landroidx/compose/material/ripple/RippleAlpha; HSPLandroidx/compose/material3/CardKt;->getString-NWtq2-8(ILandroidx/compose/runtime/Composer;)Ljava/lang/String; HPLandroidx/compose/material3/CardKt;->getString-NWtq2-8(ILandroidx/compose/runtime/Composer;)Ljava/lang/String; HSPLandroidx/compose/material3/CardKt;->getSystemBarsForVisualComponents(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/AndroidWindowInsets; HPLandroidx/compose/material3/CardKt;->getSystemBarsForVisualComponents(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/AndroidWindowInsets; HSPLandroidx/compose/material3/CardKt;->pinnedScrollBehavior(Landroidx/compose/material3/TopAppBarState;Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/TopAppBarScrollBehavior; HPLandroidx/compose/material3/CardKt;->pinnedScrollBehavior(Landroidx/compose/material3/TopAppBarState;Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/TopAppBarScrollBehavior; HSPLandroidx/compose/material3/CardKt;->topAppBarColors-zjMxDiM(JLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/TopAppBarColors; HPLandroidx/compose/material3/CardKt;->topAppBarColors-zjMxDiM(JLandroidx/compose/runtime/Composer;II)Landroidx/compose/material3/TopAppBarColors; Landroidx/compose/material3/CardKt$Card$1; HSPLandroidx/compose/material3/CardKt$Card$1;->(IILkotlin/jvm/functions/Function3;)V HPLandroidx/compose/material3/CardKt$Card$1;->(IILkotlin/jvm/functions/Function3;)V HSPLandroidx/compose/material3/CardKt$Card$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/CardKt$Card$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/CardKt$Card$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/CardKt$Card$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/ChipKt$Chip$1; HSPLandroidx/compose/material3/ChipKt$Chip$1;->()V PLandroidx/compose/material3/ChipKt$Chip$1;->()V HSPLandroidx/compose/material3/ChipKt$Chip$1;->(I)V PLandroidx/compose/material3/ChipKt$Chip$1;->(I)V HSPLandroidx/compose/material3/ChipKt$Chip$1;->invoke(Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;)V PLandroidx/compose/material3/ChipKt$Chip$1;->invoke(Landroidx/compose/animation/core/KeyframesSpec$KeyframesSpecConfig;)V HSPLandroidx/compose/material3/ChipKt$Chip$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V PLandroidx/compose/material3/ChipKt$Chip$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/material3/ChipKt$Chip$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/ChipKt$Chip$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/ColorScheme; HSPLandroidx/compose/material3/ColorScheme;->(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)V HPLandroidx/compose/material3/ColorScheme;->(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ)V HSPLandroidx/compose/material3/ColorScheme;->getBackground-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getBackground-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getError-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getError-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getErrorContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getErrorContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getInverseOnSurface-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getInverseOnSurface-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getInversePrimary-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getInversePrimary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getInverseSurface-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getInverseSurface-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnBackground-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getOnBackground-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnError-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnError-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnErrorContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnErrorContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnPrimary-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnPrimary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnPrimaryContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnPrimaryContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnSecondary-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnSecondary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnSecondaryContainer-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getOnSecondaryContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnSurface-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getOnSurface-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnSurfaceVariant-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnSurfaceVariant-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnTertiary-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnTertiary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOnTertiaryContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOnTertiaryContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOutline-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOutline-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getOutlineVariant-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getOutlineVariant-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getPrimary-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getPrimary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getPrimaryContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getPrimaryContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getScrim-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getScrim-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSecondary-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getSecondary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSecondaryContainer-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getSecondaryContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurface-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getSurface-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceBright-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceBright-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceContainerHigh-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceContainerHigh-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceContainerHighest-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceContainerHighest-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceContainerLow-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceContainerLow-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceContainerLowest-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceContainerLowest-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceDim-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceDim-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceTint-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getSurfaceTint-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getSurfaceVariant-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getSurfaceVariant-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getTertiary-0d7_KjU()J HPLandroidx/compose/material3/ColorScheme;->getTertiary-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->getTertiaryContainer-0d7_KjU()J PLandroidx/compose/material3/ColorScheme;->getTertiaryContainer-0d7_KjU()J HSPLandroidx/compose/material3/ColorScheme;->setBackground-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setBackground-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setError-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setError-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setErrorContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setErrorContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setInverseOnSurface-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setInverseOnSurface-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setInversePrimary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setInversePrimary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setInverseSurface-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setInverseSurface-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnBackground-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnBackground-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnError-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnError-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnErrorContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnErrorContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnPrimary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnPrimary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnPrimaryContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnPrimaryContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnSecondary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnSecondary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnSecondaryContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnSecondaryContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnSurface-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnSurface-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnSurfaceVariant-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnSurfaceVariant-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnTertiary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnTertiary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOnTertiaryContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOnTertiaryContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOutline-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOutline-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setOutlineVariant-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setOutlineVariant-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setPrimary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setPrimary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setPrimaryContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setPrimaryContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setScrim-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setScrim-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSecondary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSecondary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSecondaryContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSecondaryContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurface-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurface-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceBright-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceBright-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceContainer-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceContainerHigh-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceContainerHigh-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceContainerHighest-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceContainerHighest-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceContainerLow-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceContainerLow-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceContainerLowest-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceContainerLowest-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceDim-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceDim-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceTint-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceTint-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setSurfaceVariant-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setSurfaceVariant-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setTertiary-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setTertiary-8_81llA$material3_release(J)V HSPLandroidx/compose/material3/ColorScheme;->setTertiaryContainer-8_81llA$material3_release(J)V PLandroidx/compose/material3/ColorScheme;->setTertiaryContainer-8_81llA$material3_release(J)V Landroidx/compose/material3/ColorSchemeKt; HSPLandroidx/compose/material3/ColorSchemeKt;->()V PLandroidx/compose/material3/ColorSchemeKt;->()V HSPLandroidx/compose/material3/ColorSchemeKt;->applyTonalElevation-RFCenO8(Landroidx/compose/material3/ColorScheme;JFLandroidx/compose/runtime/Composer;)J HPLandroidx/compose/material3/ColorSchemeKt;->applyTonalElevation-RFCenO8(Landroidx/compose/material3/ColorScheme;JFLandroidx/compose/runtime/Composer;)J HSPLandroidx/compose/material3/ColorSchemeKt;->contentColorFor-4WTKRHQ(Landroidx/compose/material3/ColorScheme;J)J HPLandroidx/compose/material3/ColorSchemeKt;->contentColorFor-4WTKRHQ(Landroidx/compose/material3/ColorScheme;J)J HSPLandroidx/compose/material3/ColorSchemeKt;->contentColorFor-ek8zF_U(JLandroidx/compose/runtime/Composer;)J HPLandroidx/compose/material3/ColorSchemeKt;->contentColorFor-ek8zF_U(JLandroidx/compose/runtime/Composer;)J HSPLandroidx/compose/material3/ColorSchemeKt;->fromToken(Landroidx/compose/material3/ColorScheme;I)J HPLandroidx/compose/material3/ColorSchemeKt;->fromToken(Landroidx/compose/material3/ColorScheme;I)J HSPLandroidx/compose/material3/ColorSchemeKt;->getLocalColorScheme()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/material3/ColorSchemeKt;->getLocalColorScheme()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/material3/ColorSchemeKt;->getValue(ILandroidx/compose/runtime/Composer;)J HPLandroidx/compose/material3/ColorSchemeKt;->getValue(ILandroidx/compose/runtime/Composer;)J HSPLandroidx/compose/material3/ColorSchemeKt;->lightColorScheme-C-Xl9yA$default(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJI)Landroidx/compose/material3/ColorScheme; PLandroidx/compose/material3/ColorSchemeKt;->lightColorScheme-C-Xl9yA$default(JJJJJJJJJJJJJJJJJJJJJJJJJJJJJI)Landroidx/compose/material3/ColorScheme; HSPLandroidx/compose/material3/ColorSchemeKt;->surfaceColorAtElevation-3ABfNKs(Landroidx/compose/material3/ColorScheme;F)J HPLandroidx/compose/material3/ColorSchemeKt;->surfaceColorAtElevation-3ABfNKs(Landroidx/compose/material3/ColorScheme;F)J Landroidx/compose/material3/ComposableSingletons$SnackbarHostKt; HSPLandroidx/compose/material3/ComposableSingletons$SnackbarHostKt;->()V PLandroidx/compose/material3/ComposableSingletons$SnackbarHostKt;->()V Landroidx/compose/material3/ContentColorKt; HSPLandroidx/compose/material3/ContentColorKt;->()V PLandroidx/compose/material3/ContentColorKt;->()V HSPLandroidx/compose/material3/ContentColorKt;->getLocalContentColor()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/material3/ContentColorKt;->getLocalContentColor()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Landroidx/compose/material3/DateInputKt$DateInputContent$2; HSPLandroidx/compose/material3/DateInputKt$DateInputContent$2;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/material3/DateInputKt$DateInputContent$2;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/material3/DateInputKt$DateInputContent$2;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/DateInputKt$DateInputContent$2;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/DateInputKt$DateInputContent$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/DateInputKt$DateInputContent$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/DatePickerKt$Day$1$1; HSPLandroidx/compose/material3/DatePickerKt$Day$1$1;->(Ljava/lang/String;I)V PLandroidx/compose/material3/DatePickerKt$Day$1$1;->(Ljava/lang/String;I)V HSPLandroidx/compose/material3/DatePickerKt$Day$1$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V PLandroidx/compose/material3/DatePickerKt$Day$1$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/material3/DatePickerKt$Day$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/DatePickerKt$Day$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/DatePickerKt$WeekDays$2; HSPLandroidx/compose/material3/DatePickerKt$WeekDays$2;->(IILjava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/material3/DatePickerKt$WeekDays$2;->(IILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/material3/DatePickerKt$WeekDays$2;->invoke(Landroidx/compose/runtime/Composer;I)V PLandroidx/compose/material3/DatePickerKt$WeekDays$2;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/DatePickerKt$WeekDays$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/DatePickerKt$WeekDays$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/DefaultPlatformTextStyle_androidKt; HSPLandroidx/compose/material3/DefaultPlatformTextStyle_androidKt;->()V PLandroidx/compose/material3/DefaultPlatformTextStyle_androidKt;->()V HSPLandroidx/compose/material3/DefaultPlatformTextStyle_androidKt;->defaultPlatformTextStyle()Landroidx/compose/ui/text/PlatformTextStyle; PLandroidx/compose/material3/DefaultPlatformTextStyle_androidKt;->defaultPlatformTextStyle()Landroidx/compose/ui/text/PlatformTextStyle; Landroidx/compose/material3/DividerDefaults; HSPLandroidx/compose/material3/DividerDefaults;->()V PLandroidx/compose/material3/DividerDefaults;->()V HSPLandroidx/compose/material3/DividerDefaults;->getColor(Landroidx/compose/runtime/Composer;)J PLandroidx/compose/material3/DividerDefaults;->getColor(Landroidx/compose/runtime/Composer;)J HSPLandroidx/compose/material3/DividerDefaults;->getThickness-D9Ej5fM()F PLandroidx/compose/material3/DividerDefaults;->getThickness-D9Ej5fM()F Landroidx/compose/material3/DividerKt$VerticalDivider$1$1; HSPLandroidx/compose/material3/DividerKt$VerticalDivider$1$1;->(FJI)V PLandroidx/compose/material3/DividerKt$VerticalDivider$1$1;->(FJI)V HSPLandroidx/compose/material3/DividerKt$VerticalDivider$1$1;->invoke(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HPLandroidx/compose/material3/DividerKt$VerticalDivider$1$1;->invoke(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HSPLandroidx/compose/material3/DividerKt$VerticalDivider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/DividerKt$VerticalDivider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/DividerKt$VerticalDivider$2; HSPLandroidx/compose/material3/DividerKt$VerticalDivider$2;->(Landroidx/compose/ui/Modifier;FJIII)V PLandroidx/compose/material3/DividerKt$VerticalDivider$2;->(Landroidx/compose/ui/Modifier;FJIII)V Landroidx/compose/material3/ExposedDropdownMenuKt$expandable$2$1$1; HSPLandroidx/compose/material3/ExposedDropdownMenuKt$expandable$2$1$1;->(Lkotlin/jvm/functions/Function0;I)V PLandroidx/compose/material3/ExposedDropdownMenuKt$expandable$2$1$1;->(Lkotlin/jvm/functions/Function0;I)V Landroidx/compose/material3/FadeInFadeOutState; HSPLandroidx/compose/material3/FadeInFadeOutState;->()V PLandroidx/compose/material3/FadeInFadeOutState;->()V HSPLandroidx/compose/material3/FadeInFadeOutState;->getCurrent()Ljava/lang/Object; PLandroidx/compose/material3/FadeInFadeOutState;->getCurrent()Ljava/lang/Object; HSPLandroidx/compose/material3/FadeInFadeOutState;->getItems()Ljava/util/ArrayList; PLandroidx/compose/material3/FadeInFadeOutState;->getItems()Ljava/util/ArrayList; HSPLandroidx/compose/material3/FadeInFadeOutState;->setCurrent(Ljava/lang/Object;)V PLandroidx/compose/material3/FadeInFadeOutState;->setCurrent(Ljava/lang/Object;)V HSPLandroidx/compose/material3/FadeInFadeOutState;->setScope(Landroidx/compose/runtime/RecomposeScopeImpl;)V PLandroidx/compose/material3/FadeInFadeOutState;->setScope(Landroidx/compose/runtime/RecomposeScopeImpl;)V Landroidx/compose/material3/IconButtonColors; HSPLandroidx/compose/material3/IconButtonColors;->(JJJJ)V PLandroidx/compose/material3/IconButtonColors;->(JJJJ)V HSPLandroidx/compose/material3/IconButtonColors;->containerColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/IconButtonColors;->containerColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/material3/IconButtonColors;->contentColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/IconButtonColors;->contentColor$material3_release(ZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; Landroidx/compose/material3/IconButtonKt$IconButton$3; HSPLandroidx/compose/material3/IconButtonKt$IconButton$3;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function2;II)V PLandroidx/compose/material3/IconButtonKt$IconButton$3;->(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/IconButtonColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function2;II)V Landroidx/compose/material3/IconKt; HSPLandroidx/compose/material3/IconKt;->()V PLandroidx/compose/material3/IconKt;->()V HSPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/IconKt;->Icon-ww6aTOc(Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;Landroidx/compose/ui/Modifier;JLandroidx/compose/runtime/Composer;II)V Landroidx/compose/material3/IconKt$Icon$1; HSPLandroidx/compose/material3/IconKt$Icon$1;->(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/Modifier;JIII)V PLandroidx/compose/material3/IconKt$Icon$1;->(Ljava/lang/Object;Ljava/lang/String;Landroidx/compose/ui/Modifier;JIII)V HSPLandroidx/compose/material3/IconKt$Icon$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/IconKt$Icon$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/IconKt$Icon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/IconKt$Icon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/InteractiveComponentSizeKt; HSPLandroidx/compose/material3/InteractiveComponentSizeKt;->()V PLandroidx/compose/material3/InteractiveComponentSizeKt;->()V HSPLandroidx/compose/material3/InteractiveComponentSizeKt;->access$getMinimumInteractiveComponentSize$p()J PLandroidx/compose/material3/InteractiveComponentSizeKt;->access$getMinimumInteractiveComponentSize$p()J HSPLandroidx/compose/material3/InteractiveComponentSizeKt;->getLocalMinimumInteractiveComponentEnforcement()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/material3/InteractiveComponentSizeKt;->getLocalMinimumInteractiveComponentEnforcement()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/material3/InteractiveComponentSizeKt;->minimumInteractiveComponentSize(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; PLandroidx/compose/material3/InteractiveComponentSizeKt;->minimumInteractiveComponentSize(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Landroidx/compose/material3/MappedInteractionSource; HSPLandroidx/compose/material3/MappedInteractionSource;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;J)V HPLandroidx/compose/material3/MappedInteractionSource;->(Landroidx/compose/foundation/interaction/MutableInteractionSource;J)V HSPLandroidx/compose/material3/MappedInteractionSource;->access$getMappedPresses$p(Landroidx/compose/material3/MappedInteractionSource;)Ljava/util/LinkedHashMap; PLandroidx/compose/material3/MappedInteractionSource;->access$getMappedPresses$p(Landroidx/compose/material3/MappedInteractionSource;)Ljava/util/LinkedHashMap; HSPLandroidx/compose/material3/MappedInteractionSource;->access$mapPress(Landroidx/compose/material3/MappedInteractionSource;Landroidx/compose/foundation/interaction/PressInteraction$Press;)Landroidx/compose/foundation/interaction/PressInteraction$Press; PLandroidx/compose/material3/MappedInteractionSource;->access$mapPress(Landroidx/compose/material3/MappedInteractionSource;Landroidx/compose/foundation/interaction/PressInteraction$Press;)Landroidx/compose/foundation/interaction/PressInteraction$Press; HSPLandroidx/compose/material3/MappedInteractionSource;->getInteractions()Lkotlinx/coroutines/flow/Flow; PLandroidx/compose/material3/MappedInteractionSource;->getInteractions()Lkotlinx/coroutines/flow/Flow; Landroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1; HSPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;Landroidx/compose/material3/MappedInteractionSource;)V HPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;Landroidx/compose/material3/MappedInteractionSource;)V HSPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2; HSPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Landroidx/compose/material3/MappedInteractionSource;)V PLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Landroidx/compose/material3/MappedInteractionSource;)V HSPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2$1; HSPLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2$1;->(Landroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2$1;->(Landroidx/compose/material3/MappedInteractionSource$special$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Landroidx/compose/material3/MaterialRippleTheme; HSPLandroidx/compose/material3/MaterialRippleTheme;->()V PLandroidx/compose/material3/MaterialRippleTheme;->()V HSPLandroidx/compose/material3/MaterialRippleTheme;->()V PLandroidx/compose/material3/MaterialRippleTheme;->()V HSPLandroidx/compose/material3/MaterialRippleTheme;->defaultColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J PLandroidx/compose/material3/MaterialRippleTheme;->defaultColor-WaAFU9c(Landroidx/compose/runtime/Composer;)J HSPLandroidx/compose/material3/MaterialRippleTheme;->rippleAlpha(Landroidx/compose/runtime/Composer;)Landroidx/compose/material/ripple/RippleAlpha; PLandroidx/compose/material3/MaterialRippleTheme;->rippleAlpha(Landroidx/compose/runtime/Composer;)Landroidx/compose/material/ripple/RippleAlpha; Landroidx/compose/material3/MaterialTheme; HSPLandroidx/compose/material3/MaterialTheme;->()V PLandroidx/compose/material3/MaterialTheme;->()V HSPLandroidx/compose/material3/MaterialTheme;->()V PLandroidx/compose/material3/MaterialTheme;->()V HSPLandroidx/compose/material3/MaterialTheme;->getTypography(Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/Typography; HPLandroidx/compose/material3/MaterialTheme;->getTypography(Landroidx/compose/runtime/Composer;)Landroidx/compose/material3/Typography; Landroidx/compose/material3/MaterialThemeKt$MaterialTheme$2; HSPLandroidx/compose/material3/MaterialThemeKt$MaterialTheme$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;III)V PLandroidx/compose/material3/MaterialThemeKt$MaterialTheme$2;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;III)V Landroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m$1(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m$1(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(FF)Landroidx/compose/ui/graphics/vector/PathBuilder; PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(FF)Landroidx/compose/ui/graphics/vector/PathBuilder; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(ILkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;)V HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(ILkotlin/jvm/functions/Function2;Landroidx/compose/runtime/ComposerImpl;)V PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(JII)I HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(JLandroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(JLandroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/foundation/layout/Arrangement$Top$1;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/foundation/layout/Arrangement$Top$1;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;)V HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;)V HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;I)Ljava/lang/Object; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;I)Ljava/lang/Object; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;ILandroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;ILandroidx/compose/ui/BiasAlignment$Vertical;Landroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;IZLandroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/runtime/ComposerImpl;IZLandroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/ui/graphics/vector/PathBuilder;FFFF)V PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Landroidx/compose/ui/graphics/vector/PathBuilder;FFFF)V HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)Lkotlin/reflect/KMutableProperty1; PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)Lkotlin/reflect/KMutableProperty1; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Ljava/lang/StringBuilder; PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Ljava/lang/StringBuilder; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(ZLandroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; HPLandroidx/compose/material3/MenuKt$$ExternalSyntheticOutline0;->m(ZLandroidx/compose/runtime/ComposerImpl;I)Landroidx/compose/ui/layout/MeasurePolicy; Landroidx/compose/material3/MinimumInteractiveComponentSizeModifier; HSPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier;->(J)V HPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier;->(J)V HSPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/material3/MinimumInteractiveComponentSizeModifier$measure$1; HSPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier$measure$1;->(IILandroidx/compose/ui/layout/Placeable;)V PLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier$measure$1;->(IILandroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/MinimumInteractiveComponentSizeModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/NavigationBarDefaults; HSPLandroidx/compose/material3/NavigationBarDefaults;->()V PLandroidx/compose/material3/NavigationBarDefaults;->()V HSPLandroidx/compose/material3/NavigationBarDefaults;->getElevation-D9Ej5fM()F PLandroidx/compose/material3/NavigationBarDefaults;->getElevation-D9Ej5fM()F HSPLandroidx/compose/material3/NavigationBarDefaults;->getWindowInsets(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/WindowInsets; PLandroidx/compose/material3/NavigationBarDefaults;->getWindowInsets(Landroidx/compose/runtime/Composer;)Landroidx/compose/foundation/layout/WindowInsets; Landroidx/compose/material3/NavigationBarItemColors; HSPLandroidx/compose/material3/NavigationBarItemColors;->(JJJJJJJ)V HPLandroidx/compose/material3/NavigationBarItemColors;->(JJJJJJJ)V HSPLandroidx/compose/material3/NavigationBarItemColors;->getIndicatorColor-0d7_KjU$material3_release()J PLandroidx/compose/material3/NavigationBarItemColors;->getIndicatorColor-0d7_KjU$material3_release()J HSPLandroidx/compose/material3/NavigationBarItemColors;->iconColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/State; HPLandroidx/compose/material3/NavigationBarItemColors;->iconColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/State; HSPLandroidx/compose/material3/NavigationBarItemColors;->textColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/State; HPLandroidx/compose/material3/NavigationBarItemColors;->textColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/State; Landroidx/compose/material3/NavigationBarKt; HSPLandroidx/compose/material3/NavigationBarKt;->()V PLandroidx/compose/material3/NavigationBarKt;->()V HSPLandroidx/compose/material3/NavigationBarKt;->NavigationBarItem(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/NavigationBarItemColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/NavigationBarKt;->NavigationBarItem(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/NavigationBarItemColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/NavigationBarKt;->NavigationBarItemLayout(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;ZFLandroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/NavigationBarKt;->NavigationBarItemLayout(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;ZFLandroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/NavigationBarKt;->access$NavigationBarItem$lambda$9$lambda$6(Landroidx/compose/runtime/State;)F HPLandroidx/compose/material3/NavigationBarKt;->access$NavigationBarItem$lambda$9$lambda$6(Landroidx/compose/runtime/State;)F HSPLandroidx/compose/material3/NavigationBarKt;->access$getIndicatorHorizontalPadding$p()F PLandroidx/compose/material3/NavigationBarKt;->access$getIndicatorHorizontalPadding$p()F HSPLandroidx/compose/material3/NavigationBarKt;->access$placeLabelAndIcon-zUg2_y0(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;JZF)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/material3/NavigationBarKt;->access$placeLabelAndIcon-zUg2_y0(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/layout/Placeable;JZF)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/material3/NavigationBarKt;->getIndicatorVerticalPadding()F PLandroidx/compose/material3/NavigationBarKt;->getIndicatorVerticalPadding()F Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$1; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$1;->(Landroidx/compose/runtime/MutableIntState;I)V HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$1;->(Landroidx/compose/runtime/MutableIntState;I)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$4; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$4;->(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/NavigationBarItemColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;II)V HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$4;->(Landroidx/compose/foundation/layout/RowScope;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/NavigationBarItemColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;II)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->(Ljava/lang/Object;ZZILkotlin/jvm/functions/Function2;ZLkotlin/jvm/functions/Function2;I)V HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->(Ljava/lang/Object;ZZILkotlin/jvm/functions/Function2;ZLkotlin/jvm/functions/Function2;I)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledIcon$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1;->(Ljava/lang/Object;ZZILkotlin/jvm/functions/Function2;I)V HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1;->(Ljava/lang/Object;ZZILkotlin/jvm/functions/Function2;I)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItem$styledLabel$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2; HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2;->(FLkotlin/jvm/functions/Function2;ZI)V PLandroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2;->(FLkotlin/jvm/functions/Function2;ZI)V HSPLandroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$2;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/material3/NavigationBarKt$NavigationBarItemLayout$3; Landroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1; HSPLandroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1;->(Landroidx/compose/ui/layout/Placeable;ZFLandroidx/compose/ui/layout/Placeable;IFFLandroidx/compose/ui/layout/Placeable;IFLandroidx/compose/ui/layout/Placeable;IFILandroidx/compose/ui/layout/MeasureScope;I)V HPLandroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1;->(Landroidx/compose/ui/layout/Placeable;ZFLandroidx/compose/ui/layout/Placeable;IFFLandroidx/compose/ui/layout/Placeable;IFLandroidx/compose/ui/layout/Placeable;IFILandroidx/compose/ui/layout/MeasureScope;I)V HSPLandroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HPLandroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/NavigationBarKt$placeLabelAndIcon$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/NavigationRailItemColors; Landroidx/compose/material3/NavigationRailKt; Landroidx/compose/material3/PinnedScrollBehavior; HSPLandroidx/compose/material3/PinnedScrollBehavior;->(Landroidx/compose/material3/TopAppBarState;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/material3/PinnedScrollBehavior;->(Landroidx/compose/material3/TopAppBarState;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/material3/PinnedScrollBehavior;->getNestedScrollConnection()Landroidx/compose/material3/PinnedScrollBehavior$nestedScrollConnection$1; PLandroidx/compose/material3/PinnedScrollBehavior;->getNestedScrollConnection()Landroidx/compose/material3/PinnedScrollBehavior$nestedScrollConnection$1; HSPLandroidx/compose/material3/PinnedScrollBehavior;->getState()Landroidx/compose/material3/TopAppBarState; PLandroidx/compose/material3/PinnedScrollBehavior;->getState()Landroidx/compose/material3/TopAppBarState; Landroidx/compose/material3/PinnedScrollBehavior$nestedScrollConnection$1; HSPLandroidx/compose/material3/PinnedScrollBehavior$nestedScrollConnection$1;->(Landroidx/compose/material3/PinnedScrollBehavior;)V HPLandroidx/compose/material3/PinnedScrollBehavior$nestedScrollConnection$1;->(Landroidx/compose/material3/PinnedScrollBehavior;)V Landroidx/compose/material3/PlainTooltipPositionProvider; HSPLandroidx/compose/material3/PlainTooltipPositionProvider;->(I)V HPLandroidx/compose/material3/PlainTooltipPositionProvider;->(I)V Landroidx/compose/material3/PlainTooltipState; Landroidx/compose/material3/PlainTooltipStateImpl; HSPLandroidx/compose/material3/PlainTooltipStateImpl;->(Landroidx/compose/foundation/MutatorMutex;)V HPLandroidx/compose/material3/PlainTooltipStateImpl;->(Landroidx/compose/foundation/MutatorMutex;)V HSPLandroidx/compose/material3/PlainTooltipStateImpl;->isVisible()Z HPLandroidx/compose/material3/PlainTooltipStateImpl;->isVisible()Z HSPLandroidx/compose/material3/PlainTooltipStateImpl;->onDispose()V PLandroidx/compose/material3/PlainTooltipStateImpl;->onDispose()V Landroidx/compose/material3/ProgressIndicatorDefaults; HSPLandroidx/compose/material3/ProgressIndicatorDefaults;->()V PLandroidx/compose/material3/ProgressIndicatorDefaults;->()V HSPLandroidx/compose/material3/ProgressIndicatorDefaults;->getCircularIndeterminateStrokeCap-KaPHkGw()I PLandroidx/compose/material3/ProgressIndicatorDefaults;->getCircularIndeterminateStrokeCap-KaPHkGw()I HSPLandroidx/compose/material3/ProgressIndicatorDefaults;->getCircularStrokeWidth-D9Ej5fM()F PLandroidx/compose/material3/ProgressIndicatorDefaults;->getCircularStrokeWidth-D9Ej5fM()F Landroidx/compose/material3/ProgressIndicatorKt; HSPLandroidx/compose/material3/ProgressIndicatorKt;->()V PLandroidx/compose/material3/ProgressIndicatorKt;->()V HSPLandroidx/compose/material3/ProgressIndicatorKt;->CircularProgressIndicator-LxG7B9w(FIIIJJLandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)V PLandroidx/compose/material3/ProgressIndicatorKt;->CircularProgressIndicator-LxG7B9w(FIIIJJLandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)V HSPLandroidx/compose/material3/ProgressIndicatorKt;->access$drawCircularIndicatorTrack-bw27NRU(Landroidx/compose/ui/graphics/drawscope/DrawScope;JLandroidx/compose/ui/graphics/drawscope/Stroke;)V PLandroidx/compose/material3/ProgressIndicatorKt;->access$drawCircularIndicatorTrack-bw27NRU(Landroidx/compose/ui/graphics/drawscope/DrawScope;JLandroidx/compose/ui/graphics/drawscope/Stroke;)V HSPLandroidx/compose/material3/ProgressIndicatorKt;->access$drawIndeterminateCircularIndicator-hrjfTZI(Landroidx/compose/ui/graphics/drawscope/DrawScope;FFFJLandroidx/compose/ui/graphics/drawscope/Stroke;)V PLandroidx/compose/material3/ProgressIndicatorKt;->access$drawIndeterminateCircularIndicator-hrjfTZI(Landroidx/compose/ui/graphics/drawscope/DrawScope;FFFJLandroidx/compose/ui/graphics/drawscope/Stroke;)V HSPLandroidx/compose/material3/ProgressIndicatorKt;->access$getCircularEasing$p()Landroidx/compose/animation/core/CubicBezierEasing; PLandroidx/compose/material3/ProgressIndicatorKt;->access$getCircularEasing$p()Landroidx/compose/animation/core/CubicBezierEasing; HSPLandroidx/compose/material3/ProgressIndicatorKt;->drawCircularIndicator-42QJj7c(Landroidx/compose/ui/graphics/drawscope/DrawScope;FFJLandroidx/compose/ui/graphics/drawscope/Stroke;)V PLandroidx/compose/material3/ProgressIndicatorKt;->drawCircularIndicator-42QJj7c(Landroidx/compose/ui/graphics/drawscope/DrawScope;FFJLandroidx/compose/ui/graphics/drawscope/Stroke;)V Landroidx/compose/material3/ProgressIndicatorKt$CircularProgressIndicator$3; HSPLandroidx/compose/material3/ProgressIndicatorKt$CircularProgressIndicator$3;->(FJJLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/ui/graphics/drawscope/Stroke;)V PLandroidx/compose/material3/ProgressIndicatorKt$CircularProgressIndicator$3;->(FJJLandroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/animation/core/InfiniteTransition$TransitionAnimationState;Landroidx/compose/ui/graphics/drawscope/Stroke;)V HSPLandroidx/compose/material3/ProgressIndicatorKt$CircularProgressIndicator$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/ProgressIndicatorKt$CircularProgressIndicator$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/ProgressIndicatorKt$LinearProgressIndicator$2; HSPLandroidx/compose/material3/ProgressIndicatorKt$LinearProgressIndicator$2;->(Landroidx/compose/ui/Modifier;JFJIII)V PLandroidx/compose/material3/ProgressIndicatorKt$LinearProgressIndicator$2;->(Landroidx/compose/ui/Modifier;JFJIII)V Landroidx/compose/material3/ScaffoldKt$Scaffold$1$1; HSPLandroidx/compose/material3/ScaffoldKt$Scaffold$1$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/material3/ScaffoldKt$Scaffold$1$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/material3/ScaffoldKt$Scaffold$1$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V PLandroidx/compose/material3/ScaffoldKt$Scaffold$1$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/material3/ScaffoldKt$Scaffold$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/ScaffoldKt$Scaffold$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/ShapeDefaults; HSPLandroidx/compose/material3/ShapeDefaults;->()V PLandroidx/compose/material3/ShapeDefaults;->()V HSPLandroidx/compose/material3/ShapeDefaults;->getExtraLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/ShapeDefaults;->getExtraLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/ShapeDefaults;->getExtraSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/ShapeDefaults;->getExtraSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/ShapeDefaults;->getLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/ShapeDefaults;->getLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/ShapeDefaults;->getMedium()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/ShapeDefaults;->getMedium()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/ShapeDefaults;->getSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/ShapeDefaults;->getSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; Landroidx/compose/material3/Shapes; HSPLandroidx/compose/material3/Shapes;->()V PLandroidx/compose/material3/Shapes;->()V HSPLandroidx/compose/material3/Shapes;->(Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;)V PLandroidx/compose/material3/Shapes;->(Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;Landroidx/compose/foundation/shape/CornerBasedShape;)V HSPLandroidx/compose/material3/Shapes;->getExtraLarge()Landroidx/compose/foundation/shape/CornerBasedShape; PLandroidx/compose/material3/Shapes;->getExtraLarge()Landroidx/compose/foundation/shape/CornerBasedShape; HSPLandroidx/compose/material3/Shapes;->getExtraSmall()Landroidx/compose/foundation/shape/CornerBasedShape; PLandroidx/compose/material3/Shapes;->getExtraSmall()Landroidx/compose/foundation/shape/CornerBasedShape; HSPLandroidx/compose/material3/Shapes;->getLarge()Landroidx/compose/foundation/shape/CornerBasedShape; PLandroidx/compose/material3/Shapes;->getLarge()Landroidx/compose/foundation/shape/CornerBasedShape; HSPLandroidx/compose/material3/Shapes;->getMedium()Landroidx/compose/foundation/shape/CornerBasedShape; PLandroidx/compose/material3/Shapes;->getMedium()Landroidx/compose/foundation/shape/CornerBasedShape; HSPLandroidx/compose/material3/Shapes;->getSmall()Landroidx/compose/foundation/shape/CornerBasedShape; PLandroidx/compose/material3/Shapes;->getSmall()Landroidx/compose/foundation/shape/CornerBasedShape; Landroidx/compose/material3/ShapesKt; HSPLandroidx/compose/material3/ShapesKt;->()V PLandroidx/compose/material3/ShapesKt;->()V HSPLandroidx/compose/material3/ShapesKt;->getLocalShapes()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/material3/ShapesKt;->getLocalShapes()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/material3/ShapesKt;->getValue(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/Shape; HPLandroidx/compose/material3/ShapesKt;->getValue(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/Shape; Landroidx/compose/material3/ShapesKt$LocalShapes$1; HSPLandroidx/compose/material3/ShapesKt$LocalShapes$1;->()V PLandroidx/compose/material3/ShapesKt$LocalShapes$1;->()V HSPLandroidx/compose/material3/ShapesKt$LocalShapes$1;->(I)V PLandroidx/compose/material3/ShapesKt$LocalShapes$1;->(I)V HSPLandroidx/compose/material3/ShapesKt$LocalShapes$1;->invoke()Ljava/lang/Object; PLandroidx/compose/material3/ShapesKt$LocalShapes$1;->invoke()Ljava/lang/Object; Landroidx/compose/material3/SnackbarData; Landroidx/compose/material3/SnackbarHostKt$SnackbarHost$1; HSPLandroidx/compose/material3/SnackbarHostKt$SnackbarHost$1;->(Landroidx/compose/material3/SnackbarData;Landroidx/compose/ui/platform/AccessibilityManager;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/material3/SnackbarHostKt$SnackbarHost$1;->(Landroidx/compose/material3/SnackbarData;Landroidx/compose/ui/platform/AccessibilityManager;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/material3/SnackbarHostKt$SnackbarHost$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/material3/SnackbarHostKt$SnackbarHost$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/material3/SnackbarHostKt$SnackbarHost$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/SnackbarHostKt$SnackbarHost$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SnackbarHostState; HSPLandroidx/compose/material3/SnackbarHostState;->()V PLandroidx/compose/material3/SnackbarHostState;->()V HSPLandroidx/compose/material3/SnackbarHostState;->getCurrentSnackbarData()Landroidx/compose/material3/SnackbarData; PLandroidx/compose/material3/SnackbarHostState;->getCurrentSnackbarData()Landroidx/compose/material3/SnackbarData; Landroidx/compose/material3/SnackbarKt$Snackbar$3; HSPLandroidx/compose/material3/SnackbarKt$Snackbar$3;->(Ljava/lang/Object;I)V HPLandroidx/compose/material3/SnackbarKt$Snackbar$3;->(Ljava/lang/Object;I)V HSPLandroidx/compose/material3/SnackbarKt$Snackbar$3;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/SnackbarKt$Snackbar$3;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/SnackbarKt$Snackbar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/SnackbarKt$Snackbar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SurfaceKt; HSPLandroidx/compose/material3/SurfaceKt;->()V PLandroidx/compose/material3/SurfaceKt;->()V HSPLandroidx/compose/material3/SurfaceKt;->Surface-T9BRK9s(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JJFFLandroidx/compose/foundation/BorderStroke;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/SurfaceKt;->Surface-T9BRK9s(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JJFFLandroidx/compose/foundation/BorderStroke;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/SurfaceKt;->Surface-o_FOJdg(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;JJFFLandroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/SurfaceKt;->Surface-o_FOJdg(Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;JJFFLandroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/SurfaceKt;->access$surface-8ww4TTg(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JLandroidx/compose/foundation/BorderStroke;F)Landroidx/compose/ui/Modifier; PLandroidx/compose/material3/SurfaceKt;->access$surface-8ww4TTg(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JLandroidx/compose/foundation/BorderStroke;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/material3/SurfaceKt;->access$surfaceColorAtElevation-CLU3JFs(JFLandroidx/compose/runtime/Composer;I)J PLandroidx/compose/material3/SurfaceKt;->access$surfaceColorAtElevation-CLU3JFs(JFLandroidx/compose/runtime/Composer;I)J Landroidx/compose/material3/SurfaceKt$Surface$1; HSPLandroidx/compose/material3/SurfaceKt$Surface$1;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFILandroidx/compose/foundation/BorderStroke;FLkotlin/jvm/functions/Function2;)V PLandroidx/compose/material3/SurfaceKt$Surface$1;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFILandroidx/compose/foundation/BorderStroke;FLkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/material3/SurfaceKt$Surface$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/SurfaceKt$Surface$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SurfaceKt$Surface$1$2; HSPLandroidx/compose/material3/SurfaceKt$Surface$1$2;->(Lkotlin/coroutines/Continuation;)V PLandroidx/compose/material3/SurfaceKt$Surface$1$2;->(Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/material3/SurfaceKt$Surface$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/SurfaceKt$Surface$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/material3/SurfaceKt$Surface$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/SurfaceKt$Surface$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SurfaceKt$Surface$3; HSPLandroidx/compose/material3/SurfaceKt$Surface$3;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFILandroidx/compose/foundation/BorderStroke;FLandroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLandroidx/compose/material3/SurfaceKt$Surface$3;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;JFILandroidx/compose/foundation/BorderStroke;FLandroidx/compose/foundation/interaction/MutableInteractionSource;ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/material3/SurfaceKt$Surface$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/SurfaceKt$Surface$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SwitchColors; HSPLandroidx/compose/material3/SwitchColors;->(JJJJJJJJJJJJJJJJ)V PLandroidx/compose/material3/SwitchColors;->(JJJJJJJJJJJJJJJJ)V HSPLandroidx/compose/material3/SwitchColors;->borderColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/SwitchColors;->borderColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/material3/SwitchColors;->thumbColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/SwitchColors;->thumbColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/material3/SwitchColors;->trackColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; PLandroidx/compose/material3/SwitchColors;->trackColor$material3_release(ZZLandroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; Landroidx/compose/material3/SwitchDefaults; HSPLandroidx/compose/material3/SwitchDefaults;->()V PLandroidx/compose/material3/SwitchDefaults;->()V Landroidx/compose/material3/SwitchKt; HSPLandroidx/compose/material3/SwitchKt;->()V PLandroidx/compose/material3/SwitchKt;->()V HSPLandroidx/compose/material3/SwitchKt;->Switch(ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/SwitchColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/SwitchKt;->Switch(ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/SwitchColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/SwitchKt;->SwitchImpl-0DmnUew(Landroidx/compose/foundation/layout/BoxScope;ZZLandroidx/compose/material3/SwitchColors;Landroidx/compose/runtime/State;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/ui/graphics/Shape;FFFLandroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/SwitchKt;->SwitchImpl-0DmnUew(Landroidx/compose/foundation/layout/BoxScope;ZZLandroidx/compose/material3/SwitchColors;Landroidx/compose/runtime/State;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/ui/graphics/Shape;FFFLandroidx/compose/runtime/Composer;II)V Landroidx/compose/material3/SwitchKt$Switch$2; HSPLandroidx/compose/material3/SwitchKt$Switch$2;->(Ljava/lang/Object;FI)V HPLandroidx/compose/material3/SwitchKt$Switch$2;->(Ljava/lang/Object;FI)V HSPLandroidx/compose/material3/SwitchKt$Switch$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/material3/SwitchKt$Switch$2;->invoke()Ljava/lang/Object; HSPLandroidx/compose/material3/SwitchKt$Switch$2;->invoke()V HPLandroidx/compose/material3/SwitchKt$Switch$2;->invoke()V Landroidx/compose/material3/SwitchKt$Switch$3; HSPLandroidx/compose/material3/SwitchKt$Switch$3;->(Landroidx/compose/animation/core/Animatable;FLkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/material3/SwitchKt$Switch$3;->(Landroidx/compose/animation/core/Animatable;FLkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/material3/SwitchKt$Switch$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/SwitchKt$Switch$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SwitchKt$Switch$3$invoke$$inlined$onDispose$1; HSPLandroidx/compose/material3/SwitchKt$Switch$3$invoke$$inlined$onDispose$1;->()V PLandroidx/compose/material3/SwitchKt$Switch$3$invoke$$inlined$onDispose$1;->()V PLandroidx/compose/material3/SwitchKt$Switch$3$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/material3/SwitchKt$Switch$5; HSPLandroidx/compose/material3/SwitchKt$Switch$5;->(ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/SwitchColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;II)V PLandroidx/compose/material3/SwitchKt$Switch$5;->(ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;ZLandroidx/compose/material3/SwitchColors;Landroidx/compose/foundation/interaction/MutableInteractionSource;II)V Landroidx/compose/material3/SwitchKt$Switch$valueToOffset$1$1; HSPLandroidx/compose/material3/SwitchKt$Switch$valueToOffset$1$1;->(FF)V PLandroidx/compose/material3/SwitchKt$Switch$valueToOffset$1$1;->(FF)V HSPLandroidx/compose/material3/SwitchKt$Switch$valueToOffset$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/SwitchKt$Switch$valueToOffset$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SwitchKt$SwitchImpl$1$1$1; HSPLandroidx/compose/material3/SwitchKt$SwitchImpl$1$1$1;->(F)V PLandroidx/compose/material3/SwitchKt$SwitchImpl$1$1$1;->(F)V HSPLandroidx/compose/material3/SwitchKt$SwitchImpl$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/SwitchKt$SwitchImpl$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/SwitchKt$SwitchImpl$2; HSPLandroidx/compose/material3/SwitchKt$SwitchImpl$2;->(Landroidx/compose/foundation/layout/BoxScope;ZZLandroidx/compose/material3/SwitchColors;Landroidx/compose/runtime/State;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/ui/graphics/Shape;FFFII)V PLandroidx/compose/material3/SwitchKt$SwitchImpl$2;->(Landroidx/compose/foundation/layout/BoxScope;ZZLandroidx/compose/material3/SwitchColors;Landroidx/compose/runtime/State;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/interaction/InteractionSource;Landroidx/compose/ui/graphics/Shape;FFFII)V Landroidx/compose/material3/TabKt$TabTransition$color$2; HSPLandroidx/compose/material3/TabKt$TabTransition$color$2;->()V PLandroidx/compose/material3/TabKt$TabTransition$color$2;->()V HSPLandroidx/compose/material3/TabKt$TabTransition$color$2;->(I)V PLandroidx/compose/material3/TabKt$TabTransition$color$2;->(I)V HSPLandroidx/compose/material3/TabKt$TabTransition$color$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/TabKt$TabTransition$color$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/TextKt; HSPLandroidx/compose/material3/TextKt;->()V PLandroidx/compose/material3/TextKt;->()V HSPLandroidx/compose/material3/TextKt;->ProvideTextStyle(Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/TextKt;->ProvideTextStyle(Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/TextKt;->Text--4IGK_g(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZIILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/Composer;III)V HPLandroidx/compose/material3/TextKt;->Text--4IGK_g(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZIILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/Composer;III)V HSPLandroidx/compose/material3/TextKt;->getLocalTextStyle()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/material3/TextKt;->getLocalTextStyle()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Landroidx/compose/material3/TextKt$ProvideTextStyle$1; HSPLandroidx/compose/material3/TextKt$ProvideTextStyle$1;->(Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;II)V HPLandroidx/compose/material3/TextKt$ProvideTextStyle$1;->(Landroidx/compose/ui/text/TextStyle;Lkotlin/jvm/functions/Function2;II)V HSPLandroidx/compose/material3/TextKt$ProvideTextStyle$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/TextKt$ProvideTextStyle$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/TextKt$ProvideTextStyle$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/TextKt$ProvideTextStyle$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/TextKt$Text$1; HSPLandroidx/compose/material3/TextKt$Text$1;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZIILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;III)V HPLandroidx/compose/material3/TextKt$Text$1;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZIILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;III)V HSPLandroidx/compose/material3/TextKt$Text$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/TextKt$Text$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/TooltipDefaults; HSPLandroidx/compose/material3/TooltipDefaults;->()V PLandroidx/compose/material3/TooltipDefaults;->()V HSPLandroidx/compose/material3/TooltipDefaults;->getGlobalMutatorMutex()Landroidx/compose/foundation/MutatorMutex; PLandroidx/compose/material3/TooltipDefaults;->getGlobalMutatorMutex()Landroidx/compose/foundation/MutatorMutex; Landroidx/compose/material3/TooltipKt; HSPLandroidx/compose/material3/TooltipKt;->()V PLandroidx/compose/material3/TooltipKt;->()V HSPLandroidx/compose/material3/TooltipKt;->PlainTooltipBox-EVJuX4I(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/PlainTooltipState;Landroidx/compose/ui/graphics/Shape;JJLkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/material3/TooltipKt;->PlainTooltipBox-EVJuX4I(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/PlainTooltipState;Landroidx/compose/ui/graphics/Shape;JJLkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/material3/TooltipKt;->TooltipBox-xJj0JzU(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/window/PopupPositionProvider;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/PlainTooltipState;JFFLkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/TooltipKt;->TooltipBox-xJj0JzU(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/window/PopupPositionProvider;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/PlainTooltipState;JFFLkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;I)V Landroidx/compose/material3/TooltipKt$PlainTooltipBox$1; HSPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$1;->(JLkotlin/jvm/functions/Function2;II)V HPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$1;->(JLkotlin/jvm/functions/Function2;II)V HSPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/TooltipKt$PlainTooltipBox$2; HSPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$2;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/PlainTooltipState;Landroidx/compose/ui/graphics/Shape;JJLkotlin/jvm/functions/Function3;II)V HPLandroidx/compose/material3/TooltipKt$PlainTooltipBox$2;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/Modifier;ZLandroidx/compose/material3/PlainTooltipState;Landroidx/compose/ui/graphics/Shape;JJLkotlin/jvm/functions/Function3;II)V Landroidx/compose/material3/TooltipKt$TooltipBox$1$1; HSPLandroidx/compose/material3/TooltipKt$TooltipBox$1$1;->(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/PlainTooltipState;)V HPLandroidx/compose/material3/TooltipKt$TooltipBox$1$1;->(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/PlainTooltipState;)V Landroidx/compose/material3/TooltipKt$TooltipBox$2$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/material3/TooltipKt$TooltipBox$2$1$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;I)V PLandroidx/compose/material3/TooltipKt$TooltipBox$2$1$invoke$$inlined$onDispose$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/material3/TooltipKt$TooltipBox$2$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/material3/TooltipKt$TooltipBox$2$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/material3/TooltipKt$TooltipBox$3; HSPLandroidx/compose/material3/TooltipKt$TooltipBox$3;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/window/PopupPositionProvider;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/PlainTooltipState;JFFLkotlin/jvm/functions/Function3;I)V HPLandroidx/compose/material3/TooltipKt$TooltipBox$3;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/ui/window/PopupPositionProvider;Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/material3/PlainTooltipState;JFFLkotlin/jvm/functions/Function3;I)V Landroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1; HSPLandroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1;->(Landroidx/compose/material3/PlainTooltipState;Lkotlinx/coroutines/CoroutineScope;Ljava/lang/String;)V HPLandroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1;->(Landroidx/compose/material3/PlainTooltipState;Lkotlinx/coroutines/CoroutineScope;Ljava/lang/String;)V HSPLandroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1;->tooltipTrigger(Landroidx/compose/ui/Modifier$Companion;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1;->tooltipTrigger(Landroidx/compose/ui/Modifier$Companion;)Landroidx/compose/ui/Modifier; Landroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1$tooltipTrigger$1; HSPLandroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1$tooltipTrigger$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/material3/TooltipKt$TooltipBox$scope$1$1$tooltipTrigger$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V Landroidx/compose/material3/TooltipKt$animateTooltip$$inlined$debugInspectorInfo$1; HSPLandroidx/compose/material3/TooltipKt$animateTooltip$$inlined$debugInspectorInfo$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/material3/TooltipKt$animateTooltip$$inlined$debugInspectorInfo$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/material3/TooltipKt$animateTooltip$$inlined$debugInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/material3/TooltipKt$animateTooltip$$inlined$debugInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/TopAppBarColors; HSPLandroidx/compose/material3/TopAppBarColors;->(JJJJJ)V PLandroidx/compose/material3/TopAppBarColors;->(JJJJJ)V HSPLandroidx/compose/material3/TopAppBarColors;->containerColor-XeAY9LY$material3_release(FLandroidx/compose/runtime/Composer;)J HPLandroidx/compose/material3/TopAppBarColors;->containerColor-XeAY9LY$material3_release(FLandroidx/compose/runtime/Composer;)J PLandroidx/compose/material3/TopAppBarColors;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/material3/TopAppBarColors;->getActionIconContentColor-0d7_KjU()J PLandroidx/compose/material3/TopAppBarColors;->getActionIconContentColor-0d7_KjU()J HSPLandroidx/compose/material3/TopAppBarColors;->getNavigationIconContentColor-0d7_KjU()J PLandroidx/compose/material3/TopAppBarColors;->getNavigationIconContentColor-0d7_KjU()J HSPLandroidx/compose/material3/TopAppBarColors;->getTitleContentColor-0d7_KjU()J PLandroidx/compose/material3/TopAppBarColors;->getTitleContentColor-0d7_KjU()J Landroidx/compose/material3/TopAppBarDefaults$pinnedScrollBehavior$1; HSPLandroidx/compose/material3/TopAppBarDefaults$pinnedScrollBehavior$1;->()V PLandroidx/compose/material3/TopAppBarDefaults$pinnedScrollBehavior$1;->()V HSPLandroidx/compose/material3/TopAppBarDefaults$pinnedScrollBehavior$1;->()V PLandroidx/compose/material3/TopAppBarDefaults$pinnedScrollBehavior$1;->()V Landroidx/compose/material3/TopAppBarScrollBehavior; Landroidx/compose/material3/TopAppBarState; HSPLandroidx/compose/material3/TopAppBarState;->()V PLandroidx/compose/material3/TopAppBarState;->()V HSPLandroidx/compose/material3/TopAppBarState;->(FFF)V PLandroidx/compose/material3/TopAppBarState;->(FFF)V HSPLandroidx/compose/material3/TopAppBarState;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/material3/TopAppBarState;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/material3/TopAppBarState;->getContentOffset()F HPLandroidx/compose/material3/TopAppBarState;->getContentOffset()F HSPLandroidx/compose/material3/TopAppBarState;->getHeightOffset()F HPLandroidx/compose/material3/TopAppBarState;->getHeightOffset()F HSPLandroidx/compose/material3/TopAppBarState;->getHeightOffsetLimit()F HPLandroidx/compose/material3/TopAppBarState;->getHeightOffsetLimit()F HSPLandroidx/compose/material3/TopAppBarState;->setHeightOffsetLimit(F)V PLandroidx/compose/material3/TopAppBarState;->setHeightOffsetLimit(F)V Landroidx/compose/material3/TopAppBarState$Companion$Saver$1; HSPLandroidx/compose/material3/TopAppBarState$Companion$Saver$1;->()V PLandroidx/compose/material3/TopAppBarState$Companion$Saver$1;->()V HSPLandroidx/compose/material3/TopAppBarState$Companion$Saver$1;->(I)V PLandroidx/compose/material3/TopAppBarState$Companion$Saver$1;->(I)V HSPLandroidx/compose/material3/TopAppBarState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/material3/TopAppBarState$Companion$Saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/material3/Typography; HSPLandroidx/compose/material3/Typography;->(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;)V PLandroidx/compose/material3/Typography;->(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;)V HSPLandroidx/compose/material3/Typography;->getBodyLarge()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getBodyLarge()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/Typography;->getBodyMedium()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getBodyMedium()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/Typography;->getBodySmall()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getBodySmall()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/Typography;->getDisplayMedium()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getDisplayMedium()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/Typography;->getLabelLarge()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getLabelLarge()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/Typography;->getLabelMedium()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getLabelMedium()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/Typography;->getTitleLarge()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/Typography;->getTitleLarge()Landroidx/compose/ui/text/TextStyle; Landroidx/compose/material3/TypographyKt; HSPLandroidx/compose/material3/TypographyKt;->()V PLandroidx/compose/material3/TypographyKt;->()V HSPLandroidx/compose/material3/TypographyKt;->fromToken(Landroidx/compose/material3/Typography;I)Landroidx/compose/ui/text/TextStyle; HPLandroidx/compose/material3/TypographyKt;->fromToken(Landroidx/compose/material3/Typography;I)Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/material3/TypographyKt;->getLocalTypography()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/material3/TypographyKt;->getLocalTypography()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/material3/tokens/BadgeTokens; HSPLandroidx/compose/material3/tokens/BadgeTokens;->()V PLandroidx/compose/material3/tokens/BadgeTokens;->()V HSPLandroidx/compose/material3/tokens/BadgeTokens;->getSize-D9Ej5fM()F PLandroidx/compose/material3/tokens/BadgeTokens;->getSize-D9Ej5fM()F Landroidx/compose/material3/tokens/CircularProgressIndicatorTokens; HSPLandroidx/compose/material3/tokens/CircularProgressIndicatorTokens;->()V PLandroidx/compose/material3/tokens/CircularProgressIndicatorTokens;->()V HSPLandroidx/compose/material3/tokens/CircularProgressIndicatorTokens;->getActiveIndicatorWidth-D9Ej5fM()F PLandroidx/compose/material3/tokens/CircularProgressIndicatorTokens;->getActiveIndicatorWidth-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/CircularProgressIndicatorTokens;->getSize-D9Ej5fM()F PLandroidx/compose/material3/tokens/CircularProgressIndicatorTokens;->getSize-D9Ej5fM()F Landroidx/compose/material3/tokens/ColorLightTokens; HSPLandroidx/compose/material3/tokens/ColorLightTokens;->()V PLandroidx/compose/material3/tokens/ColorLightTokens;->()V HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceBright-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceBright-0d7_KjU()J HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainer-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainer-0d7_KjU()J HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerHigh-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerHigh-0d7_KjU()J HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerHighest-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerHighest-0d7_KjU()J HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerLow-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerLow-0d7_KjU()J HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerLowest-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceContainerLowest-0d7_KjU()J HSPLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceDim-0d7_KjU()J PLandroidx/compose/material3/tokens/ColorLightTokens;->getSurfaceDim-0d7_KjU()J Landroidx/compose/material3/tokens/DividerTokens; HSPLandroidx/compose/material3/tokens/DividerTokens;->()V PLandroidx/compose/material3/tokens/DividerTokens;->()V HSPLandroidx/compose/material3/tokens/DividerTokens;->getThickness-D9Ej5fM()F PLandroidx/compose/material3/tokens/DividerTokens;->getThickness-D9Ej5fM()F Landroidx/compose/material3/tokens/ElevationTokens; HSPLandroidx/compose/material3/tokens/ElevationTokens;->()V PLandroidx/compose/material3/tokens/ElevationTokens;->()V HSPLandroidx/compose/material3/tokens/ElevationTokens;->getLevel0-D9Ej5fM()F PLandroidx/compose/material3/tokens/ElevationTokens;->getLevel0-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/ElevationTokens;->getLevel1-D9Ej5fM()F PLandroidx/compose/material3/tokens/ElevationTokens;->getLevel1-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/ElevationTokens;->getLevel2-D9Ej5fM()F PLandroidx/compose/material3/tokens/ElevationTokens;->getLevel2-D9Ej5fM()F Landroidx/compose/material3/tokens/FilledButtonTokens; HSPLandroidx/compose/material3/tokens/FilledButtonTokens;->()V PLandroidx/compose/material3/tokens/FilledButtonTokens;->()V Landroidx/compose/material3/tokens/IconButtonTokens; HSPLandroidx/compose/material3/tokens/IconButtonTokens;->()V PLandroidx/compose/material3/tokens/IconButtonTokens;->()V HSPLandroidx/compose/material3/tokens/IconButtonTokens;->getIconSize-D9Ej5fM()F PLandroidx/compose/material3/tokens/IconButtonTokens;->getIconSize-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/IconButtonTokens;->getStateLayerShape()I PLandroidx/compose/material3/tokens/IconButtonTokens;->getStateLayerShape()I HSPLandroidx/compose/material3/tokens/IconButtonTokens;->getStateLayerSize-D9Ej5fM()F PLandroidx/compose/material3/tokens/IconButtonTokens;->getStateLayerSize-D9Ej5fM()F Landroidx/compose/material3/tokens/LinearProgressIndicatorTokens; HSPLandroidx/compose/material3/tokens/LinearProgressIndicatorTokens;->()V PLandroidx/compose/material3/tokens/LinearProgressIndicatorTokens;->()V HSPLandroidx/compose/material3/tokens/LinearProgressIndicatorTokens;->getTrackHeight-D9Ej5fM()F PLandroidx/compose/material3/tokens/LinearProgressIndicatorTokens;->getTrackHeight-D9Ej5fM()F Landroidx/compose/material3/tokens/NavigationBarTokens; HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->()V PLandroidx/compose/material3/tokens/NavigationBarTokens;->()V HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveIndicatorHeight-D9Ej5fM()F PLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveIndicatorHeight-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveIndicatorShape()I PLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveIndicatorShape()I HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveIndicatorWidth-D9Ej5fM()F PLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveIndicatorWidth-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveLabelTextColor()I PLandroidx/compose/material3/tokens/NavigationBarTokens;->getActiveLabelTextColor()I HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getContainerColor()I PLandroidx/compose/material3/tokens/NavigationBarTokens;->getContainerColor()I HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getContainerElevation-D9Ej5fM()F PLandroidx/compose/material3/tokens/NavigationBarTokens;->getContainerElevation-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getContainerHeight-D9Ej5fM()F PLandroidx/compose/material3/tokens/NavigationBarTokens;->getContainerHeight-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getIconSize-D9Ej5fM()F PLandroidx/compose/material3/tokens/NavigationBarTokens;->getIconSize-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getInactiveIconColor()I PLandroidx/compose/material3/tokens/NavigationBarTokens;->getInactiveIconColor()I HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getInactiveLabelTextColor()I PLandroidx/compose/material3/tokens/NavigationBarTokens;->getInactiveLabelTextColor()I HSPLandroidx/compose/material3/tokens/NavigationBarTokens;->getLabelTextFont()I PLandroidx/compose/material3/tokens/NavigationBarTokens;->getLabelTextFont()I Landroidx/compose/material3/tokens/PaletteTokens; HSPLandroidx/compose/material3/tokens/PaletteTokens;->()V PLandroidx/compose/material3/tokens/PaletteTokens;->()V HSPLandroidx/compose/material3/tokens/PaletteTokens;->getError10-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getError10-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getError100-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getError100-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getError40-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getError40-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getError90-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getError90-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral0-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral0-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral10-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral10-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral100-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral100-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral20-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral20-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral87-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral87-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral90-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral90-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral92-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral92-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral94-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral94-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral95-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral95-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral96-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral96-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral98-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral98-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral99-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutral99-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant30-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant30-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant50-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant50-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant80-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant80-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant90-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getNeutralVariant90-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary10-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary10-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary100-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary100-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary40-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary40-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary80-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary80-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary90-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getPrimary90-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary10-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary10-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary100-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary100-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary40-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary40-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary90-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getSecondary90-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary10-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary10-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary100-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary100-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary40-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary40-0d7_KjU()J HSPLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary90-0d7_KjU()J PLandroidx/compose/material3/tokens/PaletteTokens;->getTertiary90-0d7_KjU()J Landroidx/compose/material3/tokens/ShapeTokens; HSPLandroidx/compose/material3/tokens/ShapeTokens;->()V PLandroidx/compose/material3/tokens/ShapeTokens;->()V HSPLandroidx/compose/material3/tokens/ShapeTokens;->getCornerExtraLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/tokens/ShapeTokens;->getCornerExtraLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/tokens/ShapeTokens;->getCornerExtraSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/tokens/ShapeTokens;->getCornerExtraSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/tokens/ShapeTokens;->getCornerLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/tokens/ShapeTokens;->getCornerLarge()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/tokens/ShapeTokens;->getCornerMedium()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/tokens/ShapeTokens;->getCornerMedium()Landroidx/compose/foundation/shape/RoundedCornerShape; HSPLandroidx/compose/material3/tokens/ShapeTokens;->getCornerSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; PLandroidx/compose/material3/tokens/ShapeTokens;->getCornerSmall()Landroidx/compose/foundation/shape/RoundedCornerShape; Landroidx/compose/material3/tokens/SwitchTokens; HSPLandroidx/compose/material3/tokens/SwitchTokens;->()V PLandroidx/compose/material3/tokens/SwitchTokens;->()V HSPLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedHandleColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedHandleColor()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedHandleWidth-D9Ej5fM()F PLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedHandleWidth-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedIconColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedIconColor()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedTrackColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getSelectedTrackColor()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getStateLayerSize-D9Ej5fM()F PLandroidx/compose/material3/tokens/SwitchTokens;->getStateLayerSize-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/SwitchTokens;->getTrackHeight-D9Ej5fM()F PLandroidx/compose/material3/tokens/SwitchTokens;->getTrackHeight-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/SwitchTokens;->getTrackOutlineWidth-D9Ej5fM()F PLandroidx/compose/material3/tokens/SwitchTokens;->getTrackOutlineWidth-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/SwitchTokens;->getTrackShape()I PLandroidx/compose/material3/tokens/SwitchTokens;->getTrackShape()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getTrackWidth-D9Ej5fM()F PLandroidx/compose/material3/tokens/SwitchTokens;->getTrackWidth-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedFocusTrackOutlineColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedFocusTrackOutlineColor()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedHandleColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedHandleColor()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedHandleWidth-D9Ej5fM()F PLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedHandleWidth-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedIconColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedIconColor()I HSPLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedTrackColor()I PLandroidx/compose/material3/tokens/SwitchTokens;->getUnselectedTrackColor()I Landroidx/compose/material3/tokens/TextButtonTokens; HSPLandroidx/compose/material3/tokens/TextButtonTokens;->()V PLandroidx/compose/material3/tokens/TextButtonTokens;->()V HSPLandroidx/compose/material3/tokens/TextButtonTokens;->getContainerShape()I PLandroidx/compose/material3/tokens/TextButtonTokens;->getContainerShape()I HSPLandroidx/compose/material3/tokens/TextButtonTokens;->getDisabledLabelTextColor()I PLandroidx/compose/material3/tokens/TextButtonTokens;->getDisabledLabelTextColor()I HSPLandroidx/compose/material3/tokens/TextButtonTokens;->getLabelTextColor()I PLandroidx/compose/material3/tokens/TextButtonTokens;->getLabelTextColor()I Landroidx/compose/material3/tokens/TopAppBarSmallTokens; HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->()V PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->()V HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getContainerHeight-D9Ej5fM()F PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getContainerHeight-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getHeadlineColor()I PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getHeadlineColor()I HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getHeadlineFont()I PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getHeadlineFont()I HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getLeadingIconColor()I PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getLeadingIconColor()I HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getOnScrollContainerElevation-D9Ej5fM()F PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getOnScrollContainerElevation-D9Ej5fM()F HSPLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getTrailingIconColor()I PLandroidx/compose/material3/tokens/TopAppBarSmallTokens;->getTrailingIconColor()I Landroidx/compose/material3/tokens/TypographyTokensKt; HSPLandroidx/compose/material3/tokens/TypographyTokensKt;->()V PLandroidx/compose/material3/tokens/TypographyTokensKt;->()V HSPLandroidx/compose/material3/tokens/TypographyTokensKt;->getDefaultTextStyle()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/material3/tokens/TypographyTokensKt;->getDefaultTextStyle()Landroidx/compose/ui/text/TextStyle; Landroidx/compose/runtime/AbstractApplier; HSPLandroidx/compose/runtime/AbstractApplier;->(Ljava/lang/Object;)V HPLandroidx/compose/runtime/AbstractApplier;->(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/AbstractApplier;->clear()V HPLandroidx/compose/runtime/AbstractApplier;->clear()V HSPLandroidx/compose/runtime/AbstractApplier;->down(Ljava/lang/Object;)V HPLandroidx/compose/runtime/AbstractApplier;->down(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/AbstractApplier;->getCurrent()Ljava/lang/Object; HPLandroidx/compose/runtime/AbstractApplier;->getCurrent()Ljava/lang/Object; HSPLandroidx/compose/runtime/AbstractApplier;->getRoot()Ljava/lang/Object; PLandroidx/compose/runtime/AbstractApplier;->getRoot()Ljava/lang/Object; HSPLandroidx/compose/runtime/AbstractApplier;->up()V HPLandroidx/compose/runtime/AbstractApplier;->up()V Landroidx/compose/runtime/ActualAndroid_androidKt; HSPLandroidx/compose/runtime/ActualAndroid_androidKt;->()V PLandroidx/compose/runtime/ActualAndroid_androidKt;->()V Landroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2; HSPLandroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;->()V PLandroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;->()V HSPLandroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;->()V PLandroidx/compose/runtime/ActualAndroid_androidKt$DefaultMonotonicFrameClock$2;->()V Landroidx/compose/runtime/Anchor; HSPLandroidx/compose/runtime/Anchor;->(I)V HPLandroidx/compose/runtime/Anchor;->(I)V HSPLandroidx/compose/runtime/Anchor;->getLocation$runtime_release()I PLandroidx/compose/runtime/Anchor;->getLocation$runtime_release()I HSPLandroidx/compose/runtime/Anchor;->getValid()Z HPLandroidx/compose/runtime/Anchor;->getValid()Z HSPLandroidx/compose/runtime/Anchor;->setLocation$runtime_release(I)V PLandroidx/compose/runtime/Anchor;->setLocation$runtime_release(I)V Landroidx/compose/runtime/Applier; HSPLandroidx/compose/runtime/Applier;->onEndChanges()V PLandroidx/compose/runtime/Applier;->onEndChanges()V Landroidx/compose/runtime/BroadcastFrameClock; HSPLandroidx/compose/runtime/BroadcastFrameClock;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/BroadcastFrameClock;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/BroadcastFrameClock;->access$getAwaiters$p(Landroidx/compose/runtime/BroadcastFrameClock;)Ljava/util/List; PLandroidx/compose/runtime/BroadcastFrameClock;->access$getAwaiters$p(Landroidx/compose/runtime/BroadcastFrameClock;)Ljava/util/List; HSPLandroidx/compose/runtime/BroadcastFrameClock;->access$getLock$p(Landroidx/compose/runtime/BroadcastFrameClock;)Ljava/lang/Object; PLandroidx/compose/runtime/BroadcastFrameClock;->access$getLock$p(Landroidx/compose/runtime/BroadcastFrameClock;)Ljava/lang/Object; HSPLandroidx/compose/runtime/BroadcastFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; PLandroidx/compose/runtime/BroadcastFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLandroidx/compose/runtime/BroadcastFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLandroidx/compose/runtime/BroadcastFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLandroidx/compose/runtime/BroadcastFrameClock;->getHasAwaiters()Z HPLandroidx/compose/runtime/BroadcastFrameClock;->getHasAwaiters()Z HSPLandroidx/compose/runtime/BroadcastFrameClock;->sendFrame(J)V HPLandroidx/compose/runtime/BroadcastFrameClock;->sendFrame(J)V HSPLandroidx/compose/runtime/BroadcastFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/runtime/BroadcastFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter; HSPLandroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CancellableContinuationImpl;)V HPLandroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLandroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;->resume(J)V HPLandroidx/compose/runtime/BroadcastFrameClock$FrameAwaiter;->resume(J)V Landroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1; HSPLandroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;->(Landroidx/compose/runtime/BroadcastFrameClock;Lkotlin/jvm/internal/Ref$ObjectRef;)V HPLandroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;->(Landroidx/compose/runtime/BroadcastFrameClock;Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLandroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/BroadcastFrameClock$withFrameNanos$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/ComposableSingletons$CompositionKt; HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt;->()V PLandroidx/compose/runtime/ComposableSingletons$CompositionKt;->()V Landroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1; HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;->()V PLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;->()V HSPLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;->(I)V PLandroidx/compose/runtime/ComposableSingletons$CompositionKt$lambda-1$1;->(I)V Landroidx/compose/runtime/ComposeNodeLifecycleCallback; Landroidx/compose/runtime/ComposeRuntimeError; Landroidx/compose/runtime/Composer; Landroidx/compose/runtime/Composer$Companion; HSPLandroidx/compose/runtime/Composer$Companion;->()V PLandroidx/compose/runtime/Composer$Companion;->()V HSPLandroidx/compose/runtime/Composer$Companion;->getEmpty()Landroidx/compose/runtime/Composer$Companion$Empty$1; HPLandroidx/compose/runtime/Composer$Companion;->getEmpty()Landroidx/compose/runtime/Composer$Companion$Empty$1; Landroidx/compose/runtime/Composer$Companion$Empty$1; HSPLandroidx/compose/runtime/Composer$Companion$Empty$1;->()V PLandroidx/compose/runtime/Composer$Companion$Empty$1;->()V Landroidx/compose/runtime/ComposerImpl; HSPLandroidx/compose/runtime/ComposerImpl;->(Landroidx/compose/runtime/AbstractApplier;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/SlotTable;Ljava/util/HashSet;Landroidx/compose/runtime/changelist/ChangeList;Landroidx/compose/runtime/changelist/ChangeList;Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/ComposerImpl;->(Landroidx/compose/runtime/AbstractApplier;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/SlotTable;Ljava/util/HashSet;Landroidx/compose/runtime/changelist/ChangeList;Landroidx/compose/runtime/changelist/ChangeList;Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/ComposerImpl;->access$getChildrenComposing$p(Landroidx/compose/runtime/ComposerImpl;)I HPLandroidx/compose/runtime/ComposerImpl;->access$getChildrenComposing$p(Landroidx/compose/runtime/ComposerImpl;)I HSPLandroidx/compose/runtime/ComposerImpl;->access$getParentContext$p(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/CompositionContext; PLandroidx/compose/runtime/ComposerImpl;->access$getParentContext$p(Landroidx/compose/runtime/ComposerImpl;)Landroidx/compose/runtime/CompositionContext; HSPLandroidx/compose/runtime/ComposerImpl;->access$setChildrenComposing$p(Landroidx/compose/runtime/ComposerImpl;I)V HPLandroidx/compose/runtime/ComposerImpl;->access$setChildrenComposing$p(Landroidx/compose/runtime/ComposerImpl;I)V HSPLandroidx/compose/runtime/ComposerImpl;->apply(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/ComposerImpl;->apply(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/ComposerImpl;->buildContext()Landroidx/compose/runtime/CompositionContext; HPLandroidx/compose/runtime/ComposerImpl;->buildContext()Landroidx/compose/runtime/CompositionContext; HSPLandroidx/compose/runtime/ComposerImpl;->changed(F)Z HPLandroidx/compose/runtime/ComposerImpl;->changed(F)Z HSPLandroidx/compose/runtime/ComposerImpl;->changed(I)Z HPLandroidx/compose/runtime/ComposerImpl;->changed(I)Z HSPLandroidx/compose/runtime/ComposerImpl;->changed(J)Z HPLandroidx/compose/runtime/ComposerImpl;->changed(J)Z HSPLandroidx/compose/runtime/ComposerImpl;->changed(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/ComposerImpl;->changed(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/ComposerImpl;->changed(Z)Z HPLandroidx/compose/runtime/ComposerImpl;->changed(Z)Z HSPLandroidx/compose/runtime/ComposerImpl;->changedInstance(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/ComposerImpl;->changedInstance(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/ComposerImpl;->changesApplied$runtime_release()V HPLandroidx/compose/runtime/ComposerImpl;->changesApplied$runtime_release()V HSPLandroidx/compose/runtime/ComposerImpl;->cleanUpCompose()V HPLandroidx/compose/runtime/ComposerImpl;->cleanUpCompose()V HSPLandroidx/compose/runtime/ComposerImpl;->composeContent$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/runtime/ComposerImpl;->composeContent$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/runtime/ComposerImpl;->compoundKeyOf(III)I HPLandroidx/compose/runtime/ComposerImpl;->compoundKeyOf(III)I HSPLandroidx/compose/runtime/ComposerImpl;->consume(Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; HPLandroidx/compose/runtime/ComposerImpl;->consume(Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; HSPLandroidx/compose/runtime/ComposerImpl;->createFreshInsertTable()V HPLandroidx/compose/runtime/ComposerImpl;->createFreshInsertTable()V HSPLandroidx/compose/runtime/ComposerImpl;->createNode(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/ComposerImpl;->createNode(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/ComposerImpl;->currentCompositionLocalScope()Landroidx/compose/runtime/PersistentCompositionLocalMap; HPLandroidx/compose/runtime/ComposerImpl;->currentCompositionLocalScope()Landroidx/compose/runtime/PersistentCompositionLocalMap; HSPLandroidx/compose/runtime/ComposerImpl;->dispose$runtime_release()V HPLandroidx/compose/runtime/ComposerImpl;->dispose$runtime_release()V HSPLandroidx/compose/runtime/ComposerImpl;->doCompose(Landroidx/compose/runtime/collection/IdentityArrayMap;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/runtime/ComposerImpl;->doCompose(Landroidx/compose/runtime/collection/IdentityArrayMap;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/runtime/ComposerImpl;->doRecordDownsFor(II)V HPLandroidx/compose/runtime/ComposerImpl;->doRecordDownsFor(II)V HSPLandroidx/compose/runtime/ComposerImpl;->end(Z)V HPLandroidx/compose/runtime/ComposerImpl;->end(Z)V HSPLandroidx/compose/runtime/ComposerImpl;->endDefaults()V HPLandroidx/compose/runtime/ComposerImpl;->endDefaults()V HSPLandroidx/compose/runtime/ComposerImpl;->endMovableGroup()V HPLandroidx/compose/runtime/ComposerImpl;->endMovableGroup()V HSPLandroidx/compose/runtime/ComposerImpl;->endNode()V HPLandroidx/compose/runtime/ComposerImpl;->endNode()V HSPLandroidx/compose/runtime/ComposerImpl;->endProvider()V PLandroidx/compose/runtime/ComposerImpl;->endProvider()V HSPLandroidx/compose/runtime/ComposerImpl;->endProviders()V PLandroidx/compose/runtime/ComposerImpl;->endProviders()V HSPLandroidx/compose/runtime/ComposerImpl;->endReplaceableGroup()V HPLandroidx/compose/runtime/ComposerImpl;->endReplaceableGroup()V HSPLandroidx/compose/runtime/ComposerImpl;->endRestartGroup()Landroidx/compose/runtime/RecomposeScopeImpl; HPLandroidx/compose/runtime/ComposerImpl;->endRestartGroup()Landroidx/compose/runtime/RecomposeScopeImpl; HSPLandroidx/compose/runtime/ComposerImpl;->endReusableGroup()V PLandroidx/compose/runtime/ComposerImpl;->endReusableGroup()V HSPLandroidx/compose/runtime/ComposerImpl;->endRoot()V HPLandroidx/compose/runtime/ComposerImpl;->endRoot()V HSPLandroidx/compose/runtime/ComposerImpl;->enterGroup(ZLandroidx/compose/runtime/Pending;)V HPLandroidx/compose/runtime/ComposerImpl;->enterGroup(ZLandroidx/compose/runtime/Pending;)V HSPLandroidx/compose/runtime/ComposerImpl;->getApplier()Landroidx/compose/runtime/Applier; HPLandroidx/compose/runtime/ComposerImpl;->getApplier()Landroidx/compose/runtime/Applier; HSPLandroidx/compose/runtime/ComposerImpl;->getApplyCoroutineContext()Lkotlin/coroutines/CoroutineContext; HPLandroidx/compose/runtime/ComposerImpl;->getApplyCoroutineContext()Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/runtime/ComposerImpl;->getAreChildrenComposing$runtime_release()Z PLandroidx/compose/runtime/ComposerImpl;->getAreChildrenComposing$runtime_release()Z HSPLandroidx/compose/runtime/ComposerImpl;->getComposition()Landroidx/compose/runtime/ControlledComposition; HPLandroidx/compose/runtime/ComposerImpl;->getComposition()Landroidx/compose/runtime/ControlledComposition; HSPLandroidx/compose/runtime/ComposerImpl;->getCompoundKeyHash()I PLandroidx/compose/runtime/ComposerImpl;->getCompoundKeyHash()I HSPLandroidx/compose/runtime/ComposerImpl;->getCurrentCompositionLocalMap()Landroidx/compose/runtime/PersistentCompositionLocalMap; HPLandroidx/compose/runtime/ComposerImpl;->getCurrentCompositionLocalMap()Landroidx/compose/runtime/PersistentCompositionLocalMap; HSPLandroidx/compose/runtime/ComposerImpl;->getCurrentRecomposeScope$runtime_release()Landroidx/compose/runtime/RecomposeScopeImpl; HPLandroidx/compose/runtime/ComposerImpl;->getCurrentRecomposeScope$runtime_release()Landroidx/compose/runtime/RecomposeScopeImpl; HSPLandroidx/compose/runtime/ComposerImpl;->getDefaultsInvalid()Z HPLandroidx/compose/runtime/ComposerImpl;->getDefaultsInvalid()Z HSPLandroidx/compose/runtime/ComposerImpl;->getDeferredChanges$runtime_release()Landroidx/compose/runtime/changelist/ChangeList; PLandroidx/compose/runtime/ComposerImpl;->getDeferredChanges$runtime_release()Landroidx/compose/runtime/changelist/ChangeList; HSPLandroidx/compose/runtime/ComposerImpl;->getInserting()Z HPLandroidx/compose/runtime/ComposerImpl;->getInserting()Z HSPLandroidx/compose/runtime/ComposerImpl;->getReader$runtime_release()Landroidx/compose/runtime/SlotReader; HPLandroidx/compose/runtime/ComposerImpl;->getReader$runtime_release()Landroidx/compose/runtime/SlotReader; HSPLandroidx/compose/runtime/ComposerImpl;->getSkipping()Z HPLandroidx/compose/runtime/ComposerImpl;->getSkipping()Z HSPLandroidx/compose/runtime/ComposerImpl;->isComposing$runtime_release()Z PLandroidx/compose/runtime/ComposerImpl;->isComposing$runtime_release()Z HSPLandroidx/compose/runtime/ComposerImpl;->nextSlot()Ljava/lang/Object; HPLandroidx/compose/runtime/ComposerImpl;->nextSlot()Ljava/lang/Object; HSPLandroidx/compose/runtime/ComposerImpl;->prepareCompose$runtime_release(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/ComposerImpl;->prepareCompose$runtime_release(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/ComposerImpl;->recompose$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;)Z HPLandroidx/compose/runtime/ComposerImpl;->recompose$runtime_release(Landroidx/compose/runtime/collection/IdentityArrayMap;)Z HSPLandroidx/compose/runtime/ComposerImpl;->recomposeToGroupEnd()V HPLandroidx/compose/runtime/ComposerImpl;->recomposeToGroupEnd()V HSPLandroidx/compose/runtime/ComposerImpl;->recordSideEffect(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/ComposerImpl;->recordSideEffect(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/ComposerImpl;->recordUpsAndDowns(III)V HPLandroidx/compose/runtime/ComposerImpl;->recordUpsAndDowns(III)V HSPLandroidx/compose/runtime/ComposerImpl;->reportAllMovableContent()V HPLandroidx/compose/runtime/ComposerImpl;->reportAllMovableContent()V HSPLandroidx/compose/runtime/ComposerImpl;->reportFreeMovableContent$reportGroup(Landroidx/compose/runtime/ComposerImpl;IZI)I HPLandroidx/compose/runtime/ComposerImpl;->reportFreeMovableContent$reportGroup(Landroidx/compose/runtime/ComposerImpl;IZI)I HSPLandroidx/compose/runtime/ComposerImpl;->skipToGroupEnd()V HPLandroidx/compose/runtime/ComposerImpl;->skipToGroupEnd()V HSPLandroidx/compose/runtime/ComposerImpl;->start-BaiHCIY(IILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/ComposerImpl;->start-BaiHCIY(IILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->startDefaults()V HPLandroidx/compose/runtime/ComposerImpl;->startDefaults()V HSPLandroidx/compose/runtime/ComposerImpl;->startGroup(ILandroidx/compose/runtime/OpaqueKey;)V HPLandroidx/compose/runtime/ComposerImpl;->startGroup(ILandroidx/compose/runtime/OpaqueKey;)V HSPLandroidx/compose/runtime/ComposerImpl;->startMovableGroup(ILjava/lang/Object;)V HPLandroidx/compose/runtime/ComposerImpl;->startMovableGroup(ILjava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->startNode()V HPLandroidx/compose/runtime/ComposerImpl;->startNode()V HSPLandroidx/compose/runtime/ComposerImpl;->startProvider(Landroidx/compose/runtime/ProvidedValue;)V HPLandroidx/compose/runtime/ComposerImpl;->startProvider(Landroidx/compose/runtime/ProvidedValue;)V HSPLandroidx/compose/runtime/ComposerImpl;->startProviders([Landroidx/compose/runtime/ProvidedValue;)V HPLandroidx/compose/runtime/ComposerImpl;->startProviders([Landroidx/compose/runtime/ProvidedValue;)V HSPLandroidx/compose/runtime/ComposerImpl;->startReaderGroup(Ljava/lang/Object;Z)V HPLandroidx/compose/runtime/ComposerImpl;->startReaderGroup(Ljava/lang/Object;Z)V HSPLandroidx/compose/runtime/ComposerImpl;->startReplaceableGroup(I)V HPLandroidx/compose/runtime/ComposerImpl;->startReplaceableGroup(I)V HSPLandroidx/compose/runtime/ComposerImpl;->startRestartGroup(I)Landroidx/compose/runtime/ComposerImpl; HPLandroidx/compose/runtime/ComposerImpl;->startRestartGroup(I)Landroidx/compose/runtime/ComposerImpl; HSPLandroidx/compose/runtime/ComposerImpl;->startReusableGroup(Ljava/lang/Object;)V HPLandroidx/compose/runtime/ComposerImpl;->startReusableGroup(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->startReusableNode()V HPLandroidx/compose/runtime/ComposerImpl;->startReusableNode()V HSPLandroidx/compose/runtime/ComposerImpl;->startRoot()V HPLandroidx/compose/runtime/ComposerImpl;->startRoot()V HSPLandroidx/compose/runtime/ComposerImpl;->tryImminentInvalidation$runtime_release(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)Z HPLandroidx/compose/runtime/ComposerImpl;->tryImminentInvalidation$runtime_release(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeEnterGroup(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeEnterGroup(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeExitGroup(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeExitGroup(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeExitGroupKeyHash(I)V HPLandroidx/compose/runtime/ComposerImpl;->updateCompoundKeyWhenWeExitGroupKeyHash(I)V HSPLandroidx/compose/runtime/ComposerImpl;->updateNodeCount(II)V HPLandroidx/compose/runtime/ComposerImpl;->updateNodeCount(II)V HSPLandroidx/compose/runtime/ComposerImpl;->updateNodeCountOverrides(II)V HPLandroidx/compose/runtime/ComposerImpl;->updateNodeCountOverrides(II)V HSPLandroidx/compose/runtime/ComposerImpl;->updateProviderMapGroup(Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HPLandroidx/compose/runtime/ComposerImpl;->updateProviderMapGroup(Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V HPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I HPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I HSPLandroidx/compose/runtime/ComposerImpl;->useNode()V HPLandroidx/compose/runtime/ComposerImpl;->useNode()V Landroidx/compose/runtime/ComposerImpl$CompositionContextHolder; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->(Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl;)V PLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->(Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->getRef()Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl; PLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->getRef()Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onForgotten()V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onForgotten()V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onRemembered()V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextHolder;->onRemembered()V Landroidx/compose/runtime/ComposerImpl$CompositionContextImpl; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->(Landroidx/compose/runtime/ComposerImpl;IZLandroidx/compose/runtime/CompositionObserverHolder;)V PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->(Landroidx/compose/runtime/ComposerImpl;IZLandroidx/compose/runtime/CompositionObserverHolder;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->composeInitial$runtime_release(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->composeInitial$runtime_release(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->dispose()V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->dispose()V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->doneComposing$runtime_release()V PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->doneComposing$runtime_release()V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCollectingParameterInformation$runtime_release()Z PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCollectingParameterInformation$runtime_release()Z HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getComposers()Ljava/util/LinkedHashSet; PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getComposers()Ljava/util/LinkedHashSet; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompositionLocalScope$runtime_release()Landroidx/compose/runtime/PersistentCompositionLocalMap; HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompositionLocalScope$runtime_release()Landroidx/compose/runtime/PersistentCompositionLocalMap; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompoundHashKey$runtime_release()I PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getCompoundHashKey$runtime_release()I HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getEffectCoroutineContext()Lkotlin/coroutines/CoroutineContext; HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getEffectCoroutineContext()Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getObserverHolder$runtime_release()Landroidx/compose/runtime/CompositionObserverHolder; PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->getObserverHolder$runtime_release()Landroidx/compose/runtime/CompositionObserverHolder; HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->invalidate$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->invalidate$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->registerComposer$runtime_release(Landroidx/compose/runtime/ComposerImpl;)V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->registerComposer$runtime_release(Landroidx/compose/runtime/ComposerImpl;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->reportRemovedComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->reportRemovedComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->startComposing$runtime_release()V PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->startComposing$runtime_release()V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposer$runtime_release(Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposer$runtime_release(Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->unregisterComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->updateCompositionLocalScope(Landroidx/compose/runtime/PersistentCompositionLocalMap;)V PLandroidx/compose/runtime/ComposerImpl$CompositionContextImpl;->updateCompositionLocalScope(Landroidx/compose/runtime/PersistentCompositionLocalMap;)V Landroidx/compose/runtime/ComposerImpl$derivedStateObserver$1; HSPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->(Landroidx/compose/runtime/ComposerImpl;)V PLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->(Landroidx/compose/runtime/ComposerImpl;)V HSPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->done()V HPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->done()V HSPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->start()V HPLandroidx/compose/runtime/ComposerImpl$derivedStateObserver$1;->start()V Landroidx/compose/runtime/ComposerImpl$doCompose$lambda$40$$inlined$sortBy$1; HSPLandroidx/compose/runtime/ComposerImpl$doCompose$lambda$40$$inlined$sortBy$1;->()V PLandroidx/compose/runtime/ComposerImpl$doCompose$lambda$40$$inlined$sortBy$1;->()V HSPLandroidx/compose/runtime/ComposerImpl$doCompose$lambda$40$$inlined$sortBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HPLandroidx/compose/runtime/ComposerImpl$doCompose$lambda$40$$inlined$sortBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I Landroidx/compose/runtime/ComposerKt; HSPLandroidx/compose/runtime/ComposerKt;->()V PLandroidx/compose/runtime/ComposerKt;->()V HSPLandroidx/compose/runtime/ComposerKt;->access$firstInRange(IILjava/util/ArrayList;)Landroidx/compose/runtime/Invalidation; HPLandroidx/compose/runtime/ComposerKt;->access$firstInRange(IILjava/util/ArrayList;)Landroidx/compose/runtime/Invalidation; HSPLandroidx/compose/runtime/ComposerKt;->access$insertIfMissing(Ljava/util/ArrayList;ILandroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)V HPLandroidx/compose/runtime/ComposerKt;->access$insertIfMissing(Ljava/util/ArrayList;ILandroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/ComposerKt;->access$nearestCommonRootOf(Landroidx/compose/runtime/SlotReader;III)I HPLandroidx/compose/runtime/ComposerKt;->access$nearestCommonRootOf(Landroidx/compose/runtime/SlotReader;III)I HSPLandroidx/compose/runtime/ComposerKt;->access$removeLocation(ILjava/util/ArrayList;)Landroidx/compose/runtime/Invalidation; PLandroidx/compose/runtime/ComposerKt;->access$removeLocation(ILjava/util/ArrayList;)Landroidx/compose/runtime/Invalidation; HSPLandroidx/compose/runtime/ComposerKt;->access$removeRange(IILjava/util/ArrayList;)V HPLandroidx/compose/runtime/ComposerKt;->access$removeRange(IILjava/util/ArrayList;)V HSPLandroidx/compose/runtime/ComposerKt;->findLocation(ILjava/util/List;)I HPLandroidx/compose/runtime/ComposerKt;->findLocation(ILjava/util/List;)I HSPLandroidx/compose/runtime/ComposerKt;->getCompositionLocalMap()Landroidx/compose/runtime/OpaqueKey; PLandroidx/compose/runtime/ComposerKt;->getCompositionLocalMap()Landroidx/compose/runtime/OpaqueKey; HSPLandroidx/compose/runtime/ComposerKt;->getInvocation()Landroidx/compose/runtime/OpaqueKey; PLandroidx/compose/runtime/ComposerKt;->getInvocation()Landroidx/compose/runtime/OpaqueKey; HSPLandroidx/compose/runtime/ComposerKt;->getProvider()Landroidx/compose/runtime/OpaqueKey; PLandroidx/compose/runtime/ComposerKt;->getProvider()Landroidx/compose/runtime/OpaqueKey; HSPLandroidx/compose/runtime/ComposerKt;->getProviderMaps()Landroidx/compose/runtime/OpaqueKey; PLandroidx/compose/runtime/ComposerKt;->getProviderMaps()Landroidx/compose/runtime/OpaqueKey; HSPLandroidx/compose/runtime/ComposerKt;->getReference()Landroidx/compose/runtime/OpaqueKey; PLandroidx/compose/runtime/ComposerKt;->getReference()Landroidx/compose/runtime/OpaqueKey; HSPLandroidx/compose/runtime/ComposerKt;->removeCurrentGroup(Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/ComposerKt;->removeCurrentGroup(Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HSPLandroidx/compose/runtime/ComposerKt;->runtimeCheck(Z)V HPLandroidx/compose/runtime/ComposerKt;->runtimeCheck(Z)V Landroidx/compose/runtime/Composition; Landroidx/compose/runtime/CompositionContext; HSPLandroidx/compose/runtime/CompositionContext;->()V PLandroidx/compose/runtime/CompositionContext;->()V HSPLandroidx/compose/runtime/CompositionContext;->doneComposing$runtime_release()V PLandroidx/compose/runtime/CompositionContext;->doneComposing$runtime_release()V HSPLandroidx/compose/runtime/CompositionContext;->getCompositionLocalScope$runtime_release()Landroidx/compose/runtime/PersistentCompositionLocalMap; PLandroidx/compose/runtime/CompositionContext;->getCompositionLocalScope$runtime_release()Landroidx/compose/runtime/PersistentCompositionLocalMap; HSPLandroidx/compose/runtime/CompositionContext;->getObserverHolder$runtime_release()Landroidx/compose/runtime/CompositionObserverHolder; PLandroidx/compose/runtime/CompositionContext;->getObserverHolder$runtime_release()Landroidx/compose/runtime/CompositionObserverHolder; HSPLandroidx/compose/runtime/CompositionContext;->registerComposer$runtime_release(Landroidx/compose/runtime/ComposerImpl;)V PLandroidx/compose/runtime/CompositionContext;->registerComposer$runtime_release(Landroidx/compose/runtime/ComposerImpl;)V HSPLandroidx/compose/runtime/CompositionContext;->startComposing$runtime_release()V PLandroidx/compose/runtime/CompositionContext;->startComposing$runtime_release()V PLandroidx/compose/runtime/CompositionContext;->unregisterComposer$runtime_release(Landroidx/compose/runtime/Composer;)V Landroidx/compose/runtime/CompositionContextKt; HSPLandroidx/compose/runtime/CompositionContextKt;->()V PLandroidx/compose/runtime/CompositionContextKt;->()V HSPLandroidx/compose/runtime/CompositionContextKt;->access$getEmptyPersistentCompositionLocalMap$p()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; PLandroidx/compose/runtime/CompositionContextKt;->access$getEmptyPersistentCompositionLocalMap$p()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; Landroidx/compose/runtime/CompositionImpl; HSPLandroidx/compose/runtime/CompositionImpl;->(Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/AbstractApplier;)V HPLandroidx/compose/runtime/CompositionImpl;->(Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/AbstractApplier;)V HSPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/util/HashSet;Ljava/lang/Object;Z)Ljava/util/HashSet; HPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/util/HashSet;Ljava/lang/Object;Z)Ljava/util/HashSet; HSPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/util/Set;Z)V HPLandroidx/compose/runtime/CompositionImpl;->addPendingInvalidationsLocked(Ljava/util/Set;Z)V HSPLandroidx/compose/runtime/CompositionImpl;->applyChanges()V HPLandroidx/compose/runtime/CompositionImpl;->applyChanges()V HSPLandroidx/compose/runtime/CompositionImpl;->applyChangesInLocked(Landroidx/compose/runtime/changelist/ChangeList;)V HPLandroidx/compose/runtime/CompositionImpl;->applyChangesInLocked(Landroidx/compose/runtime/changelist/ChangeList;)V HSPLandroidx/compose/runtime/CompositionImpl;->applyLateChanges()V HPLandroidx/compose/runtime/CompositionImpl;->applyLateChanges()V HSPLandroidx/compose/runtime/CompositionImpl;->changesApplied()V HPLandroidx/compose/runtime/CompositionImpl;->changesApplied()V HSPLandroidx/compose/runtime/CompositionImpl;->cleanUpDerivedStateObservations()V HPLandroidx/compose/runtime/CompositionImpl;->cleanUpDerivedStateObservations()V HSPLandroidx/compose/runtime/CompositionImpl;->composeContent(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/runtime/CompositionImpl;->composeContent(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/runtime/CompositionImpl;->dispose()V HPLandroidx/compose/runtime/CompositionImpl;->dispose()V HSPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsForCompositionLocked()V HPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsForCompositionLocked()V HSPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsLocked()V HPLandroidx/compose/runtime/CompositionImpl;->drainPendingModificationsLocked()V HSPLandroidx/compose/runtime/CompositionImpl;->getHasInvalidations()Z HPLandroidx/compose/runtime/CompositionImpl;->getHasInvalidations()Z HSPLandroidx/compose/runtime/CompositionImpl;->getObserverHolder$runtime_release()Landroidx/compose/runtime/CompositionObserverHolder; PLandroidx/compose/runtime/CompositionImpl;->getObserverHolder$runtime_release()Landroidx/compose/runtime/CompositionObserverHolder; HSPLandroidx/compose/runtime/CompositionImpl;->invalidate$enumunboxing$(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)I HPLandroidx/compose/runtime/CompositionImpl;->invalidate$enumunboxing$(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)I HSPLandroidx/compose/runtime/CompositionImpl;->invalidateChecked(Landroidx/compose/runtime/RecomposeScopeImpl;Landroidx/compose/runtime/Anchor;Ljava/lang/Object;)I HPLandroidx/compose/runtime/CompositionImpl;->invalidateChecked(Landroidx/compose/runtime/RecomposeScopeImpl;Landroidx/compose/runtime/Anchor;Ljava/lang/Object;)I HSPLandroidx/compose/runtime/CompositionImpl;->invalidateScopeOfLocked(Ljava/lang/Object;)V HPLandroidx/compose/runtime/CompositionImpl;->invalidateScopeOfLocked(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/CompositionImpl;->isComposing()Z PLandroidx/compose/runtime/CompositionImpl;->isComposing()Z HSPLandroidx/compose/runtime/CompositionImpl;->isDisposed()Z PLandroidx/compose/runtime/CompositionImpl;->isDisposed()Z HSPLandroidx/compose/runtime/CompositionImpl;->observer()V HPLandroidx/compose/runtime/CompositionImpl;->observer()V HSPLandroidx/compose/runtime/CompositionImpl;->observesAnyOf(Landroidx/compose/runtime/collection/IdentityArraySet;)Z HPLandroidx/compose/runtime/CompositionImpl;->observesAnyOf(Landroidx/compose/runtime/collection/IdentityArraySet;)Z HSPLandroidx/compose/runtime/CompositionImpl;->prepareCompose(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/CompositionImpl;->prepareCompose(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/CompositionImpl;->recompose()Z HPLandroidx/compose/runtime/CompositionImpl;->recompose()Z HSPLandroidx/compose/runtime/CompositionImpl;->recomposeScopeReleased()V PLandroidx/compose/runtime/CompositionImpl;->recomposeScopeReleased()V HSPLandroidx/compose/runtime/CompositionImpl;->recordModificationsOf(Landroidx/compose/runtime/collection/IdentityArraySet;)V HPLandroidx/compose/runtime/CompositionImpl;->recordModificationsOf(Landroidx/compose/runtime/collection/IdentityArraySet;)V HSPLandroidx/compose/runtime/CompositionImpl;->recordReadOf(Ljava/lang/Object;)V HPLandroidx/compose/runtime/CompositionImpl;->recordReadOf(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/CompositionImpl;->recordWriteOf(Ljava/lang/Object;)V HPLandroidx/compose/runtime/CompositionImpl;->recordWriteOf(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/CompositionImpl;->removeDerivedStateObservation$runtime_release(Landroidx/compose/runtime/DerivedState;)V PLandroidx/compose/runtime/CompositionImpl;->removeDerivedStateObservation$runtime_release(Landroidx/compose/runtime/DerivedState;)V HSPLandroidx/compose/runtime/CompositionImpl;->removeObservation$runtime_release(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)V PLandroidx/compose/runtime/CompositionImpl;->removeObservation$runtime_release(Landroidx/compose/runtime/RecomposeScopeImpl;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/CompositionImpl;->setContent(Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/CompositionImpl;->setContent(Lkotlin/jvm/functions/Function2;)V Landroidx/compose/runtime/CompositionImpl$RememberEventDispatcher; HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->(Ljava/util/HashSet;)V HPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->(Ljava/util/HashSet;)V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchAbandons()V HPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchAbandons()V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchRememberObservers()V HPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchRememberObservers()V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchSideEffects()V HPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->dispatchSideEffects()V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->forgetting(Landroidx/compose/runtime/RememberObserver;)V PLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->forgetting(Landroidx/compose/runtime/RememberObserver;)V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->releasing(Landroidx/compose/runtime/ComposeNodeLifecycleCallback;)V PLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->releasing(Landroidx/compose/runtime/ComposeNodeLifecycleCallback;)V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->remembering(Landroidx/compose/runtime/RememberObserver;)V HPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->remembering(Landroidx/compose/runtime/RememberObserver;)V HSPLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->sideEffect(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/CompositionImpl$RememberEventDispatcher;->sideEffect(Lkotlin/jvm/functions/Function0;)V Landroidx/compose/runtime/CompositionKt; HSPLandroidx/compose/runtime/CompositionKt;->()V PLandroidx/compose/runtime/CompositionKt;->()V HSPLandroidx/compose/runtime/CompositionKt;->access$getPendingApplyNoModifications$p()Ljava/lang/Object; PLandroidx/compose/runtime/CompositionKt;->access$getPendingApplyNoModifications$p()Ljava/lang/Object; Landroidx/compose/runtime/CompositionLocal; HSPLandroidx/compose/runtime/CompositionLocal;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/CompositionLocal;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/CompositionLocal;->getDefaultValueHolder$runtime_release()Landroidx/compose/runtime/LazyValueHolder; PLandroidx/compose/runtime/CompositionLocal;->getDefaultValueHolder$runtime_release()Landroidx/compose/runtime/LazyValueHolder; Landroidx/compose/runtime/CompositionLocalKt$CompositionLocalProvider$1; Landroidx/compose/runtime/CompositionLocalMap; HSPLandroidx/compose/runtime/CompositionLocalMap;->()V PLandroidx/compose/runtime/CompositionLocalMap;->()V Landroidx/compose/runtime/CompositionLocalMap$Companion; HSPLandroidx/compose/runtime/CompositionLocalMap$Companion;->()V PLandroidx/compose/runtime/CompositionLocalMap$Companion;->()V HSPLandroidx/compose/runtime/CompositionLocalMap$Companion;->()V PLandroidx/compose/runtime/CompositionLocalMap$Companion;->()V HSPLandroidx/compose/runtime/CompositionLocalMap$Companion;->getEmpty()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; PLandroidx/compose/runtime/CompositionLocalMap$Companion;->getEmpty()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; Landroidx/compose/runtime/CompositionObserverHolder; HSPLandroidx/compose/runtime/CompositionObserverHolder;->()V HPLandroidx/compose/runtime/CompositionObserverHolder;->()V HSPLandroidx/compose/runtime/CompositionObserverHolder;->getObserver()V PLandroidx/compose/runtime/CompositionObserverHolder;->getObserver()V HSPLandroidx/compose/runtime/CompositionObserverHolder;->getRoot()Z PLandroidx/compose/runtime/CompositionObserverHolder;->getRoot()Z Landroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller; HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->(Lkotlinx/coroutines/CoroutineScope;)V HPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->(Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; PLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onForgotten()V HPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onForgotten()V HSPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onRemembered()V HPLandroidx/compose/runtime/CompositionScopedCoroutineScopeCanceller;->onRemembered()V Landroidx/compose/runtime/ControlledComposition; Landroidx/compose/runtime/DefaultChoreographerFrameClock; Landroidx/compose/runtime/DerivedSnapshotState; HSPLandroidx/compose/runtime/DerivedSnapshotState;->(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/DerivedSnapshotState;->(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/DerivedSnapshotState;->current(Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HPLandroidx/compose/runtime/DerivedSnapshotState;->current(Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HSPLandroidx/compose/runtime/DerivedSnapshotState;->currentRecord(Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord;Landroidx/compose/runtime/snapshots/Snapshot;ZLkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HPLandroidx/compose/runtime/DerivedSnapshotState;->currentRecord(Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord;Landroidx/compose/runtime/snapshots/Snapshot;ZLkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HSPLandroidx/compose/runtime/DerivedSnapshotState;->getCurrentRecord()Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HPLandroidx/compose/runtime/DerivedSnapshotState;->getCurrentRecord()Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HSPLandroidx/compose/runtime/DerivedSnapshotState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/DerivedSnapshotState;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/DerivedSnapshotState;->getPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; PLandroidx/compose/runtime/DerivedSnapshotState;->getPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; HSPLandroidx/compose/runtime/DerivedSnapshotState;->getValue()Ljava/lang/Object; HPLandroidx/compose/runtime/DerivedSnapshotState;->getValue()Ljava/lang/Object; HSPLandroidx/compose/runtime/DerivedSnapshotState;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/DerivedSnapshotState;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V Landroidx/compose/runtime/DerivedSnapshotState$ResultRecord; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->()V PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->()V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->()V HPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->()V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->access$getUnset$cp()Ljava/lang/Object; PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->access$getUnset$cp()Ljava/lang/Object; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->getCurrentValue()Ljava/lang/Object; PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->getCurrentValue()Ljava/lang/Object; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->getDependencies()[Ljava/lang/Object; PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->getDependencies()[Ljava/lang/Object; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->getResult()Ljava/lang/Object; PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->getResult()Ljava/lang/Object; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->get_dependencies()Landroidx/compose/runtime/collection/IdentityArrayMap; HPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->get_dependencies()Landroidx/compose/runtime/collection/IdentityArrayMap; HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->isValid(Landroidx/compose/runtime/DerivedState;Landroidx/compose/runtime/snapshots/Snapshot;)Z HPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->isValid(Landroidx/compose/runtime/DerivedState;Landroidx/compose/runtime/snapshots/Snapshot;)Z HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->readableHash(Landroidx/compose/runtime/DerivedState;Landroidx/compose/runtime/snapshots/Snapshot;)I HPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->readableHash(Landroidx/compose/runtime/DerivedState;Landroidx/compose/runtime/snapshots/Snapshot;)I HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setResult(Ljava/lang/Object;)V PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setResult(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setResultHash(I)V PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setResultHash(I)V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setValidSnapshotId(I)V PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setValidSnapshotId(I)V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setValidSnapshotWriteCount(I)V PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->setValidSnapshotWriteCount(I)V HSPLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->set_dependencies(Landroidx/compose/runtime/collection/IdentityArrayMap;)V PLandroidx/compose/runtime/DerivedSnapshotState$ResultRecord;->set_dependencies(Landroidx/compose/runtime/collection/IdentityArrayMap;)V Landroidx/compose/runtime/DerivedState; Landroidx/compose/runtime/DerivedStateObserver; Landroidx/compose/runtime/DisposableEffectImpl; HSPLandroidx/compose/runtime/DisposableEffectImpl;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/runtime/DisposableEffectImpl;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/DisposableEffectImpl;->onForgotten()V HPLandroidx/compose/runtime/DisposableEffectImpl;->onForgotten()V HSPLandroidx/compose/runtime/DisposableEffectImpl;->onRemembered()V HPLandroidx/compose/runtime/DisposableEffectImpl;->onRemembered()V Landroidx/compose/runtime/DisposableEffectResult; Landroidx/compose/runtime/DisposableEffectScope; HSPLandroidx/compose/runtime/DisposableEffectScope;->()V PLandroidx/compose/runtime/DisposableEffectScope;->()V Landroidx/compose/runtime/DynamicProvidableCompositionLocal; HSPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->updatedStateOf$runtime_release(Ljava/lang/Object;Landroidx/compose/runtime/State;)Landroidx/compose/runtime/State; HPLandroidx/compose/runtime/DynamicProvidableCompositionLocal;->updatedStateOf$runtime_release(Ljava/lang/Object;Landroidx/compose/runtime/State;)Landroidx/compose/runtime/State; Landroidx/compose/runtime/EffectsKt; HSPLandroidx/compose/runtime/EffectsKt;->()V PLandroidx/compose/runtime/EffectsKt;->()V HSPLandroidx/compose/runtime/EffectsKt;->DisposableEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/EffectsKt;->DisposableEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/EffectsKt;->DisposableEffect(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/EffectsKt;->DisposableEffect(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController;Ljava/lang/Boolean;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController;Ljava/lang/Boolean;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/EffectsKt;->LaunchedEffect(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/EffectsKt;->SideEffect(Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/EffectsKt;->SideEffect(Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/EffectsKt;->access$getInternalDisposableEffectScope$p()Landroidx/compose/runtime/DisposableEffectScope; PLandroidx/compose/runtime/EffectsKt;->access$getInternalDisposableEffectScope$p()Landroidx/compose/runtime/DisposableEffectScope; HSPLandroidx/compose/runtime/EffectsKt;->createCompositionCoroutineScope(Lkotlin/coroutines/EmptyCoroutineContext;Landroidx/compose/runtime/Composer;)Lkotlinx/coroutines/CoroutineScope; HPLandroidx/compose/runtime/EffectsKt;->createCompositionCoroutineScope(Lkotlin/coroutines/EmptyCoroutineContext;Landroidx/compose/runtime/Composer;)Lkotlinx/coroutines/CoroutineScope; Landroidx/compose/runtime/GroupInfo; HSPLandroidx/compose/runtime/GroupInfo;->(III)V PLandroidx/compose/runtime/GroupInfo;->(III)V HSPLandroidx/compose/runtime/GroupInfo;->getNodeCount()I PLandroidx/compose/runtime/GroupInfo;->getNodeCount()I HSPLandroidx/compose/runtime/GroupInfo;->getNodeIndex()I PLandroidx/compose/runtime/GroupInfo;->getNodeIndex()I HSPLandroidx/compose/runtime/GroupInfo;->getSlotIndex()I PLandroidx/compose/runtime/GroupInfo;->getSlotIndex()I HSPLandroidx/compose/runtime/GroupInfo;->setNodeCount(I)V PLandroidx/compose/runtime/GroupInfo;->setNodeCount(I)V HSPLandroidx/compose/runtime/GroupInfo;->setNodeIndex(I)V PLandroidx/compose/runtime/GroupInfo;->setNodeIndex(I)V HSPLandroidx/compose/runtime/GroupInfo;->setSlotIndex(I)V PLandroidx/compose/runtime/GroupInfo;->setSlotIndex(I)V Landroidx/compose/runtime/GroupKind$Companion; HSPLandroidx/compose/runtime/GroupKind$Companion;->()V PLandroidx/compose/runtime/GroupKind$Companion;->()V PLandroidx/compose/runtime/GroupKind$Companion;->access$removeRunning(Landroidx/compose/runtime/GroupKind$Companion;)V Landroidx/compose/runtime/IntStack; HSPLandroidx/compose/runtime/IntStack;->(II)V HPLandroidx/compose/runtime/IntStack;->(II)V HSPLandroidx/compose/runtime/IntStack;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V HPLandroidx/compose/runtime/IntStack;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V HSPLandroidx/compose/runtime/IntStack;->add-0FcD4WY(J)V PLandroidx/compose/runtime/IntStack;->add-0FcD4WY(J)V HSPLandroidx/compose/runtime/IntStack;->clear()V PLandroidx/compose/runtime/IntStack;->clear()V HSPLandroidx/compose/runtime/IntStack;->contains(J)Z PLandroidx/compose/runtime/IntStack;->contains(J)Z HSPLandroidx/compose/runtime/IntStack;->get-_I2yYro(I)J PLandroidx/compose/runtime/IntStack;->get-_I2yYro(I)J HSPLandroidx/compose/runtime/IntStack;->getNode()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; PLandroidx/compose/runtime/IntStack;->getNode()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/IntStack;->getSize()I HPLandroidx/compose/runtime/IntStack;->getSize()I HSPLandroidx/compose/runtime/IntStack;->getSizeDelta()I PLandroidx/compose/runtime/IntStack;->getSizeDelta()I HSPLandroidx/compose/runtime/IntStack;->isEmpty()Z PLandroidx/compose/runtime/IntStack;->isEmpty()Z HSPLandroidx/compose/runtime/IntStack;->peek()I PLandroidx/compose/runtime/IntStack;->peek()I HSPLandroidx/compose/runtime/IntStack;->peekOr(I)I PLandroidx/compose/runtime/IntStack;->peekOr(I)I HSPLandroidx/compose/runtime/IntStack;->pop()I PLandroidx/compose/runtime/IntStack;->pop()I HSPLandroidx/compose/runtime/IntStack;->push(I)V HPLandroidx/compose/runtime/IntStack;->push(I)V HSPLandroidx/compose/runtime/IntStack;->remove-0FcD4WY(J)V PLandroidx/compose/runtime/IntStack;->remove-0FcD4WY(J)V HSPLandroidx/compose/runtime/IntStack;->removeAt(I)V PLandroidx/compose/runtime/IntStack;->removeAt(I)V HSPLandroidx/compose/runtime/IntStack;->setNode(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)V PLandroidx/compose/runtime/IntStack;->setNode(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)V Landroidx/compose/runtime/Invalidation; HSPLandroidx/compose/runtime/Invalidation;->(Landroidx/compose/runtime/RecomposeScopeImpl;ILandroidx/compose/runtime/collection/IdentityArraySet;)V PLandroidx/compose/runtime/Invalidation;->(Landroidx/compose/runtime/RecomposeScopeImpl;ILandroidx/compose/runtime/collection/IdentityArraySet;)V HSPLandroidx/compose/runtime/Invalidation;->getInstances()Landroidx/compose/runtime/collection/IdentityArraySet; PLandroidx/compose/runtime/Invalidation;->getInstances()Landroidx/compose/runtime/collection/IdentityArraySet; HSPLandroidx/compose/runtime/Invalidation;->getLocation()I HPLandroidx/compose/runtime/Invalidation;->getLocation()I HSPLandroidx/compose/runtime/Invalidation;->getScope()Landroidx/compose/runtime/RecomposeScopeImpl; PLandroidx/compose/runtime/Invalidation;->getScope()Landroidx/compose/runtime/RecomposeScopeImpl; HSPLandroidx/compose/runtime/Invalidation;->isInvalid()Z PLandroidx/compose/runtime/Invalidation;->isInvalid()Z HSPLandroidx/compose/runtime/Invalidation;->setInstances()V PLandroidx/compose/runtime/Invalidation;->setInstances()V Landroidx/compose/runtime/JoinedKey; HSPLandroidx/compose/runtime/JoinedKey;->(Ljava/lang/Integer;Ljava/lang/Object;)V PLandroidx/compose/runtime/JoinedKey;->(Ljava/lang/Integer;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/JoinedKey;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/JoinedKey;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/JoinedKey;->hashCode()I HPLandroidx/compose/runtime/JoinedKey;->hashCode()I Landroidx/compose/runtime/KeyInfo; HSPLandroidx/compose/runtime/KeyInfo;->(IIILjava/lang/Object;)V PLandroidx/compose/runtime/KeyInfo;->(IIILjava/lang/Object;)V HSPLandroidx/compose/runtime/KeyInfo;->getKey()I PLandroidx/compose/runtime/KeyInfo;->getKey()I HSPLandroidx/compose/runtime/KeyInfo;->getLocation()I HPLandroidx/compose/runtime/KeyInfo;->getLocation()I HSPLandroidx/compose/runtime/KeyInfo;->getNodes()I PLandroidx/compose/runtime/KeyInfo;->getNodes()I HSPLandroidx/compose/runtime/KeyInfo;->getObjectKey()Ljava/lang/Object; PLandroidx/compose/runtime/KeyInfo;->getObjectKey()Ljava/lang/Object; Landroidx/compose/runtime/Latch; HSPLandroidx/compose/runtime/Latch;->()V PLandroidx/compose/runtime/Latch;->()V HSPLandroidx/compose/runtime/Latch;->await(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/runtime/Latch;->await(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Latch;->closeLatch()V PLandroidx/compose/runtime/Latch;->closeLatch()V HSPLandroidx/compose/runtime/Latch;->openLatch()V PLandroidx/compose/runtime/Latch;->openLatch()V Landroidx/compose/runtime/Latch$await$2$2; HSPLandroidx/compose/runtime/Latch$await$2$2;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/Latch$await$2$2;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/Latch$await$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/Latch$await$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Latch$await$2$2;->invoke(Ljava/lang/Throwable;)V Landroidx/compose/runtime/LaunchedEffectImpl; HSPLandroidx/compose/runtime/LaunchedEffectImpl;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/runtime/LaunchedEffectImpl;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/LaunchedEffectImpl;->onForgotten()V HPLandroidx/compose/runtime/LaunchedEffectImpl;->onForgotten()V HSPLandroidx/compose/runtime/LaunchedEffectImpl;->onRemembered()V HPLandroidx/compose/runtime/LaunchedEffectImpl;->onRemembered()V Landroidx/compose/runtime/LazyValueHolder; HSPLandroidx/compose/runtime/LazyValueHolder;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/LazyValueHolder;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/LazyValueHolder;->getValue()Ljava/lang/Object; PLandroidx/compose/runtime/LazyValueHolder;->getValue()Ljava/lang/Object; Landroidx/compose/runtime/LeftCompositionCancellationException; HSPLandroidx/compose/runtime/LeftCompositionCancellationException;->()V HPLandroidx/compose/runtime/LeftCompositionCancellationException;->()V HSPLandroidx/compose/runtime/LeftCompositionCancellationException;->fillInStackTrace()Ljava/lang/Throwable; HPLandroidx/compose/runtime/LeftCompositionCancellationException;->fillInStackTrace()Ljava/lang/Throwable; Landroidx/compose/runtime/MonotonicFrameClock; HSPLandroidx/compose/runtime/MonotonicFrameClock;->()V PLandroidx/compose/runtime/MonotonicFrameClock;->()V HSPLandroidx/compose/runtime/MonotonicFrameClock;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HPLandroidx/compose/runtime/MonotonicFrameClock;->getKey()Lkotlin/coroutines/CoroutineContext$Key; Landroidx/compose/runtime/MonotonicFrameClock$Key; HSPLandroidx/compose/runtime/MonotonicFrameClock$Key;->()V PLandroidx/compose/runtime/MonotonicFrameClock$Key;->()V HSPLandroidx/compose/runtime/MonotonicFrameClock$Key;->()V PLandroidx/compose/runtime/MonotonicFrameClock$Key;->()V Landroidx/compose/runtime/MonotonicFrameClockKt; HSPLandroidx/compose/runtime/MonotonicFrameClockKt;->getMonotonicFrameClock(Lkotlin/coroutines/CoroutineContext;)Landroidx/compose/runtime/MonotonicFrameClock; HPLandroidx/compose/runtime/MonotonicFrameClockKt;->getMonotonicFrameClock(Lkotlin/coroutines/CoroutineContext;)Landroidx/compose/runtime/MonotonicFrameClock; HSPLandroidx/compose/runtime/MonotonicFrameClockKt;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/runtime/MonotonicFrameClockKt;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2; HSPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->(Ljava/lang/Object;I)V HPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->invoke(Ljava/lang/Object;)V HPLandroidx/compose/runtime/MonotonicFrameClockKt$withFrameMillis$2;->invoke(Ljava/lang/Object;)V Landroidx/compose/runtime/MovableContentStateReference; Landroidx/compose/runtime/MutableFloatState; Landroidx/compose/runtime/MutableIntState; Landroidx/compose/runtime/MutableLongState; Landroidx/compose/runtime/MutableState; Landroidx/compose/runtime/NeverEqualPolicy; HSPLandroidx/compose/runtime/NeverEqualPolicy;->()V PLandroidx/compose/runtime/NeverEqualPolicy;->()V HSPLandroidx/compose/runtime/NeverEqualPolicy;->()V PLandroidx/compose/runtime/NeverEqualPolicy;->()V HSPLandroidx/compose/runtime/NeverEqualPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z PLandroidx/compose/runtime/NeverEqualPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z Landroidx/compose/runtime/OpaqueKey; HSPLandroidx/compose/runtime/OpaqueKey;->(Ljava/lang/String;)V PLandroidx/compose/runtime/OpaqueKey;->(Ljava/lang/String;)V HSPLandroidx/compose/runtime/OpaqueKey;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/OpaqueKey;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/OpaqueKey;->hashCode()I HPLandroidx/compose/runtime/OpaqueKey;->hashCode()I Landroidx/compose/runtime/ParcelableSnapshotMutableFloatState; HSPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->()V PLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->()V HSPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->(F)V HPLandroidx/compose/runtime/ParcelableSnapshotMutableFloatState;->(F)V Landroidx/compose/runtime/ParcelableSnapshotMutableIntState; HSPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->()V PLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->()V HSPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->(I)V HPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState;->(I)V Landroidx/compose/runtime/ParcelableSnapshotMutableIntState$Companion$CREATOR$1; HSPLandroidx/compose/runtime/ParcelableSnapshotMutableIntState$Companion$CREATOR$1;->(I)V PLandroidx/compose/runtime/ParcelableSnapshotMutableIntState$Companion$CREATOR$1;->(I)V Landroidx/compose/runtime/ParcelableSnapshotMutableLongState; HSPLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->()V PLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->()V HSPLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->(J)V PLandroidx/compose/runtime/ParcelableSnapshotMutableLongState;->(J)V Landroidx/compose/runtime/ParcelableSnapshotMutableState; HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->()V PLandroidx/compose/runtime/ParcelableSnapshotMutableState;->()V HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V HPLandroidx/compose/runtime/ParcelableSnapshotMutableState;->(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V Landroidx/compose/runtime/ParcelableSnapshotMutableState$Companion$CREATOR$1; HSPLandroidx/compose/runtime/ParcelableSnapshotMutableState$Companion$CREATOR$1;->()V PLandroidx/compose/runtime/ParcelableSnapshotMutableState$Companion$CREATOR$1;->()V Landroidx/compose/runtime/PausableMonotonicFrameClock; HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->(Landroidx/compose/runtime/MonotonicFrameClock;)V PLandroidx/compose/runtime/PausableMonotonicFrameClock;->(Landroidx/compose/runtime/MonotonicFrameClock;)V HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLandroidx/compose/runtime/PausableMonotonicFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; PLandroidx/compose/runtime/PausableMonotonicFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; PLandroidx/compose/runtime/PausableMonotonicFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->pause()V PLandroidx/compose/runtime/PausableMonotonicFrameClock;->pause()V HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->resume()V PLandroidx/compose/runtime/PausableMonotonicFrameClock;->resume()V HSPLandroidx/compose/runtime/PausableMonotonicFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/runtime/PausableMonotonicFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1; HSPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->(Landroidx/compose/runtime/PausableMonotonicFrameClock;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->(Landroidx/compose/runtime/PausableMonotonicFrameClock;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/PausableMonotonicFrameClock$withFrameNanos$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/Pending; HSPLandroidx/compose/runtime/Pending;->(ILjava/util/ArrayList;)V HPLandroidx/compose/runtime/Pending;->(ILjava/util/ArrayList;)V HSPLandroidx/compose/runtime/Pending;->getKeyInfos()Ljava/util/List; PLandroidx/compose/runtime/Pending;->getKeyInfos()Ljava/util/List; HSPLandroidx/compose/runtime/Pending;->getNext(ILjava/lang/Object;)Landroidx/compose/runtime/KeyInfo; HPLandroidx/compose/runtime/Pending;->getNext(ILjava/lang/Object;)Landroidx/compose/runtime/KeyInfo; HSPLandroidx/compose/runtime/Pending;->getStartIndex()I PLandroidx/compose/runtime/Pending;->getStartIndex()I HSPLandroidx/compose/runtime/Pending;->nodePositionOf(Landroidx/compose/runtime/KeyInfo;)I HPLandroidx/compose/runtime/Pending;->nodePositionOf(Landroidx/compose/runtime/KeyInfo;)I HSPLandroidx/compose/runtime/Pending;->recordUsed(Landroidx/compose/runtime/KeyInfo;)V PLandroidx/compose/runtime/Pending;->recordUsed(Landroidx/compose/runtime/KeyInfo;)V HSPLandroidx/compose/runtime/Pending;->registerInsert(Landroidx/compose/runtime/KeyInfo;I)V PLandroidx/compose/runtime/Pending;->registerInsert(Landroidx/compose/runtime/KeyInfo;I)V HSPLandroidx/compose/runtime/Pending;->registerMoveSlot(II)V HPLandroidx/compose/runtime/Pending;->registerMoveSlot(II)V HSPLandroidx/compose/runtime/Pending;->updateNodeCount(II)Z HPLandroidx/compose/runtime/Pending;->updateNodeCount(II)Z Landroidx/compose/runtime/Pending$keyMap$2; HSPLandroidx/compose/runtime/Pending$keyMap$2;->(Ljava/lang/Object;I)V HPLandroidx/compose/runtime/Pending$keyMap$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/Pending$keyMap$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/runtime/Pending$keyMap$2;->invoke()Ljava/lang/Object; Landroidx/compose/runtime/PersistentCompositionLocalMap; Landroidx/compose/runtime/ProduceStateScope; Landroidx/compose/runtime/ProduceStateScopeImpl; HSPLandroidx/compose/runtime/ProduceStateScopeImpl;->(Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/CoroutineContext;)V HPLandroidx/compose/runtime/ProduceStateScopeImpl;->(Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/CoroutineContext;)V HSPLandroidx/compose/runtime/ProduceStateScopeImpl;->setValue(Ljava/lang/Object;)V HPLandroidx/compose/runtime/ProduceStateScopeImpl;->setValue(Ljava/lang/Object;)V Landroidx/compose/runtime/ProvidableCompositionLocal; HSPLandroidx/compose/runtime/ProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/ProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/ProvidableCompositionLocal;->provides(Ljava/lang/Object;)Landroidx/compose/runtime/ProvidedValue; HPLandroidx/compose/runtime/ProvidableCompositionLocal;->provides(Ljava/lang/Object;)Landroidx/compose/runtime/ProvidedValue; Landroidx/compose/runtime/ProvidedValue; HSPLandroidx/compose/runtime/ProvidedValue;->(Landroidx/compose/runtime/CompositionLocal;Ljava/lang/Object;Z)V HPLandroidx/compose/runtime/ProvidedValue;->(Landroidx/compose/runtime/CompositionLocal;Ljava/lang/Object;Z)V HSPLandroidx/compose/runtime/ProvidedValue;->getCanOverride()Z PLandroidx/compose/runtime/ProvidedValue;->getCanOverride()Z HSPLandroidx/compose/runtime/ProvidedValue;->getCompositionLocal()Landroidx/compose/runtime/CompositionLocal; PLandroidx/compose/runtime/ProvidedValue;->getCompositionLocal()Landroidx/compose/runtime/CompositionLocal; HSPLandroidx/compose/runtime/ProvidedValue;->getValue()Ljava/lang/Object; PLandroidx/compose/runtime/ProvidedValue;->getValue()Ljava/lang/Object; Landroidx/compose/runtime/RecomposeScope; Landroidx/compose/runtime/RecomposeScopeImpl; HSPLandroidx/compose/runtime/RecomposeScopeImpl;->(Landroidx/compose/runtime/CompositionImpl;)V HPLandroidx/compose/runtime/RecomposeScopeImpl;->(Landroidx/compose/runtime/CompositionImpl;)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->access$getCurrentToken$p(Landroidx/compose/runtime/RecomposeScopeImpl;)I PLandroidx/compose/runtime/RecomposeScopeImpl;->access$getCurrentToken$p(Landroidx/compose/runtime/RecomposeScopeImpl;)I HSPLandroidx/compose/runtime/RecomposeScopeImpl;->access$getTrackedDependencies$p(Landroidx/compose/runtime/RecomposeScopeImpl;)Landroidx/compose/runtime/collection/IdentityArrayMap; PLandroidx/compose/runtime/RecomposeScopeImpl;->access$getTrackedDependencies$p(Landroidx/compose/runtime/RecomposeScopeImpl;)Landroidx/compose/runtime/collection/IdentityArrayMap; HSPLandroidx/compose/runtime/RecomposeScopeImpl;->access$getTrackedInstances$p(Landroidx/compose/runtime/RecomposeScopeImpl;)Landroidx/compose/runtime/collection/IdentityArrayIntMap; PLandroidx/compose/runtime/RecomposeScopeImpl;->access$getTrackedInstances$p(Landroidx/compose/runtime/RecomposeScopeImpl;)Landroidx/compose/runtime/collection/IdentityArrayIntMap; HSPLandroidx/compose/runtime/RecomposeScopeImpl;->access$setTrackedInstances$p(Landroidx/compose/runtime/RecomposeScopeImpl;)V PLandroidx/compose/runtime/RecomposeScopeImpl;->access$setTrackedInstances$p(Landroidx/compose/runtime/RecomposeScopeImpl;)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->compose(Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/RecomposeScopeImpl;->compose(Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->end(I)Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/RecomposeScopeImpl;->end(I)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getAnchor()Landroidx/compose/runtime/Anchor; HPLandroidx/compose/runtime/RecomposeScopeImpl;->getAnchor()Landroidx/compose/runtime/Anchor; HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getCanRecompose()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->getCanRecompose()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getDefaultsInScope()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->getDefaultsInScope()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getDefaultsInvalid()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->getDefaultsInvalid()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getRequiresRecompose()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->getRequiresRecompose()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getSkipped$runtime_release()Z HPLandroidx/compose/runtime/RecomposeScopeImpl;->getSkipped$runtime_release()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getUsed()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->getUsed()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->getValid()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->getValid()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->invalidate()V PLandroidx/compose/runtime/RecomposeScopeImpl;->invalidate()V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->invalidateForResult$enumunboxing$(Ljava/lang/Object;)I PLandroidx/compose/runtime/RecomposeScopeImpl;->invalidateForResult$enumunboxing$(Ljava/lang/Object;)I HSPLandroidx/compose/runtime/RecomposeScopeImpl;->isConditional()Z PLandroidx/compose/runtime/RecomposeScopeImpl;->isConditional()Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->isInvalidFor(Landroidx/compose/runtime/collection/IdentityArraySet;)Z HPLandroidx/compose/runtime/RecomposeScopeImpl;->isInvalidFor(Landroidx/compose/runtime/collection/IdentityArraySet;)Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->recordRead(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/RecomposeScopeImpl;->recordRead(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/RecomposeScopeImpl;->release()V PLandroidx/compose/runtime/RecomposeScopeImpl;->release()V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->rereadTrackedInstances()V HPLandroidx/compose/runtime/RecomposeScopeImpl;->rereadTrackedInstances()V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->scopeSkipped()V PLandroidx/compose/runtime/RecomposeScopeImpl;->scopeSkipped()V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->setAnchor(Landroidx/compose/runtime/Anchor;)V PLandroidx/compose/runtime/RecomposeScopeImpl;->setAnchor(Landroidx/compose/runtime/Anchor;)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->setDefaultsInScope()V PLandroidx/compose/runtime/RecomposeScopeImpl;->setDefaultsInScope()V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->setDefaultsInvalid(Z)V PLandroidx/compose/runtime/RecomposeScopeImpl;->setDefaultsInvalid(Z)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->setRequiresRecompose(Z)V PLandroidx/compose/runtime/RecomposeScopeImpl;->setRequiresRecompose(Z)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->setUsed()V PLandroidx/compose/runtime/RecomposeScopeImpl;->setUsed()V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->start(I)V PLandroidx/compose/runtime/RecomposeScopeImpl;->start(I)V HSPLandroidx/compose/runtime/RecomposeScopeImpl;->updateScope(Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/RecomposeScopeImpl;->updateScope(Lkotlin/jvm/functions/Function2;)V Landroidx/compose/runtime/RecomposeScopeImpl$end$1$2; HSPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->(Landroidx/compose/runtime/DerivedSnapshotState;Landroidx/compose/runtime/collection/IdentityArrayMap;I)V PLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->(Landroidx/compose/runtime/DerivedSnapshotState;Landroidx/compose/runtime/collection/IdentityArrayMap;I)V HSPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->(Landroidx/compose/runtime/RecomposeScopeImpl;ILandroidx/compose/runtime/collection/IdentityArrayIntMap;)V HPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->(Landroidx/compose/runtime/RecomposeScopeImpl;ILandroidx/compose/runtime/collection/IdentityArrayIntMap;)V HSPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/RecomposeScopeImpl$end$1$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/RecomposeScopeOwner; Landroidx/compose/runtime/Recomposer; HSPLandroidx/compose/runtime/Recomposer;->()V PLandroidx/compose/runtime/Recomposer;->()V HSPLandroidx/compose/runtime/Recomposer;->(Lkotlin/coroutines/CoroutineContext;)V HPLandroidx/compose/runtime/Recomposer;->(Lkotlin/coroutines/CoroutineContext;)V HSPLandroidx/compose/runtime/Recomposer;->access$awaitWorkAvailable(Landroidx/compose/runtime/Recomposer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/runtime/Recomposer;->access$awaitWorkAvailable(Landroidx/compose/runtime/Recomposer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer;->access$deriveStateLocked(Landroidx/compose/runtime/Recomposer;)Lkotlinx/coroutines/CancellableContinuation; PLandroidx/compose/runtime/Recomposer;->access$deriveStateLocked(Landroidx/compose/runtime/Recomposer;)Lkotlinx/coroutines/CancellableContinuation; HSPLandroidx/compose/runtime/Recomposer;->access$discardUnusedValues(Landroidx/compose/runtime/Recomposer;)V HPLandroidx/compose/runtime/Recomposer;->access$discardUnusedValues(Landroidx/compose/runtime/Recomposer;)V HSPLandroidx/compose/runtime/Recomposer;->access$getBroadcastFrameClock$p(Landroidx/compose/runtime/Recomposer;)Landroidx/compose/runtime/BroadcastFrameClock; PLandroidx/compose/runtime/Recomposer;->access$getBroadcastFrameClock$p(Landroidx/compose/runtime/Recomposer;)Landroidx/compose/runtime/BroadcastFrameClock; HSPLandroidx/compose/runtime/Recomposer;->access$getCompositionInvalidations$p(Landroidx/compose/runtime/Recomposer;)Ljava/util/ArrayList; PLandroidx/compose/runtime/Recomposer;->access$getCompositionInvalidations$p(Landroidx/compose/runtime/Recomposer;)Ljava/util/ArrayList; HSPLandroidx/compose/runtime/Recomposer;->access$getCompositionValuesAwaitingInsert$p(Landroidx/compose/runtime/Recomposer;)Ljava/util/ArrayList; PLandroidx/compose/runtime/Recomposer;->access$getCompositionValuesAwaitingInsert$p(Landroidx/compose/runtime/Recomposer;)Ljava/util/ArrayList; HSPLandroidx/compose/runtime/Recomposer;->access$getHasBroadcastFrameClockAwaiters(Landroidx/compose/runtime/Recomposer;)Z HPLandroidx/compose/runtime/Recomposer;->access$getHasBroadcastFrameClockAwaiters(Landroidx/compose/runtime/Recomposer;)Z HSPLandroidx/compose/runtime/Recomposer;->access$getKnownCompositions(Landroidx/compose/runtime/Recomposer;)Ljava/util/List; PLandroidx/compose/runtime/Recomposer;->access$getKnownCompositions(Landroidx/compose/runtime/Recomposer;)Ljava/util/List; HSPLandroidx/compose/runtime/Recomposer;->access$getRecomposerInfo$p(Landroidx/compose/runtime/Recomposer;)Landroidx/compose/runtime/GroupKind$Companion; PLandroidx/compose/runtime/Recomposer;->access$getRecomposerInfo$p(Landroidx/compose/runtime/Recomposer;)Landroidx/compose/runtime/GroupKind$Companion; PLandroidx/compose/runtime/Recomposer;->access$getRunnerJob$p(Landroidx/compose/runtime/Recomposer;)Lkotlinx/coroutines/Job; HSPLandroidx/compose/runtime/Recomposer;->access$getShouldKeepRecomposing(Landroidx/compose/runtime/Recomposer;)Z HPLandroidx/compose/runtime/Recomposer;->access$getShouldKeepRecomposing(Landroidx/compose/runtime/Recomposer;)Z HSPLandroidx/compose/runtime/Recomposer;->access$getSnapshotInvalidations$p(Landroidx/compose/runtime/Recomposer;)Landroidx/compose/runtime/collection/IdentityArraySet; PLandroidx/compose/runtime/Recomposer;->access$getSnapshotInvalidations$p(Landroidx/compose/runtime/Recomposer;)Landroidx/compose/runtime/collection/IdentityArraySet; HSPLandroidx/compose/runtime/Recomposer;->access$getStateLock$p(Landroidx/compose/runtime/Recomposer;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer;->access$getStateLock$p(Landroidx/compose/runtime/Recomposer;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer;->access$get_runningRecomposers$cp()Lkotlinx/coroutines/flow/MutableStateFlow; PLandroidx/compose/runtime/Recomposer;->access$get_runningRecomposers$cp()Lkotlinx/coroutines/flow/MutableStateFlow; HSPLandroidx/compose/runtime/Recomposer;->access$get_state$p(Landroidx/compose/runtime/Recomposer;)Lkotlinx/coroutines/flow/MutableStateFlow; PLandroidx/compose/runtime/Recomposer;->access$get_state$p(Landroidx/compose/runtime/Recomposer;)Lkotlinx/coroutines/flow/MutableStateFlow; PLandroidx/compose/runtime/Recomposer;->access$isClosed$p(Landroidx/compose/runtime/Recomposer;)Z HSPLandroidx/compose/runtime/Recomposer;->access$performRecompose(Landroidx/compose/runtime/Recomposer;Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/collection/IdentityArraySet;)Landroidx/compose/runtime/CompositionImpl; HPLandroidx/compose/runtime/Recomposer;->access$performRecompose(Landroidx/compose/runtime/Recomposer;Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/collection/IdentityArraySet;)Landroidx/compose/runtime/CompositionImpl; HSPLandroidx/compose/runtime/Recomposer;->access$recordComposerModifications(Landroidx/compose/runtime/Recomposer;)Z HPLandroidx/compose/runtime/Recomposer;->access$recordComposerModifications(Landroidx/compose/runtime/Recomposer;)Z HSPLandroidx/compose/runtime/Recomposer;->access$registerRunnerJob(Landroidx/compose/runtime/Recomposer;Lkotlinx/coroutines/Job;)V PLandroidx/compose/runtime/Recomposer;->access$registerRunnerJob(Landroidx/compose/runtime/Recomposer;Lkotlinx/coroutines/Job;)V HSPLandroidx/compose/runtime/Recomposer;->access$setChangeCount$p(Landroidx/compose/runtime/Recomposer;J)V PLandroidx/compose/runtime/Recomposer;->access$setChangeCount$p(Landroidx/compose/runtime/Recomposer;J)V PLandroidx/compose/runtime/Recomposer;->access$setCloseCause$p(Landroidx/compose/runtime/Recomposer;Ljava/lang/Throwable;)V HSPLandroidx/compose/runtime/Recomposer;->access$setCompositionsRemoved$p(Landroidx/compose/runtime/Recomposer;)V PLandroidx/compose/runtime/Recomposer;->access$setCompositionsRemoved$p(Landroidx/compose/runtime/Recomposer;)V PLandroidx/compose/runtime/Recomposer;->access$setRunnerJob$p(Landroidx/compose/runtime/Recomposer;)V PLandroidx/compose/runtime/Recomposer;->access$setWorkContinuation$p(Landroidx/compose/runtime/Recomposer;)V HSPLandroidx/compose/runtime/Recomposer;->applyAndCheck(Landroidx/compose/runtime/snapshots/MutableSnapshot;)V HPLandroidx/compose/runtime/Recomposer;->applyAndCheck(Landroidx/compose/runtime/snapshots/MutableSnapshot;)V PLandroidx/compose/runtime/Recomposer;->cancel()V HSPLandroidx/compose/runtime/Recomposer;->composeInitial$runtime_release(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HPLandroidx/compose/runtime/Recomposer;->composeInitial$runtime_release(Landroidx/compose/runtime/ControlledComposition;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/runtime/Recomposer;->deriveStateLocked()Lkotlinx/coroutines/CancellableContinuation; HPLandroidx/compose/runtime/Recomposer;->deriveStateLocked()Lkotlinx/coroutines/CancellableContinuation; HSPLandroidx/compose/runtime/Recomposer;->getChangeCount()J PLandroidx/compose/runtime/Recomposer;->getChangeCount()J HSPLandroidx/compose/runtime/Recomposer;->getCollectingParameterInformation$runtime_release()Z PLandroidx/compose/runtime/Recomposer;->getCollectingParameterInformation$runtime_release()Z HSPLandroidx/compose/runtime/Recomposer;->getCompoundHashKey$runtime_release()I PLandroidx/compose/runtime/Recomposer;->getCompoundHashKey$runtime_release()I HSPLandroidx/compose/runtime/Recomposer;->getCurrentState()Lkotlinx/coroutines/flow/MutableStateFlow; PLandroidx/compose/runtime/Recomposer;->getCurrentState()Lkotlinx/coroutines/flow/MutableStateFlow; HSPLandroidx/compose/runtime/Recomposer;->getEffectCoroutineContext()Lkotlin/coroutines/CoroutineContext; HPLandroidx/compose/runtime/Recomposer;->getEffectCoroutineContext()Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/runtime/Recomposer;->getHasBroadcastFrameClockAwaitersLocked()Z PLandroidx/compose/runtime/Recomposer;->getHasBroadcastFrameClockAwaitersLocked()Z HSPLandroidx/compose/runtime/Recomposer;->getHasSchedulingWork()Z HPLandroidx/compose/runtime/Recomposer;->getHasSchedulingWork()Z HSPLandroidx/compose/runtime/Recomposer;->getKnownCompositions()Ljava/util/List; HPLandroidx/compose/runtime/Recomposer;->getKnownCompositions()Ljava/util/List; HSPLandroidx/compose/runtime/Recomposer;->invalidate$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/Recomposer;->invalidate$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/Recomposer;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer;->pauseCompositionFrameClock()V PLandroidx/compose/runtime/Recomposer;->pauseCompositionFrameClock()V HSPLandroidx/compose/runtime/Recomposer;->performInitialMovableContentInserts(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/Recomposer;->performInitialMovableContentInserts(Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/Recomposer;->reportRemovedComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/Recomposer;->reportRemovedComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/Recomposer;->resumeCompositionFrameClock()V PLandroidx/compose/runtime/Recomposer;->resumeCompositionFrameClock()V HSPLandroidx/compose/runtime/Recomposer;->runRecomposeAndApplyChanges(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer;->runRecomposeAndApplyChanges(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer;->unregisterComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/Recomposer;->unregisterComposition$runtime_release(Landroidx/compose/runtime/ControlledComposition;)V Landroidx/compose/runtime/Recomposer$State; HSPLandroidx/compose/runtime/Recomposer$State;->()V PLandroidx/compose/runtime/Recomposer$State;->()V HSPLandroidx/compose/runtime/Recomposer$State;->(Ljava/lang/String;I)V PLandroidx/compose/runtime/Recomposer$State;->(Ljava/lang/String;I)V Landroidx/compose/runtime/Recomposer$effectJob$1$1; HSPLandroidx/compose/runtime/Recomposer$effectJob$1$1;->(Landroidx/compose/runtime/Recomposer;)V PLandroidx/compose/runtime/Recomposer$effectJob$1$1;->(Landroidx/compose/runtime/Recomposer;)V PLandroidx/compose/runtime/Recomposer$effectJob$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/Recomposer$join$2; HSPLandroidx/compose/runtime/Recomposer$join$2;->(Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/runtime/Recomposer$join$2;->(Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/Recomposer$join$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/runtime/Recomposer$join$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/Recomposer$join$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/Recomposer$join$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer$join$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/Recomposer$join$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/Recomposer$performRecompose$1$1; HSPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->(ILjava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->invoke()V HPLandroidx/compose/runtime/Recomposer$performRecompose$1$1;->invoke()V Landroidx/compose/runtime/Recomposer$recompositionRunner$2; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->(Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MonotonicFrameClock;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->(Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MonotonicFrameClock;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/Recomposer$recompositionRunner$2$3; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MonotonicFrameClock;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/MonotonicFrameClock;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->(Ljava/lang/Object;I)V PLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->invoke(Ljava/util/Set;)V HPLandroidx/compose/runtime/Recomposer$recompositionRunner$2$unregisterApplyObserver$1;->invoke(Ljava/util/Set;)V Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2; HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->(Landroidx/compose/runtime/Recomposer;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->(Landroidx/compose/runtime/Recomposer;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->access$invokeSuspend$fillToInsert(Ljava/util/List;Landroidx/compose/runtime/Recomposer;)V HPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->access$invokeSuspend$fillToInsert(Ljava/util/List;Landroidx/compose/runtime/Recomposer;)V HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$1; HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$1;->(Landroidx/compose/runtime/Recomposer;Landroidx/compose/runtime/collection/IdentityArraySet;Landroidx/compose/runtime/collection/IdentityArraySet;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/List;Ljava/util/Set;)V HPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$1;->(Landroidx/compose/runtime/Recomposer;Landroidx/compose/runtime/collection/IdentityArraySet;Landroidx/compose/runtime/collection/IdentityArraySet;Ljava/util/List;Ljava/util/List;Ljava/util/Set;Ljava/util/List;Ljava/util/Set;)V HSPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/Recomposer$runRecomposeAndApplyChanges$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/ReferentialEqualityPolicy; HSPLandroidx/compose/runtime/ReferentialEqualityPolicy;->()V PLandroidx/compose/runtime/ReferentialEqualityPolicy;->()V HSPLandroidx/compose/runtime/ReferentialEqualityPolicy;->()V PLandroidx/compose/runtime/ReferentialEqualityPolicy;->()V HSPLandroidx/compose/runtime/ReferentialEqualityPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z HPLandroidx/compose/runtime/ReferentialEqualityPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z Landroidx/compose/runtime/RememberManager; Landroidx/compose/runtime/RememberObserver; Landroidx/compose/runtime/SkippableUpdater; HSPLandroidx/compose/runtime/SkippableUpdater;->(Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/SkippableUpdater;->(Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/SkippableUpdater;->box-impl(Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/SkippableUpdater; HPLandroidx/compose/runtime/SkippableUpdater;->box-impl(Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/SkippableUpdater; HSPLandroidx/compose/runtime/SkippableUpdater;->unbox-impl()Landroidx/compose/runtime/Composer; PLandroidx/compose/runtime/SkippableUpdater;->unbox-impl()Landroidx/compose/runtime/Composer; Landroidx/compose/runtime/SlotReader; HSPLandroidx/compose/runtime/SlotReader;->(Landroidx/compose/runtime/SlotTable;)V HPLandroidx/compose/runtime/SlotReader;->(Landroidx/compose/runtime/SlotTable;)V HSPLandroidx/compose/runtime/SlotReader;->anchor(I)Landroidx/compose/runtime/Anchor; HPLandroidx/compose/runtime/SlotReader;->anchor(I)Landroidx/compose/runtime/Anchor; HSPLandroidx/compose/runtime/SlotReader;->beginEmpty()V PLandroidx/compose/runtime/SlotReader;->beginEmpty()V HSPLandroidx/compose/runtime/SlotReader;->close()V HPLandroidx/compose/runtime/SlotReader;->close()V HSPLandroidx/compose/runtime/SlotReader;->containsMark(I)Z PLandroidx/compose/runtime/SlotReader;->containsMark(I)Z HSPLandroidx/compose/runtime/SlotReader;->endEmpty()V PLandroidx/compose/runtime/SlotReader;->endEmpty()V HSPLandroidx/compose/runtime/SlotReader;->endGroup()V HPLandroidx/compose/runtime/SlotReader;->endGroup()V HSPLandroidx/compose/runtime/SlotReader;->extractKeys()Ljava/util/ArrayList; HPLandroidx/compose/runtime/SlotReader;->extractKeys()Ljava/util/ArrayList; HSPLandroidx/compose/runtime/SlotReader;->getCurrentGroup()I HPLandroidx/compose/runtime/SlotReader;->getCurrentGroup()I HSPLandroidx/compose/runtime/SlotReader;->getGroupAux()Ljava/lang/Object; HPLandroidx/compose/runtime/SlotReader;->getGroupAux()Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->getGroupKey()I PLandroidx/compose/runtime/SlotReader;->getGroupKey()I HSPLandroidx/compose/runtime/SlotReader;->getGroupObjectKey()Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->getGroupObjectKey()Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->getGroupSize()I PLandroidx/compose/runtime/SlotReader;->getGroupSize()I HSPLandroidx/compose/runtime/SlotReader;->getInEmpty()Z PLandroidx/compose/runtime/SlotReader;->getInEmpty()Z HSPLandroidx/compose/runtime/SlotReader;->getParent()I HPLandroidx/compose/runtime/SlotReader;->getParent()I HSPLandroidx/compose/runtime/SlotReader;->getParentNodes()I PLandroidx/compose/runtime/SlotReader;->getParentNodes()I HSPLandroidx/compose/runtime/SlotReader;->getSize()I PLandroidx/compose/runtime/SlotReader;->getSize()I HSPLandroidx/compose/runtime/SlotReader;->getTable$runtime_release()Landroidx/compose/runtime/SlotTable; PLandroidx/compose/runtime/SlotReader;->getTable$runtime_release()Landroidx/compose/runtime/SlotTable; HSPLandroidx/compose/runtime/SlotReader;->groupAux(I)Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->groupAux(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->groupGet(I)Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->groupGet(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->groupGet(II)Ljava/lang/Object; HPLandroidx/compose/runtime/SlotReader;->groupGet(II)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->groupKey(I)I PLandroidx/compose/runtime/SlotReader;->groupKey(I)I HSPLandroidx/compose/runtime/SlotReader;->groupObjectKey(I)Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->groupObjectKey(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->groupSize(I)I HPLandroidx/compose/runtime/SlotReader;->groupSize(I)I HSPLandroidx/compose/runtime/SlotReader;->hasMark(I)Z PLandroidx/compose/runtime/SlotReader;->hasMark(I)Z HSPLandroidx/compose/runtime/SlotReader;->hasObjectKey(I)Z HPLandroidx/compose/runtime/SlotReader;->hasObjectKey(I)Z HSPLandroidx/compose/runtime/SlotReader;->isGroupEnd()Z PLandroidx/compose/runtime/SlotReader;->isGroupEnd()Z HSPLandroidx/compose/runtime/SlotReader;->isNode()Z PLandroidx/compose/runtime/SlotReader;->isNode()Z HSPLandroidx/compose/runtime/SlotReader;->isNode(I)Z PLandroidx/compose/runtime/SlotReader;->isNode(I)Z HSPLandroidx/compose/runtime/SlotReader;->next()Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->next()Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->node(I)Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->node(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->nodeCount(I)I HPLandroidx/compose/runtime/SlotReader;->nodeCount(I)I HSPLandroidx/compose/runtime/SlotReader;->objectKey(I[I)Ljava/lang/Object; PLandroidx/compose/runtime/SlotReader;->objectKey(I[I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotReader;->parent(I)I HPLandroidx/compose/runtime/SlotReader;->parent(I)I HSPLandroidx/compose/runtime/SlotReader;->reposition(I)V HPLandroidx/compose/runtime/SlotReader;->reposition(I)V HSPLandroidx/compose/runtime/SlotReader;->restoreParent(I)V HPLandroidx/compose/runtime/SlotReader;->restoreParent(I)V HSPLandroidx/compose/runtime/SlotReader;->skipGroup()I HPLandroidx/compose/runtime/SlotReader;->skipGroup()I HSPLandroidx/compose/runtime/SlotReader;->skipToGroupEnd()V PLandroidx/compose/runtime/SlotReader;->skipToGroupEnd()V HSPLandroidx/compose/runtime/SlotReader;->startGroup()V HPLandroidx/compose/runtime/SlotReader;->startGroup()V Landroidx/compose/runtime/SlotTable; HSPLandroidx/compose/runtime/SlotTable;->()V HPLandroidx/compose/runtime/SlotTable;->()V HSPLandroidx/compose/runtime/SlotTable;->anchorIndex(Landroidx/compose/runtime/Anchor;)I HPLandroidx/compose/runtime/SlotTable;->anchorIndex(Landroidx/compose/runtime/Anchor;)I HSPLandroidx/compose/runtime/SlotTable;->close$runtime_release(Landroidx/compose/runtime/SlotReader;)V HPLandroidx/compose/runtime/SlotTable;->close$runtime_release(Landroidx/compose/runtime/SlotReader;)V HSPLandroidx/compose/runtime/SlotTable;->close$runtime_release(Landroidx/compose/runtime/SlotWriter;[II[Ljava/lang/Object;ILjava/util/ArrayList;)V HPLandroidx/compose/runtime/SlotTable;->close$runtime_release(Landroidx/compose/runtime/SlotWriter;[II[Ljava/lang/Object;ILjava/util/ArrayList;)V HSPLandroidx/compose/runtime/SlotTable;->containsMark()Z PLandroidx/compose/runtime/SlotTable;->containsMark()Z HSPLandroidx/compose/runtime/SlotTable;->getAnchors$runtime_release()Ljava/util/ArrayList; PLandroidx/compose/runtime/SlotTable;->getAnchors$runtime_release()Ljava/util/ArrayList; HSPLandroidx/compose/runtime/SlotTable;->getGroups()[I PLandroidx/compose/runtime/SlotTable;->getGroups()[I HSPLandroidx/compose/runtime/SlotTable;->getGroupsSize()I PLandroidx/compose/runtime/SlotTable;->getGroupsSize()I HSPLandroidx/compose/runtime/SlotTable;->getSlots()[Ljava/lang/Object; PLandroidx/compose/runtime/SlotTable;->getSlots()[Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotTable;->getSlotsSize()I HPLandroidx/compose/runtime/SlotTable;->getSlotsSize()I HSPLandroidx/compose/runtime/SlotTable;->isEmpty()Z PLandroidx/compose/runtime/SlotTable;->isEmpty()Z HSPLandroidx/compose/runtime/SlotTable;->openReader()Landroidx/compose/runtime/SlotReader; HPLandroidx/compose/runtime/SlotTable;->openReader()Landroidx/compose/runtime/SlotReader; HSPLandroidx/compose/runtime/SlotTable;->openWriter()Landroidx/compose/runtime/SlotWriter; HPLandroidx/compose/runtime/SlotTable;->openWriter()Landroidx/compose/runtime/SlotWriter; HSPLandroidx/compose/runtime/SlotTable;->ownsAnchor(Landroidx/compose/runtime/Anchor;)Z HPLandroidx/compose/runtime/SlotTable;->ownsAnchor(Landroidx/compose/runtime/Anchor;)Z HSPLandroidx/compose/runtime/SlotTable;->setTo$runtime_release([II[Ljava/lang/Object;ILjava/util/ArrayList;)V PLandroidx/compose/runtime/SlotTable;->setTo$runtime_release([II[Ljava/lang/Object;ILjava/util/ArrayList;)V Landroidx/compose/runtime/SlotWriter; HSPLandroidx/compose/runtime/SlotWriter;->()V PLandroidx/compose/runtime/SlotWriter;->()V HSPLandroidx/compose/runtime/SlotWriter;->(Landroidx/compose/runtime/SlotTable;)V HPLandroidx/compose/runtime/SlotWriter;->(Landroidx/compose/runtime/SlotTable;)V HSPLandroidx/compose/runtime/SlotWriter;->access$containsAnyGroupMarks(Landroidx/compose/runtime/SlotWriter;I)Z PLandroidx/compose/runtime/SlotWriter;->access$containsAnyGroupMarks(Landroidx/compose/runtime/SlotWriter;I)Z HSPLandroidx/compose/runtime/SlotWriter;->access$dataIndex(Landroidx/compose/runtime/SlotWriter;I)I PLandroidx/compose/runtime/SlotWriter;->access$dataIndex(Landroidx/compose/runtime/SlotWriter;I)I HSPLandroidx/compose/runtime/SlotWriter;->access$dataIndex(Landroidx/compose/runtime/SlotWriter;[II)I HPLandroidx/compose/runtime/SlotWriter;->access$dataIndex(Landroidx/compose/runtime/SlotWriter;[II)I HSPLandroidx/compose/runtime/SlotWriter;->access$dataIndexToDataAddress(Landroidx/compose/runtime/SlotWriter;I)I HPLandroidx/compose/runtime/SlotWriter;->access$dataIndexToDataAddress(Landroidx/compose/runtime/SlotWriter;I)I HSPLandroidx/compose/runtime/SlotWriter;->access$dataIndexToDataAnchor(Landroidx/compose/runtime/SlotWriter;IIII)I HPLandroidx/compose/runtime/SlotWriter;->access$dataIndexToDataAnchor(Landroidx/compose/runtime/SlotWriter;IIII)I HSPLandroidx/compose/runtime/SlotWriter;->access$getAnchors$p(Landroidx/compose/runtime/SlotWriter;)Ljava/util/ArrayList; PLandroidx/compose/runtime/SlotWriter;->access$getAnchors$p(Landroidx/compose/runtime/SlotWriter;)Ljava/util/ArrayList; HSPLandroidx/compose/runtime/SlotWriter;->access$getCurrentSlot$p(Landroidx/compose/runtime/SlotWriter;)I PLandroidx/compose/runtime/SlotWriter;->access$getCurrentSlot$p(Landroidx/compose/runtime/SlotWriter;)I HSPLandroidx/compose/runtime/SlotWriter;->access$getGroupGapStart$p(Landroidx/compose/runtime/SlotWriter;)I PLandroidx/compose/runtime/SlotWriter;->access$getGroupGapStart$p(Landroidx/compose/runtime/SlotWriter;)I HSPLandroidx/compose/runtime/SlotWriter;->access$getGroups$p(Landroidx/compose/runtime/SlotWriter;)[I PLandroidx/compose/runtime/SlotWriter;->access$getGroups$p(Landroidx/compose/runtime/SlotWriter;)[I HSPLandroidx/compose/runtime/SlotWriter;->access$getNodeCount$p(Landroidx/compose/runtime/SlotWriter;)I PLandroidx/compose/runtime/SlotWriter;->access$getNodeCount$p(Landroidx/compose/runtime/SlotWriter;)I HSPLandroidx/compose/runtime/SlotWriter;->access$getSlots$p(Landroidx/compose/runtime/SlotWriter;)[Ljava/lang/Object; HPLandroidx/compose/runtime/SlotWriter;->access$getSlots$p(Landroidx/compose/runtime/SlotWriter;)[Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->access$getSlotsGapLen$p(Landroidx/compose/runtime/SlotWriter;)I PLandroidx/compose/runtime/SlotWriter;->access$getSlotsGapLen$p(Landroidx/compose/runtime/SlotWriter;)I HSPLandroidx/compose/runtime/SlotWriter;->access$getSlotsGapOwner$p(Landroidx/compose/runtime/SlotWriter;)I PLandroidx/compose/runtime/SlotWriter;->access$getSlotsGapOwner$p(Landroidx/compose/runtime/SlotWriter;)I HSPLandroidx/compose/runtime/SlotWriter;->access$getSlotsGapStart$p(Landroidx/compose/runtime/SlotWriter;)I PLandroidx/compose/runtime/SlotWriter;->access$getSlotsGapStart$p(Landroidx/compose/runtime/SlotWriter;)I HSPLandroidx/compose/runtime/SlotWriter;->access$insertGroups(Landroidx/compose/runtime/SlotWriter;I)V PLandroidx/compose/runtime/SlotWriter;->access$insertGroups(Landroidx/compose/runtime/SlotWriter;I)V HSPLandroidx/compose/runtime/SlotWriter;->access$insertSlots(IILandroidx/compose/runtime/SlotWriter;)V PLandroidx/compose/runtime/SlotWriter;->access$insertSlots(IILandroidx/compose/runtime/SlotWriter;)V HSPLandroidx/compose/runtime/SlotWriter;->access$setCurrentGroup$p(Landroidx/compose/runtime/SlotWriter;I)V PLandroidx/compose/runtime/SlotWriter;->access$setCurrentGroup$p(Landroidx/compose/runtime/SlotWriter;I)V HSPLandroidx/compose/runtime/SlotWriter;->access$setCurrentSlot$p(Landroidx/compose/runtime/SlotWriter;I)V PLandroidx/compose/runtime/SlotWriter;->access$setCurrentSlot$p(Landroidx/compose/runtime/SlotWriter;I)V HSPLandroidx/compose/runtime/SlotWriter;->access$setNodeCount$p(Landroidx/compose/runtime/SlotWriter;I)V PLandroidx/compose/runtime/SlotWriter;->access$setNodeCount$p(Landroidx/compose/runtime/SlotWriter;I)V HSPLandroidx/compose/runtime/SlotWriter;->access$setSlotsGapOwner$p(Landroidx/compose/runtime/SlotWriter;I)V PLandroidx/compose/runtime/SlotWriter;->access$setSlotsGapOwner$p(Landroidx/compose/runtime/SlotWriter;I)V HSPLandroidx/compose/runtime/SlotWriter;->access$updateContainsMark(Landroidx/compose/runtime/SlotWriter;I)V PLandroidx/compose/runtime/SlotWriter;->access$updateContainsMark(Landroidx/compose/runtime/SlotWriter;I)V HSPLandroidx/compose/runtime/SlotWriter;->advanceBy(I)V HPLandroidx/compose/runtime/SlotWriter;->advanceBy(I)V HSPLandroidx/compose/runtime/SlotWriter;->anchor(I)Landroidx/compose/runtime/Anchor; HPLandroidx/compose/runtime/SlotWriter;->anchor(I)Landroidx/compose/runtime/Anchor; HSPLandroidx/compose/runtime/SlotWriter;->anchorIndex(Landroidx/compose/runtime/Anchor;)I HPLandroidx/compose/runtime/SlotWriter;->anchorIndex(Landroidx/compose/runtime/Anchor;)I HSPLandroidx/compose/runtime/SlotWriter;->auxIndex(I[I)I HPLandroidx/compose/runtime/SlotWriter;->auxIndex(I[I)I HSPLandroidx/compose/runtime/SlotWriter;->beginInsert()V PLandroidx/compose/runtime/SlotWriter;->beginInsert()V HSPLandroidx/compose/runtime/SlotWriter;->close()V HPLandroidx/compose/runtime/SlotWriter;->close()V HSPLandroidx/compose/runtime/SlotWriter;->dataIndex(I[I)I HPLandroidx/compose/runtime/SlotWriter;->dataIndex(I[I)I HSPLandroidx/compose/runtime/SlotWriter;->dataIndexToDataAddress(I)I PLandroidx/compose/runtime/SlotWriter;->dataIndexToDataAddress(I)I HSPLandroidx/compose/runtime/SlotWriter;->endGroup()V HPLandroidx/compose/runtime/SlotWriter;->endGroup()V HSPLandroidx/compose/runtime/SlotWriter;->endInsert()V HPLandroidx/compose/runtime/SlotWriter;->endInsert()V HSPLandroidx/compose/runtime/SlotWriter;->ensureStarted(I)V HPLandroidx/compose/runtime/SlotWriter;->ensureStarted(I)V HSPLandroidx/compose/runtime/SlotWriter;->fixParentAnchorsFor(III)V HPLandroidx/compose/runtime/SlotWriter;->fixParentAnchorsFor(III)V HSPLandroidx/compose/runtime/SlotWriter;->getClosed()Z PLandroidx/compose/runtime/SlotWriter;->getClosed()Z HSPLandroidx/compose/runtime/SlotWriter;->getCurrentGroup()I PLandroidx/compose/runtime/SlotWriter;->getCurrentGroup()I HSPLandroidx/compose/runtime/SlotWriter;->getParent()I HPLandroidx/compose/runtime/SlotWriter;->getParent()I HSPLandroidx/compose/runtime/SlotWriter;->getSize$runtime_release()I HPLandroidx/compose/runtime/SlotWriter;->getSize$runtime_release()I HSPLandroidx/compose/runtime/SlotWriter;->getTable$runtime_release()Landroidx/compose/runtime/SlotTable; PLandroidx/compose/runtime/SlotWriter;->getTable$runtime_release()Landroidx/compose/runtime/SlotTable; HSPLandroidx/compose/runtime/SlotWriter;->groupAux(I)Ljava/lang/Object; HPLandroidx/compose/runtime/SlotWriter;->groupAux(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->groupIndexToAddress(I)I HPLandroidx/compose/runtime/SlotWriter;->groupIndexToAddress(I)I HSPLandroidx/compose/runtime/SlotWriter;->groupKey(I)I PLandroidx/compose/runtime/SlotWriter;->groupKey(I)I HSPLandroidx/compose/runtime/SlotWriter;->groupObjectKey(I)Ljava/lang/Object; HPLandroidx/compose/runtime/SlotWriter;->groupObjectKey(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->groupSize(I)I HPLandroidx/compose/runtime/SlotWriter;->groupSize(I)I HSPLandroidx/compose/runtime/SlotWriter;->groupSlots()Landroidx/compose/runtime/SlotWriter$groupSlots$1; HPLandroidx/compose/runtime/SlotWriter;->groupSlots()Landroidx/compose/runtime/SlotWriter$groupSlots$1; HSPLandroidx/compose/runtime/SlotWriter;->insertGroups(I)V HPLandroidx/compose/runtime/SlotWriter;->insertGroups(I)V HSPLandroidx/compose/runtime/SlotWriter;->insertSlots(II)V HPLandroidx/compose/runtime/SlotWriter;->insertSlots(II)V HSPLandroidx/compose/runtime/SlotWriter;->markGroup$default(Landroidx/compose/runtime/SlotWriter;)V HPLandroidx/compose/runtime/SlotWriter;->markGroup$default(Landroidx/compose/runtime/SlotWriter;)V HSPLandroidx/compose/runtime/SlotWriter;->moveFrom(Landroidx/compose/runtime/SlotTable;I)V HPLandroidx/compose/runtime/SlotWriter;->moveFrom(Landroidx/compose/runtime/SlotTable;I)V HSPLandroidx/compose/runtime/SlotWriter;->moveGroup(I)V HPLandroidx/compose/runtime/SlotWriter;->moveGroup(I)V HSPLandroidx/compose/runtime/SlotWriter;->moveGroupGapTo(I)V HPLandroidx/compose/runtime/SlotWriter;->moveGroupGapTo(I)V HSPLandroidx/compose/runtime/SlotWriter;->moveSlotGapTo(II)V HPLandroidx/compose/runtime/SlotWriter;->moveSlotGapTo(II)V HSPLandroidx/compose/runtime/SlotWriter;->node(I)Ljava/lang/Object; PLandroidx/compose/runtime/SlotWriter;->node(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->parent(I)I HPLandroidx/compose/runtime/SlotWriter;->parent(I)I HSPLandroidx/compose/runtime/SlotWriter;->parent(I[I)I HPLandroidx/compose/runtime/SlotWriter;->parent(I[I)I HSPLandroidx/compose/runtime/SlotWriter;->recalculateMarks()V HPLandroidx/compose/runtime/SlotWriter;->recalculateMarks()V HSPLandroidx/compose/runtime/SlotWriter;->removeGroup()Z HPLandroidx/compose/runtime/SlotWriter;->removeGroup()Z HSPLandroidx/compose/runtime/SlotWriter;->removeGroups(II)Z HPLandroidx/compose/runtime/SlotWriter;->removeGroups(II)Z HSPLandroidx/compose/runtime/SlotWriter;->removeSlots(III)V HPLandroidx/compose/runtime/SlotWriter;->removeSlots(III)V HSPLandroidx/compose/runtime/SlotWriter;->set(IILjava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SlotWriter;->set(IILjava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->set(ILjava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SlotWriter;->set(ILjava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/SlotWriter;->skipGroup()I HPLandroidx/compose/runtime/SlotWriter;->skipGroup()I HSPLandroidx/compose/runtime/SlotWriter;->skipToGroupEnd()V PLandroidx/compose/runtime/SlotWriter;->skipToGroupEnd()V HSPLandroidx/compose/runtime/SlotWriter;->slotIndex(I[I)I PLandroidx/compose/runtime/SlotWriter;->slotIndex(I[I)I HSPLandroidx/compose/runtime/SlotWriter;->startData(ILjava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/runtime/SlotWriter;->startData(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/SlotWriter;->startGroup()V HPLandroidx/compose/runtime/SlotWriter;->startGroup()V HSPLandroidx/compose/runtime/SlotWriter;->startGroup(ILjava/lang/Object;)V PLandroidx/compose/runtime/SlotWriter;->startGroup(ILjava/lang/Object;)V HSPLandroidx/compose/runtime/SlotWriter;->startGroup(ILjava/lang/Object;Ljava/lang/Object;Z)V HPLandroidx/compose/runtime/SlotWriter;->startGroup(ILjava/lang/Object;Ljava/lang/Object;Z)V HSPLandroidx/compose/runtime/SlotWriter;->startNode(ILandroidx/compose/runtime/Composer$Companion$Empty$1;)V PLandroidx/compose/runtime/SlotWriter;->startNode(ILandroidx/compose/runtime/Composer$Companion$Empty$1;)V HSPLandroidx/compose/runtime/SlotWriter;->update(Ljava/lang/Object;)V HPLandroidx/compose/runtime/SlotWriter;->update(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/SlotWriter;->updateAux(Ljava/lang/Object;)V HPLandroidx/compose/runtime/SlotWriter;->updateAux(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/SlotWriter;->updateContainsMark(I)V HPLandroidx/compose/runtime/SlotWriter;->updateContainsMark(I)V HSPLandroidx/compose/runtime/SlotWriter;->updateNode(Landroidx/compose/runtime/Anchor;Ljava/lang/Object;)V HPLandroidx/compose/runtime/SlotWriter;->updateNode(Landroidx/compose/runtime/Anchor;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/SlotWriter;->updateNodeOfGroup(ILjava/lang/Object;)V HPLandroidx/compose/runtime/SlotWriter;->updateNodeOfGroup(ILjava/lang/Object;)V Landroidx/compose/runtime/SlotWriter$Companion; HSPLandroidx/compose/runtime/SlotWriter$Companion;->()V PLandroidx/compose/runtime/SlotWriter$Companion;->()V HSPLandroidx/compose/runtime/SlotWriter$Companion;->access$moveGroup(Landroidx/compose/runtime/SlotWriter;ILandroidx/compose/runtime/SlotWriter;)Ljava/util/List; PLandroidx/compose/runtime/SlotWriter$Companion;->access$moveGroup(Landroidx/compose/runtime/SlotWriter;ILandroidx/compose/runtime/SlotWriter;)Ljava/util/List; HSPLandroidx/compose/runtime/SlotWriter$Companion;->moveGroup(Landroidx/compose/runtime/SlotWriter;ILandroidx/compose/runtime/SlotWriter;ZZZ)Ljava/util/List; HPLandroidx/compose/runtime/SlotWriter$Companion;->moveGroup(Landroidx/compose/runtime/SlotWriter;ILandroidx/compose/runtime/SlotWriter;ZZZ)Ljava/util/List; Landroidx/compose/runtime/SlotWriter$groupSlots$1; HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->(IILandroidx/compose/runtime/SlotWriter;)V HPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->(IILandroidx/compose/runtime/SlotWriter;)V HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->hasNext()Z HPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->hasNext()Z HSPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->next()Ljava/lang/Object; HPLandroidx/compose/runtime/SlotWriter$groupSlots$1;->next()Ljava/lang/Object; Landroidx/compose/runtime/SnapshotMutableFloatStateImpl; HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->(F)V HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->(F)V HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->getFloatValue()F HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->getFloatValue()F HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->setFloatValue(F)V HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl;->setFloatValue(F)V Landroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord; HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->(F)V HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->(F)V HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->getValue()F PLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->getValue()F HSPLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->setValue(F)V PLandroidx/compose/runtime/SnapshotMutableFloatStateImpl$FloatStateStateRecord;->setValue(F)V Landroidx/compose/runtime/SnapshotMutableIntStateImpl; HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->(I)V HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->(I)V HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->getIntValue()I HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->getIntValue()I HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->setIntValue(I)V HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl;->setIntValue(I)V Landroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord; HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->(I)V HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->(I)V HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->getValue()I PLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->getValue()I HSPLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->setValue(I)V PLandroidx/compose/runtime/SnapshotMutableIntStateImpl$IntStateStateRecord;->setValue(I)V Landroidx/compose/runtime/SnapshotMutableLongStateImpl; HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->(J)V PLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->(J)V HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->getLongValue()J HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->getLongValue()J HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->setLongValue(J)V HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl;->setLongValue(J)V Landroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord; HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->(J)V HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->(J)V HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->getValue()J PLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->getValue()J HSPLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->setValue(J)V PLandroidx/compose/runtime/SnapshotMutableLongStateImpl$LongStateStateRecord;->setValue(J)V Landroidx/compose/runtime/SnapshotMutableStateImpl; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V HPLandroidx/compose/runtime/SnapshotMutableStateImpl;->(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)V HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getValue()Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotMutableStateImpl;->getValue()Ljava/lang/Object; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableStateImpl;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableStateImpl;->setValue(Ljava/lang/Object;)V HPLandroidx/compose/runtime/SnapshotMutableStateImpl;->setValue(Ljava/lang/Object;)V Landroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->(Ljava/lang/Object;)V HPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->getValue()Ljava/lang/Object; PLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->getValue()Ljava/lang/Object; HSPLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->setValue(Ljava/lang/Object;)V PLandroidx/compose/runtime/SnapshotMutableStateImpl$StateStateRecord;->setValue(Ljava/lang/Object;)V Landroidx/compose/runtime/SnapshotMutationPolicy; Landroidx/compose/runtime/SnapshotStateKt__DerivedStateKt; HSPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->()V PLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->()V HSPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->access$getCalculationBlockNestedLevel$p()Landroidx/compose/runtime/SnapshotThreadLocal; HPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->access$getCalculationBlockNestedLevel$p()Landroidx/compose/runtime/SnapshotThreadLocal; HSPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->derivedStateObservers()Landroidx/compose/runtime/collection/MutableVector; HPLandroidx/compose/runtime/SnapshotStateKt__DerivedStateKt;->derivedStateObservers()Landroidx/compose/runtime/collection/MutableVector; Landroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1; HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3; HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotStateKt__ProduceStateKt$produceState$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1;->(Landroidx/compose/runtime/ProduceStateScope;I)V PLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1;->(Landroidx/compose/runtime/ProduceStateScope;I)V HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$collectAsState$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotStateKt__SnapshotFlowKt$snapshotFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/SnapshotThreadLocal; HSPLandroidx/compose/runtime/SnapshotThreadLocal;->()V PLandroidx/compose/runtime/SnapshotThreadLocal;->()V HSPLandroidx/compose/runtime/SnapshotThreadLocal;->get()Ljava/lang/Object; HPLandroidx/compose/runtime/SnapshotThreadLocal;->get()Ljava/lang/Object; HSPLandroidx/compose/runtime/SnapshotThreadLocal;->set(Ljava/lang/Object;)V HPLandroidx/compose/runtime/SnapshotThreadLocal;->set(Ljava/lang/Object;)V Landroidx/compose/runtime/Stack; HSPLandroidx/compose/runtime/Stack;->()V PLandroidx/compose/runtime/Stack;->()V HSPLandroidx/compose/runtime/Stack;->(I)V HPLandroidx/compose/runtime/Stack;->(I)V HSPLandroidx/compose/runtime/Stack;->add(I)V PLandroidx/compose/runtime/Stack;->add(I)V HSPLandroidx/compose/runtime/Stack;->clear()V HPLandroidx/compose/runtime/Stack;->clear()V HSPLandroidx/compose/runtime/Stack;->getAndroidCanvas()Landroidx/compose/ui/graphics/AndroidCanvas; HPLandroidx/compose/runtime/Stack;->getAndroidCanvas()Landroidx/compose/ui/graphics/AndroidCanvas; HSPLandroidx/compose/runtime/Stack;->getSize()I HPLandroidx/compose/runtime/Stack;->getSize()I HSPLandroidx/compose/runtime/Stack;->isEmpty()Z HPLandroidx/compose/runtime/Stack;->isEmpty()Z HSPLandroidx/compose/runtime/Stack;->peek()Ljava/lang/Object; HPLandroidx/compose/runtime/Stack;->peek()Ljava/lang/Object; HSPLandroidx/compose/runtime/Stack;->peek(I)Ljava/lang/Object; HPLandroidx/compose/runtime/Stack;->peek(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/Stack;->pop()Ljava/lang/Object; HPLandroidx/compose/runtime/Stack;->pop()Ljava/lang/Object; HSPLandroidx/compose/runtime/Stack;->push(Ljava/lang/Object;)V HPLandroidx/compose/runtime/Stack;->push(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/Stack;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;)Landroidx/compose/ui/text/font/TypefaceResult$Immutable; PLandroidx/compose/runtime/Stack;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;)Landroidx/compose/ui/text/font/TypefaceResult$Immutable; HSPLandroidx/compose/runtime/Stack;->scheduleWithDelay(JLjava/lang/Runnable;)V PLandroidx/compose/runtime/Stack;->scheduleWithDelay(JLjava/lang/Runnable;)V HSPLandroidx/compose/runtime/Stack;->toArray()[Ljava/lang/Object; HPLandroidx/compose/runtime/Stack;->toArray()[Ljava/lang/Object; Landroidx/compose/runtime/State; Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/runtime/StaticProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/StaticProvidableCompositionLocal;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/StaticProvidableCompositionLocal;->updatedStateOf$runtime_release(Ljava/lang/Object;Landroidx/compose/runtime/State;)Landroidx/compose/runtime/State; HPLandroidx/compose/runtime/StaticProvidableCompositionLocal;->updatedStateOf$runtime_release(Ljava/lang/Object;Landroidx/compose/runtime/State;)Landroidx/compose/runtime/State; Landroidx/compose/runtime/StaticValueHolder; HSPLandroidx/compose/runtime/StaticValueHolder;->(Ljava/lang/Object;)V PLandroidx/compose/runtime/StaticValueHolder;->(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/StaticValueHolder;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/StaticValueHolder;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/StaticValueHolder;->getValue()Ljava/lang/Object; HPLandroidx/compose/runtime/StaticValueHolder;->getValue()Ljava/lang/Object; Landroidx/compose/runtime/StructuralEqualityPolicy; HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->()V PLandroidx/compose/runtime/StructuralEqualityPolicy;->()V HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->()V PLandroidx/compose/runtime/StructuralEqualityPolicy;->()V HSPLandroidx/compose/runtime/StructuralEqualityPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z HPLandroidx/compose/runtime/StructuralEqualityPolicy;->equivalent(Ljava/lang/Object;Ljava/lang/Object;)Z Landroidx/compose/runtime/Updater; HSPLandroidx/compose/runtime/Updater;->CompositionLocalProvider(Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/runtime/Updater;->CompositionLocalProvider(Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/runtime/Updater;->CompositionLocalProvider([Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/runtime/Updater;->CompositionLocalProvider([Landroidx/compose/runtime/ProvidedValue;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/runtime/Updater;->access$auxIndex(I[I)I PLandroidx/compose/runtime/Updater;->access$auxIndex(I[I)I HSPLandroidx/compose/runtime/Updater;->access$containsMark(I[I)Z PLandroidx/compose/runtime/Updater;->access$containsMark(I[I)Z HSPLandroidx/compose/runtime/Updater;->access$countOneBits(I)I PLandroidx/compose/runtime/Updater;->access$countOneBits(I)I HSPLandroidx/compose/runtime/Updater;->access$groupSize(I[I)I HPLandroidx/compose/runtime/Updater;->access$groupSize(I[I)I HSPLandroidx/compose/runtime/Updater;->access$hasAux(I[I)Z HPLandroidx/compose/runtime/Updater;->access$hasAux(I[I)Z HSPLandroidx/compose/runtime/Updater;->access$intersects(Landroidx/compose/runtime/collection/IdentityArraySet;Ljava/util/Set;)Z HPLandroidx/compose/runtime/Updater;->access$intersects(Landroidx/compose/runtime/collection/IdentityArraySet;Ljava/util/Set;)Z HSPLandroidx/compose/runtime/Updater;->access$isNode(I[I)Z HPLandroidx/compose/runtime/Updater;->access$isNode(I[I)Z HSPLandroidx/compose/runtime/Updater;->access$locationOf(Ljava/util/ArrayList;II)I HPLandroidx/compose/runtime/Updater;->access$locationOf(Ljava/util/ArrayList;II)I HSPLandroidx/compose/runtime/Updater;->access$nodeCount(I[I)I PLandroidx/compose/runtime/Updater;->access$nodeCount(I[I)I HSPLandroidx/compose/runtime/Updater;->access$objectKeyIndex(I[I)I PLandroidx/compose/runtime/Updater;->access$objectKeyIndex(I[I)I HSPLandroidx/compose/runtime/Updater;->access$search(Ljava/util/ArrayList;II)I HPLandroidx/compose/runtime/Updater;->access$search(Ljava/util/ArrayList;II)I HSPLandroidx/compose/runtime/Updater;->access$slotAnchor(I[I)I HPLandroidx/compose/runtime/Updater;->access$slotAnchor(I[I)I HSPLandroidx/compose/runtime/Updater;->access$updateGroupSize([III)V PLandroidx/compose/runtime/Updater;->access$updateGroupSize([III)V HSPLandroidx/compose/runtime/Updater;->access$updateNodeCount([III)V PLandroidx/compose/runtime/Updater;->access$updateNodeCount([III)V HSPLandroidx/compose/runtime/Updater;->collectAsState(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/runtime/Updater;->collectAsState(Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/runtime/Updater;->collectAsState(Lkotlinx/coroutines/flow/StateFlow;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/runtime/Updater;->collectAsState(Lkotlinx/coroutines/flow/StateFlow;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/runtime/Updater;->compositionLocalOf$default(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/runtime/Updater;->compositionLocalOf$default(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/DynamicProvidableCompositionLocal; HSPLandroidx/compose/runtime/Updater;->countOneBits(I)I PLandroidx/compose/runtime/Updater;->countOneBits(I)I HSPLandroidx/compose/runtime/Updater;->derivedStateObservers()Landroidx/compose/runtime/collection/MutableVector; PLandroidx/compose/runtime/Updater;->derivedStateObservers()Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/runtime/Updater;->derivedStateOf(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/State; PLandroidx/compose/runtime/Updater;->derivedStateOf(Landroidx/compose/runtime/SnapshotMutationPolicy;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/State; HSPLandroidx/compose/runtime/Updater;->derivedStateOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/State; HPLandroidx/compose/runtime/Updater;->derivedStateOf(Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/State; HSPLandroidx/compose/runtime/Updater;->getCurrentCompositeKeyHash(Landroidx/compose/runtime/Composer;)I HPLandroidx/compose/runtime/Updater;->getCurrentCompositeKeyHash(Landroidx/compose/runtime/Composer;)I HSPLandroidx/compose/runtime/Updater;->invokeComposable(Landroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/Updater;->invokeComposable(Landroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/Updater;->mutableFloatStateOf(F)Landroidx/compose/runtime/ParcelableSnapshotMutableFloatState; PLandroidx/compose/runtime/Updater;->mutableFloatStateOf(F)Landroidx/compose/runtime/ParcelableSnapshotMutableFloatState; HSPLandroidx/compose/runtime/Updater;->mutableIntStateOf(I)Landroidx/compose/runtime/ParcelableSnapshotMutableIntState; HPLandroidx/compose/runtime/Updater;->mutableIntStateOf(I)Landroidx/compose/runtime/ParcelableSnapshotMutableIntState; HSPLandroidx/compose/runtime/Updater;->mutableStateListOf([Ljava/lang/Object;)Landroidx/compose/runtime/snapshots/SnapshotStateList; PLandroidx/compose/runtime/Updater;->mutableStateListOf([Ljava/lang/Object;)Landroidx/compose/runtime/snapshots/SnapshotStateList; HSPLandroidx/compose/runtime/Updater;->mutableStateOf$default(Ljava/lang/Object;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; HPLandroidx/compose/runtime/Updater;->mutableStateOf$default(Ljava/lang/Object;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; HSPLandroidx/compose/runtime/Updater;->mutableStateOf(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; HPLandroidx/compose/runtime/Updater;->mutableStateOf(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; HSPLandroidx/compose/runtime/Updater;->neverEqualPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; PLandroidx/compose/runtime/Updater;->neverEqualPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; HSPLandroidx/compose/runtime/Updater;->produceState(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/runtime/Updater;->produceState(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/runtime/Updater;->produceState(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/runtime/Updater;->produceState(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/runtime/Updater;->read(Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; HPLandroidx/compose/runtime/Updater;->read(Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; HSPLandroidx/compose/runtime/Updater;->referentialEqualityPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; HPLandroidx/compose/runtime/Updater;->referentialEqualityPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; HSPLandroidx/compose/runtime/Updater;->rememberCompositionContext(Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/CompositionContext; PLandroidx/compose/runtime/Updater;->rememberCompositionContext(Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/CompositionContext; HSPLandroidx/compose/runtime/Updater;->rememberUpdatedState(Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HPLandroidx/compose/runtime/Updater;->rememberUpdatedState(Ljava/lang/Object;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HSPLandroidx/compose/runtime/Updater;->search(Ljava/util/ArrayList;II)I HPLandroidx/compose/runtime/Updater;->search(Ljava/util/ArrayList;II)I HSPLandroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/Updater;->snapshotFlow(Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/flow/Flow; PLandroidx/compose/runtime/Updater;->snapshotFlow(Lkotlin/jvm/functions/Function0;)Lkotlinx/coroutines/flow/Flow; HSPLandroidx/compose/runtime/Updater;->structuralEqualityPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; HPLandroidx/compose/runtime/Updater;->structuralEqualityPolicy()Landroidx/compose/runtime/SnapshotMutationPolicy; HSPLandroidx/compose/runtime/Updater;->updateChangedFlags(I)I HPLandroidx/compose/runtime/Updater;->updateChangedFlags(I)I HSPLandroidx/compose/runtime/Updater;->updateCompositionMap([Landroidx/compose/runtime/ProvidedValue;Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/PersistentCompositionLocalMap;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HPLandroidx/compose/runtime/Updater;->updateCompositionMap([Landroidx/compose/runtime/ProvidedValue;Landroidx/compose/runtime/PersistentCompositionLocalMap;Landroidx/compose/runtime/PersistentCompositionLocalMap;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; Landroidx/compose/runtime/WeakReference; HSPLandroidx/compose/runtime/WeakReference;->(Ljava/lang/Object;)V PLandroidx/compose/runtime/WeakReference;->(Ljava/lang/Object;)V Landroidx/compose/runtime/changelist/ChangeList; HSPLandroidx/compose/runtime/changelist/ChangeList;->()V HPLandroidx/compose/runtime/changelist/ChangeList;->()V HSPLandroidx/compose/runtime/changelist/ChangeList;->clear()V HPLandroidx/compose/runtime/changelist/ChangeList;->clear()V HSPLandroidx/compose/runtime/changelist/ChangeList;->executeAndFlushAllPendingChanges(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V PLandroidx/compose/runtime/changelist/ChangeList;->executeAndFlushAllPendingChanges(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->isEmpty()Z PLandroidx/compose/runtime/changelist/ChangeList;->isEmpty()Z HSPLandroidx/compose/runtime/changelist/ChangeList;->isNotEmpty()Z PLandroidx/compose/runtime/changelist/ChangeList;->isNotEmpty()Z HSPLandroidx/compose/runtime/changelist/ChangeList;->pushAdvanceSlotsBy(I)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushAdvanceSlotsBy(I)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushDowns([Ljava/lang/Object;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushDowns([Ljava/lang/Object;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushEndCompositionScope(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ControlledComposition;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushEndCompositionScope(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushEndCurrentGroup()V PLandroidx/compose/runtime/changelist/ChangeList;->pushEndCurrentGroup()V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushEnsureGroupStarted(Landroidx/compose/runtime/Anchor;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushEnsureGroupStarted(Landroidx/compose/runtime/Anchor;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushEnsureRootStarted()V HPLandroidx/compose/runtime/changelist/ChangeList;->pushEnsureRootStarted()V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushInsertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushInsertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushInsertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;Landroidx/compose/runtime/changelist/FixupList;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushInsertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;Landroidx/compose/runtime/changelist/FixupList;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushMoveCurrentGroup(I)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushMoveCurrentGroup(I)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushRemember(Landroidx/compose/runtime/RememberObserver;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushRemember(Landroidx/compose/runtime/RememberObserver;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushRemoveCurrentGroup()V HPLandroidx/compose/runtime/changelist/ChangeList;->pushRemoveCurrentGroup()V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushRemoveNode(II)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushRemoveNode(II)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushSideEffect(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushSideEffect(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushUpdateAuxData(Ljava/lang/Object;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushUpdateAuxData(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushUpdateNode(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushUpdateNode(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushUpdateValue(ILjava/lang/Object;)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushUpdateValue(ILjava/lang/Object;)V HSPLandroidx/compose/runtime/changelist/ChangeList;->pushUps(I)V HPLandroidx/compose/runtime/changelist/ChangeList;->pushUps(I)V Landroidx/compose/runtime/changelist/ComposerChangeListWriter; HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/changelist/ChangeList;)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->(Landroidx/compose/runtime/ComposerImpl;Landroidx/compose/runtime/changelist/ChangeList;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endCompositionScope(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ControlledComposition;)V PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endCompositionScope(Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/ControlledComposition;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endCurrentGroup()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endCurrentGroup()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endNodeMovement()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endNodeMovement()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endRoot()V PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->endRoot()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->finalizeComposition()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->finalizeComposition()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->getChangeList()Landroidx/compose/runtime/changelist/ChangeList; PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->getChangeList()Landroidx/compose/runtime/changelist/ChangeList; HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->getReader()Landroidx/compose/runtime/SlotReader; HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->getReader()Landroidx/compose/runtime/SlotReader; HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->insertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->insertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->insertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;Landroidx/compose/runtime/changelist/FixupList;)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->insertSlots(Landroidx/compose/runtime/Anchor;Landroidx/compose/runtime/SlotTable;Landroidx/compose/runtime/changelist/FixupList;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveCurrentGroup(I)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveCurrentGroup(I)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveDown(Ljava/lang/Object;)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveDown(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveReaderRelativeTo(I)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveReaderRelativeTo(I)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveUp()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->moveUp()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->pushPendingUpsAndDowns()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->pushPendingUpsAndDowns()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->realizeNodeMovementOperations()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->realizeNodeMovementOperations()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->realizeOperationLocation(Z)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->realizeOperationLocation(Z)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->releaseMovableContent()V PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->releaseMovableContent()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->remember(Landroidx/compose/runtime/RememberObserver;)V PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->remember(Landroidx/compose/runtime/RememberObserver;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->removeCurrentGroup()V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->removeCurrentGroup()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->removeNode(II)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->removeNode(II)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->resetTransientState()V PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->resetTransientState()V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->setChangeList(Landroidx/compose/runtime/changelist/ChangeList;)V PLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->setChangeList(Landroidx/compose/runtime/changelist/ChangeList;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->sideEffect(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->sideEffect(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->updateNode(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/changelist/ComposerChangeListWriter;->updateNode(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V Landroidx/compose/runtime/changelist/FixupList; HSPLandroidx/compose/runtime/changelist/FixupList;->()V PLandroidx/compose/runtime/changelist/FixupList;->()V HSPLandroidx/compose/runtime/changelist/FixupList;->createAndInsertNode(Lkotlin/jvm/functions/Function0;ILandroidx/compose/runtime/Anchor;)V HPLandroidx/compose/runtime/changelist/FixupList;->createAndInsertNode(Lkotlin/jvm/functions/Function0;ILandroidx/compose/runtime/Anchor;)V HSPLandroidx/compose/runtime/changelist/FixupList;->endNodeInsert()V PLandroidx/compose/runtime/changelist/FixupList;->endNodeInsert()V HSPLandroidx/compose/runtime/changelist/FixupList;->executeAndFlushAllPendingFixups(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/FixupList;->executeAndFlushAllPendingFixups(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HSPLandroidx/compose/runtime/changelist/FixupList;->isEmpty()Z PLandroidx/compose/runtime/changelist/FixupList;->isEmpty()Z HSPLandroidx/compose/runtime/changelist/FixupList;->updateNode(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/runtime/changelist/FixupList;->updateNode(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V Landroidx/compose/runtime/changelist/Operation; HSPLandroidx/compose/runtime/changelist/Operation;->(II)V PLandroidx/compose/runtime/changelist/Operation;->(II)V HSPLandroidx/compose/runtime/changelist/Operation;->(III)V PLandroidx/compose/runtime/changelist/Operation;->(III)V HSPLandroidx/compose/runtime/changelist/Operation;->getInts()I HPLandroidx/compose/runtime/changelist/Operation;->getInts()I HSPLandroidx/compose/runtime/changelist/Operation;->getObjects()I HPLandroidx/compose/runtime/changelist/Operation;->getObjects()I Landroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy; HSPLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->()V PLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->()V HSPLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->()V PLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->()V HSPLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$AdvanceSlotsBy;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$Downs; HSPLandroidx/compose/runtime/changelist/Operation$Downs;->()V PLandroidx/compose/runtime/changelist/Operation$Downs;->()V HSPLandroidx/compose/runtime/changelist/Operation$Downs;->()V PLandroidx/compose/runtime/changelist/Operation$Downs;->()V HSPLandroidx/compose/runtime/changelist/Operation$Downs;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$Downs;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$EndCompositionScope; HSPLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->()V PLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->()V HSPLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->()V PLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->()V HSPLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$EndCompositionScope;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$EndCurrentGroup; HSPLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->()V PLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->()V HSPLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->()V PLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->()V HSPLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$EndCurrentGroup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$EnsureGroupStarted; HSPLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->()V PLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->()V HSPLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->()V PLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->()V HSPLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$EnsureGroupStarted;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted; HSPLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->()V PLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->()V HSPLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->()V PLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->()V HSPLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$EnsureRootGroupStarted;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$InsertNodeFixup; HSPLandroidx/compose/runtime/changelist/Operation$InsertNodeFixup;->()V PLandroidx/compose/runtime/changelist/Operation$InsertNodeFixup;->()V HSPLandroidx/compose/runtime/changelist/Operation$InsertNodeFixup;->()V PLandroidx/compose/runtime/changelist/Operation$InsertNodeFixup;->()V HSPLandroidx/compose/runtime/changelist/Operation$InsertNodeFixup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$InsertNodeFixup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$InsertSlots; HSPLandroidx/compose/runtime/changelist/Operation$InsertSlots;->()V PLandroidx/compose/runtime/changelist/Operation$InsertSlots;->()V HSPLandroidx/compose/runtime/changelist/Operation$InsertSlots;->()V PLandroidx/compose/runtime/changelist/Operation$InsertSlots;->()V HSPLandroidx/compose/runtime/changelist/Operation$InsertSlots;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$InsertSlots;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups; HSPLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->()V PLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->()V HSPLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->()V PLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->()V HSPLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$InsertSlotsWithFixups;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$MoveCurrentGroup; HSPLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->()V PLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->()V HSPLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->()V PLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->()V HSPLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$MoveCurrentGroup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup; HSPLandroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup;->()V PLandroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup;->()V HSPLandroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup;->()V PLandroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup;->()V HSPLandroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$PostInsertNodeFixup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$Remember; HSPLandroidx/compose/runtime/changelist/Operation$Remember;->()V PLandroidx/compose/runtime/changelist/Operation$Remember;->()V HSPLandroidx/compose/runtime/changelist/Operation$Remember;->()V PLandroidx/compose/runtime/changelist/Operation$Remember;->()V HSPLandroidx/compose/runtime/changelist/Operation$Remember;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$Remember;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup; HSPLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->()V PLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->()V HSPLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->()V PLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->()V HSPLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$RemoveCurrentGroup;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$RemoveNode; HSPLandroidx/compose/runtime/changelist/Operation$RemoveNode;->()V PLandroidx/compose/runtime/changelist/Operation$RemoveNode;->()V HSPLandroidx/compose/runtime/changelist/Operation$RemoveNode;->()V PLandroidx/compose/runtime/changelist/Operation$RemoveNode;->()V HSPLandroidx/compose/runtime/changelist/Operation$RemoveNode;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$RemoveNode;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$SideEffect; HSPLandroidx/compose/runtime/changelist/Operation$SideEffect;->()V PLandroidx/compose/runtime/changelist/Operation$SideEffect;->()V HSPLandroidx/compose/runtime/changelist/Operation$SideEffect;->()V PLandroidx/compose/runtime/changelist/Operation$SideEffect;->()V HSPLandroidx/compose/runtime/changelist/Operation$SideEffect;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$SideEffect;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$UpdateAuxData; HSPLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->()V PLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->()V HSPLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->()V PLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->()V HSPLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$UpdateAuxData;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$UpdateNode; HSPLandroidx/compose/runtime/changelist/Operation$UpdateNode;->()V PLandroidx/compose/runtime/changelist/Operation$UpdateNode;->()V HSPLandroidx/compose/runtime/changelist/Operation$UpdateNode;->()V PLandroidx/compose/runtime/changelist/Operation$UpdateNode;->()V HSPLandroidx/compose/runtime/changelist/Operation$UpdateNode;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$UpdateNode;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$UpdateValue; HSPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->()V PLandroidx/compose/runtime/changelist/Operation$UpdateValue;->()V HSPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->()V PLandroidx/compose/runtime/changelist/Operation$UpdateValue;->()V HSPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$UpdateValue;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$Ups; HSPLandroidx/compose/runtime/changelist/Operation$Ups;->()V PLandroidx/compose/runtime/changelist/Operation$Ups;->()V HSPLandroidx/compose/runtime/changelist/Operation$Ups;->()V PLandroidx/compose/runtime/changelist/Operation$Ups;->()V HSPLandroidx/compose/runtime/changelist/Operation$Ups;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operation$Ups;->execute(Landroidx/compose/runtime/changelist/Operations$OpIterator;Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V Landroidx/compose/runtime/changelist/Operation$UseCurrentNode; Landroidx/compose/runtime/changelist/Operations; HSPLandroidx/compose/runtime/changelist/Operations;->()V HPLandroidx/compose/runtime/changelist/Operations;->()V HSPLandroidx/compose/runtime/changelist/Operations;->access$createExpectedArgMask(Landroidx/compose/runtime/changelist/Operations;I)I HPLandroidx/compose/runtime/changelist/Operations;->access$createExpectedArgMask(Landroidx/compose/runtime/changelist/Operations;I)I HSPLandroidx/compose/runtime/changelist/Operations;->access$getIntArgs$p(Landroidx/compose/runtime/changelist/Operations;)[I PLandroidx/compose/runtime/changelist/Operations;->access$getIntArgs$p(Landroidx/compose/runtime/changelist/Operations;)[I HSPLandroidx/compose/runtime/changelist/Operations;->access$getObjectArgs$p(Landroidx/compose/runtime/changelist/Operations;)[Ljava/lang/Object; PLandroidx/compose/runtime/changelist/Operations;->access$getObjectArgs$p(Landroidx/compose/runtime/changelist/Operations;)[Ljava/lang/Object; HSPLandroidx/compose/runtime/changelist/Operations;->access$getOpCodes$p(Landroidx/compose/runtime/changelist/Operations;)[Landroidx/compose/runtime/changelist/Operation; HPLandroidx/compose/runtime/changelist/Operations;->access$getOpCodes$p(Landroidx/compose/runtime/changelist/Operations;)[Landroidx/compose/runtime/changelist/Operation; HSPLandroidx/compose/runtime/changelist/Operations;->access$getOpCodesSize$p(Landroidx/compose/runtime/changelist/Operations;)I PLandroidx/compose/runtime/changelist/Operations;->access$getOpCodesSize$p(Landroidx/compose/runtime/changelist/Operations;)I HSPLandroidx/compose/runtime/changelist/Operations;->access$getPushedIntMask$p(Landroidx/compose/runtime/changelist/Operations;)I HPLandroidx/compose/runtime/changelist/Operations;->access$getPushedIntMask$p(Landroidx/compose/runtime/changelist/Operations;)I HSPLandroidx/compose/runtime/changelist/Operations;->access$getPushedObjectMask$p(Landroidx/compose/runtime/changelist/Operations;)I PLandroidx/compose/runtime/changelist/Operations;->access$getPushedObjectMask$p(Landroidx/compose/runtime/changelist/Operations;)I HSPLandroidx/compose/runtime/changelist/Operations;->access$setPushedIntMask$p(Landroidx/compose/runtime/changelist/Operations;I)V HPLandroidx/compose/runtime/changelist/Operations;->access$setPushedIntMask$p(Landroidx/compose/runtime/changelist/Operations;I)V HSPLandroidx/compose/runtime/changelist/Operations;->access$setPushedObjectMask$p(Landroidx/compose/runtime/changelist/Operations;I)V HPLandroidx/compose/runtime/changelist/Operations;->access$setPushedObjectMask$p(Landroidx/compose/runtime/changelist/Operations;I)V HSPLandroidx/compose/runtime/changelist/Operations;->access$topIntIndexOf-w8GmfQM(Landroidx/compose/runtime/changelist/Operations;I)I HPLandroidx/compose/runtime/changelist/Operations;->access$topIntIndexOf-w8GmfQM(Landroidx/compose/runtime/changelist/Operations;I)I HSPLandroidx/compose/runtime/changelist/Operations;->access$topObjectIndexOf-31yXWZQ(Landroidx/compose/runtime/changelist/Operations;I)I HPLandroidx/compose/runtime/changelist/Operations;->access$topObjectIndexOf-31yXWZQ(Landroidx/compose/runtime/changelist/Operations;I)I HSPLandroidx/compose/runtime/changelist/Operations;->clear()V HPLandroidx/compose/runtime/changelist/Operations;->clear()V HSPLandroidx/compose/runtime/changelist/Operations;->executeAndFlushAllPendingOperations(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HPLandroidx/compose/runtime/changelist/Operations;->executeAndFlushAllPendingOperations(Landroidx/compose/runtime/Applier;Landroidx/compose/runtime/SlotWriter;Landroidx/compose/runtime/RememberManager;)V HSPLandroidx/compose/runtime/changelist/Operations;->isEmpty()Z PLandroidx/compose/runtime/changelist/Operations;->isEmpty()Z HSPLandroidx/compose/runtime/changelist/Operations;->isNotEmpty()Z PLandroidx/compose/runtime/changelist/Operations;->isNotEmpty()Z HSPLandroidx/compose/runtime/changelist/Operations;->popInto(Landroidx/compose/runtime/changelist/Operations;)V HPLandroidx/compose/runtime/changelist/Operations;->popInto(Landroidx/compose/runtime/changelist/Operations;)V HSPLandroidx/compose/runtime/changelist/Operations;->push(Landroidx/compose/runtime/changelist/Operation;)V HPLandroidx/compose/runtime/changelist/Operations;->push(Landroidx/compose/runtime/changelist/Operation;)V HSPLandroidx/compose/runtime/changelist/Operations;->pushOp(Landroidx/compose/runtime/changelist/Operation;)V HPLandroidx/compose/runtime/changelist/Operations;->pushOp(Landroidx/compose/runtime/changelist/Operation;)V Landroidx/compose/runtime/changelist/Operations$OpIterator; HSPLandroidx/compose/runtime/changelist/Operations$OpIterator;->(Landroidx/compose/runtime/changelist/Operations;)V HPLandroidx/compose/runtime/changelist/Operations$OpIterator;->(Landroidx/compose/runtime/changelist/Operations;)V HSPLandroidx/compose/runtime/changelist/Operations$OpIterator;->getInt-w8GmfQM(I)I HPLandroidx/compose/runtime/changelist/Operations$OpIterator;->getInt-w8GmfQM(I)I HSPLandroidx/compose/runtime/changelist/Operations$OpIterator;->getObject-31yXWZQ(I)Ljava/lang/Object; HPLandroidx/compose/runtime/changelist/Operations$OpIterator;->getObject-31yXWZQ(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/changelist/Operations$OpIterator;->getOperation()Landroidx/compose/runtime/changelist/Operation; HPLandroidx/compose/runtime/changelist/Operations$OpIterator;->getOperation()Landroidx/compose/runtime/changelist/Operation; HSPLandroidx/compose/runtime/changelist/Operations$OpIterator;->next()Z HPLandroidx/compose/runtime/changelist/Operations$OpIterator;->next()Z Landroidx/compose/runtime/collection/IdentityArrayIntMap; HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->()V HPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->()V HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->access$setSize$p(Landroidx/compose/runtime/collection/IdentityArrayIntMap;I)V PLandroidx/compose/runtime/collection/IdentityArrayIntMap;->access$setSize$p(Landroidx/compose/runtime/collection/IdentityArrayIntMap;I)V HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->add(ILjava/lang/Object;)I HPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->add(ILjava/lang/Object;)I HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->getKeys()[Ljava/lang/Object; PLandroidx/compose/runtime/collection/IdentityArrayIntMap;->getKeys()[Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->getSize()I PLandroidx/compose/runtime/collection/IdentityArrayIntMap;->getSize()I HSPLandroidx/compose/runtime/collection/IdentityArrayIntMap;->getValues()[I PLandroidx/compose/runtime/collection/IdentityArrayIntMap;->getValues()[I Landroidx/compose/runtime/collection/IdentityArrayMap; HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->()V HPLandroidx/compose/runtime/collection/IdentityArrayMap;->()V HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->access$setSize$p(Landroidx/compose/runtime/collection/IdentityArrayMap;I)V PLandroidx/compose/runtime/collection/IdentityArrayMap;->access$setSize$p(Landroidx/compose/runtime/collection/IdentityArrayMap;I)V HPLandroidx/compose/runtime/collection/IdentityArrayMap;->clear()V HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->contains(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/IdentityArrayMap;->contains(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->find(Ljava/lang/Object;)I HPLandroidx/compose/runtime/collection/IdentityArrayMap;->find(Ljava/lang/Object;)I HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/collection/IdentityArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->getKeys()[Ljava/lang/Object; HPLandroidx/compose/runtime/collection/IdentityArrayMap;->getKeys()[Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->getSize()I HPLandroidx/compose/runtime/collection/IdentityArrayMap;->getSize()I HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->getValues()[Ljava/lang/Object; HPLandroidx/compose/runtime/collection/IdentityArrayMap;->getValues()[Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->isNotEmpty()Z PLandroidx/compose/runtime/collection/IdentityArrayMap;->isNotEmpty()Z HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/collection/IdentityArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityArrayMap;->set(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/collection/IdentityArrayMap;->set(Ljava/lang/Object;Ljava/lang/Object;)V Landroidx/compose/runtime/collection/IdentityArraySet; HSPLandroidx/compose/runtime/collection/IdentityArraySet;->()V PLandroidx/compose/runtime/collection/IdentityArraySet;->()V HSPLandroidx/compose/runtime/collection/IdentityArraySet;->access$setSize$p(Landroidx/compose/runtime/collection/IdentityArraySet;I)V PLandroidx/compose/runtime/collection/IdentityArraySet;->access$setSize$p(Landroidx/compose/runtime/collection/IdentityArraySet;I)V HSPLandroidx/compose/runtime/collection/IdentityArraySet;->add(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/IdentityArraySet;->add(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/IdentityArraySet;->addAll(Ljava/util/Collection;)V HPLandroidx/compose/runtime/collection/IdentityArraySet;->addAll(Ljava/util/Collection;)V HSPLandroidx/compose/runtime/collection/IdentityArraySet;->clear()V HPLandroidx/compose/runtime/collection/IdentityArraySet;->clear()V HSPLandroidx/compose/runtime/collection/IdentityArraySet;->contains(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/IdentityArraySet;->contains(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/IdentityArraySet;->find(Ljava/lang/Object;)I HPLandroidx/compose/runtime/collection/IdentityArraySet;->find(Ljava/lang/Object;)I HSPLandroidx/compose/runtime/collection/IdentityArraySet;->getValues()[Ljava/lang/Object; PLandroidx/compose/runtime/collection/IdentityArraySet;->getValues()[Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityArraySet;->isEmpty()Z PLandroidx/compose/runtime/collection/IdentityArraySet;->isEmpty()Z HSPLandroidx/compose/runtime/collection/IdentityArraySet;->isNotEmpty()Z PLandroidx/compose/runtime/collection/IdentityArraySet;->isNotEmpty()Z HSPLandroidx/compose/runtime/collection/IdentityArraySet;->iterator()Ljava/util/Iterator; PLandroidx/compose/runtime/collection/IdentityArraySet;->iterator()Ljava/util/Iterator; HSPLandroidx/compose/runtime/collection/IdentityArraySet;->remove(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/IdentityArraySet;->remove(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/IdentityArraySet;->size()I PLandroidx/compose/runtime/collection/IdentityArraySet;->size()I Landroidx/compose/runtime/collection/IdentityArraySet$iterator$1; HSPLandroidx/compose/runtime/collection/IdentityArraySet$iterator$1;->(Landroidx/compose/runtime/collection/IdentityArraySet;)V HPLandroidx/compose/runtime/collection/IdentityArraySet$iterator$1;->(Landroidx/compose/runtime/collection/IdentityArraySet;)V HSPLandroidx/compose/runtime/collection/IdentityArraySet$iterator$1;->hasNext()Z PLandroidx/compose/runtime/collection/IdentityArraySet$iterator$1;->hasNext()Z HSPLandroidx/compose/runtime/collection/IdentityArraySet$iterator$1;->next()Ljava/lang/Object; PLandroidx/compose/runtime/collection/IdentityArraySet$iterator$1;->next()Ljava/lang/Object; Landroidx/compose/runtime/collection/IdentityScopeMap; HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->()V HPLandroidx/compose/runtime/collection/IdentityScopeMap;->()V HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->access$find(Landroidx/compose/runtime/collection/IdentityScopeMap;Ljava/lang/Object;)I HPLandroidx/compose/runtime/collection/IdentityScopeMap;->access$find(Landroidx/compose/runtime/collection/IdentityScopeMap;Ljava/lang/Object;)I HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->access$scopeSetAt(Landroidx/compose/runtime/collection/IdentityScopeMap;I)Landroidx/compose/runtime/collection/IdentityArraySet; HPLandroidx/compose/runtime/collection/IdentityScopeMap;->access$scopeSetAt(Landroidx/compose/runtime/collection/IdentityScopeMap;I)Landroidx/compose/runtime/collection/IdentityArraySet; HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->add(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/collection/IdentityScopeMap;->add(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/collection/IdentityScopeMap;->clear()V HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->contains(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/IdentityScopeMap;->contains(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->find(Ljava/lang/Object;)I HPLandroidx/compose/runtime/collection/IdentityScopeMap;->find(Ljava/lang/Object;)I HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->getScopeSets()[Landroidx/compose/runtime/collection/IdentityArraySet; PLandroidx/compose/runtime/collection/IdentityScopeMap;->getScopeSets()[Landroidx/compose/runtime/collection/IdentityArraySet; HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->getSize()I PLandroidx/compose/runtime/collection/IdentityScopeMap;->getSize()I HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->getValueOrder()[I PLandroidx/compose/runtime/collection/IdentityScopeMap;->getValueOrder()[I HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->getValues()[Ljava/lang/Object; PLandroidx/compose/runtime/collection/IdentityScopeMap;->getValues()[Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/IdentityScopeMap;->remove(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->removeScope(Ljava/lang/Object;)V HPLandroidx/compose/runtime/collection/IdentityScopeMap;->removeScope(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/collection/IdentityScopeMap;->setSize(I)V PLandroidx/compose/runtime/collection/IdentityScopeMap;->setSize(I)V Landroidx/compose/runtime/collection/IntMap; HSPLandroidx/compose/runtime/collection/IntMap;->()V HPLandroidx/compose/runtime/collection/IntMap;->()V HSPLandroidx/compose/runtime/collection/IntMap;->clear()V HPLandroidx/compose/runtime/collection/IntMap;->clear()V HSPLandroidx/compose/runtime/collection/IntMap;->get(I)Ljava/lang/Object; PLandroidx/compose/runtime/collection/IntMap;->get(I)Ljava/lang/Object; PLandroidx/compose/runtime/collection/IntMap;->set(ILjava/lang/Object;)V Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/runtime/collection/MutableVector;->([Ljava/lang/Object;)V HPLandroidx/compose/runtime/collection/MutableVector;->([Ljava/lang/Object;)V HSPLandroidx/compose/runtime/collection/MutableVector;->add(ILjava/lang/Object;)V PLandroidx/compose/runtime/collection/MutableVector;->add(ILjava/lang/Object;)V HSPLandroidx/compose/runtime/collection/MutableVector;->add(Ljava/lang/Object;)V HPLandroidx/compose/runtime/collection/MutableVector;->add(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/collection/MutableVector;->addAll(ILandroidx/compose/runtime/collection/MutableVector;)V HPLandroidx/compose/runtime/collection/MutableVector;->addAll(ILandroidx/compose/runtime/collection/MutableVector;)V HSPLandroidx/compose/runtime/collection/MutableVector;->asMutableList()Ljava/util/List; PLandroidx/compose/runtime/collection/MutableVector;->asMutableList()Ljava/util/List; HSPLandroidx/compose/runtime/collection/MutableVector;->clear()V HPLandroidx/compose/runtime/collection/MutableVector;->clear()V HSPLandroidx/compose/runtime/collection/MutableVector;->contains(Ljava/lang/Object;)Z PLandroidx/compose/runtime/collection/MutableVector;->contains(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/MutableVector;->ensureCapacity(I)V HPLandroidx/compose/runtime/collection/MutableVector;->ensureCapacity(I)V HSPLandroidx/compose/runtime/collection/MutableVector;->getContent()[Ljava/lang/Object; HPLandroidx/compose/runtime/collection/MutableVector;->getContent()[Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/MutableVector;->getSize()I HPLandroidx/compose/runtime/collection/MutableVector;->getSize()I HSPLandroidx/compose/runtime/collection/MutableVector;->indexOf(Ljava/lang/Object;)I HPLandroidx/compose/runtime/collection/MutableVector;->indexOf(Ljava/lang/Object;)I HSPLandroidx/compose/runtime/collection/MutableVector;->isEmpty()Z PLandroidx/compose/runtime/collection/MutableVector;->isEmpty()Z HSPLandroidx/compose/runtime/collection/MutableVector;->isNotEmpty()Z HPLandroidx/compose/runtime/collection/MutableVector;->isNotEmpty()Z HSPLandroidx/compose/runtime/collection/MutableVector;->remove(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/collection/MutableVector;->remove(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/collection/MutableVector;->removeAt(I)Ljava/lang/Object; HPLandroidx/compose/runtime/collection/MutableVector;->removeAt(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/MutableVector;->removeRange(II)V HPLandroidx/compose/runtime/collection/MutableVector;->removeRange(II)V HSPLandroidx/compose/runtime/collection/MutableVector;->set(ILjava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/collection/MutableVector;->set(ILjava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/MutableVector;->sortWith(Ljava/util/Comparator;)V PLandroidx/compose/runtime/collection/MutableVector;->sortWith(Ljava/util/Comparator;)V Landroidx/compose/runtime/collection/MutableVector$MutableVectorList; HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->(Landroidx/compose/runtime/collection/MutableVector;)V HPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->(Landroidx/compose/runtime/collection/MutableVector;)V HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->get(I)Ljava/lang/Object; HPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->get(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->isEmpty()Z PLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->isEmpty()Z HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->iterator()Ljava/util/Iterator; HPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->iterator()Ljava/util/Iterator; HSPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->size()I HPLandroidx/compose/runtime/collection/MutableVector$MutableVectorList;->size()I Landroidx/compose/runtime/collection/MutableVector$VectorListIterator; HSPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->(ILjava/util/List;)V HPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->(ILjava/util/List;)V HSPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->hasNext()Z HPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->hasNext()Z HSPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->next()Ljava/lang/Object; HPLandroidx/compose/runtime/collection/MutableVector$VectorListIterator;->next()Ljava/lang/Object; Landroidx/compose/runtime/collection/MutableVectorKt; HSPLandroidx/compose/runtime/collection/MutableVectorKt;->access$checkIndex(ILjava/util/List;)V HPLandroidx/compose/runtime/collection/MutableVectorKt;->access$checkIndex(ILjava/util/List;)V Landroidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableList; Landroidx/compose/runtime/external/kotlinx/collections/immutable/ImmutableSet; Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap; Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentMap$Builder; Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentSet; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->contains(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/AbstractPersistentList;->contains(Ljava/lang/Object;)Z Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->([Ljava/lang/Object;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->([Ljava/lang/Object;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->addAll(Ljava/util/Collection;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->addAll(Ljava/util/Collection;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->get(I)Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->get(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->getSize()I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->getSize()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->indexOf(Ljava/lang/Object;)I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->indexOf(Ljava/lang/Object;)I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->removeAt(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableList/SmallPersistentVector;->removeAt(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->getKey()Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->getKey()Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->getValue()Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/MapEntry;->getValue()Ljava/lang/Object; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->containsKey(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->containsKey(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->getEntries()Ljava/util/Set; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->getEntries()Ljava/util/Set; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->getNode$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->getNode$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->getSize()I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->getSize()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->put(Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->put(Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;->remove(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;[Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;)V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;[Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->ensureNextEntryIsReady()V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->ensureNextEntryIsReady()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->hasNext()Z PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->hasNext()Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->moveToNextNodeWithData(I)I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->moveToNextNodeWithData(I)I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->next()Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBaseIterator;->next()Ljava/lang/Object; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getModCount$runtime_release()I PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getModCount$runtime_release()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getNode$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getNode$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getOwnership()Lorg/acra/file/CrashReportPersister; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getOwnership()Lorg/acra/file/CrashReportPersister; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getSize()I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->getSize()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->putAll(Ljava/util/Map;)V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->putAll(Ljava/util/Map;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setModCount$runtime_release(I)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setModCount$runtime_release(I)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setOperationResult$runtime_release(Ljava/lang/Object;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setOperationResult$runtime_release(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setOwnership(Lorg/acra/file/CrashReportPersister;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setOwnership(Lorg/acra/file/CrashReportPersister;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setSize(I)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;->setSize(I)V Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->getSize()I PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->getSize()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->iterator()Ljava/util/Iterator; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapEntries;->iterator()Ljava/util/Iterator; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapKeysIterator; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapKeysIterator;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapKeysIterator;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->(II[Ljava/lang/Object;Lorg/acra/file/CrashReportPersister;)V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->(II[Ljava/lang/Object;Lorg/acra/file/CrashReportPersister;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->bufferMoveEntryToNode(IIILjava/lang/Object;Ljava/lang/Object;ILorg/acra/file/CrashReportPersister;)[Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->bufferMoveEntryToNode(IIILjava/lang/Object;Ljava/lang/Object;ILorg/acra/file/CrashReportPersister;)[Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->containsKey(IILjava/lang/Object;)Z HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->containsKey(IILjava/lang/Object;)Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->elementsIdentityEquals(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Z HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->elementsIdentityEquals(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->entryCount$runtime_release()I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->entryCount$runtime_release()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->entryKeyIndex$runtime_release(I)I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->entryKeyIndex$runtime_release(I)I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->get(IILjava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->get(IILjava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->getBuffer$runtime_release()[Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->getBuffer$runtime_release()[Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasEntryAt$runtime_release(I)Z PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasEntryAt$runtime_release(I)Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasNodeAt(I)Z HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->hasNodeAt(I)Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->makeNode(ILjava/lang/Object;Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;ILorg/acra/file/CrashReportPersister;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->makeNode(ILjava/lang/Object;Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;ILorg/acra/file/CrashReportPersister;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePut(ILjava/lang/Object;Ljava/lang/Object;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePut(ILjava/lang/Object;Ljava/lang/Object;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePutAll(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->mutablePutAll(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;ILandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMapBuilder;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeAtIndex$runtime_release(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeAtIndex$runtime_release(I)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeIndex$runtime_release(I)I HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->nodeIndex$runtime_release(I)I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->put(IILjava/lang/Object;Ljava/lang/Object;)Landroidx/compose/runtime/IntStack; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->put(IILjava/lang/Object;Ljava/lang/Object;)Landroidx/compose/runtime/IntStack; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->remove(IILjava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->updateNodeAtIndex(IILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->updateNodeAtIndex(IILandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->valueAtKeyIndex(I)Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;->valueAtKeyIndex(I)Ljava/lang/Object; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->getBuffer()[Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->getBuffer()[Ljava/lang/Object; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->getIndex()I PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->getIndex()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->hasNextKey()Z PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->hasNextKey()Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->hasNextNode()Z PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->hasNextNode()Z HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->reset(II[Ljava/lang/Object;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->reset(II[Ljava/lang/Object;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->setIndex(I)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeBaseIterator;->setIndex(I)V Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKeysIterator; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKeysIterator;->(I)V HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKeysIterator;->(I)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKeysIterator;->next()Ljava/lang/Object; HPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNodeKeysIterator;->next()Ljava/lang/Object; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->(Ljava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->(Ljava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->getHasNext()Z PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->getHasPrevious()Z PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->getNext()Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->getPrevious()Ljava/lang/Object; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->withNext(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links;->withPrevious(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/Links; Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/PersistentHashMap;)V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->access$getEMPTY$cp()Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->add(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->getSize()I PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->getSize()I PLandroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet;->remove(Ljava/lang/Object;)Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/persistentOrderedSet/PersistentOrderedSet; Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;->getCount()I PLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;->getCount()I HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;->setCount(I)V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/DeltaCounter;->setCount(I)V Landroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain; HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;->()V HSPLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;->()V PLandroidx/compose/runtime/external/kotlinx/collections/immutable/internal/EndOfChain;->()V Landroidx/compose/runtime/internal/ComposableLambdaImpl; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->(IZ)V HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->(IZ)V HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->trackRead(Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->trackRead(Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->update(Lkotlin/jvm/internal/Lambda;)V HPLandroidx/compose/runtime/internal/ComposableLambdaImpl;->update(Lkotlin/jvm/internal/Lambda;)V Landroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;I)V HPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$2; HSPLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$2;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;Ljava/lang/Object;I)V PLandroidx/compose/runtime/internal/ComposableLambdaImpl$invoke$2;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;Ljava/lang/Object;Ljava/lang/Object;I)V Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->()V PLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->()V HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V PLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/implementations/immutableMap/TrieNode;I)V HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->access$getEmpty$cp()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; PLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->access$getEmpty$cp()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->containsKey(Ljava/lang/Object;)Z PLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->containsKey(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->putValue(Landroidx/compose/runtime/CompositionLocal;Landroidx/compose/runtime/State;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;->putValue(Landroidx/compose/runtime/CompositionLocal;Landroidx/compose/runtime/State;)Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder; HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->(Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;)V PLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->(Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap;)V HSPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->build()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HPLandroidx/compose/runtime/internal/PersistentCompositionLocalHashMap$Builder;->build()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; Landroidx/compose/runtime/internal/ThreadMap; HSPLandroidx/compose/runtime/internal/ThreadMap;->(I[J[Ljava/lang/Object;)V PLandroidx/compose/runtime/internal/ThreadMap;->(I[J[Ljava/lang/Object;)V HSPLandroidx/compose/runtime/internal/ThreadMap;->find(J)I HPLandroidx/compose/runtime/internal/ThreadMap;->find(J)I HSPLandroidx/compose/runtime/internal/ThreadMap;->get(J)Ljava/lang/Object; HPLandroidx/compose/runtime/internal/ThreadMap;->get(J)Ljava/lang/Object; HSPLandroidx/compose/runtime/internal/ThreadMap;->newWith(JLjava/lang/Object;)Landroidx/compose/runtime/internal/ThreadMap; PLandroidx/compose/runtime/internal/ThreadMap;->newWith(JLjava/lang/Object;)Landroidx/compose/runtime/internal/ThreadMap; HSPLandroidx/compose/runtime/internal/ThreadMap;->trySet(JLjava/lang/Object;)Z HPLandroidx/compose/runtime/internal/ThreadMap;->trySet(JLjava/lang/Object;)Z Landroidx/compose/runtime/internal/ThreadMapKt; HSPLandroidx/compose/runtime/internal/ThreadMapKt;->()V PLandroidx/compose/runtime/internal/ThreadMapKt;->()V HSPLandroidx/compose/runtime/internal/ThreadMapKt;->getEmptyThreadMap()Landroidx/compose/runtime/internal/ThreadMap; PLandroidx/compose/runtime/internal/ThreadMapKt;->getEmptyThreadMap()Landroidx/compose/runtime/internal/ThreadMap; Landroidx/compose/runtime/saveable/MapSaverKt; HSPLandroidx/compose/runtime/saveable/MapSaverKt;->listSaver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/runtime/saveable/MapSaverKt;->listSaver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/runtime/saveable/MapSaverKt;->rememberSaveable([Ljava/lang/Object;Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/MapSaverKt;->rememberSaveable([Ljava/lang/Object;Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)Ljava/lang/Object; HSPLandroidx/compose/runtime/saveable/MapSaverKt;->rememberSaveableStateHolder(Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/saveable/SaveableStateHolder; HPLandroidx/compose/runtime/saveable/MapSaverKt;->rememberSaveableStateHolder(Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/saveable/SaveableStateHolder; Landroidx/compose/runtime/saveable/MapSaverKt$mapSaver$1; HSPLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$1;->(Ljava/lang/Object;I)V PLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/saveable/MapSaverKt$mapSaver$2; HSPLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$2;->(Ljava/lang/Object;I)V PLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/MapSaverKt$mapSaver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1; HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;->(Landroidx/compose/runtime/saveable/SaveableHolder;Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V PLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;->(Landroidx/compose/runtime/saveable/SaveableHolder;Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V HSPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/RememberSaveableKt$rememberSaveable$1;->invoke()Ljava/lang/Object; Landroidx/compose/runtime/saveable/SaveableHolder; HSPLandroidx/compose/runtime/saveable/SaveableHolder;->(Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V PLandroidx/compose/runtime/saveable/SaveableHolder;->(Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V HSPLandroidx/compose/runtime/saveable/SaveableHolder;->canBeSaved(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/saveable/SaveableHolder;->canBeSaved(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/saveable/SaveableHolder;->getValueIfInputsDidntChange([Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/saveable/SaveableHolder;->getValueIfInputsDidntChange([Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/saveable/SaveableHolder;->invoke()Ljava/lang/Object; PLandroidx/compose/runtime/saveable/SaveableHolder;->invoke()Ljava/lang/Object; HSPLandroidx/compose/runtime/saveable/SaveableHolder;->onForgotten()V HPLandroidx/compose/runtime/saveable/SaveableHolder;->onForgotten()V HSPLandroidx/compose/runtime/saveable/SaveableHolder;->onRemembered()V HPLandroidx/compose/runtime/saveable/SaveableHolder;->onRemembered()V HSPLandroidx/compose/runtime/saveable/SaveableHolder;->register()V HPLandroidx/compose/runtime/saveable/SaveableHolder;->register()V HSPLandroidx/compose/runtime/saveable/SaveableHolder;->update(Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V HPLandroidx/compose/runtime/saveable/SaveableHolder;->update(Landroidx/compose/runtime/saveable/SaverKt$Saver$1;Landroidx/compose/runtime/saveable/SaveableStateRegistry;Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;)V Landroidx/compose/runtime/saveable/SaveableStateHolder; Landroidx/compose/runtime/saveable/SaveableStateHolderImpl; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->()V PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->()V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->(Ljava/util/Map;)V HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->(Ljava/util/Map;)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->SaveableStateProvider(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->SaveableStateProvider(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$getRegistryHolders$p(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)Ljava/util/LinkedHashMap; PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$getRegistryHolders$p(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)Ljava/util/LinkedHashMap; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$getSavedStates$p(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)Ljava/util/Map; PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$getSavedStates$p(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)Ljava/util/Map; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$getSaver$cp()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$saveAll(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)Ljava/util/Map; HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->access$saveAll(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;)Ljava/util/Map; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->getParentSaveableStateRegistry()Landroidx/compose/runtime/saveable/SaveableStateRegistry; PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->getParentSaveableStateRegistry()Landroidx/compose/runtime/saveable/SaveableStateRegistry; PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->removeState(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->setParentSaveableStateRegistry(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl;->setParentSaveableStateRegistry(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->getRegistry()Landroidx/compose/runtime/saveable/SaveableStateRegistry; PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->getRegistry()Landroidx/compose/runtime/saveable/SaveableStateRegistry; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->saveTo(Ljava/util/Map;)V HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;->saveTo(Ljava/util/Map;)V Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;->(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V PLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;->(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$RegistryHolder;Landroidx/compose/runtime/saveable/SaveableStateHolderImpl;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$1$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/runtime/saveable/SaveableStateHolderImpl$SaveableStateProvider$2; Landroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1; HSPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->()V PLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->()V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->(I)V PLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->(I)V HSPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/SaveableStateHolderKt$rememberSaveableStateHolder$1;->invoke()Ljava/lang/Object; Landroidx/compose/runtime/saveable/SaveableStateRegistry; Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->access$getValueProviders$p(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;)Ljava/util/LinkedHashMap; PLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->access$getValueProviders$p(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;)Ljava/util/LinkedHashMap; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->canBeSaved(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->canBeSaved(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->performSave()Ljava/util/Map; HPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->performSave()Ljava/util/Map; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; HPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;->(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;->(Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;->unregister()V HPLandroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3;->unregister()V Landroidx/compose/runtime/saveable/SaveableStateRegistryKt; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->()V PLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->()V HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->SaveableStateRegistry(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaveableStateRegistry; PLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->SaveableStateRegistry(Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaveableStateRegistry; HSPLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->getLocalSaveableStateRegistry()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/runtime/saveable/SaveableStateRegistryKt;->getLocalSaveableStateRegistry()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/runtime/saveable/SaverKt; HSPLandroidx/compose/runtime/saveable/SaverKt;->()V PLandroidx/compose/runtime/saveable/SaverKt;->()V HSPLandroidx/compose/runtime/saveable/SaverKt;->Saver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/runtime/saveable/SaverKt;->Saver(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/runtime/saveable/SaverKt;->autoSaver()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLandroidx/compose/runtime/saveable/SaverKt;->autoSaver()Landroidx/compose/runtime/saveable/SaverKt$Saver$1; Landroidx/compose/runtime/saveable/SaverKt$AutoSaver$1; HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;->()V PLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;->()V HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;->(I)V PLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;->(I)V HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/saveable/SaverKt$AutoSaver$2; HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;->()V PLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;->()V HSPLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;->(I)V PLandroidx/compose/runtime/saveable/SaverKt$AutoSaver$2;->(I)V Landroidx/compose/runtime/saveable/SaverKt$Saver$1; HSPLandroidx/compose/runtime/saveable/SaverKt$Saver$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/runtime/saveable/SaverKt$Saver$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/saveable/SaverKt$Saver$1;->save(Landroidx/compose/runtime/saveable/SaverScope;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/saveable/SaverKt$Saver$1;->save(Landroidx/compose/runtime/saveable/SaverScope;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/saveable/SaverScope; Landroidx/compose/runtime/snapshots/GlobalSnapshot; HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)V HPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)V HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->dispose()V HPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->dispose()V HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->notifyObjectsInitialized$runtime_release()V PLandroidx/compose/runtime/snapshots/GlobalSnapshot;->notifyObjectsInitialized$runtime_release()V HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; PLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedSnapshot(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/GlobalSnapshot;->takeNestedSnapshot(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/Snapshot; Landroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1; HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;->(Ljava/lang/Object;I)V PLandroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;->invoke(Ljava/lang/Object;)V HPLandroidx/compose/runtime/snapshots/GlobalSnapshot$1$1$1;->invoke(Ljava/lang/Object;)V Landroidx/compose/runtime/snapshots/MutableSnapshot; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->()V PLandroidx/compose/runtime/snapshots/MutableSnapshot;->()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->advance$runtime_release()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->advance$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/Snapshot$Companion; HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/Snapshot$Companion; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->closeLocked$runtime_release()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->closeLocked$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->dispose()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->dispose()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getApplied$runtime_release()Z PLandroidx/compose/runtime/snapshots/MutableSnapshot;->getApplied$runtime_release()Z HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getModified$runtime_release()Landroidx/compose/runtime/collection/IdentityArraySet; HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getModified$runtime_release()Landroidx/compose/runtime/collection/IdentityArraySet; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getPreviousIds$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet; PLandroidx/compose/runtime/snapshots/MutableSnapshot;->getPreviousIds$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getPreviousPinnedSnapshots$runtime_release()[I PLandroidx/compose/runtime/snapshots/MutableSnapshot;->getPreviousPinnedSnapshots$runtime_release()[I HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadObserver$runtime_release()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadObserver$runtime_release()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadOnly()Z HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getReadOnly()Z HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteCount$runtime_release()I HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteCount$runtime_release()I HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteObserver$runtime_release()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->getWriteObserver$runtime_release()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->innerApplyLocked$runtime_release(ILjava/util/HashMap;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/Snapshot$Companion; HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->innerApplyLocked$runtime_release(ILjava/util/HashMap;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/Snapshot$Companion; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->nestedActivated$runtime_release()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->nestedActivated$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->nestedDeactivated$runtime_release()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->nestedDeactivated$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->notifyObjectsInitialized$runtime_release()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->notifyObjectsInitialized$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordModified$runtime_release(Landroidx/compose/runtime/snapshots/StateObject;)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordModified$runtime_release(Landroidx/compose/runtime/snapshots/StateObject;)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPrevious$runtime_release(I)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPrevious$runtime_release(I)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPreviousList$runtime_release(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPreviousList$runtime_release(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPreviousPinnedSnapshot$runtime_release(I)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPreviousPinnedSnapshot$runtime_release(I)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPreviousPinnedSnapshots$runtime_release([I)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->recordPreviousPinnedSnapshots$runtime_release([I)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->releasePinnedSnapshotsForCloseLocked$runtime_release()V PLandroidx/compose/runtime/snapshots/MutableSnapshot;->releasePinnedSnapshotsForCloseLocked$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setApplied$runtime_release()V PLandroidx/compose/runtime/snapshots/MutableSnapshot;->setApplied$runtime_release()V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setModified(Landroidx/compose/runtime/collection/IdentityArraySet;)V PLandroidx/compose/runtime/snapshots/MutableSnapshot;->setModified(Landroidx/compose/runtime/collection/IdentityArraySet;)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setWriteCount$runtime_release(I)V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->setWriteCount$runtime_release(I)V HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; HSPLandroidx/compose/runtime/snapshots/MutableSnapshot;->validateNotAppliedOrPinned()V HPLandroidx/compose/runtime/snapshots/MutableSnapshot;->validateNotAppliedOrPinned()V Landroidx/compose/runtime/snapshots/NestedMutableSnapshot; HSPLandroidx/compose/runtime/snapshots/NestedMutableSnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/snapshots/MutableSnapshot;)V PLandroidx/compose/runtime/snapshots/NestedMutableSnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/snapshots/MutableSnapshot;)V HSPLandroidx/compose/runtime/snapshots/NestedMutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/Snapshot$Companion; HPLandroidx/compose/runtime/snapshots/NestedMutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/Snapshot$Companion; HSPLandroidx/compose/runtime/snapshots/NestedMutableSnapshot;->dispose()V HPLandroidx/compose/runtime/snapshots/NestedMutableSnapshot;->dispose()V Landroidx/compose/runtime/snapshots/ObserverHandle; Landroidx/compose/runtime/snapshots/ReadonlySnapshot; HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->dispose()V HPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->dispose()V HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->getReadObserver$runtime_release()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->getReadObserver$runtime_release()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->nestedDeactivated$runtime_release()V HPLandroidx/compose/runtime/snapshots/ReadonlySnapshot;->nestedDeactivated$runtime_release()V Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/Snapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)V HPLandroidx/compose/runtime/snapshots/Snapshot;->(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)V HSPLandroidx/compose/runtime/snapshots/Snapshot;->closeAndReleasePinning$runtime_release()V HPLandroidx/compose/runtime/snapshots/Snapshot;->closeAndReleasePinning$runtime_release()V HSPLandroidx/compose/runtime/snapshots/Snapshot;->closeLocked$runtime_release()V PLandroidx/compose/runtime/snapshots/Snapshot;->closeLocked$runtime_release()V HSPLandroidx/compose/runtime/snapshots/Snapshot;->dispose()V HPLandroidx/compose/runtime/snapshots/Snapshot;->dispose()V HSPLandroidx/compose/runtime/snapshots/Snapshot;->getDisposed$runtime_release()Z HPLandroidx/compose/runtime/snapshots/Snapshot;->getDisposed$runtime_release()Z HSPLandroidx/compose/runtime/snapshots/Snapshot;->getId()I HPLandroidx/compose/runtime/snapshots/Snapshot;->getId()I HSPLandroidx/compose/runtime/snapshots/Snapshot;->getInvalid$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HPLandroidx/compose/runtime/snapshots/Snapshot;->getInvalid$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/Snapshot;->makeCurrent()Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/Snapshot;->makeCurrent()Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotLocked$runtime_release()V HPLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotLocked$runtime_release()V HSPLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotsForCloseLocked$runtime_release()V PLandroidx/compose/runtime/snapshots/Snapshot;->releasePinnedSnapshotsForCloseLocked$runtime_release()V HSPLandroidx/compose/runtime/snapshots/Snapshot;->restoreCurrent(Landroidx/compose/runtime/snapshots/Snapshot;)V HPLandroidx/compose/runtime/snapshots/Snapshot;->restoreCurrent(Landroidx/compose/runtime/snapshots/Snapshot;)V HSPLandroidx/compose/runtime/snapshots/Snapshot;->setDisposed$runtime_release()V PLandroidx/compose/runtime/snapshots/Snapshot;->setDisposed$runtime_release()V HSPLandroidx/compose/runtime/snapshots/Snapshot;->setId$runtime_release(I)V PLandroidx/compose/runtime/snapshots/Snapshot;->setId$runtime_release(I)V HSPLandroidx/compose/runtime/snapshots/Snapshot;->setInvalid$runtime_release(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V PLandroidx/compose/runtime/snapshots/Snapshot;->setInvalid$runtime_release(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V HSPLandroidx/compose/runtime/snapshots/Snapshot;->takeoverPinnedSnapshot$runtime_release()I PLandroidx/compose/runtime/snapshots/Snapshot;->takeoverPinnedSnapshot$runtime_release()I HSPLandroidx/compose/runtime/snapshots/Snapshot;->validateNotDisposed$runtime_release()V PLandroidx/compose/runtime/snapshots/Snapshot;->validateNotDisposed$runtime_release()V Landroidx/compose/runtime/snapshots/Snapshot$Companion; HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->()V PLandroidx/compose/runtime/snapshots/Snapshot$Companion;->()V HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->createNonObservableSnapshot()Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->createNonObservableSnapshot()Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->observe(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->observe(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->registerApplyObserver(Lkotlin/jvm/functions/Function2;)Landroidx/compose/runtime/snapshots/ObserverHandle; HPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->registerApplyObserver(Lkotlin/jvm/functions/Function2;)Landroidx/compose/runtime/snapshots/ObserverHandle; HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion;->registerGlobalWriteObserver(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/ObserverHandle; PLandroidx/compose/runtime/snapshots/Snapshot$Companion;->registerGlobalWriteObserver(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/ObserverHandle; Landroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2; HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;->(Lkotlin/jvm/internal/Lambda;I)V HPLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;->(Lkotlin/jvm/internal/Lambda;I)V HSPLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;->dispose()V HPLandroidx/compose/runtime/snapshots/Snapshot$Companion$registerApplyObserver$2;->dispose()V Landroidx/compose/runtime/snapshots/SnapshotApplyResult$Failure; Landroidx/compose/runtime/snapshots/SnapshotApplyResult$Success; HSPLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;->()V PLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;->()V PLandroidx/compose/runtime/snapshots/SnapshotApplyResult$Success;->()V Landroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap; HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->()V PLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->add(I)I HPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->add(I)I HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->lowestOrDefault(I)I HPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->lowestOrDefault(I)I HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->remove(I)V HPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->remove(I)V HSPLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->swap(II)V PLandroidx/compose/runtime/snapshots/SnapshotDoubleIndexHeap;->swap(II)V Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->()V PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->(JJI[I)V HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->(JJI[I)V HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getBelowBound$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)[I PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getBelowBound$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)[I HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getEMPTY$cp()Landroidx/compose/runtime/snapshots/SnapshotIdSet; PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getEMPTY$cp()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getLowerBound$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)I PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getLowerBound$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)I HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getLowerSet$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)J HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getLowerSet$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)J HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getUpperSet$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)J PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->access$getUpperSet$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)J HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->andNot(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->andNot(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->clear(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->clear(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->get(I)Z HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->get(I)Z HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->iterator()Ljava/util/Iterator; PLandroidx/compose/runtime/snapshots/SnapshotIdSet;->iterator()Ljava/util/Iterator; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->lowest(I)I HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->lowest(I)I HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->or(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->or(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->set(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet; HPLandroidx/compose/runtime/snapshots/SnapshotIdSet;->set(I)Landroidx/compose/runtime/snapshots/SnapshotIdSet; Landroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->(Landroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->(Landroidx/compose/runtime/snapshots/SnapshotIdSet;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotIdSet$iterator$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/snapshots/SnapshotKt; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->()V PLandroidx/compose/runtime/snapshots/SnapshotKt;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$advanceGlobalSnapshot()V HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$advanceGlobalSnapshot()V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$advanceGlobalSnapshot(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$advanceGlobalSnapshot(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$checkAndOverwriteUnusedRecordsLocked()V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$checkAndOverwriteUnusedRecordsLocked()V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getApplyObservers$p()Ljava/util/List; PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getApplyObservers$p()Ljava/util/List; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getCurrentGlobalSnapshot$p()Ljava/util/concurrent/atomic/AtomicReference; PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getCurrentGlobalSnapshot$p()Ljava/util/concurrent/atomic/AtomicReference; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getEmptyLambda$p()Lkotlin/jvm/functions/Function1; PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getEmptyLambda$p()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getGlobalWriteObservers$p()Ljava/util/List; PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getGlobalWriteObservers$p()Ljava/util/List; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getNextSnapshotId$p()I PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getNextSnapshotId$p()I HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getOpenSnapshots$p()Landroidx/compose/runtime/snapshots/SnapshotIdSet; PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getOpenSnapshots$p()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getThreadSnapshot$p()Landroidx/compose/runtime/SnapshotThreadLocal; PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$getThreadSnapshot$p()Landroidx/compose/runtime/SnapshotThreadLocal; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$mergedReadObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$mergedReadObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Z)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$mergedWriteObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$mergedWriteObserver(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$optimisticMerges(Landroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Ljava/util/HashMap; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$optimisticMerges(Landroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/MutableSnapshot;Landroidx/compose/runtime/snapshots/SnapshotIdSet;)Ljava/util/HashMap; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$processForUnusedRecordsLocked(Landroidx/compose/runtime/snapshots/StateObject;)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$processForUnusedRecordsLocked(Landroidx/compose/runtime/snapshots/StateObject;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$readable(Landroidx/compose/runtime/snapshots/StateRecord;ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$readable(Landroidx/compose/runtime/snapshots/StateRecord;ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setApplyObservers$p(Ljava/util/List;)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setApplyObservers$p(Ljava/util/List;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setGlobalWriteObservers$p(Ljava/util/List;)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setGlobalWriteObservers$p(Ljava/util/List;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setNextSnapshotId$p(I)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setNextSnapshotId$p(I)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setOpenSnapshots$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$setOpenSnapshots$p(Landroidx/compose/runtime/snapshots/SnapshotIdSet;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$takeNewGlobalSnapshot(Landroidx/compose/runtime/snapshots/GlobalSnapshot;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->access$takeNewGlobalSnapshot(Landroidx/compose/runtime/snapshots/GlobalSnapshot;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$takeNewSnapshot(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$takeNewSnapshot(Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$validateOpen(Landroidx/compose/runtime/snapshots/Snapshot;)V HPLandroidx/compose/runtime/snapshots/SnapshotKt;->access$validateOpen(Landroidx/compose/runtime/snapshots/Snapshot;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->advanceGlobalSnapshot(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->advanceGlobalSnapshot(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->checkAndOverwriteUnusedRecordsLocked()V HPLandroidx/compose/runtime/snapshots/SnapshotKt;->checkAndOverwriteUnusedRecordsLocked()V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver$default(Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver$default(Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->createTransparentSnapshotWithNoParentReadObserver(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;Z)Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->current(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->currentSnapshot()Landroidx/compose/runtime/snapshots/Snapshot; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->currentSnapshot()Landroidx/compose/runtime/snapshots/Snapshot; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->getLock()Ljava/lang/Object; PLandroidx/compose/runtime/snapshots/SnapshotKt;->getLock()Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->mergedReadObserver$default(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->mergedReadObserver$default(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->newOverwritableRecordLocked(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->newOverwritableRecordLocked(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->newWritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->newWritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->notifyWrite(Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/StateObject;)V HPLandroidx/compose/runtime/snapshots/SnapshotKt;->notifyWrite(Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/StateObject;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->overwritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/StateRecord;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->overwritableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;Landroidx/compose/runtime/snapshots/StateRecord;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->overwriteUnusedRecordsLocked(Landroidx/compose/runtime/snapshots/StateObject;)Z HPLandroidx/compose/runtime/snapshots/SnapshotKt;->overwriteUnusedRecordsLocked(Landroidx/compose/runtime/snapshots/StateObject;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->readable(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;)Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->releasePinningLocked(I)V PLandroidx/compose/runtime/snapshots/SnapshotKt;->releasePinningLocked(I)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->takeNewGlobalSnapshot(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->takeNewGlobalSnapshot(Landroidx/compose/runtime/snapshots/Snapshot;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->trackPinning(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)I HPLandroidx/compose/runtime/snapshots/SnapshotKt;->trackPinning(ILandroidx/compose/runtime/snapshots/SnapshotIdSet;)I HSPLandroidx/compose/runtime/snapshots/SnapshotKt;->writableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotKt;->writableRecord(Landroidx/compose/runtime/snapshots/StateRecord;Landroidx/compose/runtime/snapshots/StateObject;Landroidx/compose/runtime/snapshots/Snapshot;)Landroidx/compose/runtime/snapshots/StateRecord; Landroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->()V PLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->(I)V PLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->(I)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/snapshots/SnapshotKt$emptyLambda$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;I)V HPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;I)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->invoke(Ljava/lang/Object;)V HPLandroidx/compose/runtime/snapshots/SnapshotKt$mergedReadObserver$1;->invoke(Ljava/lang/Object;)V Landroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1; HSPLandroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;->(ILkotlin/jvm/functions/Function1;)V HPLandroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;->(ILkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotKt$takeNewSnapshot$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/snapshots/SnapshotMutableState; Landroidx/compose/runtime/snapshots/SnapshotStateList; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->()V HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->add(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->add(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->addAll(Ljava/util/Collection;)Z HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->addAll(Ljava/util/Collection;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->clear()V HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->clear()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->contains(Ljava/lang/Object;)Z PLandroidx/compose/runtime/snapshots/SnapshotStateList;->contains(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->get(I)Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->get(I)Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getFirstStateRecord()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getModification$runtime_release()I HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getModification$runtime_release()I HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getReadable$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->getReadable$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->isEmpty()Z HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->isEmpty()Z PLandroidx/compose/runtime/snapshots/SnapshotStateList;->iterator()Ljava/util/Iterator; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->listIterator()Ljava/util/ListIterator; HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->listIterator()Ljava/util/ListIterator; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->prependStateRecord(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->remove(Ljava/lang/Object;)Z HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->remove(Ljava/lang/Object;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateList;->size()I HPLandroidx/compose/runtime/snapshots/SnapshotStateList;->size()I PLandroidx/compose/runtime/snapshots/SnapshotStateList;->toArray()[Ljava/lang/Object; Landroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->assign(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->create()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->getList$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->getList$runtime_release()Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList; HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->getModification$runtime_release()I HPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->getModification$runtime_release()I HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->setList$runtime_release(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;)V PLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->setList$runtime_release(Landroidx/compose/runtime/external/kotlinx/collections/immutable/PersistentList;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->setModification$runtime_release(I)V PLandroidx/compose/runtime/snapshots/SnapshotStateList$StateListStateRecord;->setModification$runtime_release(I)V Landroidx/compose/runtime/snapshots/SnapshotStateListKt; HSPLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->()V PLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->access$getSync$p()Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->access$getSync$p()Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->access$validateRange(II)V HPLandroidx/compose/runtime/snapshots/SnapshotStateListKt;->access$validateRange(II)V Landroidx/compose/runtime/snapshots/SnapshotStateObserver; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$addChanges(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;Ljava/util/Set;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$addChanges(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;Ljava/util/Set;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$drainChanges(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$drainChanges(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$getCurrentMap$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap; PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$getCurrentMap$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$getObservedScopeMaps$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Landroidx/compose/runtime/collection/MutableVector; PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$getObservedScopeMaps$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$getSendingNotifications$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$getSendingNotifications$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$isPaused$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$isPaused$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$sendNotifications(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$sendNotifications(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$setSendingNotifications$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;Z)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->access$setSendingNotifications$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;Z)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->clear()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->clearIf(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->clearIf(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->observeReads(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->observeReads(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->start()V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->start()V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver;->stop()V Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->access$getDeriveStateScopeCount$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;)I HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->access$getDeriveStateScopeCount$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;)I HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->access$setDeriveStateScopeCount$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;I)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->access$setDeriveStateScopeCount$p(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;I)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->clear()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->getOnChanged()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->getOnChanged()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->notifyInvalidatedScopes()V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->notifyInvalidatedScopes()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->observe(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->observe(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordInvalidation(Ljava/util/Set;)Z HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordInvalidation(Ljava/util/Set;)Z HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordRead(Ljava/lang/Object;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordRead(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordRead(Ljava/lang/Object;ILjava/lang/Object;Landroidx/compose/runtime/collection/IdentityArrayIntMap;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->recordRead(Ljava/lang/Object;ILjava/lang/Object;Landroidx/compose/runtime/collection/IdentityArrayIntMap;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeObservation(Ljava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeObservation(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeScopeIf(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;->removeScopeIf(Lkotlin/jvm/functions/Function1;)V Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1;->done()V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1;->done()V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1;->start()V HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$ObservedScopeMap$derivedStateObserver$1;->start()V Landroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/runtime/snapshots/SnapshotStateObserver$applyObserver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1; HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V PLandroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;->(Landroidx/compose/runtime/snapshots/SnapshotStateObserver;)V HSPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/SnapshotStateObserver$sendNotifications$1;->invoke()Ljava/lang/Object; Landroidx/compose/runtime/snapshots/SnapshotWeakSet; HSPLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->()V PLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->()V HSPLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->add(Ljava/lang/Object;)V PLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->add(Ljava/lang/Object;)V HSPLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->getHashes$runtime_release()[I PLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->getHashes$runtime_release()[I HSPLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->getSize$runtime_release()I PLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->getSize$runtime_release()I HSPLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->getValues$runtime_release()[Landroidx/compose/runtime/WeakReference; PLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->getValues$runtime_release()[Landroidx/compose/runtime/WeakReference; HSPLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->setSize$runtime_release(I)V PLandroidx/compose/runtime/snapshots/SnapshotWeakSet;->setSize$runtime_release(I)V Landroidx/compose/runtime/snapshots/StateListIterator; HSPLandroidx/compose/runtime/snapshots/StateListIterator;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;I)V HPLandroidx/compose/runtime/snapshots/StateListIterator;->(Landroidx/compose/runtime/snapshots/SnapshotStateList;I)V HSPLandroidx/compose/runtime/snapshots/StateListIterator;->hasNext()Z HPLandroidx/compose/runtime/snapshots/StateListIterator;->hasNext()Z HSPLandroidx/compose/runtime/snapshots/StateListIterator;->next()Ljava/lang/Object; HPLandroidx/compose/runtime/snapshots/StateListIterator;->next()Ljava/lang/Object; HSPLandroidx/compose/runtime/snapshots/StateListIterator;->validateModification()V HPLandroidx/compose/runtime/snapshots/StateListIterator;->validateModification()V Landroidx/compose/runtime/snapshots/StateObject; Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/StateRecord;->()V HPLandroidx/compose/runtime/snapshots/StateRecord;->()V HSPLandroidx/compose/runtime/snapshots/StateRecord;->getNext$runtime_release()Landroidx/compose/runtime/snapshots/StateRecord; HPLandroidx/compose/runtime/snapshots/StateRecord;->getNext$runtime_release()Landroidx/compose/runtime/snapshots/StateRecord; HSPLandroidx/compose/runtime/snapshots/StateRecord;->getSnapshotId$runtime_release()I HPLandroidx/compose/runtime/snapshots/StateRecord;->getSnapshotId$runtime_release()I HSPLandroidx/compose/runtime/snapshots/StateRecord;->setNext$runtime_release(Landroidx/compose/runtime/snapshots/StateRecord;)V HPLandroidx/compose/runtime/snapshots/StateRecord;->setNext$runtime_release(Landroidx/compose/runtime/snapshots/StateRecord;)V HSPLandroidx/compose/runtime/snapshots/StateRecord;->setSnapshotId$runtime_release(I)V HPLandroidx/compose/runtime/snapshots/StateRecord;->setSnapshotId$runtime_release(I)V Landroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot; HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->(Landroidx/compose/runtime/snapshots/MutableSnapshot;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ZZ)V HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->(Landroidx/compose/runtime/snapshots/MutableSnapshot;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ZZ)V HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/Snapshot$Companion; PLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->apply()Landroidx/compose/runtime/snapshots/Snapshot$Companion; HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->dispose()V HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->dispose()V HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getCurrentSnapshot()Landroidx/compose/runtime/snapshots/MutableSnapshot; HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getCurrentSnapshot()Landroidx/compose/runtime/snapshots/MutableSnapshot; HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getId()I HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getId()I HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getInvalid$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getInvalid$runtime_release()Landroidx/compose/runtime/snapshots/SnapshotIdSet; HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getReadOnly()Z HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getReadOnly()Z HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getWriteCount$runtime_release()I HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->getWriteCount$runtime_release()I HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->notifyObjectsInitialized$runtime_release()V HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->notifyObjectsInitialized$runtime_release()V HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->recordModified$runtime_release(Landroidx/compose/runtime/snapshots/StateObject;)V HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->recordModified$runtime_release(Landroidx/compose/runtime/snapshots/StateObject;)V HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->setWriteCount$runtime_release(I)V HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->setWriteCount$runtime_release(I)V HSPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; HPLandroidx/compose/runtime/snapshots/TransparentObserverMutableSnapshot;->takeNestedMutableSnapshot(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/runtime/snapshots/MutableSnapshot; Landroidx/compose/runtime/snapshots/TransparentObserverSnapshot; Landroidx/compose/runtime/tooling/InspectionTablesKt; HSPLandroidx/compose/runtime/tooling/InspectionTablesKt;->()V PLandroidx/compose/runtime/tooling/InspectionTablesKt;->()V HSPLandroidx/compose/runtime/tooling/InspectionTablesKt;->getLocalInspectionTables()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/runtime/tooling/InspectionTablesKt;->getLocalInspectionTables()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1; HSPLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->()V PLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->()V HSPLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->()V PLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->()V HSPLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->invoke()Ljava/lang/Object; PLandroidx/compose/runtime/tooling/InspectionTablesKt$LocalInspectionTables$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/ActualKt; HSPLandroidx/compose/ui/ActualKt;->composed$default(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/ActualKt;->composed$default(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/ActualKt;->composed(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/ActualKt;->composed(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/ActualKt;->materializeModifier(Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/ActualKt;->materializeModifier(Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/Alignment; Landroidx/compose/ui/Alignment$Companion; HSPLandroidx/compose/ui/Alignment$Companion;->()V PLandroidx/compose/ui/Alignment$Companion;->()V HSPLandroidx/compose/ui/Alignment$Companion;->getBottom()Landroidx/compose/ui/BiasAlignment$Vertical; PLandroidx/compose/ui/Alignment$Companion;->getBottom()Landroidx/compose/ui/BiasAlignment$Vertical; HSPLandroidx/compose/ui/Alignment$Companion;->getBottomCenter()Landroidx/compose/ui/BiasAlignment; PLandroidx/compose/ui/Alignment$Companion;->getBottomCenter()Landroidx/compose/ui/BiasAlignment; HSPLandroidx/compose/ui/Alignment$Companion;->getCenter()Landroidx/compose/ui/BiasAlignment; PLandroidx/compose/ui/Alignment$Companion;->getCenter()Landroidx/compose/ui/BiasAlignment; HSPLandroidx/compose/ui/Alignment$Companion;->getCenterHorizontally()Landroidx/compose/ui/BiasAlignment$Horizontal; PLandroidx/compose/ui/Alignment$Companion;->getCenterHorizontally()Landroidx/compose/ui/BiasAlignment$Horizontal; HSPLandroidx/compose/ui/Alignment$Companion;->getCenterStart()Landroidx/compose/ui/BiasAlignment; PLandroidx/compose/ui/Alignment$Companion;->getCenterStart()Landroidx/compose/ui/BiasAlignment; HSPLandroidx/compose/ui/Alignment$Companion;->getCenterVertically()Landroidx/compose/ui/BiasAlignment$Vertical; PLandroidx/compose/ui/Alignment$Companion;->getCenterVertically()Landroidx/compose/ui/BiasAlignment$Vertical; HSPLandroidx/compose/ui/Alignment$Companion;->getStart()Landroidx/compose/ui/BiasAlignment$Horizontal; PLandroidx/compose/ui/Alignment$Companion;->getStart()Landroidx/compose/ui/BiasAlignment$Horizontal; HSPLandroidx/compose/ui/Alignment$Companion;->getTop()Landroidx/compose/ui/BiasAlignment$Vertical; PLandroidx/compose/ui/Alignment$Companion;->getTop()Landroidx/compose/ui/BiasAlignment$Vertical; HSPLandroidx/compose/ui/Alignment$Companion;->getTopStart()Landroidx/compose/ui/BiasAlignment; HPLandroidx/compose/ui/Alignment$Companion;->getTopStart()Landroidx/compose/ui/BiasAlignment; Landroidx/compose/ui/Alignment$Horizontal; Landroidx/compose/ui/Alignment$Vertical; Landroidx/compose/ui/BiasAlignment; HSPLandroidx/compose/ui/BiasAlignment;->(FF)V PLandroidx/compose/ui/BiasAlignment;->(FF)V HSPLandroidx/compose/ui/BiasAlignment;->align-KFBX0sM(JJLandroidx/compose/ui/unit/LayoutDirection;)J HPLandroidx/compose/ui/BiasAlignment;->align-KFBX0sM(JJLandroidx/compose/ui/unit/LayoutDirection;)J HSPLandroidx/compose/ui/BiasAlignment;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/BiasAlignment;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/BiasAlignment$Horizontal; HSPLandroidx/compose/ui/BiasAlignment$Horizontal;->(F)V PLandroidx/compose/ui/BiasAlignment$Horizontal;->(F)V HSPLandroidx/compose/ui/BiasAlignment$Horizontal;->align(IILandroidx/compose/ui/unit/LayoutDirection;)I HPLandroidx/compose/ui/BiasAlignment$Horizontal;->align(IILandroidx/compose/ui/unit/LayoutDirection;)I HSPLandroidx/compose/ui/BiasAlignment$Horizontal;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/BiasAlignment$Horizontal;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/BiasAlignment$Vertical; HSPLandroidx/compose/ui/BiasAlignment$Vertical;->(F)V PLandroidx/compose/ui/BiasAlignment$Vertical;->(F)V HSPLandroidx/compose/ui/BiasAlignment$Vertical;->align(II)I HPLandroidx/compose/ui/BiasAlignment$Vertical;->align(II)I HSPLandroidx/compose/ui/BiasAlignment$Vertical;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/BiasAlignment$Vertical;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/CombinedModifier; HSPLandroidx/compose/ui/CombinedModifier;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Modifier;)V HPLandroidx/compose/ui/CombinedModifier;->(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/Modifier;)V HSPLandroidx/compose/ui/CombinedModifier;->all(Lkotlin/jvm/functions/Function1;)Z HPLandroidx/compose/ui/CombinedModifier;->all(Lkotlin/jvm/functions/Function1;)Z HSPLandroidx/compose/ui/CombinedModifier;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/CombinedModifier;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/CombinedModifier;->foldIn(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLandroidx/compose/ui/CombinedModifier;->foldIn(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLandroidx/compose/ui/CombinedModifier;->getInner$ui_release()Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/CombinedModifier;->getInner$ui_release()Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/CombinedModifier;->getOuter$ui_release()Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/CombinedModifier;->getOuter$ui_release()Landroidx/compose/ui/Modifier; Landroidx/compose/ui/ComposedModifier; HSPLandroidx/compose/ui/ComposedModifier;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V HPLandroidx/compose/ui/ComposedModifier;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V HSPLandroidx/compose/ui/ComposedModifier;->getFactory()Lkotlin/jvm/functions/Function3; PLandroidx/compose/ui/ComposedModifier;->getFactory()Lkotlin/jvm/functions/Function3; Landroidx/compose/ui/ComposedModifierKt$materialize$1; HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->()V PLandroidx/compose/ui/ComposedModifierKt$materialize$1;->()V HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->()V PLandroidx/compose/ui/ComposedModifierKt$materialize$1;->()V HSPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/ComposedModifierKt$materialize$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/ComposedModifierKt$materialize$result$1; HSPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->(Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->(Landroidx/compose/runtime/Composer;)V HSPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/ComposedModifierKt$materialize$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/CompositionLocalMapInjectionElement; Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/Modifier;->()V PLandroidx/compose/ui/Modifier;->()V HSPLandroidx/compose/ui/Modifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/Modifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/Modifier$Companion; HSPLandroidx/compose/ui/Modifier$Companion;->()V PLandroidx/compose/ui/Modifier$Companion;->()V HSPLandroidx/compose/ui/Modifier$Companion;->()V PLandroidx/compose/ui/Modifier$Companion;->()V HSPLandroidx/compose/ui/Modifier$Companion;->all(Lkotlin/jvm/functions/Function1;)Z HPLandroidx/compose/ui/Modifier$Companion;->all(Lkotlin/jvm/functions/Function1;)Z HSPLandroidx/compose/ui/Modifier$Companion;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/Modifier$Companion;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/Modifier$Element; HSPLandroidx/compose/ui/Modifier$Element;->all(Lkotlin/jvm/functions/Function1;)Z HPLandroidx/compose/ui/Modifier$Element;->all(Lkotlin/jvm/functions/Function1;)Z HSPLandroidx/compose/ui/Modifier$Element;->foldIn(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLandroidx/compose/ui/Modifier$Element;->foldIn(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/Modifier$Node;->()V HPLandroidx/compose/ui/Modifier$Node;->()V HSPLandroidx/compose/ui/Modifier$Node;->getAggregateChildKindSet$ui_release()I HPLandroidx/compose/ui/Modifier$Node;->getAggregateChildKindSet$ui_release()I HSPLandroidx/compose/ui/Modifier$Node;->getChild$ui_release()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/Modifier$Node;->getChild$ui_release()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/Modifier$Node;->getCoordinator$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/Modifier$Node;->getCoordinator$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/Modifier$Node;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; HPLandroidx/compose/ui/Modifier$Node;->getCoroutineScope()Lkotlinx/coroutines/CoroutineScope; HSPLandroidx/compose/ui/Modifier$Node;->getInsertedNodeAwaitingAttachForInvalidation$ui_release()Z PLandroidx/compose/ui/Modifier$Node;->getInsertedNodeAwaitingAttachForInvalidation$ui_release()Z HSPLandroidx/compose/ui/Modifier$Node;->getKindSet$ui_release()I HPLandroidx/compose/ui/Modifier$Node;->getKindSet$ui_release()I HSPLandroidx/compose/ui/Modifier$Node;->getNode()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/Modifier$Node;->getNode()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/Modifier$Node;->getOwnerScope$ui_release()Landroidx/compose/ui/node/ObserverNodeOwnerScope; PLandroidx/compose/ui/Modifier$Node;->getOwnerScope$ui_release()Landroidx/compose/ui/node/ObserverNodeOwnerScope; HSPLandroidx/compose/ui/Modifier$Node;->getParent$ui_release()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/Modifier$Node;->getParent$ui_release()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/Modifier$Node;->getShouldAutoInvalidate()Z HPLandroidx/compose/ui/Modifier$Node;->getShouldAutoInvalidate()Z HSPLandroidx/compose/ui/Modifier$Node;->getUpdatedNodeAwaitingAttachForInvalidation$ui_release()Z PLandroidx/compose/ui/Modifier$Node;->getUpdatedNodeAwaitingAttachForInvalidation$ui_release()Z HSPLandroidx/compose/ui/Modifier$Node;->isAttached()Z HPLandroidx/compose/ui/Modifier$Node;->isAttached()Z HSPLandroidx/compose/ui/Modifier$Node;->isValidOwnerScope()Z PLandroidx/compose/ui/Modifier$Node;->isValidOwnerScope()Z HSPLandroidx/compose/ui/Modifier$Node;->markAsAttached$ui_release()V HPLandroidx/compose/ui/Modifier$Node;->markAsAttached$ui_release()V HSPLandroidx/compose/ui/Modifier$Node;->markAsDetached$ui_release()V HPLandroidx/compose/ui/Modifier$Node;->markAsDetached$ui_release()V HSPLandroidx/compose/ui/Modifier$Node;->onAttach()V HPLandroidx/compose/ui/Modifier$Node;->onAttach()V HSPLandroidx/compose/ui/Modifier$Node;->onDetach()V HPLandroidx/compose/ui/Modifier$Node;->onDetach()V HSPLandroidx/compose/ui/Modifier$Node;->runAttachLifecycle$ui_release()V HPLandroidx/compose/ui/Modifier$Node;->runAttachLifecycle$ui_release()V HSPLandroidx/compose/ui/Modifier$Node;->runDetachLifecycle$ui_release()V HPLandroidx/compose/ui/Modifier$Node;->runDetachLifecycle$ui_release()V HSPLandroidx/compose/ui/Modifier$Node;->setAggregateChildKindSet$ui_release(I)V PLandroidx/compose/ui/Modifier$Node;->setAggregateChildKindSet$ui_release(I)V HSPLandroidx/compose/ui/Modifier$Node;->setAsDelegateTo$ui_release(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/ui/Modifier$Node;->setAsDelegateTo$ui_release(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/Modifier$Node;->setChild$ui_release(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/Modifier$Node;->setChild$ui_release(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/Modifier$Node;->setInsertedNodeAwaitingAttachForInvalidation$ui_release(Z)V HPLandroidx/compose/ui/Modifier$Node;->setInsertedNodeAwaitingAttachForInvalidation$ui_release(Z)V HSPLandroidx/compose/ui/Modifier$Node;->setKindSet$ui_release(I)V PLandroidx/compose/ui/Modifier$Node;->setKindSet$ui_release(I)V HSPLandroidx/compose/ui/Modifier$Node;->setOwnerScope$ui_release(Landroidx/compose/ui/node/ObserverNodeOwnerScope;)V PLandroidx/compose/ui/Modifier$Node;->setOwnerScope$ui_release(Landroidx/compose/ui/node/ObserverNodeOwnerScope;)V HSPLandroidx/compose/ui/Modifier$Node;->setParent$ui_release(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/Modifier$Node;->setParent$ui_release(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/Modifier$Node;->setUpdatedNodeAwaitingAttachForInvalidation$ui_release(Z)V PLandroidx/compose/ui/Modifier$Node;->setUpdatedNodeAwaitingAttachForInvalidation$ui_release(Z)V HSPLandroidx/compose/ui/Modifier$Node;->updateCoordinator$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/Modifier$Node;->updateCoordinator$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V Landroidx/compose/ui/ModifierNodeDetachedCancellationException; HSPLandroidx/compose/ui/ModifierNodeDetachedCancellationException;->()V PLandroidx/compose/ui/ModifierNodeDetachedCancellationException;->()V HSPLandroidx/compose/ui/ModifierNodeDetachedCancellationException;->fillInStackTrace()Ljava/lang/Throwable; PLandroidx/compose/ui/ModifierNodeDetachedCancellationException;->fillInStackTrace()Ljava/lang/Throwable; Landroidx/compose/ui/MotionDurationScale; HSPLandroidx/compose/ui/MotionDurationScale;->()V PLandroidx/compose/ui/MotionDurationScale;->()V HSPLandroidx/compose/ui/MotionDurationScale;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HPLandroidx/compose/ui/MotionDurationScale;->getKey()Lkotlin/coroutines/CoroutineContext$Key; Landroidx/compose/ui/MotionDurationScale$Key; HSPLandroidx/compose/ui/MotionDurationScale$Key;->()V PLandroidx/compose/ui/MotionDurationScale$Key;->()V HSPLandroidx/compose/ui/MotionDurationScale$Key;->()V PLandroidx/compose/ui/MotionDurationScale$Key;->()V Landroidx/compose/ui/TempListUtilsKt; HSPLandroidx/compose/ui/TempListUtilsKt;->fastJoinToString$default(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String; HPLandroidx/compose/ui/TempListUtilsKt;->fastJoinToString$default(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String; Landroidx/compose/ui/autofill/AndroidAutofill; HSPLandroidx/compose/ui/autofill/AndroidAutofill;->(Landroid/view/View;Landroidx/compose/ui/autofill/AutofillTree;)V PLandroidx/compose/ui/autofill/AndroidAutofill;->(Landroid/view/View;Landroidx/compose/ui/autofill/AutofillTree;)V HSPLandroidx/compose/ui/autofill/AndroidAutofill;->getAutofillManager()Landroid/view/autofill/AutofillManager; PLandroidx/compose/ui/autofill/AndroidAutofill;->getAutofillManager()Landroid/view/autofill/AutofillManager; Landroidx/compose/ui/autofill/AutofillCallback; HSPLandroidx/compose/ui/autofill/AutofillCallback;->()V PLandroidx/compose/ui/autofill/AutofillCallback;->()V HSPLandroidx/compose/ui/autofill/AutofillCallback;->()V PLandroidx/compose/ui/autofill/AutofillCallback;->()V HSPLandroidx/compose/ui/autofill/AutofillCallback;->register(Landroidx/compose/ui/autofill/AndroidAutofill;)V PLandroidx/compose/ui/autofill/AutofillCallback;->register(Landroidx/compose/ui/autofill/AndroidAutofill;)V PLandroidx/compose/ui/autofill/AutofillCallback;->unregister(Landroidx/compose/ui/autofill/AndroidAutofill;)V Landroidx/compose/ui/autofill/AutofillTree; HSPLandroidx/compose/ui/autofill/AutofillTree;->()V PLandroidx/compose/ui/autofill/AutofillTree;->()V Landroidx/compose/ui/draw/BlurKt; HSPLandroidx/compose/ui/draw/BlurKt;->CacheDrawModifierNode(Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/draw/CacheDrawModifierNode; PLandroidx/compose/ui/draw/BlurKt;->CacheDrawModifierNode(Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/draw/CacheDrawModifierNode; HSPLandroidx/compose/ui/draw/BlurKt;->alpha(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/draw/BlurKt;->alpha(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/draw/BlurKt;->clip(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/draw/BlurKt;->clip(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/draw/BlurKt;->clipToBounds(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/draw/BlurKt;->clipToBounds(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/draw/BlurKt;->drawBehind(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/draw/BlurKt;->drawBehind(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/draw/BlurKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/draw/BlurKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/draw/BlurKt;->paint$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/draw/BlurKt;->paint$default(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/draw/BlurKt;->shadow-s4CzXII$default(Landroidx/compose/ui/Modifier;FLandroidx/compose/ui/graphics/Shape;Z)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/draw/BlurKt;->shadow-s4CzXII$default(Landroidx/compose/ui/Modifier;FLandroidx/compose/ui/graphics/Shape;Z)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/draw/BuildDrawCacheParams; Landroidx/compose/ui/draw/CacheDrawModifierNode; Landroidx/compose/ui/draw/CacheDrawModifierNodeImpl; HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->(Landroidx/compose/ui/draw/CacheDrawScope;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->(Landroidx/compose/ui/draw/CacheDrawScope;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getBlock()Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getBlock()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getDensity()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getDensity()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getSize-NH-jbRc()J HPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->getSize-NH-jbRc()J HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->invalidateDrawCache()V PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->invalidateDrawCache()V HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->onMeasureResultChanged()V PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl;->onMeasureResultChanged()V Landroidx/compose/ui/draw/CacheDrawModifierNodeImpl$getOrBuildCachedDrawBlock$1$1; HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl$getOrBuildCachedDrawBlock$1$1;->(Landroidx/compose/ui/draw/CacheDrawModifierNodeImpl;Landroidx/compose/ui/draw/CacheDrawScope;)V PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl$getOrBuildCachedDrawBlock$1$1;->(Landroidx/compose/ui/draw/CacheDrawModifierNodeImpl;Landroidx/compose/ui/draw/CacheDrawScope;)V HSPLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl$getOrBuildCachedDrawBlock$1$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/draw/CacheDrawModifierNodeImpl$getOrBuildCachedDrawBlock$1$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/draw/CacheDrawScope; HSPLandroidx/compose/ui/draw/CacheDrawScope;->()V PLandroidx/compose/ui/draw/CacheDrawScope;->()V HSPLandroidx/compose/ui/draw/CacheDrawScope;->getDensity()F PLandroidx/compose/ui/draw/CacheDrawScope;->getDensity()F HSPLandroidx/compose/ui/draw/CacheDrawScope;->getDrawResult$ui_release()Landroidx/compose/ui/draw/DrawResult; PLandroidx/compose/ui/draw/CacheDrawScope;->getDrawResult$ui_release()Landroidx/compose/ui/draw/DrawResult; HSPLandroidx/compose/ui/draw/CacheDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/draw/CacheDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/draw/CacheDrawScope;->getSize-NH-jbRc()J PLandroidx/compose/ui/draw/CacheDrawScope;->getSize-NH-jbRc()J HSPLandroidx/compose/ui/draw/CacheDrawScope;->onDrawWithContent(Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/draw/DrawResult; PLandroidx/compose/ui/draw/CacheDrawScope;->onDrawWithContent(Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/draw/DrawResult; HSPLandroidx/compose/ui/draw/CacheDrawScope;->setCacheParams$ui_release(Landroidx/compose/ui/draw/BuildDrawCacheParams;)V PLandroidx/compose/ui/draw/CacheDrawScope;->setCacheParams$ui_release(Landroidx/compose/ui/draw/BuildDrawCacheParams;)V HSPLandroidx/compose/ui/draw/CacheDrawScope;->setDrawResult$ui_release()V PLandroidx/compose/ui/draw/CacheDrawScope;->setDrawResult$ui_release()V Landroidx/compose/ui/draw/DrawBackgroundModifier; HSPLandroidx/compose/ui/draw/DrawBackgroundModifier;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/DrawBackgroundModifier;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/draw/DrawBackgroundModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V PLandroidx/compose/ui/draw/DrawBackgroundModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V Landroidx/compose/ui/draw/DrawBehindElement; HSPLandroidx/compose/ui/draw/DrawBehindElement;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/DrawBehindElement;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/draw/DrawBehindElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/draw/DrawBehindElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/ui/draw/DrawModifier; Landroidx/compose/ui/draw/DrawResult; HSPLandroidx/compose/ui/draw/DrawResult;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/DrawResult;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/draw/DrawResult;->getBlock$ui_release()Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/draw/DrawResult;->getBlock$ui_release()Lkotlin/jvm/functions/Function1; Landroidx/compose/ui/draw/DrawWithContentElement; HSPLandroidx/compose/ui/draw/DrawWithContentElement;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/DrawWithContentElement;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/draw/DrawWithContentElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/draw/DrawWithContentElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/draw/DrawWithContentElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/draw/DrawWithContentElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/draw/DrawWithContentElement;->update(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/ui/draw/DrawWithContentElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/ui/draw/DrawWithContentModifier; HSPLandroidx/compose/ui/draw/DrawWithContentModifier;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/DrawWithContentModifier;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/draw/DrawWithContentModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V PLandroidx/compose/ui/draw/DrawWithContentModifier;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/ui/draw/DrawWithContentModifier;->setOnDraw(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/draw/DrawWithContentModifier;->setOnDraw(Lkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/draw/EmptyBuildDrawCacheParams; HSPLandroidx/compose/ui/draw/EmptyBuildDrawCacheParams;->()V PLandroidx/compose/ui/draw/EmptyBuildDrawCacheParams;->()V HSPLandroidx/compose/ui/draw/EmptyBuildDrawCacheParams;->()V PLandroidx/compose/ui/draw/EmptyBuildDrawCacheParams;->()V Landroidx/compose/ui/draw/PainterElement; HSPLandroidx/compose/ui/draw/PainterElement;->(Landroidx/compose/ui/graphics/painter/Painter;ZLandroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;)V PLandroidx/compose/ui/draw/PainterElement;->(Landroidx/compose/ui/graphics/painter/Painter;ZLandroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/draw/PainterElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/draw/PainterElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/draw/PainterElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/draw/PainterElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/draw/PainterElement;->update(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/draw/PainterElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/ui/draw/PainterNode; HSPLandroidx/compose/ui/draw/PainterNode;->(Landroidx/compose/ui/graphics/painter/Painter;ZLandroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;)V HPLandroidx/compose/ui/draw/PainterNode;->(Landroidx/compose/ui/graphics/painter/Painter;ZLandroidx/compose/ui/Alignment;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/draw/PainterNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HPLandroidx/compose/ui/draw/PainterNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/ui/draw/PainterNode;->getPainter()Landroidx/compose/ui/graphics/painter/Painter; PLandroidx/compose/ui/draw/PainterNode;->getPainter()Landroidx/compose/ui/graphics/painter/Painter; HSPLandroidx/compose/ui/draw/PainterNode;->getShouldAutoInvalidate()Z HPLandroidx/compose/ui/draw/PainterNode;->getShouldAutoInvalidate()Z HSPLandroidx/compose/ui/draw/PainterNode;->getSizeToIntrinsics()Z PLandroidx/compose/ui/draw/PainterNode;->getSizeToIntrinsics()Z HSPLandroidx/compose/ui/draw/PainterNode;->getUseIntrinsicSize()Z PLandroidx/compose/ui/draw/PainterNode;->getUseIntrinsicSize()Z HSPLandroidx/compose/ui/draw/PainterNode;->hasSpecifiedAndFiniteHeight-uvyYCjk(J)Z HPLandroidx/compose/ui/draw/PainterNode;->hasSpecifiedAndFiniteHeight-uvyYCjk(J)Z HSPLandroidx/compose/ui/draw/PainterNode;->hasSpecifiedAndFiniteWidth-uvyYCjk(J)Z HPLandroidx/compose/ui/draw/PainterNode;->hasSpecifiedAndFiniteWidth-uvyYCjk(J)Z HSPLandroidx/compose/ui/draw/PainterNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/draw/PainterNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/ui/draw/PainterNode;->modifyConstraints-ZezNO4M(J)J HPLandroidx/compose/ui/draw/PainterNode;->modifyConstraints-ZezNO4M(J)J HSPLandroidx/compose/ui/draw/PainterNode;->setAlignment(Landroidx/compose/ui/Alignment;)V PLandroidx/compose/ui/draw/PainterNode;->setAlignment(Landroidx/compose/ui/Alignment;)V HSPLandroidx/compose/ui/draw/PainterNode;->setAlpha(F)V PLandroidx/compose/ui/draw/PainterNode;->setAlpha(F)V HSPLandroidx/compose/ui/draw/PainterNode;->setColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)V PLandroidx/compose/ui/draw/PainterNode;->setColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/draw/PainterNode;->setContentScale(Landroidx/compose/ui/layout/ContentScale;)V PLandroidx/compose/ui/draw/PainterNode;->setContentScale(Landroidx/compose/ui/layout/ContentScale;)V HSPLandroidx/compose/ui/draw/PainterNode;->setPainter(Landroidx/compose/ui/graphics/painter/Painter;)V PLandroidx/compose/ui/draw/PainterNode;->setPainter(Landroidx/compose/ui/graphics/painter/Painter;)V HSPLandroidx/compose/ui/draw/PainterNode;->setSizeToIntrinsics(Z)V PLandroidx/compose/ui/draw/PainterNode;->setSizeToIntrinsics(Z)V Landroidx/compose/ui/draw/PainterNode$measure$1; HSPLandroidx/compose/ui/draw/PainterNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;)V PLandroidx/compose/ui/draw/PainterNode$measure$1;->(Landroidx/compose/ui/layout/Placeable;)V HSPLandroidx/compose/ui/draw/PainterNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/draw/PainterNode$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/focus/FocusEventModifierNode; Landroidx/compose/ui/focus/FocusInvalidationManager; HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/focus/FocusInvalidationManager;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->access$getFocusEventNodes$p(Landroidx/compose/ui/focus/FocusInvalidationManager;)Ljava/util/LinkedHashSet; HPLandroidx/compose/ui/focus/FocusInvalidationManager;->access$getFocusEventNodes$p(Landroidx/compose/ui/focus/FocusInvalidationManager;)Ljava/util/LinkedHashSet; HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->access$getFocusPropertiesNodes$p(Landroidx/compose/ui/focus/FocusInvalidationManager;)Ljava/util/LinkedHashSet; HPLandroidx/compose/ui/focus/FocusInvalidationManager;->access$getFocusPropertiesNodes$p(Landroidx/compose/ui/focus/FocusInvalidationManager;)Ljava/util/LinkedHashSet; HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->access$getFocusTargetNodes$p(Landroidx/compose/ui/focus/FocusInvalidationManager;)Ljava/util/LinkedHashSet; HPLandroidx/compose/ui/focus/FocusInvalidationManager;->access$getFocusTargetNodes$p(Landroidx/compose/ui/focus/FocusInvalidationManager;)Ljava/util/LinkedHashSet; HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusEventModifierNode;)V HPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusEventModifierNode;)V HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusPropertiesModifierNode;)V PLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusPropertiesModifierNode;)V HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusTargetNode;)V PLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusTargetNode;)V HSPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Ljava/util/LinkedHashSet;Ljava/lang/Object;)V HPLandroidx/compose/ui/focus/FocusInvalidationManager;->scheduleInvalidation(Ljava/util/LinkedHashSet;Ljava/lang/Object;)V Landroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1; HSPLandroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;->(Landroidx/compose/ui/focus/FocusInvalidationManager;)V PLandroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;->(Landroidx/compose/ui/focus/FocusInvalidationManager;)V HSPLandroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/focus/FocusInvalidationManager$invalidateNodes$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/focus/FocusModifierKt; HSPLandroidx/compose/ui/focus/FocusModifierKt;->getFocusState(Landroidx/compose/ui/focus/FocusEventModifierNode;)Landroidx/compose/ui/focus/FocusStateImpl; HPLandroidx/compose/ui/focus/FocusModifierKt;->getFocusState(Landroidx/compose/ui/focus/FocusEventModifierNode;)Landroidx/compose/ui/focus/FocusStateImpl; HSPLandroidx/compose/ui/focus/FocusModifierKt;->refreshFocusEventNodes(Landroidx/compose/ui/focus/FocusTargetNode;)V HPLandroidx/compose/ui/focus/FocusModifierKt;->refreshFocusEventNodes(Landroidx/compose/ui/focus/FocusTargetNode;)V Landroidx/compose/ui/focus/FocusOwner; Landroidx/compose/ui/focus/FocusOwnerImpl; HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/focus/FocusOwnerImpl;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->getFocusTransactionManager()Landroidx/compose/ui/focus/FocusTransactionManager; PLandroidx/compose/ui/focus/FocusOwnerImpl;->getFocusTransactionManager()Landroidx/compose/ui/focus/FocusTransactionManager; HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->getModifier()Landroidx/compose/ui/focus/FocusOwnerImpl$modifier$1; PLandroidx/compose/ui/focus/FocusOwnerImpl;->getModifier()Landroidx/compose/ui/focus/FocusOwnerImpl$modifier$1; HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->getRootFocusNode$ui_release()Landroidx/compose/ui/focus/FocusTargetNode; PLandroidx/compose/ui/focus/FocusOwnerImpl;->getRootFocusNode$ui_release()Landroidx/compose/ui/focus/FocusTargetNode; HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusEventModifierNode;)V HPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusEventModifierNode;)V HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusPropertiesModifierNode;)V PLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusPropertiesModifierNode;)V HSPLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusTargetNode;)V PLandroidx/compose/ui/focus/FocusOwnerImpl;->scheduleInvalidation(Landroidx/compose/ui/focus/FocusTargetNode;)V Landroidx/compose/ui/focus/FocusOwnerImpl$modifier$1; HSPLandroidx/compose/ui/focus/FocusOwnerImpl$modifier$1;->(Landroidx/compose/ui/focus/FocusOwnerImpl;)V PLandroidx/compose/ui/focus/FocusOwnerImpl$modifier$1;->(Landroidx/compose/ui/focus/FocusOwnerImpl;)V HSPLandroidx/compose/ui/focus/FocusOwnerImpl$modifier$1;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/focus/FocusOwnerImpl$modifier$1;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/ui/focus/FocusProperties; Landroidx/compose/ui/focus/FocusPropertiesModifierNode; Landroidx/compose/ui/focus/FocusRequester; HSPLandroidx/compose/ui/focus/FocusRequester;->()V PLandroidx/compose/ui/focus/FocusRequester;->()V HSPLandroidx/compose/ui/focus/FocusRequester;->()V PLandroidx/compose/ui/focus/FocusRequester;->()V Landroidx/compose/ui/focus/FocusRequesterModifierNode; Landroidx/compose/ui/focus/FocusState; Landroidx/compose/ui/focus/FocusStateImpl; HSPLandroidx/compose/ui/focus/FocusStateImpl;->()V PLandroidx/compose/ui/focus/FocusStateImpl;->()V HSPLandroidx/compose/ui/focus/FocusStateImpl;->(Ljava/lang/String;I)V PLandroidx/compose/ui/focus/FocusStateImpl;->(Ljava/lang/String;I)V HSPLandroidx/compose/ui/focus/FocusStateImpl;->isFocused()Z HPLandroidx/compose/ui/focus/FocusStateImpl;->isFocused()Z Landroidx/compose/ui/focus/FocusTargetNode; HSPLandroidx/compose/ui/focus/FocusTargetNode;->()V HPLandroidx/compose/ui/focus/FocusTargetNode;->()V HSPLandroidx/compose/ui/focus/FocusTargetNode;->getFocusState()Landroidx/compose/ui/focus/FocusStateImpl; HPLandroidx/compose/ui/focus/FocusTargetNode;->getFocusState()Landroidx/compose/ui/focus/FocusStateImpl; HSPLandroidx/compose/ui/focus/FocusTargetNode;->invalidateFocus$ui_release()V HPLandroidx/compose/ui/focus/FocusTargetNode;->invalidateFocus$ui_release()V Landroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement; HSPLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->()V PLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->()V HSPLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->()V PLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->()V HSPLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/focus/FocusTargetNode$FocusTargetElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/focus/FocusTransactionManager; HSPLandroidx/compose/ui/focus/FocusTransactionManager;->()V PLandroidx/compose/ui/focus/FocusTransactionManager;->()V HSPLandroidx/compose/ui/focus/FocusTransactionManager;->(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/input/pointer/PointerInputEvent;)V HPLandroidx/compose/ui/focus/FocusTransactionManager;->(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/input/pointer/PointerInputEvent;)V HSPLandroidx/compose/ui/focus/FocusTransactionManager;->getChanges()Landroidx/collection/LongSparseArray; PLandroidx/compose/ui/focus/FocusTransactionManager;->getChanges()Landroidx/collection/LongSparseArray; HSPLandroidx/compose/ui/focus/FocusTransactionManager;->getMotionEvent()Landroid/view/MotionEvent; PLandroidx/compose/ui/focus/FocusTransactionManager;->getMotionEvent()Landroid/view/MotionEvent; HSPLandroidx/compose/ui/focus/FocusTransactionManager;->getSuppressMovementConsumption()Z PLandroidx/compose/ui/focus/FocusTransactionManager;->getSuppressMovementConsumption()Z HSPLandroidx/compose/ui/focus/FocusTransactionManager;->getUncommittedFocusState(Landroidx/compose/ui/focus/FocusTargetNode;)Landroidx/compose/ui/focus/FocusStateImpl; HPLandroidx/compose/ui/focus/FocusTransactionManager;->getUncommittedFocusState(Landroidx/compose/ui/focus/FocusTargetNode;)Landroidx/compose/ui/focus/FocusStateImpl; HSPLandroidx/compose/ui/focus/FocusTransactionManager;->issuesEnterExitEvent-0FcD4WY(J)Z HPLandroidx/compose/ui/focus/FocusTransactionManager;->issuesEnterExitEvent-0FcD4WY(J)Z Landroidx/compose/ui/geometry/CornerRadius; HSPLandroidx/compose/ui/geometry/CornerRadius;->()V PLandroidx/compose/ui/geometry/CornerRadius;->()V HSPLandroidx/compose/ui/geometry/CornerRadius;->access$getZero$cp()J PLandroidx/compose/ui/geometry/CornerRadius;->access$getZero$cp()J HSPLandroidx/compose/ui/geometry/CornerRadius;->getX-impl(J)F HPLandroidx/compose/ui/geometry/CornerRadius;->getX-impl(J)F HSPLandroidx/compose/ui/geometry/CornerRadius;->getY-impl(J)F PLandroidx/compose/ui/geometry/CornerRadius;->getY-impl(J)F Landroidx/compose/ui/geometry/MutableRect; HSPLandroidx/compose/ui/geometry/MutableRect;->()V PLandroidx/compose/ui/geometry/MutableRect;->()V HSPLandroidx/compose/ui/geometry/MutableRect;->getBottom()F HPLandroidx/compose/ui/geometry/MutableRect;->getBottom()F HSPLandroidx/compose/ui/geometry/MutableRect;->getLeft()F HPLandroidx/compose/ui/geometry/MutableRect;->getLeft()F HSPLandroidx/compose/ui/geometry/MutableRect;->getRight()F HPLandroidx/compose/ui/geometry/MutableRect;->getRight()F HSPLandroidx/compose/ui/geometry/MutableRect;->getTop()F HPLandroidx/compose/ui/geometry/MutableRect;->getTop()F HSPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V HPLandroidx/compose/ui/geometry/MutableRect;->intersect(FFFF)V HSPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z HPLandroidx/compose/ui/geometry/MutableRect;->isEmpty()Z HSPLandroidx/compose/ui/geometry/MutableRect;->setBottom(F)V HPLandroidx/compose/ui/geometry/MutableRect;->setBottom(F)V HSPLandroidx/compose/ui/geometry/MutableRect;->setLeft(F)V HPLandroidx/compose/ui/geometry/MutableRect;->setLeft(F)V HSPLandroidx/compose/ui/geometry/MutableRect;->setRight(F)V HPLandroidx/compose/ui/geometry/MutableRect;->setRight(F)V HSPLandroidx/compose/ui/geometry/MutableRect;->setTop(F)V HPLandroidx/compose/ui/geometry/MutableRect;->setTop(F)V Landroidx/compose/ui/geometry/Offset; HSPLandroidx/compose/ui/geometry/Offset;->()V PLandroidx/compose/ui/geometry/Offset;->()V HSPLandroidx/compose/ui/geometry/Offset;->(J)V HPLandroidx/compose/ui/geometry/Offset;->(J)V HSPLandroidx/compose/ui/geometry/Offset;->access$getInfinite$cp()J PLandroidx/compose/ui/geometry/Offset;->access$getInfinite$cp()J HSPLandroidx/compose/ui/geometry/Offset;->access$getUnspecified$cp()J PLandroidx/compose/ui/geometry/Offset;->access$getUnspecified$cp()J HSPLandroidx/compose/ui/geometry/Offset;->access$getZero$cp()J HPLandroidx/compose/ui/geometry/Offset;->access$getZero$cp()J HSPLandroidx/compose/ui/geometry/Offset;->box-impl(J)Landroidx/compose/ui/geometry/Offset; HPLandroidx/compose/ui/geometry/Offset;->box-impl(J)Landroidx/compose/ui/geometry/Offset; HSPLandroidx/compose/ui/geometry/Offset;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/geometry/Offset;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/geometry/Offset;->equals-impl0(JJ)Z PLandroidx/compose/ui/geometry/Offset;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/geometry/Offset;->getDistance-impl(J)F HPLandroidx/compose/ui/geometry/Offset;->getDistance-impl(J)F HSPLandroidx/compose/ui/geometry/Offset;->getX-impl(J)F HPLandroidx/compose/ui/geometry/Offset;->getX-impl(J)F HSPLandroidx/compose/ui/geometry/Offset;->getY-impl(J)F HPLandroidx/compose/ui/geometry/Offset;->getY-impl(J)F HSPLandroidx/compose/ui/geometry/Offset;->minus-MK-Hz9U(JJ)J HPLandroidx/compose/ui/geometry/Offset;->minus-MK-Hz9U(JJ)J HSPLandroidx/compose/ui/geometry/Offset;->plus-MK-Hz9U(JJ)J HPLandroidx/compose/ui/geometry/Offset;->plus-MK-Hz9U(JJ)J HSPLandroidx/compose/ui/geometry/Offset;->unbox-impl()J PLandroidx/compose/ui/geometry/Offset;->unbox-impl()J Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/geometry/Rect;->()V PLandroidx/compose/ui/geometry/Rect;->()V HSPLandroidx/compose/ui/geometry/Rect;->(FFFF)V HPLandroidx/compose/ui/geometry/Rect;->(FFFF)V HSPLandroidx/compose/ui/geometry/Rect;->access$getZero$cp()Landroidx/compose/ui/geometry/Rect; PLandroidx/compose/ui/geometry/Rect;->access$getZero$cp()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/geometry/Rect;->getBottom()F PLandroidx/compose/ui/geometry/Rect;->getBottom()F HSPLandroidx/compose/ui/geometry/Rect;->getCenter-F1C5BW0()J PLandroidx/compose/ui/geometry/Rect;->getCenter-F1C5BW0()J HSPLandroidx/compose/ui/geometry/Rect;->getHeight()F PLandroidx/compose/ui/geometry/Rect;->getHeight()F HSPLandroidx/compose/ui/geometry/Rect;->getLeft()F PLandroidx/compose/ui/geometry/Rect;->getLeft()F HSPLandroidx/compose/ui/geometry/Rect;->getRight()F PLandroidx/compose/ui/geometry/Rect;->getRight()F HSPLandroidx/compose/ui/geometry/Rect;->getTop()F PLandroidx/compose/ui/geometry/Rect;->getTop()F HSPLandroidx/compose/ui/geometry/Rect;->getWidth()F PLandroidx/compose/ui/geometry/Rect;->getWidth()F Landroidx/compose/ui/geometry/RoundRect; HSPLandroidx/compose/ui/geometry/RoundRect;->()V PLandroidx/compose/ui/geometry/RoundRect;->()V HSPLandroidx/compose/ui/geometry/RoundRect;->(FFFFJJJJ)V HPLandroidx/compose/ui/geometry/RoundRect;->(FFFFJJJJ)V HSPLandroidx/compose/ui/geometry/RoundRect;->getBottom()F PLandroidx/compose/ui/geometry/RoundRect;->getBottom()F HSPLandroidx/compose/ui/geometry/RoundRect;->getBottomLeftCornerRadius-kKHJgLs()J PLandroidx/compose/ui/geometry/RoundRect;->getBottomLeftCornerRadius-kKHJgLs()J HSPLandroidx/compose/ui/geometry/RoundRect;->getBottomRightCornerRadius-kKHJgLs()J PLandroidx/compose/ui/geometry/RoundRect;->getBottomRightCornerRadius-kKHJgLs()J HSPLandroidx/compose/ui/geometry/RoundRect;->getHeight()F PLandroidx/compose/ui/geometry/RoundRect;->getHeight()F HSPLandroidx/compose/ui/geometry/RoundRect;->getLeft()F PLandroidx/compose/ui/geometry/RoundRect;->getLeft()F HSPLandroidx/compose/ui/geometry/RoundRect;->getRight()F PLandroidx/compose/ui/geometry/RoundRect;->getRight()F HSPLandroidx/compose/ui/geometry/RoundRect;->getTop()F PLandroidx/compose/ui/geometry/RoundRect;->getTop()F HSPLandroidx/compose/ui/geometry/RoundRect;->getTopLeftCornerRadius-kKHJgLs()J PLandroidx/compose/ui/geometry/RoundRect;->getTopLeftCornerRadius-kKHJgLs()J HSPLandroidx/compose/ui/geometry/RoundRect;->getTopRightCornerRadius-kKHJgLs()J PLandroidx/compose/ui/geometry/RoundRect;->getTopRightCornerRadius-kKHJgLs()J HSPLandroidx/compose/ui/geometry/RoundRect;->getWidth()F PLandroidx/compose/ui/geometry/RoundRect;->getWidth()F Landroidx/compose/ui/geometry/Size; HSPLandroidx/compose/ui/geometry/Size;->()V PLandroidx/compose/ui/geometry/Size;->()V HSPLandroidx/compose/ui/geometry/Size;->(J)V PLandroidx/compose/ui/geometry/Size;->(J)V HSPLandroidx/compose/ui/geometry/Size;->access$getUnspecified$cp()J PLandroidx/compose/ui/geometry/Size;->access$getUnspecified$cp()J HSPLandroidx/compose/ui/geometry/Size;->access$getZero$cp()J PLandroidx/compose/ui/geometry/Size;->access$getZero$cp()J HSPLandroidx/compose/ui/geometry/Size;->box-impl(J)Landroidx/compose/ui/geometry/Size; PLandroidx/compose/ui/geometry/Size;->box-impl(J)Landroidx/compose/ui/geometry/Size; HSPLandroidx/compose/ui/geometry/Size;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/geometry/Size;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/geometry/Size;->equals-impl(JLjava/lang/Object;)Z PLandroidx/compose/ui/geometry/Size;->equals-impl(JLjava/lang/Object;)Z HSPLandroidx/compose/ui/geometry/Size;->equals-impl0(JJ)Z PLandroidx/compose/ui/geometry/Size;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/geometry/Size;->getHeight-impl(J)F HPLandroidx/compose/ui/geometry/Size;->getHeight-impl(J)F HSPLandroidx/compose/ui/geometry/Size;->getMinDimension-impl(J)F HPLandroidx/compose/ui/geometry/Size;->getMinDimension-impl(J)F HSPLandroidx/compose/ui/geometry/Size;->getWidth-impl(J)F HPLandroidx/compose/ui/geometry/Size;->getWidth-impl(J)F HSPLandroidx/compose/ui/geometry/Size;->isEmpty-impl(J)Z HPLandroidx/compose/ui/geometry/Size;->isEmpty-impl(J)Z HSPLandroidx/compose/ui/geometry/Size;->unbox-impl()J PLandroidx/compose/ui/geometry/Size;->unbox-impl()J Landroidx/compose/ui/graphics/AndroidCanvas; HSPLandroidx/compose/ui/graphics/AndroidCanvas;->()V PLandroidx/compose/ui/graphics/AndroidCanvas;->()V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->clipPath-mtrdD-E(Landroidx/compose/ui/graphics/Path;I)V HPLandroidx/compose/ui/graphics/AndroidCanvas;->clipPath-mtrdD-E(Landroidx/compose/ui/graphics/Path;I)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->concat-58bKbWc([F)V HPLandroidx/compose/ui/graphics/AndroidCanvas;->concat-58bKbWc([F)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawArc(FFFFFFLandroidx/compose/ui/graphics/AndroidPaint;)V PLandroidx/compose/ui/graphics/AndroidCanvas;->drawArc(FFFFFFLandroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawImageRect-HPBpro0(Landroidx/compose/ui/graphics/ImageBitmap;JJJJLandroidx/compose/ui/graphics/AndroidPaint;)V HPLandroidx/compose/ui/graphics/AndroidCanvas;->drawImageRect-HPBpro0(Landroidx/compose/ui/graphics/ImageBitmap;JJJJLandroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawLine-Wko1d7g(JJLandroidx/compose/ui/graphics/AndroidPaint;)V HPLandroidx/compose/ui/graphics/AndroidCanvas;->drawLine-Wko1d7g(JJLandroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawPath(Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/AndroidPaint;)V HPLandroidx/compose/ui/graphics/AndroidCanvas;->drawPath(Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawRect(FFFFLandroidx/compose/ui/graphics/AndroidPaint;)V PLandroidx/compose/ui/graphics/AndroidCanvas;->drawRect(FFFFLandroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->drawRoundRect(FFFFFFLandroidx/compose/ui/graphics/AndroidPaint;)V PLandroidx/compose/ui/graphics/AndroidCanvas;->drawRoundRect(FFFFFFLandroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->getInternalCanvas()Landroid/graphics/Canvas; PLandroidx/compose/ui/graphics/AndroidCanvas;->getInternalCanvas()Landroid/graphics/Canvas; HSPLandroidx/compose/ui/graphics/AndroidCanvas;->restore()V HPLandroidx/compose/ui/graphics/AndroidCanvas;->restore()V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->save()V HPLandroidx/compose/ui/graphics/AndroidCanvas;->save()V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->setInternalCanvas(Landroid/graphics/Canvas;)V PLandroidx/compose/ui/graphics/AndroidCanvas;->setInternalCanvas(Landroid/graphics/Canvas;)V HSPLandroidx/compose/ui/graphics/AndroidCanvas;->translate(FF)V HPLandroidx/compose/ui/graphics/AndroidCanvas;->translate(FF)V Landroidx/compose/ui/graphics/AndroidCanvas_androidKt; HSPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->()V PLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->()V HSPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->access$getEmptyCanvas$p()Landroid/graphics/Canvas; PLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->access$getEmptyCanvas$p()Landroid/graphics/Canvas; HSPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->getNativeCanvas(Landroidx/compose/ui/graphics/Canvas;)Landroid/graphics/Canvas; HPLandroidx/compose/ui/graphics/AndroidCanvas_androidKt;->getNativeCanvas(Landroidx/compose/ui/graphics/Canvas;)Landroid/graphics/Canvas; Landroidx/compose/ui/graphics/AndroidImageBitmap; HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->(Landroid/graphics/Bitmap;)V HPLandroidx/compose/ui/graphics/AndroidImageBitmap;->(Landroid/graphics/Bitmap;)V HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getBitmap$ui_graphics_release()Landroid/graphics/Bitmap; PLandroidx/compose/ui/graphics/AndroidImageBitmap;->getBitmap$ui_graphics_release()Landroid/graphics/Bitmap; HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getHeight()I PLandroidx/compose/ui/graphics/AndroidImageBitmap;->getHeight()I HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->getWidth()I PLandroidx/compose/ui/graphics/AndroidImageBitmap;->getWidth()I HSPLandroidx/compose/ui/graphics/AndroidImageBitmap;->prepareToDraw()V PLandroidx/compose/ui/graphics/AndroidImageBitmap;->prepareToDraw()V Landroidx/compose/ui/graphics/AndroidPaint; HSPLandroidx/compose/ui/graphics/AndroidPaint;->(Landroid/graphics/Paint;)V HPLandroidx/compose/ui/graphics/AndroidPaint;->(Landroid/graphics/Paint;)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->asFrameworkPaint()Landroid/graphics/Paint; PLandroidx/compose/ui/graphics/AndroidPaint;->asFrameworkPaint()Landroid/graphics/Paint; HSPLandroidx/compose/ui/graphics/AndroidPaint;->getAlpha()F PLandroidx/compose/ui/graphics/AndroidPaint;->getAlpha()F HSPLandroidx/compose/ui/graphics/AndroidPaint;->getBlendMode-0nO6VwU()I PLandroidx/compose/ui/graphics/AndroidPaint;->getBlendMode-0nO6VwU()I HSPLandroidx/compose/ui/graphics/AndroidPaint;->getColor-0d7_KjU()J HPLandroidx/compose/ui/graphics/AndroidPaint;->getColor-0d7_KjU()J HSPLandroidx/compose/ui/graphics/AndroidPaint;->getColorFilter()Landroidx/compose/ui/graphics/ColorFilter; PLandroidx/compose/ui/graphics/AndroidPaint;->getColorFilter()Landroidx/compose/ui/graphics/ColorFilter; HSPLandroidx/compose/ui/graphics/AndroidPaint;->getFilterQuality-f-v9h1I()I HPLandroidx/compose/ui/graphics/AndroidPaint;->getFilterQuality-f-v9h1I()I HSPLandroidx/compose/ui/graphics/AndroidPaint;->getShader()Landroid/graphics/Shader; PLandroidx/compose/ui/graphics/AndroidPaint;->getShader()Landroid/graphics/Shader; HSPLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeCap-KaPHkGw()I PLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeCap-KaPHkGw()I HSPLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeJoin-LxFBmk8()I PLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeJoin-LxFBmk8()I HSPLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeMiterLimit()F PLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeMiterLimit()F HSPLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeWidth()F PLandroidx/compose/ui/graphics/AndroidPaint;->getStrokeWidth()F HSPLandroidx/compose/ui/graphics/AndroidPaint;->setAlpha(F)V HPLandroidx/compose/ui/graphics/AndroidPaint;->setAlpha(F)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setBlendMode-s9anfk8(I)V HPLandroidx/compose/ui/graphics/AndroidPaint;->setBlendMode-s9anfk8(I)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setColor-8_81llA(J)V HPLandroidx/compose/ui/graphics/AndroidPaint;->setColor-8_81llA(J)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)V PLandroidx/compose/ui/graphics/AndroidPaint;->setColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setShader(Landroid/graphics/Shader;)V HPLandroidx/compose/ui/graphics/AndroidPaint;->setShader(Landroid/graphics/Shader;)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setStrokeCap-BeK7IIE(I)V PLandroidx/compose/ui/graphics/AndroidPaint;->setStrokeCap-BeK7IIE(I)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setStrokeWidth(F)V PLandroidx/compose/ui/graphics/AndroidPaint;->setStrokeWidth(F)V HSPLandroidx/compose/ui/graphics/AndroidPaint;->setStyle-k9PVt8s(I)V PLandroidx/compose/ui/graphics/AndroidPaint;->setStyle-k9PVt8s(I)V Landroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings; HSPLandroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings;->()V PLandroidx/compose/ui/graphics/AndroidPaint_androidKt$WhenMappings;->()V Landroidx/compose/ui/graphics/AndroidPath; HSPLandroidx/compose/ui/graphics/AndroidPath;->(Landroid/graphics/Path;)V HPLandroidx/compose/ui/graphics/AndroidPath;->(Landroid/graphics/Path;)V HSPLandroidx/compose/ui/graphics/AndroidPath;->close()V PLandroidx/compose/ui/graphics/AndroidPath;->close()V HSPLandroidx/compose/ui/graphics/AndroidPath;->cubicTo(FFFFFF)V HPLandroidx/compose/ui/graphics/AndroidPath;->cubicTo(FFFFFF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->getFillType-Rg-k1Os()I PLandroidx/compose/ui/graphics/AndroidPath;->getFillType-Rg-k1Os()I HSPLandroidx/compose/ui/graphics/AndroidPath;->getInternalPath()Landroid/graphics/Path; PLandroidx/compose/ui/graphics/AndroidPath;->getInternalPath()Landroid/graphics/Path; HSPLandroidx/compose/ui/graphics/AndroidPath;->lineTo(FF)V HPLandroidx/compose/ui/graphics/AndroidPath;->lineTo(FF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->moveTo(FF)V PLandroidx/compose/ui/graphics/AndroidPath;->moveTo(FF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->relativeCubicTo(FFFFFF)V PLandroidx/compose/ui/graphics/AndroidPath;->relativeCubicTo(FFFFFF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->relativeLineTo(FF)V PLandroidx/compose/ui/graphics/AndroidPath;->relativeLineTo(FF)V HSPLandroidx/compose/ui/graphics/AndroidPath;->rewind()V PLandroidx/compose/ui/graphics/AndroidPath;->rewind()V HSPLandroidx/compose/ui/graphics/AndroidPath;->setFillType-oQ8Xj4U(I)V PLandroidx/compose/ui/graphics/AndroidPath;->setFillType-oQ8Xj4U(I)V Landroidx/compose/ui/graphics/Api26Bitmap; HSPLandroidx/compose/ui/graphics/Api26Bitmap;->createBitmap-x__-hDU$ui_graphics_release(IIIZLandroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroid/graphics/Bitmap; PLandroidx/compose/ui/graphics/Api26Bitmap;->createBitmap-x__-hDU$ui_graphics_release(IIIZLandroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroid/graphics/Bitmap; Landroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0; HSPLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager$AutofillCallback;)V PLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager$AutofillCallback;)V HSPLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/ColorSpace$Named; PLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/ColorSpace$Named; HSPLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m(IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap; HPLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m(IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap; PLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager$AutofillCallback;)V HSPLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/autofill/AutofillManager$AutofillCallback; PLandroidx/compose/ui/graphics/Api26Bitmap$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/view/autofill/AutofillManager$AutofillCallback; Landroidx/compose/ui/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/BlendMode;->(I)V PLandroidx/compose/ui/graphics/BlendMode;->(I)V HSPLandroidx/compose/ui/graphics/BlendMode;->box-impl(I)Landroidx/compose/ui/graphics/BlendMode; PLandroidx/compose/ui/graphics/BlendMode;->box-impl(I)Landroidx/compose/ui/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/BlendMode;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/BlendMode;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/graphics/BlendModeColorFilterHelper; HSPLandroidx/compose/ui/graphics/BlendModeColorFilterHelper;->()V PLandroidx/compose/ui/graphics/BlendModeColorFilterHelper;->()V HSPLandroidx/compose/ui/graphics/BlendModeColorFilterHelper;->()V PLandroidx/compose/ui/graphics/BlendModeColorFilterHelper;->()V HSPLandroidx/compose/ui/graphics/BlendModeColorFilterHelper;->BlendModeColorFilter-xETnrds(JI)Landroid/graphics/BlendModeColorFilter; HPLandroidx/compose/ui/graphics/BlendModeColorFilterHelper;->BlendModeColorFilter-xETnrds(JI)Landroid/graphics/BlendModeColorFilter; Landroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1; HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/Modifier$Node;I)V HPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->(Landroidx/compose/ui/layout/Placeable;Landroidx/compose/ui/Modifier$Node;I)V HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/BlockGraphicsLayerModifier$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/graphics/Brush;->()V PLandroidx/compose/ui/graphics/Brush;->()V HSPLandroidx/compose/ui/graphics/Brush;->()V HPLandroidx/compose/ui/graphics/Brush;->()V Landroidx/compose/ui/graphics/Brush$Companion; HSPLandroidx/compose/ui/graphics/Brush$Companion;->()V PLandroidx/compose/ui/graphics/Brush$Companion;->()V HSPLandroidx/compose/ui/graphics/Brush$Companion;->()V PLandroidx/compose/ui/graphics/Brush$Companion;->()V HSPLandroidx/compose/ui/graphics/Brush$Companion;->tint-xETnrds(IJ)Landroidx/compose/ui/graphics/ColorFilter; HPLandroidx/compose/ui/graphics/Brush$Companion;->tint-xETnrds(IJ)Landroidx/compose/ui/graphics/ColorFilter; Landroidx/compose/ui/graphics/BrushKt; HSPLandroidx/compose/ui/graphics/BrushKt;->()V PLandroidx/compose/ui/graphics/BrushKt;->()V HSPLandroidx/compose/ui/graphics/BrushKt;->()V HPLandroidx/compose/ui/graphics/BrushKt;->()V HSPLandroidx/compose/ui/graphics/BrushKt;->Canvas(Landroidx/compose/ui/graphics/AndroidImageBitmap;)Landroidx/compose/ui/graphics/AndroidCanvas; PLandroidx/compose/ui/graphics/BrushKt;->Canvas(Landroidx/compose/ui/graphics/AndroidImageBitmap;)Landroidx/compose/ui/graphics/AndroidCanvas; HSPLandroidx/compose/ui/graphics/BrushKt;->Color$default(III)J PLandroidx/compose/ui/graphics/BrushKt;->Color$default(III)J HSPLandroidx/compose/ui/graphics/BrushKt;->Color(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J HPLandroidx/compose/ui/graphics/BrushKt;->Color(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J HSPLandroidx/compose/ui/graphics/BrushKt;->Color(I)J PLandroidx/compose/ui/graphics/BrushKt;->Color(I)J HSPLandroidx/compose/ui/graphics/BrushKt;->Color(J)J PLandroidx/compose/ui/graphics/BrushKt;->Color(J)J HSPLandroidx/compose/ui/graphics/BrushKt;->ImageBitmap-x__-hDU$default(IIII)Landroidx/compose/ui/graphics/AndroidImageBitmap; HPLandroidx/compose/ui/graphics/BrushKt;->ImageBitmap-x__-hDU$default(IIII)Landroidx/compose/ui/graphics/AndroidImageBitmap; HSPLandroidx/compose/ui/graphics/BrushKt;->Paint()Landroidx/compose/ui/graphics/AndroidPaint; PLandroidx/compose/ui/graphics/BrushKt;->Paint()Landroidx/compose/ui/graphics/AndroidPaint; HSPLandroidx/compose/ui/graphics/BrushKt;->Path()Landroidx/compose/ui/graphics/AndroidPath; HPLandroidx/compose/ui/graphics/BrushKt;->Path()Landroidx/compose/ui/graphics/AndroidPath; HSPLandroidx/compose/ui/graphics/BrushKt;->TransformOrigin(FF)J PLandroidx/compose/ui/graphics/BrushKt;->TransformOrigin(FF)J HSPLandroidx/compose/ui/graphics/BrushKt;->asAndroidBitmap(Landroidx/compose/ui/graphics/ImageBitmap;)Landroid/graphics/Bitmap; PLandroidx/compose/ui/graphics/BrushKt;->asAndroidBitmap(Landroidx/compose/ui/graphics/ImageBitmap;)Landroid/graphics/Bitmap; HSPLandroidx/compose/ui/graphics/BrushKt;->compositeOver--OWjLjI(JJ)J HPLandroidx/compose/ui/graphics/BrushKt;->compositeOver--OWjLjI(JJ)J HSPLandroidx/compose/ui/graphics/BrushKt;->drawOutline-wDX37Ww$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/BrushKt;J)V HPLandroidx/compose/ui/graphics/BrushKt;->drawOutline-wDX37Ww$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/BrushKt;J)V HSPLandroidx/compose/ui/graphics/BrushKt;->getRectangleShape()Landroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1; HPLandroidx/compose/ui/graphics/BrushKt;->getRectangleShape()Landroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1; HSPLandroidx/compose/ui/graphics/BrushKt;->graphicsLayer-Ap8cVGQ$default(Landroidx/compose/ui/Modifier;FFFFLandroidx/compose/ui/graphics/Shape;ZI)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/graphics/BrushKt;->graphicsLayer-Ap8cVGQ$default(Landroidx/compose/ui/Modifier;FFFFLandroidx/compose/ui/graphics/Shape;ZI)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/graphics/BrushKt;->lerp-jxsXWHM(JJF)J HPLandroidx/compose/ui/graphics/BrushKt;->lerp-jxsXWHM(JJF)J HSPLandroidx/compose/ui/graphics/BrushKt;->luminance-8_81llA(J)F PLandroidx/compose/ui/graphics/BrushKt;->luminance-8_81llA(J)F HSPLandroidx/compose/ui/graphics/BrushKt;->setFrom-tU-YjHk(Landroid/graphics/Matrix;[F)V HPLandroidx/compose/ui/graphics/BrushKt;->setFrom-tU-YjHk(Landroid/graphics/Matrix;[F)V HSPLandroidx/compose/ui/graphics/BrushKt;->toAndroidBlendMode-s9anfk8(I)Landroid/graphics/BlendMode; HPLandroidx/compose/ui/graphics/BrushKt;->toAndroidBlendMode-s9anfk8(I)Landroid/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/BrushKt;->toArgb-8_81llA(J)I HPLandroidx/compose/ui/graphics/BrushKt;->toArgb-8_81llA(J)I HSPLandroidx/compose/ui/graphics/BrushKt;->toBitmapConfig-1JJdX4A(I)Landroid/graphics/Bitmap$Config; HPLandroidx/compose/ui/graphics/BrushKt;->toBitmapConfig-1JJdX4A(I)Landroid/graphics/Bitmap$Config; Landroidx/compose/ui/graphics/Canvas; Landroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0; HSPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$12()Landroid/graphics/BlendMode; PLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$12()Landroid/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$9()Landroid/graphics/BlendMode; PLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m$9()Landroid/graphics/BlendMode; HSPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m()V PLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m()V HSPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(ILandroid/graphics/BlendMode;)Landroid/graphics/BlendModeColorFilter; PLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(ILandroid/graphics/BlendMode;)Landroid/graphics/BlendModeColorFilter; HSPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Paint;Landroid/graphics/BlendMode;)V HPLandroidx/compose/ui/graphics/CanvasZHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Paint;Landroid/graphics/BlendMode;)V Landroidx/compose/ui/graphics/Color; HSPLandroidx/compose/ui/graphics/Color;->()V PLandroidx/compose/ui/graphics/Color;->()V HSPLandroidx/compose/ui/graphics/Color;->(J)V HPLandroidx/compose/ui/graphics/Color;->(J)V HSPLandroidx/compose/ui/graphics/Color;->access$getBlack$cp()J PLandroidx/compose/ui/graphics/Color;->access$getBlack$cp()J HSPLandroidx/compose/ui/graphics/Color;->access$getBlue$cp()J PLandroidx/compose/ui/graphics/Color;->access$getBlue$cp()J HSPLandroidx/compose/ui/graphics/Color;->access$getRed$cp()J PLandroidx/compose/ui/graphics/Color;->access$getRed$cp()J HSPLandroidx/compose/ui/graphics/Color;->access$getTransparent$cp()J PLandroidx/compose/ui/graphics/Color;->access$getTransparent$cp()J HSPLandroidx/compose/ui/graphics/Color;->access$getUnspecified$cp()J HPLandroidx/compose/ui/graphics/Color;->access$getUnspecified$cp()J HSPLandroidx/compose/ui/graphics/Color;->box-impl(J)Landroidx/compose/ui/graphics/Color; HPLandroidx/compose/ui/graphics/Color;->box-impl(J)Landroidx/compose/ui/graphics/Color; HSPLandroidx/compose/ui/graphics/Color;->convert-vNxB06k(JLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J HPLandroidx/compose/ui/graphics/Color;->convert-vNxB06k(JLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J HSPLandroidx/compose/ui/graphics/Color;->copy-wmQWz5c$default(JF)J HPLandroidx/compose/ui/graphics/Color;->copy-wmQWz5c$default(JF)J HSPLandroidx/compose/ui/graphics/Color;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/Color;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/Color;->getAlpha-impl(J)F HPLandroidx/compose/ui/graphics/Color;->getAlpha-impl(J)F HSPLandroidx/compose/ui/graphics/Color;->getBlue-impl(J)F HPLandroidx/compose/ui/graphics/Color;->getBlue-impl(J)F HSPLandroidx/compose/ui/graphics/Color;->getColorSpace-impl(J)Landroidx/compose/ui/graphics/colorspace/ColorSpace; HPLandroidx/compose/ui/graphics/Color;->getColorSpace-impl(J)Landroidx/compose/ui/graphics/colorspace/ColorSpace; HSPLandroidx/compose/ui/graphics/Color;->getGreen-impl(J)F HPLandroidx/compose/ui/graphics/Color;->getGreen-impl(J)F HSPLandroidx/compose/ui/graphics/Color;->getRed-impl(J)F HPLandroidx/compose/ui/graphics/Color;->getRed-impl(J)F PLandroidx/compose/ui/graphics/Color;->hashCode-impl(J)I HPLandroidx/compose/ui/graphics/Color;->hashCode-impl(J)I HSPLandroidx/compose/ui/graphics/Color;->unbox-impl()J HPLandroidx/compose/ui/graphics/Color;->unbox-impl()J Landroidx/compose/ui/graphics/ColorFilter; HSPLandroidx/compose/ui/graphics/ColorFilter;->(Landroid/graphics/ColorFilter;)V PLandroidx/compose/ui/graphics/ColorFilter;->(Landroid/graphics/ColorFilter;)V HSPLandroidx/compose/ui/graphics/ColorFilter;->getNativeColorFilter$ui_graphics_release()Landroid/graphics/ColorFilter; PLandroidx/compose/ui/graphics/ColorFilter;->getNativeColorFilter$ui_graphics_release()Landroid/graphics/ColorFilter; Landroidx/compose/ui/graphics/ColorSpaceVerificationHelper; HSPLandroidx/compose/ui/graphics/ColorSpaceVerificationHelper;->androidColorSpace(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroid/graphics/ColorSpace; HPLandroidx/compose/ui/graphics/ColorSpaceVerificationHelper;->androidColorSpace(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)Landroid/graphics/ColorSpace; Landroidx/compose/ui/graphics/ColorSpaceVerificationHelper$$ExternalSyntheticApiModelOutline1; HSPLandroidx/compose/ui/graphics/ColorSpaceVerificationHelper$$ExternalSyntheticApiModelOutline1;->m(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace; HPLandroidx/compose/ui/graphics/ColorSpaceVerificationHelper$$ExternalSyntheticApiModelOutline1;->m(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace; Landroidx/compose/ui/graphics/Float16; HSPLandroidx/compose/ui/graphics/Float16;->()V PLandroidx/compose/ui/graphics/Float16;->()V HSPLandroidx/compose/ui/graphics/Float16;->constructor-impl(F)S HPLandroidx/compose/ui/graphics/Float16;->constructor-impl(F)S HSPLandroidx/compose/ui/graphics/Float16;->toFloat-impl(S)F HPLandroidx/compose/ui/graphics/Float16;->toFloat-impl(S)F Landroidx/compose/ui/graphics/GraphicsLayerElement; HSPLandroidx/compose/ui/graphics/GraphicsLayerElement;->(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZLandroidx/compose/ui/graphics/RenderEffect;JJI)V HPLandroidx/compose/ui/graphics/GraphicsLayerElement;->(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZLandroidx/compose/ui/graphics/RenderEffect;JJI)V HSPLandroidx/compose/ui/graphics/GraphicsLayerElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/graphics/GraphicsLayerElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/graphics/GraphicsLayerElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/GraphicsLayerElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/graphics/GraphicsLayerScopeKt; HSPLandroidx/compose/ui/graphics/GraphicsLayerScopeKt;->()V PLandroidx/compose/ui/graphics/GraphicsLayerScopeKt;->()V HSPLandroidx/compose/ui/graphics/GraphicsLayerScopeKt;->getDefaultShadowColor()J HPLandroidx/compose/ui/graphics/GraphicsLayerScopeKt;->getDefaultShadowColor()J Landroidx/compose/ui/graphics/ImageBitmap; Landroidx/compose/ui/graphics/Matrix; HSPLandroidx/compose/ui/graphics/Matrix;->([F)V PLandroidx/compose/ui/graphics/Matrix;->([F)V HSPLandroidx/compose/ui/graphics/Matrix;->box-impl([F)Landroidx/compose/ui/graphics/Matrix; PLandroidx/compose/ui/graphics/Matrix;->box-impl([F)Landroidx/compose/ui/graphics/Matrix; HSPLandroidx/compose/ui/graphics/Matrix;->constructor-impl$default()[F HPLandroidx/compose/ui/graphics/Matrix;->constructor-impl$default()[F HSPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U([FJ)J HPLandroidx/compose/ui/graphics/Matrix;->map-MK-Hz9U([FJ)J HSPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V HPLandroidx/compose/ui/graphics/Matrix;->map-impl([FLandroidx/compose/ui/geometry/MutableRect;)V HSPLandroidx/compose/ui/graphics/Matrix;->reset-impl([F)V PLandroidx/compose/ui/graphics/Matrix;->reset-impl([F)V HSPLandroidx/compose/ui/graphics/Matrix;->translate-impl$default([FFF)V HPLandroidx/compose/ui/graphics/Matrix;->translate-impl$default([FFF)V HSPLandroidx/compose/ui/graphics/Matrix;->unbox-impl()[F PLandroidx/compose/ui/graphics/Matrix;->unbox-impl()[F Landroidx/compose/ui/graphics/Outline$Generic; Landroidx/compose/ui/graphics/Outline$Rectangle; HSPLandroidx/compose/ui/graphics/Outline$Rectangle;->(Landroidx/compose/ui/geometry/Rect;)V PLandroidx/compose/ui/graphics/Outline$Rectangle;->(Landroidx/compose/ui/geometry/Rect;)V HSPLandroidx/compose/ui/graphics/Outline$Rectangle;->getRect()Landroidx/compose/ui/geometry/Rect; PLandroidx/compose/ui/graphics/Outline$Rectangle;->getRect()Landroidx/compose/ui/geometry/Rect; Landroidx/compose/ui/graphics/Outline$Rounded; HSPLandroidx/compose/ui/graphics/Outline$Rounded;->(Landroidx/compose/ui/geometry/RoundRect;)V HPLandroidx/compose/ui/graphics/Outline$Rounded;->(Landroidx/compose/ui/geometry/RoundRect;)V HSPLandroidx/compose/ui/graphics/Outline$Rounded;->getRoundRect()Landroidx/compose/ui/geometry/RoundRect; PLandroidx/compose/ui/graphics/Outline$Rounded;->getRoundRect()Landroidx/compose/ui/geometry/RoundRect; HSPLandroidx/compose/ui/graphics/Outline$Rounded;->getRoundRectPath$ui_graphics_release()Landroidx/compose/ui/graphics/AndroidPath; PLandroidx/compose/ui/graphics/Outline$Rounded;->getRoundRectPath$ui_graphics_release()Landroidx/compose/ui/graphics/AndroidPath; Landroidx/compose/ui/graphics/Path; Landroidx/compose/ui/graphics/PathFillType; HSPLandroidx/compose/ui/graphics/PathFillType;->(I)V HPLandroidx/compose/ui/graphics/PathFillType;->(I)V HSPLandroidx/compose/ui/graphics/PathFillType;->box-impl(I)Landroidx/compose/ui/graphics/PathFillType; HPLandroidx/compose/ui/graphics/PathFillType;->box-impl(I)Landroidx/compose/ui/graphics/PathFillType; HSPLandroidx/compose/ui/graphics/PathFillType;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/PathFillType;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/PathFillType;->unbox-impl()I PLandroidx/compose/ui/graphics/PathFillType;->unbox-impl()I Landroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1; HSPLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;->()V PLandroidx/compose/ui/graphics/RectangleShapeKt$RectangleShape$1;->()V Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope; HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->()V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->()V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getAlpha()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getAlpha()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getAmbientShadowColor-0d7_KjU()J PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getAmbientShadowColor-0d7_KjU()J HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getCameraDistance()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getCameraDistance()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getClip()Z PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getClip()Z HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getCompositingStrategy--NrFUSI()I PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getCompositingStrategy--NrFUSI()I HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRenderEffect()Landroidx/compose/ui/graphics/RenderEffect; PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRenderEffect()Landroidx/compose/ui/graphics/RenderEffect; HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRotationX()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRotationX()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRotationY()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRotationY()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRotationZ()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getRotationZ()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getScaleX()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getScaleX()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getScaleY()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getScaleY()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getShadowElevation()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getShadowElevation()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getShape()Landroidx/compose/ui/graphics/Shape; PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getShape()Landroidx/compose/ui/graphics/Shape; HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getSpotShadowColor-0d7_KjU()J PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getSpotShadowColor-0d7_KjU()J HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getTransformOrigin-SzJe1aQ()J PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getTransformOrigin-SzJe1aQ()J HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getTranslationX()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getTranslationX()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getTranslationY()F PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->getTranslationY()F HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->reset()V HPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->reset()V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAlpha(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAlpha(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAmbientShadowColor-8_81llA(J)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setAmbientShadowColor-8_81llA(J)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setCameraDistance(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setCameraDistance(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setClip(Z)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setClip(Z)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setCompositingStrategy-aDBOjCE(I)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setCompositingStrategy-aDBOjCE(I)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setGraphicsDensity$ui_release(Landroidx/compose/ui/unit/Density;)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setGraphicsDensity$ui_release(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRenderEffect(Landroidx/compose/ui/graphics/RenderEffect;)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRenderEffect(Landroidx/compose/ui/graphics/RenderEffect;)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationX(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationX(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationY(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationY(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationZ(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setRotationZ(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleX(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleX(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleY(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setScaleY(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShadowElevation(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShadowElevation(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShape(Landroidx/compose/ui/graphics/Shape;)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setShape(Landroidx/compose/ui/graphics/Shape;)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setSize-uvyYCjk(J)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setSize-uvyYCjk(J)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setSpotShadowColor-8_81llA(J)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setSpotShadowColor-8_81llA(J)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTransformOrigin-__ExYCQ(J)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTransformOrigin-__ExYCQ(J)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTranslationX(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTranslationX(F)V HSPLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTranslationY(F)V PLandroidx/compose/ui/graphics/ReusableGraphicsLayerScope;->setTranslationY(F)V Landroidx/compose/ui/graphics/ShaderBrush; Landroidx/compose/ui/graphics/Shadow; HSPLandroidx/compose/ui/graphics/Shadow;->()V PLandroidx/compose/ui/graphics/Shadow;->()V HSPLandroidx/compose/ui/graphics/Shadow;->(JFI)V PLandroidx/compose/ui/graphics/Shadow;->(JFI)V HSPLandroidx/compose/ui/graphics/Shadow;->(JJF)V PLandroidx/compose/ui/graphics/Shadow;->(JJF)V HSPLandroidx/compose/ui/graphics/Shadow;->access$getNone$cp()Landroidx/compose/ui/graphics/Shadow; PLandroidx/compose/ui/graphics/Shadow;->access$getNone$cp()Landroidx/compose/ui/graphics/Shadow; HSPLandroidx/compose/ui/graphics/Shadow;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/Shadow;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/graphics/Shape; Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier; HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZLandroidx/compose/ui/graphics/RenderEffect;JJI)V HPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZLandroidx/compose/ui/graphics/RenderEffect;JJI)V HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->access$getLayerBlock$p(Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;)Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->access$getLayerBlock$p(Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getAlpha()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getAlpha()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getAmbientShadowColor-0d7_KjU()J PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getAmbientShadowColor-0d7_KjU()J HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getCameraDistance()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getCameraDistance()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getClip()Z PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getClip()Z HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getCompositingStrategy--NrFUSI()I PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getCompositingStrategy--NrFUSI()I HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRenderEffect()Landroidx/compose/ui/graphics/RenderEffect; PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRenderEffect()Landroidx/compose/ui/graphics/RenderEffect; HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRotationX()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRotationX()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRotationY()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRotationY()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRotationZ()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getRotationZ()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getScaleX()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getScaleX()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getScaleY()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getScaleY()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getShadowElevation()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getShadowElevation()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getShape()Landroidx/compose/ui/graphics/Shape; PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getShape()Landroidx/compose/ui/graphics/Shape; HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getSpotShadowColor-0d7_KjU()J PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getSpotShadowColor-0d7_KjU()J HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getTransformOrigin-SzJe1aQ()J PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getTransformOrigin-SzJe1aQ()J HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getTranslationX()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getTranslationX()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getTranslationY()F PLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->getTranslationY()F HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1; HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;->(Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;)V HPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;->(Landroidx/compose/ui/graphics/SimpleGraphicsLayerModifier;)V HSPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/SimpleGraphicsLayerModifier$layerBlock$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/SolidColor; HSPLandroidx/compose/ui/graphics/SolidColor;->(J)V PLandroidx/compose/ui/graphics/SolidColor;->(J)V HSPLandroidx/compose/ui/graphics/SolidColor;->applyTo-Pq9zytI(FJLandroidx/compose/ui/graphics/AndroidPaint;)V HPLandroidx/compose/ui/graphics/SolidColor;->applyTo-Pq9zytI(FJLandroidx/compose/ui/graphics/AndroidPaint;)V HSPLandroidx/compose/ui/graphics/SolidColor;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/SolidColor;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/graphics/SolidColor;->hashCode()I Landroidx/compose/ui/graphics/StrokeCap; HSPLandroidx/compose/ui/graphics/StrokeCap;->(I)V HPLandroidx/compose/ui/graphics/StrokeCap;->(I)V HSPLandroidx/compose/ui/graphics/StrokeCap;->box-impl(I)Landroidx/compose/ui/graphics/StrokeCap; HPLandroidx/compose/ui/graphics/StrokeCap;->box-impl(I)Landroidx/compose/ui/graphics/StrokeCap; HSPLandroidx/compose/ui/graphics/StrokeCap;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/StrokeCap;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/StrokeCap;->unbox-impl()I PLandroidx/compose/ui/graphics/StrokeCap;->unbox-impl()I Landroidx/compose/ui/graphics/StrokeJoin; HSPLandroidx/compose/ui/graphics/StrokeJoin;->(I)V HPLandroidx/compose/ui/graphics/StrokeJoin;->(I)V HSPLandroidx/compose/ui/graphics/StrokeJoin;->box-impl(I)Landroidx/compose/ui/graphics/StrokeJoin; HPLandroidx/compose/ui/graphics/StrokeJoin;->box-impl(I)Landroidx/compose/ui/graphics/StrokeJoin; HSPLandroidx/compose/ui/graphics/StrokeJoin;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/StrokeJoin;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/StrokeJoin;->unbox-impl()I PLandroidx/compose/ui/graphics/StrokeJoin;->unbox-impl()I Landroidx/compose/ui/graphics/TransformOrigin; HSPLandroidx/compose/ui/graphics/TransformOrigin;->()V PLandroidx/compose/ui/graphics/TransformOrigin;->()V HSPLandroidx/compose/ui/graphics/TransformOrigin;->(J)V HPLandroidx/compose/ui/graphics/TransformOrigin;->(J)V HSPLandroidx/compose/ui/graphics/TransformOrigin;->access$getCenter$cp()J HPLandroidx/compose/ui/graphics/TransformOrigin;->access$getCenter$cp()J HSPLandroidx/compose/ui/graphics/TransformOrigin;->box-impl(J)Landroidx/compose/ui/graphics/TransformOrigin; HPLandroidx/compose/ui/graphics/TransformOrigin;->box-impl(J)Landroidx/compose/ui/graphics/TransformOrigin; HSPLandroidx/compose/ui/graphics/TransformOrigin;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/graphics/TransformOrigin;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/TransformOrigin;->getPivotFractionX-impl(J)F HPLandroidx/compose/ui/graphics/TransformOrigin;->getPivotFractionX-impl(J)F HSPLandroidx/compose/ui/graphics/TransformOrigin;->getPivotFractionY-impl(J)F HPLandroidx/compose/ui/graphics/TransformOrigin;->getPivotFractionY-impl(J)F HSPLandroidx/compose/ui/graphics/TransformOrigin;->unbox-impl()J HPLandroidx/compose/ui/graphics/TransformOrigin;->unbox-impl()J Landroidx/compose/ui/graphics/WrapperVerificationHelperMethods; HSPLandroidx/compose/ui/graphics/WrapperVerificationHelperMethods;->()V PLandroidx/compose/ui/graphics/WrapperVerificationHelperMethods;->()V HSPLandroidx/compose/ui/graphics/WrapperVerificationHelperMethods;->()V PLandroidx/compose/ui/graphics/WrapperVerificationHelperMethods;->()V HSPLandroidx/compose/ui/graphics/WrapperVerificationHelperMethods;->setBlendMode-GB0RdKg(Landroid/graphics/Paint;I)V HPLandroidx/compose/ui/graphics/WrapperVerificationHelperMethods;->setBlendMode-GB0RdKg(Landroid/graphics/Paint;I)V Landroidx/compose/ui/graphics/colorspace/Adaptation; HSPLandroidx/compose/ui/graphics/colorspace/Adaptation;->()V PLandroidx/compose/ui/graphics/colorspace/Adaptation;->()V HSPLandroidx/compose/ui/graphics/colorspace/Adaptation;->([F)V PLandroidx/compose/ui/graphics/colorspace/Adaptation;->([F)V HSPLandroidx/compose/ui/graphics/colorspace/Adaptation;->access$getBradford$cp()Landroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1; PLandroidx/compose/ui/graphics/colorspace/Adaptation;->access$getBradford$cp()Landroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1; HSPLandroidx/compose/ui/graphics/colorspace/Adaptation;->getTransform$ui_graphics_release()[F PLandroidx/compose/ui/graphics/colorspace/Adaptation;->getTransform$ui_graphics_release()[F Landroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1; HSPLandroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1;->([F)V PLandroidx/compose/ui/graphics/colorspace/Adaptation$Companion$Bradford$1;->([F)V Landroidx/compose/ui/graphics/colorspace/ColorModel; HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;->()V PLandroidx/compose/ui/graphics/colorspace/ColorModel;->()V HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;->access$getLab$cp()J PLandroidx/compose/ui/graphics/colorspace/ColorModel;->access$getLab$cp()J HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;->access$getRgb$cp()J PLandroidx/compose/ui/graphics/colorspace/ColorModel;->access$getRgb$cp()J HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;->access$getXyz$cp()J PLandroidx/compose/ui/graphics/colorspace/ColorModel;->access$getXyz$cp()J HSPLandroidx/compose/ui/graphics/colorspace/ColorModel;->equals-impl0(JJ)Z PLandroidx/compose/ui/graphics/colorspace/ColorModel;->equals-impl0(JJ)Z Landroidx/compose/ui/graphics/colorspace/ColorSpace; HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->(Ljava/lang/String;JI)V PLandroidx/compose/ui/graphics/colorspace/ColorSpace;->(Ljava/lang/String;JI)V HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getComponentCount()I PLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getComponentCount()I HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getId$ui_graphics_release()I PLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getId$ui_graphics_release()I HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getModel-xdoWZVw()J PLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getModel-xdoWZVw()J HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getName()Ljava/lang/String; PLandroidx/compose/ui/graphics/colorspace/ColorSpace;->getName()Ljava/lang/String; HSPLandroidx/compose/ui/graphics/colorspace/ColorSpace;->isSrgb()Z PLandroidx/compose/ui/graphics/colorspace/ColorSpace;->isSrgb()Z Landroidx/compose/ui/graphics/colorspace/ColorSpaces; HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->()V PLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->()V HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getColorSpacesArray$ui_graphics_release()[Landroidx/compose/ui/graphics/colorspace/ColorSpace; HPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getColorSpacesArray$ui_graphics_release()[Landroidx/compose/ui/graphics/colorspace/ColorSpace; HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getNtsc1953Primaries$ui_graphics_release()[F PLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getNtsc1953Primaries$ui_graphics_release()[F HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getOklab()Landroidx/compose/ui/graphics/colorspace/Oklab; PLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getOklab()Landroidx/compose/ui/graphics/colorspace/Oklab; HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getSrgb()Landroidx/compose/ui/graphics/colorspace/Rgb; HPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getSrgb()Landroidx/compose/ui/graphics/colorspace/Rgb; HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getSrgbPrimaries$ui_graphics_release()[F PLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getSrgbPrimaries$ui_graphics_release()[F HSPLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getUnspecified$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/Rgb; PLandroidx/compose/ui/graphics/colorspace/ColorSpaces;->getUnspecified$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/Rgb; Landroidx/compose/ui/graphics/colorspace/Connector; HSPLandroidx/compose/ui/graphics/colorspace/Connector;->()V PLandroidx/compose/ui/graphics/colorspace/Connector;->()V HSPLandroidx/compose/ui/graphics/colorspace/Connector;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;I)V PLandroidx/compose/ui/graphics/colorspace/Connector;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;I)V HSPLandroidx/compose/ui/graphics/colorspace/Connector;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;[F)V PLandroidx/compose/ui/graphics/colorspace/Connector;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/ColorSpace;[F)V HSPLandroidx/compose/ui/graphics/colorspace/Connector;->access$getOklabToSrgbPerceptual$cp()Landroidx/compose/ui/graphics/colorspace/Connector; PLandroidx/compose/ui/graphics/colorspace/Connector;->access$getOklabToSrgbPerceptual$cp()Landroidx/compose/ui/graphics/colorspace/Connector; HSPLandroidx/compose/ui/graphics/colorspace/Connector;->access$getSrgbToOklabPerceptual$cp()Landroidx/compose/ui/graphics/colorspace/Connector; PLandroidx/compose/ui/graphics/colorspace/Connector;->access$getSrgbToOklabPerceptual$cp()Landroidx/compose/ui/graphics/colorspace/Connector; HSPLandroidx/compose/ui/graphics/colorspace/Connector;->transformToColor-wmQWz5c$ui_graphics_release(FFFF)J HPLandroidx/compose/ui/graphics/colorspace/Connector;->transformToColor-wmQWz5c$ui_graphics_release(FFFF)J Landroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1; HSPLandroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)V PLandroidx/compose/ui/graphics/colorspace/Connector$Companion$identity$1;->(Landroidx/compose/ui/graphics/colorspace/ColorSpace;)V Landroidx/compose/ui/graphics/colorspace/Connector$RgbConnector; Landroidx/compose/ui/graphics/colorspace/DoubleFunction; Landroidx/compose/ui/graphics/colorspace/Illuminant; HSPLandroidx/compose/ui/graphics/colorspace/Illuminant;->()V PLandroidx/compose/ui/graphics/colorspace/Illuminant;->()V HSPLandroidx/compose/ui/graphics/colorspace/Illuminant;->getC()Landroidx/compose/ui/graphics/colorspace/WhitePoint; PLandroidx/compose/ui/graphics/colorspace/Illuminant;->getC()Landroidx/compose/ui/graphics/colorspace/WhitePoint; HSPLandroidx/compose/ui/graphics/colorspace/Illuminant;->getD50()Landroidx/compose/ui/graphics/colorspace/WhitePoint; PLandroidx/compose/ui/graphics/colorspace/Illuminant;->getD50()Landroidx/compose/ui/graphics/colorspace/WhitePoint; HSPLandroidx/compose/ui/graphics/colorspace/Illuminant;->getD60()Landroidx/compose/ui/graphics/colorspace/WhitePoint; PLandroidx/compose/ui/graphics/colorspace/Illuminant;->getD60()Landroidx/compose/ui/graphics/colorspace/WhitePoint; HSPLandroidx/compose/ui/graphics/colorspace/Illuminant;->getD65()Landroidx/compose/ui/graphics/colorspace/WhitePoint; PLandroidx/compose/ui/graphics/colorspace/Illuminant;->getD65()Landroidx/compose/ui/graphics/colorspace/WhitePoint; Landroidx/compose/ui/graphics/colorspace/Lab; HSPLandroidx/compose/ui/graphics/colorspace/Lab;->()V PLandroidx/compose/ui/graphics/colorspace/Lab;->()V Landroidx/compose/ui/graphics/colorspace/Lab$Companion; HSPLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->()V PLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->()V HSPLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->access$isSrgb([FLandroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;FFI)Z PLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->access$isSrgb([FLandroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;FFI)Z HSPLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->access$isWideGamut([FFF)V PLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->access$isWideGamut([FFF)V HSPLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->area([F)F PLandroidx/compose/ui/graphics/colorspace/Lab$Companion;->area([F)F Landroidx/compose/ui/graphics/colorspace/Oklab; HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->()V PLandroidx/compose/ui/graphics/colorspace/Oklab;->()V HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->()V PLandroidx/compose/ui/graphics/colorspace/Oklab;->()V HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->getMaxValue(I)F PLandroidx/compose/ui/graphics/colorspace/Oklab;->getMaxValue(I)F HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->getMinValue(I)F PLandroidx/compose/ui/graphics/colorspace/Oklab;->getMinValue(I)F HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->toXy$ui_graphics_release(FFF)J HPLandroidx/compose/ui/graphics/colorspace/Oklab;->toXy$ui_graphics_release(FFF)J HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->toZ$ui_graphics_release(FFF)F HPLandroidx/compose/ui/graphics/colorspace/Oklab;->toZ$ui_graphics_release(FFF)F HSPLandroidx/compose/ui/graphics/colorspace/Oklab;->xyzaToColor-JlNiLsg$ui_graphics_release(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J HPLandroidx/compose/ui/graphics/colorspace/Oklab;->xyzaToColor-JlNiLsg$ui_graphics_release(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J Landroidx/compose/ui/graphics/colorspace/Rgb; HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->$r8$lambda$FANKyyW7TMwi4gnihl1LqxbkU6k(Landroidx/compose/ui/graphics/colorspace/Rgb;D)D HPLandroidx/compose/ui/graphics/colorspace/Rgb;->$r8$lambda$FANKyyW7TMwi4gnihl1LqxbkU6k(Landroidx/compose/ui/graphics/colorspace/Rgb;D)D HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->$r8$lambda$OfmTeMXzL_nayJmS5mO6N4G4DlI(Landroidx/compose/ui/graphics/colorspace/Rgb;D)D PLandroidx/compose/ui/graphics/colorspace/Rgb;->$r8$lambda$OfmTeMXzL_nayJmS5mO6N4G4DlI(Landroidx/compose/ui/graphics/colorspace/Rgb;D)D HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->()V PLandroidx/compose/ui/graphics/colorspace/Rgb;->()V HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Landroidx/compose/ui/graphics/colorspace/Rgb;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;)V PLandroidx/compose/ui/graphics/colorspace/Rgb;->(Landroidx/compose/ui/graphics/colorspace/Rgb;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;)V HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;DFFI)V PLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;DFFI)V HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V PLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;[FLandroidx/compose/ui/graphics/colorspace/DoubleFunction;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;FFLandroidx/compose/ui/graphics/colorspace/TransferParameters;I)V PLandroidx/compose/ui/graphics/colorspace/Rgb;->(Ljava/lang/String;[FLandroidx/compose/ui/graphics/colorspace/WhitePoint;[FLandroidx/compose/ui/graphics/colorspace/DoubleFunction;Landroidx/compose/ui/graphics/colorspace/DoubleFunction;FFLandroidx/compose/ui/graphics/colorspace/TransferParameters;I)V HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/colorspace/Rgb;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getEotfFunc$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0; PLandroidx/compose/ui/graphics/colorspace/Rgb;->getEotfFunc$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0; HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getEotfOrig$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/DoubleFunction; PLandroidx/compose/ui/graphics/colorspace/Rgb;->getEotfOrig$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/DoubleFunction; HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getMaxValue(I)F PLandroidx/compose/ui/graphics/colorspace/Rgb;->getMaxValue(I)F HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getMinValue(I)F PLandroidx/compose/ui/graphics/colorspace/Rgb;->getMinValue(I)F HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getOetfOrig$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/DoubleFunction; PLandroidx/compose/ui/graphics/colorspace/Rgb;->getOetfOrig$ui_graphics_release()Landroidx/compose/ui/graphics/colorspace/DoubleFunction; HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getTransform$ui_graphics_release()[F PLandroidx/compose/ui/graphics/colorspace/Rgb;->getTransform$ui_graphics_release()[F HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->getWhitePoint()Landroidx/compose/ui/graphics/colorspace/WhitePoint; PLandroidx/compose/ui/graphics/colorspace/Rgb;->getWhitePoint()Landroidx/compose/ui/graphics/colorspace/WhitePoint; HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->isSrgb()Z PLandroidx/compose/ui/graphics/colorspace/Rgb;->isSrgb()Z HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->toXy$ui_graphics_release(FFF)J HPLandroidx/compose/ui/graphics/colorspace/Rgb;->toXy$ui_graphics_release(FFF)J HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->toZ$ui_graphics_release(FFF)F PLandroidx/compose/ui/graphics/colorspace/Rgb;->toZ$ui_graphics_release(FFF)F HSPLandroidx/compose/ui/graphics/colorspace/Rgb;->xyzaToColor-JlNiLsg$ui_graphics_release(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J HPLandroidx/compose/ui/graphics/colorspace/Rgb;->xyzaToColor-JlNiLsg$ui_graphics_release(FFFFLandroidx/compose/ui/graphics/colorspace/ColorSpace;)J Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0; HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/graphics/colorspace/Rgb;I)V PLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->(Landroidx/compose/ui/graphics/colorspace/Rgb;I)V HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->invoke(D)D HPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda0;->invoke(D)D Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1; HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;->(Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V PLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;->(Landroidx/compose/ui/graphics/colorspace/TransferParameters;I)V HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;->invoke(D)D HPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda1;->invoke(D)D Landroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda2; HSPLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda2;->(DI)V PLandroidx/compose/ui/graphics/colorspace/Rgb$$ExternalSyntheticLambda2;->(DI)V Landroidx/compose/ui/graphics/colorspace/Rgb$eotf$1; HSPLandroidx/compose/ui/graphics/colorspace/Rgb$eotf$1;->(Landroidx/compose/ui/graphics/colorspace/Rgb;I)V PLandroidx/compose/ui/graphics/colorspace/Rgb$eotf$1;->(Landroidx/compose/ui/graphics/colorspace/Rgb;I)V Landroidx/compose/ui/graphics/colorspace/TransferParameters; HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->(DDDDD)V PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->(DDDDD)V HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->(DDDDDDD)V PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->(DDDDDDD)V HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getA()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getA()D HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getB()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getB()D HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getC()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getC()D HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getD()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getD()D HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getE()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getE()D HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getF()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getF()D HSPLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getGamma()D PLandroidx/compose/ui/graphics/colorspace/TransferParameters;->getGamma()D Landroidx/compose/ui/graphics/colorspace/WhitePoint; HSPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->(FF)V PLandroidx/compose/ui/graphics/colorspace/WhitePoint;->(FF)V HSPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->getX()F PLandroidx/compose/ui/graphics/colorspace/WhitePoint;->getX()F HSPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->getY()F PLandroidx/compose/ui/graphics/colorspace/WhitePoint;->getY()F HSPLandroidx/compose/ui/graphics/colorspace/WhitePoint;->toXyz$ui_graphics_release()[F PLandroidx/compose/ui/graphics/colorspace/WhitePoint;->toXyz$ui_graphics_release()[F Landroidx/compose/ui/graphics/colorspace/Xyz; HSPLandroidx/compose/ui/graphics/colorspace/Xyz;->()V PLandroidx/compose/ui/graphics/colorspace/Xyz;->()V Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->()V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->()V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-2qPWKa0$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;JLandroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-2qPWKa0$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;JLandroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE(Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;II)Landroidx/compose/ui/graphics/AndroidPaint; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configurePaint-swdJneE(Landroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;II)Landroidx/compose/ui/graphics/AndroidPaint; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configureStrokePaint-Q_0CZUI$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;JFIFLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->configureStrokePaint-Q_0CZUI$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;JFIFLandroidx/compose/ui/graphics/ColorFilter;I)Landroidx/compose/ui/graphics/AndroidPaint; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawArc-yD3GUKo(JFFJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawArc-yD3GUKo(JFFJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;II)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;II)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawLine-NGM6Ib0(JJJFIFLandroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawLine-NGM6Ib0(JJJFIFLandroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawPath-GBMwjPU(Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawPath-GBMwjPU(Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRect-n-J9OG0(JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRect-n-J9OG0(JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-u-Aw5IA(JJJJLandroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->drawRoundRect-u-Aw5IA(JJJJLandroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDensity()F HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDensity()F HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDrawParams()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getDrawParams()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->modulate-5vOe2sY(JF)J PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->modulate-5vOe2sY(JF)J HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->selectPaint(Landroidx/compose/ui/graphics/drawscope/DrawStyle;)Landroidx/compose/ui/graphics/AndroidPaint; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope;->selectPaint(Landroidx/compose/ui/graphics/drawscope/DrawStyle;)Landroidx/compose/ui/graphics/AndroidPaint; Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->()V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->()V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component1()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component1()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component2()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component2()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component3()Landroidx/compose/ui/graphics/Canvas; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component3()Landroidx/compose/ui/graphics/Canvas; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component4-NH-jbRc()J PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->component4-NH-jbRc()J HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getCanvas()Landroidx/compose/ui/graphics/Canvas; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getCanvas()Landroidx/compose/ui/graphics/Canvas; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getDensity()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getDensity()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getSize-NH-jbRc()J HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->getSize-NH-jbRc()J HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setCanvas(Landroidx/compose/ui/graphics/Canvas;)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setCanvas(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setDensity(Landroidx/compose/ui/unit/Density;)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setDensity(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setSize-uvyYCjk(J)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$DrawParams;->setSize-uvyYCjk(J)V Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope;)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getCanvas()Landroidx/compose/ui/graphics/Canvas; HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getCanvas()Landroidx/compose/ui/graphics/Canvas; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getSize-NH-jbRc()J HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getSize-NH-jbRc()J HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getTransform()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1; PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->getTransform()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->setSize-uvyYCjk(J)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;->setSize-uvyYCjk(J)V Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1; HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1;)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->clipPath-mtrdD-E$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;Landroidx/compose/ui/graphics/AndroidPath;)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->clipPath-mtrdD-E$default(Landroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;Landroidx/compose/ui/graphics/AndroidPath;)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->inset(FFFF)V HPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->inset(FFFF)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->transform-58bKbWc([F)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->transform-58bKbWc([F)V HSPLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->translate(FF)V PLandroidx/compose/ui/graphics/drawscope/CanvasDrawScopeKt$asDrawTransform$1;->translate(FF)V Landroidx/compose/ui/graphics/drawscope/ContentDrawScope; Landroidx/compose/ui/graphics/drawscope/DrawContextKt; HSPLandroidx/compose/ui/graphics/drawscope/DrawContextKt;->()V PLandroidx/compose/ui/graphics/drawscope/DrawContextKt;->()V HSPLandroidx/compose/ui/graphics/drawscope/DrawContextKt;->getDefaultDensity()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/graphics/drawscope/DrawContextKt;->getDefaultDensity()Landroidx/compose/ui/unit/Density; Landroidx/compose/ui/graphics/drawscope/DrawScope; HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawArc-yD3GUKo$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JFFJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;I)V PLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawArc-yD3GUKo$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JFFJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;I)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawImage-AZ2fEMs$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/ImageBitmap;JJJFLandroidx/compose/ui/graphics/ColorFilter;II)V HPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawImage-AZ2fEMs$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/ImageBitmap;JJJFLandroidx/compose/ui/graphics/ColorFilter;II)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawLine-NGM6Ib0$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJJFII)V PLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawLine-NGM6Ib0$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJJFII)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawPath-GBMwjPU$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/Stroke;I)V PLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawPath-GBMwjPU$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Path;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/drawscope/Stroke;I)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRect-n-J9OG0$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJJFLandroidx/compose/ui/graphics/ColorFilter;I)V HPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRect-n-J9OG0$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;JJJFLandroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRoundRect-ZuiqVtQ$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Brush;JJJLandroidx/compose/ui/graphics/drawscope/Stroke;I)V PLandroidx/compose/ui/graphics/drawscope/DrawScope;->drawRoundRect-ZuiqVtQ$default(Landroidx/compose/ui/graphics/drawscope/DrawScope;Landroidx/compose/ui/graphics/Brush;JJJLandroidx/compose/ui/graphics/drawscope/Stroke;I)V HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->getSize-NH-jbRc()J HPLandroidx/compose/ui/graphics/drawscope/DrawScope;->getSize-NH-jbRc()J HSPLandroidx/compose/ui/graphics/drawscope/DrawScope;->offsetSize-PENXr5M(JJ)J HPLandroidx/compose/ui/graphics/drawscope/DrawScope;->offsetSize-PENXr5M(JJ)J Landroidx/compose/ui/graphics/drawscope/DrawStyle; HSPLandroidx/compose/ui/graphics/drawscope/DrawStyle;->()V PLandroidx/compose/ui/graphics/drawscope/DrawStyle;->()V Landroidx/compose/ui/graphics/drawscope/EmptyCanvas; HSPLandroidx/compose/ui/graphics/drawscope/EmptyCanvas;->()V HPLandroidx/compose/ui/graphics/drawscope/EmptyCanvas;->()V Landroidx/compose/ui/graphics/drawscope/Fill; HSPLandroidx/compose/ui/graphics/drawscope/Fill;->()V PLandroidx/compose/ui/graphics/drawscope/Fill;->()V HSPLandroidx/compose/ui/graphics/drawscope/Fill;->()V PLandroidx/compose/ui/graphics/drawscope/Fill;->()V Landroidx/compose/ui/graphics/drawscope/Stroke; HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->(FFIII)V PLandroidx/compose/ui/graphics/drawscope/Stroke;->(FFIII)V HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/graphics/drawscope/Stroke;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->getCap-KaPHkGw()I PLandroidx/compose/ui/graphics/drawscope/Stroke;->getCap-KaPHkGw()I HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->getJoin-LxFBmk8()I PLandroidx/compose/ui/graphics/drawscope/Stroke;->getJoin-LxFBmk8()I HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->getMiter()F PLandroidx/compose/ui/graphics/drawscope/Stroke;->getMiter()F HSPLandroidx/compose/ui/graphics/drawscope/Stroke;->getWidth()F PLandroidx/compose/ui/graphics/drawscope/Stroke;->getWidth()F Landroidx/compose/ui/graphics/painter/Painter; HSPLandroidx/compose/ui/graphics/painter/Painter;->()V PLandroidx/compose/ui/graphics/painter/Painter;->()V HSPLandroidx/compose/ui/graphics/painter/Painter;->draw-x_KDEd0(Landroidx/compose/ui/graphics/drawscope/DrawScope;JFLandroidx/compose/ui/graphics/ColorFilter;)V HPLandroidx/compose/ui/graphics/painter/Painter;->draw-x_KDEd0(Landroidx/compose/ui/graphics/drawscope/DrawScope;JFLandroidx/compose/ui/graphics/ColorFilter;)V Landroidx/compose/ui/graphics/painter/Painter$drawLambda$1; HSPLandroidx/compose/ui/graphics/painter/Painter$drawLambda$1;->(Landroidx/compose/ui/graphics/painter/Painter;)V PLandroidx/compose/ui/graphics/painter/Painter$drawLambda$1;->(Landroidx/compose/ui/graphics/painter/Painter;)V Landroidx/compose/ui/graphics/vector/DrawCache; HSPLandroidx/compose/ui/graphics/vector/DrawCache;->()V PLandroidx/compose/ui/graphics/vector/DrawCache;->()V HSPLandroidx/compose/ui/graphics/vector/DrawCache;->drawCachedImage-CJJAR-o(JLandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/graphics/vector/DrawCache;->drawCachedImage-CJJAR-o(JLandroidx/compose/ui/unit/Density;Landroidx/compose/ui/unit/LayoutDirection;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/graphics/vector/DrawCache;->drawInto(Landroidx/compose/ui/graphics/drawscope/DrawScope;FLandroidx/compose/ui/graphics/ColorFilter;)V HPLandroidx/compose/ui/graphics/vector/DrawCache;->drawInto(Landroidx/compose/ui/graphics/drawscope/DrawScope;FLandroidx/compose/ui/graphics/ColorFilter;)V Landroidx/compose/ui/graphics/vector/FloatResult; HSPLandroidx/compose/ui/graphics/vector/FloatResult;->()V HPLandroidx/compose/ui/graphics/vector/FloatResult;->()V HSPLandroidx/compose/ui/graphics/vector/FloatResult;->getValue()F HPLandroidx/compose/ui/graphics/vector/FloatResult;->getValue()F HSPLandroidx/compose/ui/graphics/vector/FloatResult;->isValid()Z HPLandroidx/compose/ui/graphics/vector/FloatResult;->isValid()Z HSPLandroidx/compose/ui/graphics/vector/FloatResult;->setValid(Z)V HPLandroidx/compose/ui/graphics/vector/FloatResult;->setValid(Z)V HSPLandroidx/compose/ui/graphics/vector/FloatResult;->setValue(F)V HPLandroidx/compose/ui/graphics/vector/FloatResult;->setValue(F)V Landroidx/compose/ui/graphics/vector/GroupComponent; HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->()V HPLandroidx/compose/ui/graphics/vector/GroupComponent;->()V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HPLandroidx/compose/ui/graphics/vector/GroupComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->getInvalidateListener$ui_release()Lkotlin/jvm/functions/Function0; PLandroidx/compose/ui/graphics/vector/GroupComponent;->getInvalidateListener$ui_release()Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->getNumChildren()I HPLandroidx/compose/ui/graphics/vector/GroupComponent;->getNumChildren()I HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->insertAt(ILandroidx/compose/ui/graphics/vector/VNode;)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->insertAt(ILandroidx/compose/ui/graphics/vector/VNode;)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->remove(II)V HPLandroidx/compose/ui/graphics/vector/GroupComponent;->remove(II)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setClipPathData(Ljava/util/List;)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setClipPathData(Ljava/util/List;)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setInvalidateListener$ui_release(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/graphics/vector/GroupComponent;->setInvalidateListener$ui_release(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setName(Ljava/lang/String;)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setName(Ljava/lang/String;)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setPivotX(F)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setPivotX(F)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setPivotY(F)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setPivotY(F)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setRotation(F)V HPLandroidx/compose/ui/graphics/vector/GroupComponent;->setRotation(F)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setScaleX(F)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setScaleX(F)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setScaleY(F)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setScaleY(F)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setTranslationX(F)V HPLandroidx/compose/ui/graphics/vector/GroupComponent;->setTranslationX(F)V HSPLandroidx/compose/ui/graphics/vector/GroupComponent;->setTranslationY(F)V PLandroidx/compose/ui/graphics/vector/GroupComponent;->setTranslationY(F)V Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/graphics/vector/ImageVector;->()V PLandroidx/compose/ui/graphics/vector/ImageVector;->()V HSPLandroidx/compose/ui/graphics/vector/ImageVector;->(Ljava/lang/String;FFFFLandroidx/compose/ui/graphics/vector/VectorGroup;JIZ)V HPLandroidx/compose/ui/graphics/vector/ImageVector;->(Ljava/lang/String;FFFFLandroidx/compose/ui/graphics/vector/VectorGroup;JIZ)V HSPLandroidx/compose/ui/graphics/vector/ImageVector;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/vector/ImageVector;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getAutoMirror()Z PLandroidx/compose/ui/graphics/vector/ImageVector;->getAutoMirror()Z HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getDefaultHeight-D9Ej5fM()F PLandroidx/compose/ui/graphics/vector/ImageVector;->getDefaultHeight-D9Ej5fM()F HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getDefaultWidth-D9Ej5fM()F PLandroidx/compose/ui/graphics/vector/ImageVector;->getDefaultWidth-D9Ej5fM()F HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getName()Ljava/lang/String; PLandroidx/compose/ui/graphics/vector/ImageVector;->getName()Ljava/lang/String; HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getRoot()Landroidx/compose/ui/graphics/vector/VectorGroup; PLandroidx/compose/ui/graphics/vector/ImageVector;->getRoot()Landroidx/compose/ui/graphics/vector/VectorGroup; HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getTintBlendMode-0nO6VwU()I PLandroidx/compose/ui/graphics/vector/ImageVector;->getTintBlendMode-0nO6VwU()I HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getTintColor-0d7_KjU()J PLandroidx/compose/ui/graphics/vector/ImageVector;->getTintColor-0d7_KjU()J HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getViewportHeight()F PLandroidx/compose/ui/graphics/vector/ImageVector;->getViewportHeight()F HSPLandroidx/compose/ui/graphics/vector/ImageVector;->getViewportWidth()F PLandroidx/compose/ui/graphics/vector/ImageVector;->getViewportWidth()F HPLandroidx/compose/ui/graphics/vector/ImageVector;->hashCode()I Landroidx/compose/ui/graphics/vector/ImageVector$Builder; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->(Ljava/lang/String;FFFFJIZ)V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->(Ljava/lang/String;FFFFJIZ)V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->(Ljava/lang/String;FFFFJIZI)V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->(Ljava/lang/String;FFFFJIZI)V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addGroup(Ljava/lang/String;FFFFFFFLjava/util/List;)V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addGroup(Ljava/lang/String;FFFFFFFLjava/util/List;)V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addPath-oIyEayM$default(Landroidx/compose/ui/graphics/vector/ImageVector$Builder;Ljava/util/ArrayList;ILandroidx/compose/ui/graphics/SolidColor;FIF)V PLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addPath-oIyEayM$default(Landroidx/compose/ui/graphics/vector/ImageVector$Builder;Ljava/util/ArrayList;ILandroidx/compose/ui/graphics/SolidColor;FIF)V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addPath-oIyEayM(FFFFFFFIIILandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Brush;Ljava/lang/String;Ljava/util/List;)V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->addPath-oIyEayM(FFFFFFFIIILandroidx/compose/ui/graphics/Brush;Landroidx/compose/ui/graphics/Brush;Ljava/lang/String;Ljava/util/List;)V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->asVectorGroup(Landroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;)Landroidx/compose/ui/graphics/vector/VectorGroup; HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->asVectorGroup(Landroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;)Landroidx/compose/ui/graphics/vector/VectorGroup; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->build()Landroidx/compose/ui/graphics/vector/ImageVector; HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->build()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->clearGroup()V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->clearGroup()V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->ensureNotConsumed()V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder;->ensureNotConsumed()V Landroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->(Ljava/lang/String;FFFFFFFLjava/util/List;I)V HPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->(Ljava/lang/String;FFFFFFFLjava/util/List;I)V HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getChildren()Ljava/util/List; PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getChildren()Ljava/util/List; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getClipPathData()Ljava/util/List; PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getClipPathData()Ljava/util/List; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getName()Ljava/lang/String; PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getName()Ljava/lang/String; HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getPivotX()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getPivotX()F HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getPivotY()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getPivotY()F HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getRotate()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getRotate()F HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getScaleX()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getScaleX()F HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getScaleY()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getScaleY()F HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getTranslationX()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getTranslationX()F HSPLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getTranslationY()F PLandroidx/compose/ui/graphics/vector/ImageVector$Builder$GroupParams;->getTranslationY()F Landroidx/compose/ui/graphics/vector/PathBuilder; HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->()V PLandroidx/compose/ui/graphics/vector/PathBuilder;->()V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->addNode(Landroidx/compose/ui/graphics/vector/PathNode;)V HPLandroidx/compose/ui/graphics/vector/PathBuilder;->addNode(Landroidx/compose/ui/graphics/vector/PathNode;)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->arcToRelative(FFZZFF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->close()V PLandroidx/compose/ui/graphics/vector/PathBuilder;->close()V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->curveTo(FFFFFF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->curveTo(FFFFFF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->curveToRelative(FFFFFF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->curveToRelative(FFFFFF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->getNodes()Ljava/util/ArrayList; PLandroidx/compose/ui/graphics/vector/PathBuilder;->getNodes()Ljava/util/ArrayList; HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->horizontalLineTo(F)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->horizontalLineTo(F)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->horizontalLineToRelative(F)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->horizontalLineToRelative(F)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->lineTo(FF)V HPLandroidx/compose/ui/graphics/vector/PathBuilder;->lineTo(FF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->lineToRelative(FF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->lineToRelative(FF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->moveTo(FF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->moveTo(FF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->moveToRelative(FF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->moveToRelative(FF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->reflectiveCurveTo(FFFF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->reflectiveCurveTo(FFFF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->reflectiveCurveToRelative(FFFF)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->reflectiveCurveToRelative(FFFF)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->verticalLineTo(F)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->verticalLineTo(F)V HSPLandroidx/compose/ui/graphics/vector/PathBuilder;->verticalLineToRelative(F)V PLandroidx/compose/ui/graphics/vector/PathBuilder;->verticalLineToRelative(F)V Landroidx/compose/ui/graphics/vector/PathComponent; HSPLandroidx/compose/ui/graphics/vector/PathComponent;->()V HPLandroidx/compose/ui/graphics/vector/PathComponent;->()V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HPLandroidx/compose/ui/graphics/vector/PathComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setFill(Landroidx/compose/ui/graphics/Brush;)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setFill(Landroidx/compose/ui/graphics/Brush;)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setFillAlpha(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setFillAlpha(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setPathData(Ljava/util/List;)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setPathData(Ljava/util/List;)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setPathFillType-oQ8Xj4U(I)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setPathFillType-oQ8Xj4U(I)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setStroke(Landroidx/compose/ui/graphics/Brush;)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setStroke(Landroidx/compose/ui/graphics/Brush;)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeAlpha(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeAlpha(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineCap-BeK7IIE(I)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineCap-BeK7IIE(I)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineJoin-Ww9F2mQ(I)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineJoin-Ww9F2mQ(I)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineMiter(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineMiter(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineWidth(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setStrokeLineWidth(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setTrimPathEnd(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setTrimPathEnd(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setTrimPathOffset(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setTrimPathOffset(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->setTrimPathStart(F)V PLandroidx/compose/ui/graphics/vector/PathComponent;->setTrimPathStart(F)V HSPLandroidx/compose/ui/graphics/vector/PathComponent;->updateRenderPath()V HPLandroidx/compose/ui/graphics/vector/PathComponent;->updateRenderPath()V Landroidx/compose/ui/graphics/vector/PathNode; HSPLandroidx/compose/ui/graphics/vector/PathNode;->(ZZI)V HPLandroidx/compose/ui/graphics/vector/PathNode;->(ZZI)V HSPLandroidx/compose/ui/graphics/vector/PathNode;->isCurve()Z PLandroidx/compose/ui/graphics/vector/PathNode;->isCurve()Z Landroidx/compose/ui/graphics/vector/PathNode$ArcTo; Landroidx/compose/ui/graphics/vector/PathNode$Close; HSPLandroidx/compose/ui/graphics/vector/PathNode$Close;->()V PLandroidx/compose/ui/graphics/vector/PathNode$Close;->()V HSPLandroidx/compose/ui/graphics/vector/PathNode$Close;->()V PLandroidx/compose/ui/graphics/vector/PathNode$Close;->()V Landroidx/compose/ui/graphics/vector/PathNode$CurveTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->(FFFFFF)V HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->(FFFFFF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getX1()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getX1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getX2()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getX2()F HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getX3()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getX3()F HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getY1()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getY1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getY2()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getY2()F HSPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getY3()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->getY3()F HPLandroidx/compose/ui/graphics/vector/PathNode$CurveTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$HorizontalTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->(F)V HPLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->(F)V HSPLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->getX()F HPLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->getX()F PLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->hashCode()I HPLandroidx/compose/ui/graphics/vector/PathNode$HorizontalTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$LineTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->(FF)V HPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->(FF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->getX()F HPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->getX()F HSPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->getY()F HPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->getY()F HPLandroidx/compose/ui/graphics/vector/PathNode$LineTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$MoveTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->(FF)V HPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->(FF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->getX()F PLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->getX()F HSPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->getY()F HPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->getY()F HPLandroidx/compose/ui/graphics/vector/PathNode$MoveTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$QuadTo; Landroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->(FFFF)V PLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->(FFFF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getX1()F PLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getX1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getX2()F PLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getX2()F HSPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getY1()F PLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getY1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getY2()F PLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->getY2()F PLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->hashCode()I HPLandroidx/compose/ui/graphics/vector/PathNode$ReflectiveCurveTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$ReflectiveQuadTo; Landroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo; PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->(FFFZZFF)V PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getArcStartDx()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getArcStartDx()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getArcStartDy()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getArcStartDy()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getHorizontalEllipseRadius()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getHorizontalEllipseRadius()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getTheta()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getTheta()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getVerticalEllipseRadius()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->getVerticalEllipseRadius()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->hashCode()I PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->isMoreThanHalf()Z HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->isMoreThanHalf()Z PLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->isPositiveArc()Z HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeArcTo;->isPositiveArc()Z Landroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->(FFFFFF)V HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->(FFFFFF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDx1()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDx1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDx2()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDx2()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDx3()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDx3()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDy1()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDy1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDy2()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDy2()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDy3()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->getDy3()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeCurveTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo;->(F)V HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo;->(F)V HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo;->getDx()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo;->getDx()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeHorizontalTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->(FF)V HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->(FF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->getDx()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->getDx()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->getDy()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->getDy()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeLineTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->(FF)V PLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->(FF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->getDx()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->getDx()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->getDy()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->getDy()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->hashCode()I HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeMoveTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$RelativeQuadTo; Landroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->(FFFF)V PLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->(FFFF)V HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDx1()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDx1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDx2()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDx2()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDy1()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDy1()F HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDy2()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->getDy2()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveCurveTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$RelativeReflectiveQuadTo; Landroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo;->(F)V HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo;->(F)V HSPLandroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo;->getDy()F PLandroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo;->getDy()F HPLandroidx/compose/ui/graphics/vector/PathNode$RelativeVerticalTo;->hashCode()I Landroidx/compose/ui/graphics/vector/PathNode$VerticalTo; HSPLandroidx/compose/ui/graphics/vector/PathNode$VerticalTo;->(F)V PLandroidx/compose/ui/graphics/vector/PathNode$VerticalTo;->(F)V HSPLandroidx/compose/ui/graphics/vector/PathNode$VerticalTo;->getY()F PLandroidx/compose/ui/graphics/vector/PathNode$VerticalTo;->getY()F Landroidx/compose/ui/graphics/vector/PathNodeKt; HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->()V PLandroidx/compose/ui/graphics/vector/PathNodeKt;->()V HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->()V PLandroidx/compose/ui/graphics/vector/PathNodeKt;->()V HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->Group(Ljava/lang/String;FFFFFFFLjava/util/List;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/ui/graphics/vector/PathNodeKt;->Group(Ljava/lang/String;FFFFFFFLjava/util/List;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->Path-9cdaXJ4(Ljava/util/List;ILjava/lang/String;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Brush;FFIIFFFFLandroidx/compose/runtime/Composer;III)V HPLandroidx/compose/ui/graphics/vector/PathNodeKt;->Path-9cdaXJ4(Ljava/util/List;ILjava/lang/String;Landroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Brush;FFIIFFFFLandroidx/compose/runtime/Composer;III)V HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->RenderVectorGroup(Landroidx/compose/ui/graphics/vector/VectorGroup;Ljava/util/Map;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/ui/graphics/vector/PathNodeKt;->RenderVectorGroup(Landroidx/compose/ui/graphics/vector/VectorGroup;Ljava/util/Map;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->access$getPowersOfTen$cp()[F HPLandroidx/compose/ui/graphics/vector/PathNodeKt;->access$getPowersOfTen$cp()[F HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->rememberVectorPainter(Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/vector/VectorPainter; HPLandroidx/compose/ui/graphics/vector/PathNodeKt;->rememberVectorPainter(Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/vector/VectorPainter; HSPLandroidx/compose/ui/graphics/vector/PathNodeKt;->rememberVectorPainter-vIP8VLU(FFFFLjava/lang/String;JIZLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/Composer;I)Landroidx/compose/ui/graphics/vector/VectorPainter; HPLandroidx/compose/ui/graphics/vector/PathNodeKt;->rememberVectorPainter-vIP8VLU(FFFFLjava/lang/String;JIZLandroidx/compose/runtime/internal/ComposableLambdaImpl;Landroidx/compose/runtime/Composer;I)Landroidx/compose/ui/graphics/vector/VectorPainter; Landroidx/compose/ui/graphics/vector/PathParserKt; HPLandroidx/compose/ui/graphics/vector/PathParserKt;->drawArc(Landroidx/compose/ui/graphics/Path;DDDDDDDZZ)V HSPLandroidx/compose/ui/graphics/vector/PathParserKt;->toPath(Ljava/util/List;Landroidx/compose/ui/graphics/Path;)V HPLandroidx/compose/ui/graphics/vector/PathParserKt;->toPath(Ljava/util/List;Landroidx/compose/ui/graphics/Path;)V Landroidx/compose/ui/graphics/vector/VNode; HSPLandroidx/compose/ui/graphics/vector/VNode;->()V HPLandroidx/compose/ui/graphics/vector/VNode;->()V HSPLandroidx/compose/ui/graphics/vector/VNode;->getInvalidateListener$ui_release()Lkotlin/jvm/functions/Function0; PLandroidx/compose/ui/graphics/vector/VNode;->getInvalidateListener$ui_release()Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/ui/graphics/vector/VNode;->invalidate()V HPLandroidx/compose/ui/graphics/vector/VNode;->invalidate()V HSPLandroidx/compose/ui/graphics/vector/VNode;->setInvalidateListener$ui_release(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/graphics/vector/VNode;->setInvalidateListener$ui_release(Lkotlin/jvm/functions/Function0;)V Landroidx/compose/ui/graphics/vector/VectorApplier; HSPLandroidx/compose/ui/graphics/vector/VectorApplier;->(Landroidx/compose/ui/graphics/vector/GroupComponent;)V PLandroidx/compose/ui/graphics/vector/VectorApplier;->(Landroidx/compose/ui/graphics/vector/GroupComponent;)V HSPLandroidx/compose/ui/graphics/vector/VectorApplier;->asGroup(Landroidx/compose/ui/graphics/vector/VNode;)Landroidx/compose/ui/graphics/vector/GroupComponent; PLandroidx/compose/ui/graphics/vector/VectorApplier;->asGroup(Landroidx/compose/ui/graphics/vector/VNode;)Landroidx/compose/ui/graphics/vector/GroupComponent; HSPLandroidx/compose/ui/graphics/vector/VectorApplier;->insertBottomUp(ILjava/lang/Object;)V PLandroidx/compose/ui/graphics/vector/VectorApplier;->insertBottomUp(ILjava/lang/Object;)V HSPLandroidx/compose/ui/graphics/vector/VectorApplier;->insertTopDown(ILjava/lang/Object;)V PLandroidx/compose/ui/graphics/vector/VectorApplier;->insertTopDown(ILjava/lang/Object;)V HSPLandroidx/compose/ui/graphics/vector/VectorApplier;->onClear()V PLandroidx/compose/ui/graphics/vector/VectorApplier;->onClear()V Landroidx/compose/ui/graphics/vector/VectorComponent; HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->()V HPLandroidx/compose/ui/graphics/vector/VectorComponent;->()V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->access$doInvalidate(Landroidx/compose/ui/graphics/vector/VectorComponent;)V PLandroidx/compose/ui/graphics/vector/VectorComponent;->access$doInvalidate(Landroidx/compose/ui/graphics/vector/VectorComponent;)V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;FLandroidx/compose/ui/graphics/ColorFilter;)V HPLandroidx/compose/ui/graphics/vector/VectorComponent;->draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;FLandroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->getRoot()Landroidx/compose/ui/graphics/vector/GroupComponent; PLandroidx/compose/ui/graphics/vector/VectorComponent;->getRoot()Landroidx/compose/ui/graphics/vector/GroupComponent; HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->getViewportHeight()F PLandroidx/compose/ui/graphics/vector/VectorComponent;->getViewportHeight()F HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->getViewportWidth()F PLandroidx/compose/ui/graphics/vector/VectorComponent;->getViewportWidth()F HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->setIntrinsicColorFilter$ui_release(Landroidx/compose/ui/graphics/ColorFilter;)V PLandroidx/compose/ui/graphics/vector/VectorComponent;->setIntrinsicColorFilter$ui_release(Landroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->setInvalidateCallback$ui_release(Landroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;)V PLandroidx/compose/ui/graphics/vector/VectorComponent;->setInvalidateCallback$ui_release(Landroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;)V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->setName(Ljava/lang/String;)V PLandroidx/compose/ui/graphics/vector/VectorComponent;->setName(Ljava/lang/String;)V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->setViewportHeight(F)V PLandroidx/compose/ui/graphics/vector/VectorComponent;->setViewportHeight(F)V HSPLandroidx/compose/ui/graphics/vector/VectorComponent;->setViewportWidth(F)V PLandroidx/compose/ui/graphics/vector/VectorComponent;->setViewportWidth(F)V Landroidx/compose/ui/graphics/vector/VectorComposeKt$Group$4; Landroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1; HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1;->()V PLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1;->()V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1;->(I)V PLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1;->(I)V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1; HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->()V PLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->()V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->(I)V PLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->(I)V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->invoke(Landroidx/compose/ui/graphics/vector/GroupComponent;F)V HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->invoke(Landroidx/compose/ui/graphics/vector/GroupComponent;F)V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->invoke(Landroidx/compose/ui/graphics/vector/PathComponent;F)V HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->invoke(Landroidx/compose/ui/graphics/vector/PathComponent;F)V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorComposeKt$Path$3; Landroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1; HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;->invoke()V HPLandroidx/compose/ui/graphics/vector/VectorComposeKt$Path-9cdaXJ4$$inlined$ComposeNode$1;->invoke()V Landroidx/compose/ui/graphics/vector/VectorConfig; HSPLandroidx/compose/ui/graphics/vector/VectorConfig;->getOrDefault(Landroidx/compose/ui/graphics/vector/PathNodeKt;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorConfig;->getOrDefault(Landroidx/compose/ui/graphics/vector/PathNodeKt;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorGroup; HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->(Ljava/lang/String;FFFFFFFLjava/util/List;Ljava/util/List;)V HPLandroidx/compose/ui/graphics/vector/VectorGroup;->(Ljava/lang/String;FFFFFFFLjava/util/List;Ljava/util/List;)V HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->access$getChildren$p(Landroidx/compose/ui/graphics/vector/VectorGroup;)Ljava/util/List; PLandroidx/compose/ui/graphics/vector/VectorGroup;->access$getChildren$p(Landroidx/compose/ui/graphics/vector/VectorGroup;)Ljava/util/List; HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/graphics/vector/VectorGroup;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getClipPathData()Ljava/util/List; PLandroidx/compose/ui/graphics/vector/VectorGroup;->getClipPathData()Ljava/util/List; HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getName()Ljava/lang/String; PLandroidx/compose/ui/graphics/vector/VectorGroup;->getName()Ljava/lang/String; HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getPivotX()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getPivotX()F HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getPivotY()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getPivotY()F HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getRotation()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getRotation()F HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getScaleX()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getScaleX()F HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getScaleY()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getScaleY()F HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getTranslationX()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getTranslationX()F HSPLandroidx/compose/ui/graphics/vector/VectorGroup;->getTranslationY()F PLandroidx/compose/ui/graphics/vector/VectorGroup;->getTranslationY()F HPLandroidx/compose/ui/graphics/vector/VectorGroup;->hashCode()I Landroidx/compose/ui/graphics/vector/VectorGroup$iterator$1; HSPLandroidx/compose/ui/graphics/vector/VectorGroup$iterator$1;->(Landroidx/compose/ui/graphics/vector/VectorGroup;)V PLandroidx/compose/ui/graphics/vector/VectorGroup$iterator$1;->(Landroidx/compose/ui/graphics/vector/VectorGroup;)V HSPLandroidx/compose/ui/graphics/vector/VectorGroup$iterator$1;->hasNext()Z HPLandroidx/compose/ui/graphics/vector/VectorGroup$iterator$1;->hasNext()Z HSPLandroidx/compose/ui/graphics/vector/VectorGroup$iterator$1;->next()Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorGroup$iterator$1;->next()Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorKt; HSPLandroidx/compose/ui/graphics/vector/VectorKt;->()V PLandroidx/compose/ui/graphics/vector/VectorKt;->()V HSPLandroidx/compose/ui/graphics/vector/VectorKt;->addPathNodes(Ljava/lang/String;)Ljava/util/List; HPLandroidx/compose/ui/graphics/vector/VectorKt;->addPathNodes(Ljava/lang/String;)Ljava/util/List; HSPLandroidx/compose/ui/graphics/vector/VectorKt;->getEmptyPath()Lkotlin/collections/EmptyList; PLandroidx/compose/ui/graphics/vector/VectorKt;->getEmptyPath()Lkotlin/collections/EmptyList; Landroidx/compose/ui/graphics/vector/VectorNode; HSPLandroidx/compose/ui/graphics/vector/VectorNode;->()V HPLandroidx/compose/ui/graphics/vector/VectorNode;->()V Landroidx/compose/ui/graphics/vector/VectorPainter; HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->()V HPLandroidx/compose/ui/graphics/vector/VectorPainter;->()V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->RenderVector$ui_release(Ljava/lang/String;FFLkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/ui/graphics/vector/VectorPainter;->RenderVector$ui_release(Ljava/lang/String;FFLkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->access$getDrawCount$p(Landroidx/compose/ui/graphics/vector/VectorPainter;)I PLandroidx/compose/ui/graphics/vector/VectorPainter;->access$getDrawCount$p(Landroidx/compose/ui/graphics/vector/VectorPainter;)I HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->access$getInvalidateCount(Landroidx/compose/ui/graphics/vector/VectorPainter;)I HPLandroidx/compose/ui/graphics/vector/VectorPainter;->access$getInvalidateCount(Landroidx/compose/ui/graphics/vector/VectorPainter;)I HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->access$getVector$p(Landroidx/compose/ui/graphics/vector/VectorPainter;)Landroidx/compose/ui/graphics/vector/VectorComponent; PLandroidx/compose/ui/graphics/vector/VectorPainter;->access$getVector$p(Landroidx/compose/ui/graphics/vector/VectorPainter;)Landroidx/compose/ui/graphics/vector/VectorComponent; HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->access$setInvalidateCount(Landroidx/compose/ui/graphics/vector/VectorPainter;I)V PLandroidx/compose/ui/graphics/vector/VectorPainter;->access$setInvalidateCount(Landroidx/compose/ui/graphics/vector/VectorPainter;I)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->applyColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)V PLandroidx/compose/ui/graphics/vector/VectorPainter;->applyColorFilter(Landroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->getIntrinsicSize-NH-jbRc()J PLandroidx/compose/ui/graphics/vector/VectorPainter;->getIntrinsicSize-NH-jbRc()J HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->onDraw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HPLandroidx/compose/ui/graphics/vector/VectorPainter;->onDraw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->setAutoMirror$ui_release(Z)V PLandroidx/compose/ui/graphics/vector/VectorPainter;->setAutoMirror$ui_release(Z)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->setIntrinsicColorFilter$ui_release(Landroidx/compose/ui/graphics/ColorFilter;)V PLandroidx/compose/ui/graphics/vector/VectorPainter;->setIntrinsicColorFilter$ui_release(Landroidx/compose/ui/graphics/ColorFilter;)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter;->setSize-uvyYCjk$ui_release(J)V PLandroidx/compose/ui/graphics/vector/VectorPainter;->setSize-uvyYCjk$ui_release(J)V Landroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2; HSPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2;->(Ljava/lang/Object;I)V HPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2$invoke$$inlined$onDispose$1; HSPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/Composition;)V PLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/Composition;)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$2$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$3; HSPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$3;->(Landroidx/compose/ui/graphics/vector/VectorPainter;Ljava/lang/String;FFLkotlin/jvm/functions/Function4;I)V PLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$3;->(Landroidx/compose/ui/graphics/vector/VectorPainter;Ljava/lang/String;FFLkotlin/jvm/functions/Function4;I)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorPainter$RenderVector$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1; HSPLandroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1;->(ILjava/lang/Object;Ljava/lang/Object;)V PLandroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1;->invoke(Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorPainter$composeVector$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$2; HSPLandroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$2;->(Landroidx/compose/ui/graphics/vector/VectorGroup;Ljava/util/Map;II)V HPLandroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$2;->(Landroidx/compose/ui/graphics/vector/VectorGroup;Ljava/util/Map;II)V HSPLandroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$config$1; HSPLandroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$config$1;->()V HPLandroidx/compose/ui/graphics/vector/VectorPainterKt$RenderVectorGroup$config$1;->()V Landroidx/compose/ui/graphics/vector/VectorPainterKt$rememberVectorPainter$3; HSPLandroidx/compose/ui/graphics/vector/VectorPainterKt$rememberVectorPainter$3;->(Landroidx/compose/ui/graphics/vector/ImageVector;)V PLandroidx/compose/ui/graphics/vector/VectorPainterKt$rememberVectorPainter$3;->(Landroidx/compose/ui/graphics/vector/ImageVector;)V HSPLandroidx/compose/ui/graphics/vector/VectorPainterKt$rememberVectorPainter$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/graphics/vector/VectorPainterKt$rememberVectorPainter$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/graphics/vector/VectorPath; HSPLandroidx/compose/ui/graphics/vector/VectorPath;->(Ljava/lang/String;Ljava/util/List;ILandroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Brush;FFIIFFFF)V HPLandroidx/compose/ui/graphics/vector/VectorPath;->(Ljava/lang/String;Ljava/util/List;ILandroidx/compose/ui/graphics/Brush;FLandroidx/compose/ui/graphics/Brush;FFIIFFFF)V HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getFill()Landroidx/compose/ui/graphics/Brush; PLandroidx/compose/ui/graphics/vector/VectorPath;->getFill()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getFillAlpha()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getFillAlpha()F HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getName()Ljava/lang/String; PLandroidx/compose/ui/graphics/vector/VectorPath;->getName()Ljava/lang/String; HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getPathData()Ljava/util/List; PLandroidx/compose/ui/graphics/vector/VectorPath;->getPathData()Ljava/util/List; HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getPathFillType-Rg-k1Os()I PLandroidx/compose/ui/graphics/vector/VectorPath;->getPathFillType-Rg-k1Os()I HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getStroke()Landroidx/compose/ui/graphics/Brush; PLandroidx/compose/ui/graphics/vector/VectorPath;->getStroke()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeAlpha()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeAlpha()F HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineCap-KaPHkGw()I PLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineCap-KaPHkGw()I HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineJoin-LxFBmk8()I PLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineJoin-LxFBmk8()I HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineMiter()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineMiter()F HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineWidth()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getStrokeLineWidth()F HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getTrimPathEnd()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getTrimPathEnd()F HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getTrimPathOffset()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getTrimPathOffset()F HSPLandroidx/compose/ui/graphics/vector/VectorPath;->getTrimPathStart()F PLandroidx/compose/ui/graphics/vector/VectorPath;->getTrimPathStart()F HPLandroidx/compose/ui/graphics/vector/VectorPath;->hashCode()I Landroidx/compose/ui/graphics/vector/VectorProperty$Fill; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$Fill;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$Fill;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$Fill;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$Fill;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$FillAlpha; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$FillAlpha;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$FillAlpha;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$FillAlpha;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$FillAlpha;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$PathData; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$PathData;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$PathData;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$PathData;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$PathData;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$PivotX; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$PivotX;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$PivotX;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$PivotX;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$PivotX;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$PivotY; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$PivotY;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$PivotY;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$PivotY;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$PivotY;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$Rotation; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$Rotation;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$Rotation;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$Rotation;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$Rotation;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$ScaleX; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleX;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleX;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleX;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleX;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$ScaleY; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleY;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleY;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleY;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$ScaleY;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$Stroke; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$Stroke;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$Stroke;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$Stroke;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$Stroke;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$StrokeAlpha; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeAlpha;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeAlpha;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeAlpha;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeAlpha;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$StrokeLineWidth; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeLineWidth;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeLineWidth;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeLineWidth;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$StrokeLineWidth;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$TranslateX; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateX;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateX;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateX;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateX;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$TranslateY; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateY;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateY;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateY;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TranslateY;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$TrimPathEnd; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathEnd;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathEnd;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathEnd;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathEnd;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$TrimPathOffset; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathOffset;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathOffset;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathOffset;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathOffset;->()V Landroidx/compose/ui/graphics/vector/VectorProperty$TrimPathStart; HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathStart;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathStart;->()V HSPLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathStart;->()V PLandroidx/compose/ui/graphics/vector/VectorProperty$TrimPathStart;->()V Landroidx/compose/ui/graphics/vector/compat/AndroidVectorParser; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->(Lorg/xmlpull/v1/XmlPullParser;)V PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->(Lorg/xmlpull/v1/XmlPullParser;)V HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getDimension(Landroid/content/res/TypedArray;I)F HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getDimension(Landroid/content/res/TypedArray;I)F HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getFloat(Landroid/content/res/TypedArray;I)F HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getFloat(Landroid/content/res/TypedArray;I)F HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getInt(Landroid/content/res/TypedArray;)I PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getInt(Landroid/content/res/TypedArray;)I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedBoolean(Landroid/content/res/TypedArray;)Z PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedBoolean(Landroid/content/res/TypedArray;)Z HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedComplexColor(Landroid/content/res/TypedArray;Landroid/content/res/Resources$Theme;Ljava/lang/String;I)Landroidx/core/content/res/ComplexColorCompat; HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedComplexColor(Landroid/content/res/TypedArray;Landroid/content/res/Resources$Theme;Ljava/lang/String;I)Landroidx/core/content/res/ComplexColorCompat; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedFloat(Landroid/content/res/TypedArray;Ljava/lang/String;IF)F HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedFloat(Landroid/content/res/TypedArray;Ljava/lang/String;IF)F HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedInt(Landroid/content/res/TypedArray;Ljava/lang/String;II)I HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getNamedInt(Landroid/content/res/TypedArray;Ljava/lang/String;II)I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getString(Landroid/content/res/TypedArray;I)Ljava/lang/String; HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getString(Landroid/content/res/TypedArray;I)Ljava/lang/String; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getXmlParser()Lorg/xmlpull/v1/XmlPullParser; PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->getXmlParser()Lorg/xmlpull/v1/XmlPullParser; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->updateConfig(I)V HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;->updateConfig(I)V Landroidx/compose/ui/graphics/vector/compat/AndroidVectorResources; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->()V PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->()V HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_CLIP_PATH()[I PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_CLIP_PATH()[I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_GROUP()[I PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_GROUP()[I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_PATH()[I PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_PATH()[I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY()[I PLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->getSTYLEABLE_VECTOR_DRAWABLE_TYPE_ARRAY()[I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->obtainBrushFromComplexColor(Landroidx/core/content/res/ComplexColorCompat;)Landroidx/compose/ui/graphics/Brush; HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->obtainBrushFromComplexColor(Landroidx/core/content/res/ComplexColorCompat;)Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->parseCurrentVectorNode(Landroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;Landroid/content/res/Resources;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;Landroidx/compose/ui/graphics/vector/ImageVector$Builder;I)I HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->parseCurrentVectorNode(Landroidx/compose/ui/graphics/vector/compat/AndroidVectorParser;Landroid/content/res/Resources;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;Landroidx/compose/ui/graphics/vector/ImageVector$Builder;I)I HSPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->seekToStartTag(Landroid/content/res/XmlResourceParser;)V HPLandroidx/compose/ui/graphics/vector/compat/AndroidVectorResources;->seekToStartTag(Landroid/content/res/XmlResourceParser;)V Landroidx/compose/ui/hapticfeedback/PlatformHapticFeedback; HSPLandroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;->(Landroid/view/View;)V PLandroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;->(Landroid/view/View;)V Landroidx/compose/ui/input/InputMode; HSPLandroidx/compose/ui/input/InputMode;->(I)V PLandroidx/compose/ui/input/InputMode;->(I)V HSPLandroidx/compose/ui/input/InputMode;->box-impl(I)Landroidx/compose/ui/input/InputMode; PLandroidx/compose/ui/input/InputMode;->box-impl(I)Landroidx/compose/ui/input/InputMode; HSPLandroidx/compose/ui/input/InputMode;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/input/InputMode;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/input/InputMode;->unbox-impl()I PLandroidx/compose/ui/input/InputMode;->unbox-impl()I Landroidx/compose/ui/input/InputModeManagerImpl; HSPLandroidx/compose/ui/input/InputModeManagerImpl;->(ILkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/input/InputModeManagerImpl;->(ILkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/input/InputModeManagerImpl;->getInputMode-aOaMEAU()I PLandroidx/compose/ui/input/InputModeManagerImpl;->getInputMode-aOaMEAU()I HSPLandroidx/compose/ui/input/InputModeManagerImpl;->setInputMode-iuPiT84(I)V PLandroidx/compose/ui/input/InputModeManagerImpl;->setInputMode-iuPiT84(I)V Landroidx/compose/ui/input/key/KeyInputElement; HSPLandroidx/compose/ui/input/key/KeyInputElement;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/input/key/KeyInputElement;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/input/key/KeyInputElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/input/key/KeyInputElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/ui/input/key/KeyInputModifierNode; Landroidx/compose/ui/input/key/KeyInputNode; HSPLandroidx/compose/ui/input/key/KeyInputNode;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/input/key/KeyInputNode;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/input/key/Key_androidKt; HSPLandroidx/compose/ui/input/key/Key_androidKt;->onKeyEvent(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/input/key/Key_androidKt;->onKeyEvent(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection; Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->()V HPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->()V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->getModifierLocalNode$ui_release()Landroidx/compose/ui/modifier/ModifierLocalModifierNode; PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->getModifierLocalNode$ui_release()Landroidx/compose/ui/modifier/ModifierLocalModifierNode; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->setCalculateNestedScrollScope$ui_release(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->setCalculateNestedScrollScope$ui_release(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->setModifierLocalNode$ui_release(Landroidx/compose/ui/modifier/ModifierLocalModifierNode;)V PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->setModifierLocalNode$ui_release(Landroidx/compose/ui/modifier/ModifierLocalModifierNode;)V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->setScope$ui_release(Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;->setScope$ui_release(Lkotlinx/coroutines/CoroutineScope;)V Landroidx/compose/ui/input/nestedscroll/NestedScrollElement; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V HPLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/input/nestedscroll/NestedScrollElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/ui/input/nestedscroll/NestedScrollModifierKt; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierKt;->nestedScroll(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/input/nestedscroll/NestedScrollModifierKt;->nestedScroll(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/input/nestedscroll/NestedScrollNode; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V HPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->getProvidedValues()Landroidx/compose/ui/text/StringKt; PLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->getProvidedValues()Landroidx/compose/ui/text/StringKt; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->onAttach()V HPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->onAttach()V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->onDetach()V HPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->onDetach()V PLandroidx/compose/ui/input/nestedscroll/NestedScrollNode;->updateNode$ui_release(Landroidx/compose/ui/input/nestedscroll/NestedScrollConnection;Landroidx/compose/ui/input/nestedscroll/NestedScrollDispatcher;)V Landroidx/compose/ui/input/nestedscroll/NestedScrollNode$updateDispatcherFields$1; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode$updateDispatcherFields$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/ui/input/nestedscroll/NestedScrollNode$updateDispatcherFields$1;->(Ljava/lang/Object;I)V Landroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt;->()V PLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt;->()V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt;->getModifierLocalNestedScroll()Landroidx/compose/ui/modifier/ProvidableModifierLocal; PLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt;->getModifierLocalNestedScroll()Landroidx/compose/ui/modifier/ProvidableModifierLocal; Landroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt$ModifierLocalNestedScroll$1; HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt$ModifierLocalNestedScroll$1;->()V PLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt$ModifierLocalNestedScroll$1;->()V HSPLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt$ModifierLocalNestedScroll$1;->()V PLandroidx/compose/ui/input/nestedscroll/NestedScrollNodeKt$ModifierLocalNestedScroll$1;->()V Landroidx/compose/ui/input/pointer/AndroidPointerIconType; HSPLandroidx/compose/ui/input/pointer/AndroidPointerIconType;->(I)V PLandroidx/compose/ui/input/pointer/AndroidPointerIconType;->(I)V Landroidx/compose/ui/input/pointer/AwaitPointerEventScope; PLandroidx/compose/ui/input/pointer/AwaitPointerEventScope;->awaitPointerEvent$default(Landroidx/compose/ui/input/pointer/AwaitPointerEventScope;Lkotlin/coroutines/jvm/internal/BaseContinuationImpl;)Ljava/lang/Object; Landroidx/compose/ui/input/pointer/ConsumedData; HSPLandroidx/compose/ui/input/pointer/ConsumedData;->(ZZ)V HPLandroidx/compose/ui/input/pointer/ConsumedData;->(ZZ)V HSPLandroidx/compose/ui/input/pointer/ConsumedData;->getDownChange()Z PLandroidx/compose/ui/input/pointer/ConsumedData;->getDownChange()Z HSPLandroidx/compose/ui/input/pointer/ConsumedData;->getPositionChange()Z PLandroidx/compose/ui/input/pointer/ConsumedData;->getPositionChange()Z HSPLandroidx/compose/ui/input/pointer/ConsumedData;->setDownChange()V PLandroidx/compose/ui/input/pointer/ConsumedData;->setDownChange()V HSPLandroidx/compose/ui/input/pointer/ConsumedData;->setPositionChange()V PLandroidx/compose/ui/input/pointer/ConsumedData;->setPositionChange()V Landroidx/compose/ui/input/pointer/MotionEventAdapter; HSPLandroidx/compose/ui/input/pointer/MotionEventAdapter;->()V PLandroidx/compose/ui/input/pointer/MotionEventAdapter;->()V HSPLandroidx/compose/ui/input/pointer/MotionEventAdapter;->convertToPointerInputEvent$ui_release(Landroid/view/MotionEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;)Landroidx/compose/ui/input/pointer/PointerInputEvent; HPLandroidx/compose/ui/input/pointer/MotionEventAdapter;->convertToPointerInputEvent$ui_release(Landroid/view/MotionEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;)Landroidx/compose/ui/input/pointer/PointerInputEvent; Landroidx/compose/ui/input/pointer/Node; HSPLandroidx/compose/ui/input/pointer/Node;->(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/input/pointer/Node;->(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/input/pointer/Node;->buildCache(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HPLandroidx/compose/ui/input/pointer/Node;->buildCache(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HSPLandroidx/compose/ui/input/pointer/Node;->cleanUpHits(Landroidx/compose/ui/focus/FocusTransactionManager;)V HPLandroidx/compose/ui/input/pointer/Node;->cleanUpHits(Landroidx/compose/ui/focus/FocusTransactionManager;)V HSPLandroidx/compose/ui/input/pointer/Node;->dispatchFinalEventPass(Landroidx/compose/ui/focus/FocusTransactionManager;)Z HPLandroidx/compose/ui/input/pointer/Node;->dispatchFinalEventPass(Landroidx/compose/ui/focus/FocusTransactionManager;)Z HSPLandroidx/compose/ui/input/pointer/Node;->dispatchMainEventPass(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HPLandroidx/compose/ui/input/pointer/Node;->dispatchMainEventPass(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HSPLandroidx/compose/ui/input/pointer/Node;->getModifierNode()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/input/pointer/Node;->getModifierNode()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/input/pointer/Node;->getPointerIds()Landroidx/compose/runtime/IntStack; PLandroidx/compose/ui/input/pointer/Node;->getPointerIds()Landroidx/compose/runtime/IntStack; Landroidx/compose/ui/input/pointer/NodeParent; HSPLandroidx/compose/ui/input/pointer/NodeParent;->()V HPLandroidx/compose/ui/input/pointer/NodeParent;->()V HSPLandroidx/compose/ui/input/pointer/NodeParent;->buildCache(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HPLandroidx/compose/ui/input/pointer/NodeParent;->buildCache(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HSPLandroidx/compose/ui/input/pointer/NodeParent;->cleanUpHits(Landroidx/compose/ui/focus/FocusTransactionManager;)V HPLandroidx/compose/ui/input/pointer/NodeParent;->cleanUpHits(Landroidx/compose/ui/focus/FocusTransactionManager;)V HSPLandroidx/compose/ui/input/pointer/NodeParent;->dispatchFinalEventPass(Landroidx/compose/ui/focus/FocusTransactionManager;)Z HPLandroidx/compose/ui/input/pointer/NodeParent;->dispatchFinalEventPass(Landroidx/compose/ui/focus/FocusTransactionManager;)Z HSPLandroidx/compose/ui/input/pointer/NodeParent;->dispatchMainEventPass(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HPLandroidx/compose/ui/input/pointer/NodeParent;->dispatchMainEventPass(Landroidx/collection/LongSparseArray;Landroidx/compose/ui/layout/LayoutCoordinates;Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HSPLandroidx/compose/ui/input/pointer/NodeParent;->getChildren()Landroidx/compose/runtime/collection/MutableVector; PLandroidx/compose/ui/input/pointer/NodeParent;->getChildren()Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/ui/input/pointer/NodeParent;->removeDetachedPointerInputFilters()V HPLandroidx/compose/ui/input/pointer/NodeParent;->removeDetachedPointerInputFilters()V Landroidx/compose/ui/input/pointer/PointerEvent; HSPLandroidx/compose/ui/input/pointer/PointerEvent;->(Ljava/util/List;Landroidx/compose/ui/focus/FocusTransactionManager;)V HPLandroidx/compose/ui/input/pointer/PointerEvent;->(Ljava/util/List;Landroidx/compose/ui/focus/FocusTransactionManager;)V HSPLandroidx/compose/ui/input/pointer/PointerEvent;->getChanges()Ljava/util/List; PLandroidx/compose/ui/input/pointer/PointerEvent;->getChanges()Ljava/util/List; HSPLandroidx/compose/ui/input/pointer/PointerEvent;->getMotionEvent$ui_release()Landroid/view/MotionEvent; PLandroidx/compose/ui/input/pointer/PointerEvent;->getMotionEvent$ui_release()Landroid/view/MotionEvent; HSPLandroidx/compose/ui/input/pointer/PointerEvent;->getType-7fucELk()I PLandroidx/compose/ui/input/pointer/PointerEvent;->getType-7fucELk()I Landroidx/compose/ui/input/pointer/PointerEventPass; HSPLandroidx/compose/ui/input/pointer/PointerEventPass;->()V PLandroidx/compose/ui/input/pointer/PointerEventPass;->()V HSPLandroidx/compose/ui/input/pointer/PointerEventPass;->(Ljava/lang/String;I)V PLandroidx/compose/ui/input/pointer/PointerEventPass;->(Ljava/lang/String;I)V Landroidx/compose/ui/input/pointer/PointerEventTimeoutCancellationException; Landroidx/compose/ui/input/pointer/PointerIcon; HSPLandroidx/compose/ui/input/pointer/PointerIcon;->()V PLandroidx/compose/ui/input/pointer/PointerIcon;->()V Landroidx/compose/ui/input/pointer/PointerIcon$Companion; HSPLandroidx/compose/ui/input/pointer/PointerIcon$Companion;->()V PLandroidx/compose/ui/input/pointer/PointerIcon$Companion;->()V HSPLandroidx/compose/ui/input/pointer/PointerIcon$Companion;->()V PLandroidx/compose/ui/input/pointer/PointerIcon$Companion;->()V Landroidx/compose/ui/input/pointer/PointerIconKt$pointerHoverIcon$2$onSetIcon$1; HSPLandroidx/compose/ui/input/pointer/PointerIconKt$pointerHoverIcon$2$onSetIcon$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/input/pointer/PointerIconKt$pointerHoverIcon$2$onSetIcon$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/input/pointer/PointerIconKt$pointerHoverIcon$2$onSetIcon$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/input/pointer/PointerId; PLandroidx/compose/ui/input/pointer/PointerId;->(J)V PLandroidx/compose/ui/input/pointer/PointerId;->box-impl(J)Landroidx/compose/ui/input/pointer/PointerId; HSPLandroidx/compose/ui/input/pointer/PointerId;->equals-impl0(JJ)Z PLandroidx/compose/ui/input/pointer/PointerId;->equals-impl0(JJ)Z Landroidx/compose/ui/input/pointer/PointerInputChange; HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZILjava/util/List;J)V HPLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZILjava/util/List;J)V HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZZIJ)V HPLandroidx/compose/ui/input/pointer/PointerInputChange;->(JJJZFJJZZIJ)V HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->consume()V PLandroidx/compose/ui/input/pointer/PointerInputChange;->consume()V HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->copy-OHpmEuE$default(Landroidx/compose/ui/input/pointer/PointerInputChange;JJLjava/util/ArrayList;)Landroidx/compose/ui/input/pointer/PointerInputChange; HPLandroidx/compose/ui/input/pointer/PointerInputChange;->copy-OHpmEuE$default(Landroidx/compose/ui/input/pointer/PointerInputChange;JJLjava/util/ArrayList;)Landroidx/compose/ui/input/pointer/PointerInputChange; HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getHistorical()Ljava/util/List; PLandroidx/compose/ui/input/pointer/PointerInputChange;->getHistorical()Ljava/util/List; HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getId-J3iCeTQ()J PLandroidx/compose/ui/input/pointer/PointerInputChange;->getId-J3iCeTQ()J HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getPosition-F1C5BW0()J PLandroidx/compose/ui/input/pointer/PointerInputChange;->getPosition-F1C5BW0()J HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getPressed()Z PLandroidx/compose/ui/input/pointer/PointerInputChange;->getPressed()Z HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getPreviousPosition-F1C5BW0()J PLandroidx/compose/ui/input/pointer/PointerInputChange;->getPreviousPosition-F1C5BW0()J HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getPreviousPressed()Z PLandroidx/compose/ui/input/pointer/PointerInputChange;->getPreviousPressed()Z HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->getType-T8wyACA()I PLandroidx/compose/ui/input/pointer/PointerInputChange;->getType-T8wyACA()I PLandroidx/compose/ui/input/pointer/PointerInputChange;->getUptimeMillis()J HSPLandroidx/compose/ui/input/pointer/PointerInputChange;->isConsumed()Z PLandroidx/compose/ui/input/pointer/PointerInputChange;->isConsumed()Z Landroidx/compose/ui/input/pointer/PointerInputChangeEventProducer; HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;->()V PLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;->()V HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;->produce(Landroidx/compose/ui/input/pointer/PointerInputEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;)Landroidx/compose/ui/focus/FocusTransactionManager; HPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer;->produce(Landroidx/compose/ui/input/pointer/PointerInputEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;)Landroidx/compose/ui/focus/FocusTransactionManager; Landroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData; HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->(JJZ)V PLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->(JJZ)V HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->getDown()Z PLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->getDown()Z HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->getPositionOnScreen-F1C5BW0()J PLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->getPositionOnScreen-F1C5BW0()J HSPLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->getUptime()J PLandroidx/compose/ui/input/pointer/PointerInputChangeEventProducer$PointerInputData;->getUptime()J Landroidx/compose/ui/input/pointer/PointerInputEvent; HSPLandroidx/compose/ui/input/pointer/PointerInputEvent;->(Ljava/util/ArrayList;Landroid/view/MotionEvent;)V HPLandroidx/compose/ui/input/pointer/PointerInputEvent;->(Ljava/util/ArrayList;Landroid/view/MotionEvent;)V HSPLandroidx/compose/ui/input/pointer/PointerInputEvent;->getMotionEvent()Landroid/view/MotionEvent; PLandroidx/compose/ui/input/pointer/PointerInputEvent;->getMotionEvent()Landroid/view/MotionEvent; HSPLandroidx/compose/ui/input/pointer/PointerInputEvent;->getPointers()Ljava/util/List; PLandroidx/compose/ui/input/pointer/PointerInputEvent;->getPointers()Ljava/util/List; Landroidx/compose/ui/input/pointer/PointerInputEventData; HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->(JJJJZFIZLjava/util/ArrayList;J)V HPLandroidx/compose/ui/input/pointer/PointerInputEventData;->(JJJJZFIZLjava/util/ArrayList;J)V HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getDown()Z PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getDown()Z HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getHistorical()Ljava/util/List; PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getHistorical()Ljava/util/List; HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getId-J3iCeTQ()J PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getId-J3iCeTQ()J HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getIssuesEnterExit()Z PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getIssuesEnterExit()Z HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getPosition-F1C5BW0()J PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getPosition-F1C5BW0()J HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getPositionOnScreen-F1C5BW0()J PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getPositionOnScreen-F1C5BW0()J HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getPressure()F PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getPressure()F HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getScrollDelta-F1C5BW0()J PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getScrollDelta-F1C5BW0()J HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getType-T8wyACA()I PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getType-T8wyACA()I HSPLandroidx/compose/ui/input/pointer/PointerInputEventData;->getUptime()J PLandroidx/compose/ui/input/pointer/PointerInputEventData;->getUptime()J Landroidx/compose/ui/input/pointer/PointerInputEventProcessor; HSPLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;->(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;->process-BIzXfog(Landroidx/compose/ui/input/pointer/PointerInputEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;Z)I PLandroidx/compose/ui/input/pointer/PointerInputEventProcessor;->process-BIzXfog(Landroidx/compose/ui/input/pointer/PointerInputEvent;Landroidx/compose/ui/input/pointer/PositionCalculator;Z)I PLandroidx/compose/ui/input/pointer/PointerInputResetException;->()V HPLandroidx/compose/ui/input/pointer/PointerInputResetException;->()V PLandroidx/compose/ui/input/pointer/PointerInputResetException;->fillInStackTrace()Ljava/lang/Throwable; HPLandroidx/compose/ui/input/pointer/PointerInputResetException;->fillInStackTrace()Ljava/lang/Throwable; Landroidx/compose/ui/input/pointer/PointerInputScope; Landroidx/compose/ui/input/pointer/PointerInteropFilter; Landroidx/compose/ui/input/pointer/PointerInteropFilter$pointerInputFilter$1; Landroidx/compose/ui/input/pointer/PointerKeyboardModifiers; HSPLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->(I)V PLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->(I)V HSPLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->box-impl(I)Landroidx/compose/ui/input/pointer/PointerKeyboardModifiers; PLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->box-impl(I)Landroidx/compose/ui/input/pointer/PointerKeyboardModifiers; HSPLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/input/pointer/PointerKeyboardModifiers;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/input/pointer/PositionCalculator; Landroidx/compose/ui/input/pointer/ProcessResult; HSPLandroidx/compose/ui/input/pointer/ProcessResult;->()V PLandroidx/compose/ui/input/pointer/ProcessResult;->()V HSPLandroidx/compose/ui/input/pointer/ProcessResult;->changedToDownIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z PLandroidx/compose/ui/input/pointer/ProcessResult;->changedToDownIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z HSPLandroidx/compose/ui/input/pointer/ProcessResult;->changedToUp(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z PLandroidx/compose/ui/input/pointer/ProcessResult;->changedToUp(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z HSPLandroidx/compose/ui/input/pointer/ProcessResult;->changedToUpIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z PLandroidx/compose/ui/input/pointer/ProcessResult;->changedToUpIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z HSPLandroidx/compose/ui/input/pointer/ProcessResult;->getPointerIconDefault()Landroidx/compose/ui/input/pointer/AndroidPointerIconType; PLandroidx/compose/ui/input/pointer/ProcessResult;->getPointerIconDefault()Landroidx/compose/ui/input/pointer/AndroidPointerIconType; HSPLandroidx/compose/ui/input/pointer/ProcessResult;->positionChangeInternal(Landroidx/compose/ui/input/pointer/PointerInputChange;Z)J PLandroidx/compose/ui/input/pointer/ProcessResult;->positionChangeInternal(Landroidx/compose/ui/input/pointer/PointerInputChange;Z)J HSPLandroidx/compose/ui/input/pointer/ProcessResult;->positionChangedIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z PLandroidx/compose/ui/input/pointer/ProcessResult;->positionChangedIgnoreConsumed(Landroidx/compose/ui/input/pointer/PointerInputChange;)Z Landroidx/compose/ui/input/pointer/SuspendPointerInputElement; HSPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->(Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;Lkotlin/jvm/functions/Function2;I)V HPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->(Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;Lkotlin/jvm/functions/Function2;I)V HSPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/input/pointer/SuspendPointerInputElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->()V PLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->()V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->access$getEmptyPointerEvent$p()Landroidx/compose/ui/input/pointer/PointerEvent; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->access$getEmptyPointerEvent$p()Landroidx/compose/ui/input/pointer/PointerEvent; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->pointerInput(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputFilterKt;->pointerInput(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNode; Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->(Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->access$getCurrentEvent$p(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;)Landroidx/compose/ui/input/pointer/PointerEvent; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->access$getCurrentEvent$p(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;)Landroidx/compose/ui/input/pointer/PointerEvent; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->access$getPointerHandlers$p(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;)Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->awaitPointerEventScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->awaitPointerEventScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->dispatchPointerEvent(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;)V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->dispatchPointerEvent(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;)V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->getPointerInputHandler()Lkotlin/jvm/functions/Function2; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->getPointerInputHandler()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->getSize-YbymL2g()J PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->getSize-YbymL2g()J HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->onDetach()V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->onDetach()V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->resetPointerInputHandler()V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;->resetPointerInputHandler()V Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;Lkotlinx/coroutines/CancellableContinuationImpl;)V PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->awaitPointerEvent(Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->awaitPointerEvent(Landroidx/compose/ui/input/pointer/PointerEventPass;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->cancel(Ljava/lang/Throwable;)V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->cancel(Ljava/lang/Throwable;)V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getCurrentEvent()Landroidx/compose/ui/input/pointer/PointerEvent; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getCurrentEvent()Landroidx/compose/ui/input/pointer/PointerEvent; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->offerPointerEvent(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;)V PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->offerPointerEvent(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;)V PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->resumeWith(Ljava/lang/Object;)V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$PointerEventHandlerCoroutine;->resumeWith(Ljava/lang/Object;)V Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;Lkotlin/coroutines/Continuation;)V HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->(Landroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/input/pointer/SuspendingPointerInputModifierNodeImpl$onPointerEvent$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/input/pointer/util/DataPointAtTime; PLandroidx/compose/ui/input/pointer/util/DataPointAtTime;->(JF)V Landroidx/compose/ui/input/pointer/util/VelocityTracker; HSPLandroidx/compose/ui/input/pointer/util/VelocityTracker;->()V PLandroidx/compose/ui/input/pointer/util/VelocityTracker;->()V PLandroidx/compose/ui/input/pointer/util/VelocityTracker;->addPosition-Uv8p0NA(JJ)V PLandroidx/compose/ui/input/pointer/util/VelocityTracker;->getCurrentPointerPositionAccumulator-F1C5BW0$ui_release()J PLandroidx/compose/ui/input/pointer/util/VelocityTracker;->resetTracking()V PLandroidx/compose/ui/input/pointer/util/VelocityTracker;->setCurrentPointerPositionAccumulator-k-4lQ0M$ui_release(J)V Landroidx/compose/ui/input/pointer/util/VelocityTracker1D; HSPLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->()V HPLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->()V PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->addDataPoint(JF)V PLandroidx/compose/ui/input/pointer/util/VelocityTracker1D;->resetTracking()V PLandroidx/compose/ui/input/pointer/util/VelocityTrackerKt;->()V PLandroidx/compose/ui/input/pointer/util/VelocityTrackerKt;->addPointerInputChange(Landroidx/compose/ui/input/pointer/util/VelocityTracker;Landroidx/compose/ui/input/pointer/PointerInputChange;)V PLandroidx/compose/ui/input/pointer/util/VelocityTrackerKt;->getVelocityTrackerAddPointsFix()Z Landroidx/compose/ui/input/rotary/RotaryInputElement; HSPLandroidx/compose/ui/input/rotary/RotaryInputElement;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/input/rotary/RotaryInputElement;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/input/rotary/RotaryInputElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/input/rotary/RotaryInputElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/ui/input/rotary/RotaryInputModifierKt; HSPLandroidx/compose/ui/input/rotary/RotaryInputModifierKt;->onRotaryScrollEvent(Landroidx/compose/ui/Modifier$Companion;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/input/rotary/RotaryInputModifierKt;->onRotaryScrollEvent(Landroidx/compose/ui/Modifier$Companion;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/input/rotary/RotaryInputModifierNode; Landroidx/compose/ui/input/rotary/RotaryInputNode; HSPLandroidx/compose/ui/input/rotary/RotaryInputNode;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/input/rotary/RotaryInputNode;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/layout/AlignmentLine; HSPLandroidx/compose/ui/layout/AlignmentLine;->(Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/layout/AlignmentLine;->(Lkotlin/jvm/functions/Function2;)V Landroidx/compose/ui/layout/AlignmentLineKt; HSPLandroidx/compose/ui/layout/AlignmentLineKt;->()V PLandroidx/compose/ui/layout/AlignmentLineKt;->()V HSPLandroidx/compose/ui/layout/AlignmentLineKt;->getFirstBaseline()Landroidx/compose/ui/layout/HorizontalAlignmentLine; PLandroidx/compose/ui/layout/AlignmentLineKt;->getFirstBaseline()Landroidx/compose/ui/layout/HorizontalAlignmentLine; HSPLandroidx/compose/ui/layout/AlignmentLineKt;->getLastBaseline()Landroidx/compose/ui/layout/HorizontalAlignmentLine; PLandroidx/compose/ui/layout/AlignmentLineKt;->getLastBaseline()Landroidx/compose/ui/layout/HorizontalAlignmentLine; Landroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1; HSPLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;->()V PLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;->()V HSPLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;->()V PLandroidx/compose/ui/layout/AlignmentLineKt$FirstBaseline$1;->()V Landroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1; HSPLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;->()V PLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;->()V HSPLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;->()V PLandroidx/compose/ui/layout/AlignmentLineKt$LastBaseline$1;->()V Landroidx/compose/ui/layout/BeyondBoundsLayout; Landroidx/compose/ui/layout/BeyondBoundsLayout$BeyondBoundsScope; PLandroidx/compose/ui/layout/BeyondBoundsLayoutKt;->()V PLandroidx/compose/ui/layout/BeyondBoundsLayoutKt;->getModifierLocalBeyondBoundsLayout()Landroidx/compose/ui/modifier/ProvidableModifierLocal; Landroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt; HSPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt;->()V PLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt;->()V Landroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1; HSPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;->()V PLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;->()V HSPLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;->()V PLandroidx/compose/ui/layout/ComposableSingletons$SubcomposeLayoutKt$lambda-1$1;->()V Landroidx/compose/ui/layout/ContentScale; Landroidx/compose/ui/layout/ContentScale$Companion; HSPLandroidx/compose/ui/layout/ContentScale$Companion;->()V PLandroidx/compose/ui/layout/ContentScale$Companion;->()V HSPLandroidx/compose/ui/layout/ContentScale$Companion;->()V PLandroidx/compose/ui/layout/ContentScale$Companion;->()V HSPLandroidx/compose/ui/layout/ContentScale$Companion;->getFit()Lorg/acra/file/CrashReportPersister; PLandroidx/compose/ui/layout/ContentScale$Companion;->getFit()Lorg/acra/file/CrashReportPersister; Landroidx/compose/ui/layout/FixedScale; HSPLandroidx/compose/ui/layout/FixedScale;->()V PLandroidx/compose/ui/layout/FixedScale;->()V Landroidx/compose/ui/layout/HorizontalAlignmentLine; HSPLandroidx/compose/ui/layout/HorizontalAlignmentLine;->(Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/layout/HorizontalAlignmentLine;->(Lkotlin/jvm/functions/Function2;)V Landroidx/compose/ui/layout/IntrinsicMeasurable; Landroidx/compose/ui/layout/IntrinsicMeasureScope; Landroidx/compose/ui/layout/LayoutCoordinates; Landroidx/compose/ui/layout/LayoutElement; HSPLandroidx/compose/ui/layout/LayoutElement;->(Lkotlin/jvm/functions/Function3;)V PLandroidx/compose/ui/layout/LayoutElement;->(Lkotlin/jvm/functions/Function3;)V HSPLandroidx/compose/ui/layout/LayoutElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/layout/LayoutElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/layout/LayoutElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/layout/LayoutElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/layout/LayoutElement;->update(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/layout/LayoutElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/ui/layout/LayoutIdElement; HSPLandroidx/compose/ui/layout/LayoutIdElement;->(Ljava/lang/Object;)V HPLandroidx/compose/ui/layout/LayoutIdElement;->(Ljava/lang/Object;)V HSPLandroidx/compose/ui/layout/LayoutIdElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/layout/LayoutIdElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/layout/LayoutIdElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/layout/LayoutIdElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/layout/LayoutIdModifier; HSPLandroidx/compose/ui/layout/LayoutIdModifier;->(Ljava/lang/Object;)V HPLandroidx/compose/ui/layout/LayoutIdModifier;->(Ljava/lang/Object;)V HSPLandroidx/compose/ui/layout/LayoutIdModifier;->getLayoutId()Ljava/lang/Object; PLandroidx/compose/ui/layout/LayoutIdModifier;->getLayoutId()Ljava/lang/Object; HSPLandroidx/compose/ui/layout/LayoutIdModifier;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/layout/LayoutIdModifier;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/layout/LayoutIdParentData; Landroidx/compose/ui/layout/LayoutKt; HSPLandroidx/compose/ui/layout/LayoutKt;->ScaleFactor(FF)J HPLandroidx/compose/ui/layout/LayoutKt;->ScaleFactor(FF)J HSPLandroidx/compose/ui/layout/LayoutKt;->SubcomposeLayout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/ui/layout/LayoutKt;->SubcomposeLayout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/ui/layout/LayoutKt;->SubcomposeLayout(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLandroidx/compose/ui/layout/LayoutKt;->SubcomposeLayout(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLandroidx/compose/ui/layout/LayoutKt;->access$computeFillMinDimension-iLBOSCw(JJ)F HPLandroidx/compose/ui/layout/LayoutKt;->access$computeFillMinDimension-iLBOSCw(JJ)F HSPLandroidx/compose/ui/layout/LayoutKt;->boundsInWindow(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/geometry/Rect; HPLandroidx/compose/ui/layout/LayoutKt;->boundsInWindow(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/layout/LayoutKt;->findRootCoordinates(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/layout/LayoutCoordinates; HPLandroidx/compose/ui/layout/LayoutKt;->findRootCoordinates(Landroidx/compose/ui/layout/LayoutCoordinates;)Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/layout/LayoutKt;->getLayoutId(Landroidx/compose/ui/layout/Measurable;)Ljava/lang/Object; HPLandroidx/compose/ui/layout/LayoutKt;->getLayoutId(Landroidx/compose/ui/layout/Measurable;)Ljava/lang/Object; HSPLandroidx/compose/ui/layout/LayoutKt;->layout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/layout/LayoutKt;->layout(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function3;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/layout/LayoutKt;->layoutId(Landroidx/compose/ui/Modifier;Ljava/lang/Object;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/layout/LayoutKt;->layoutId(Landroidx/compose/ui/Modifier;Ljava/lang/Object;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/layout/LayoutKt;->modifierMaterializerOf(Landroidx/compose/ui/Modifier;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; HPLandroidx/compose/ui/layout/LayoutKt;->modifierMaterializerOf(Landroidx/compose/ui/Modifier;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; HSPLandroidx/compose/ui/layout/LayoutKt;->onGloballyPositioned(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; PLandroidx/compose/ui/layout/LayoutKt;->onGloballyPositioned(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/layout/LayoutKt;->onSizeChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/layout/LayoutKt;->onSizeChanged(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HSPLandroidx/compose/ui/layout/LayoutKt;->times-UQTWf7w(JJ)J HPLandroidx/compose/ui/layout/LayoutKt;->times-UQTWf7w(JJ)J Landroidx/compose/ui/layout/LayoutKt$materializerOf$1; HSPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->(Landroidx/compose/ui/Modifier;I)V HPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->(Landroidx/compose/ui/Modifier;I)V HSPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->invoke-Deg8D_g(Landroidx/compose/runtime/Composer;Landroidx/compose/runtime/Composer;)V HPLandroidx/compose/ui/layout/LayoutKt$materializerOf$1;->invoke-Deg8D_g(Landroidx/compose/runtime/Composer;Landroidx/compose/runtime/Composer;)V Landroidx/compose/ui/layout/LayoutModifier; Landroidx/compose/ui/layout/LayoutModifierImpl; HSPLandroidx/compose/ui/layout/LayoutModifierImpl;->(Lkotlin/jvm/functions/Function3;)V HPLandroidx/compose/ui/layout/LayoutModifierImpl;->(Lkotlin/jvm/functions/Function3;)V HSPLandroidx/compose/ui/layout/LayoutModifierImpl;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/layout/LayoutModifierImpl;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/ui/layout/LayoutModifierImpl;->setMeasureBlock(Lkotlin/jvm/functions/Function3;)V PLandroidx/compose/ui/layout/LayoutModifierImpl;->setMeasureBlock(Lkotlin/jvm/functions/Function3;)V Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$getCurrentIndex$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)I PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$getCurrentIndex$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)I HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$getRoot$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$getRoot$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$getScope$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope; PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$getScope$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$setCurrentIndex$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;I)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->access$setCurrentIndex$p(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;I)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->createMeasurePolicy(Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1; PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->createMeasurePolicy(Lkotlin/jvm/functions/Function2;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->disposeCurrentNodes()V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->disposeCurrentNodes()V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->disposeOrReuseStartingFromIndex(I)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->disposeOrReuseStartingFromIndex(I)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->forceRecomposeChildren()V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->forceRecomposeChildren()V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->makeSureStateIsConsistent()V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->makeSureStateIsConsistent()V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->setCompositionContext(Landroidx/compose/runtime/CompositionContext;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->setCompositionContext(Landroidx/compose/runtime/CompositionContext;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->setSlotReusePolicy(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->setSlotReusePolicy(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->subcompose(Landroidx/compose/ui/node/LayoutNode;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->subcompose(Landroidx/compose/ui/node/LayoutNode;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->subcompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/util/List; HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->subcompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/util/List; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->takeNodeFromReusables(Ljava/lang/Object;)Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState;->takeNodeFromReusables(Ljava/lang/Object;)Landroidx/compose/ui/node/LayoutNode; Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->(Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->(Ljava/lang/Object;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getActive()Z HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getActive()Z HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getComposition()Landroidx/compose/runtime/Composition; PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getComposition()Landroidx/compose/runtime/Composition; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getContent()Lkotlin/jvm/functions/Function2; PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getContent()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getForceRecompose()Z PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->getForceRecompose()Z HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->setComposition(Landroidx/compose/runtime/Composition;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->setComposition(Landroidx/compose/runtime/Composition;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->setContent(Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->setContent(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->setForceRecompose(Z)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;->setForceRecompose(Z)V Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$PostLookaheadMeasureScopeImpl; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$PostLookaheadMeasureScopeImpl;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$PostLookaheadMeasureScopeImpl;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getDensity()F PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getDensity()F HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->isLookingAhead()Z PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->isLookingAhead()Z HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->setDensity(F)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->setDensity(F)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->setFontScale(F)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->setFontScale(F)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->subcompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/util/List; HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$Scope;->subcompose(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/util/List; Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Lkotlin/jvm/functions/Function2;Ljava/lang/String;)V PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;Lkotlin/jvm/functions/Function2;Ljava/lang/String;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->(Landroidx/compose/ui/layout/MeasureResult;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;ILandroidx/compose/ui/layout/MeasureResult;I)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->(Landroidx/compose/ui/layout/MeasureResult;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;ILandroidx/compose/ui/layout/MeasureResult;I)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getAlignmentLines()Ljava/util/Map; PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getAlignmentLines()Ljava/util/Map; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getHeight()I PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getHeight()I HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getWidth()I PLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->getWidth()I HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->placeChildren()V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1;->placeChildren()V Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$3$1$1; HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$3$1$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;Lkotlin/jvm/functions/Function2;)V HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$3$1$1;->(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState$NodeState;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$3$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/layout/LayoutNodeSubcompositionsState$subcompose$3$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/layout/LookaheadLayoutCoordinatesImpl; Landroidx/compose/ui/layout/Measurable; Landroidx/compose/ui/layout/MeasurePolicy; Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/ui/layout/MeasureScope; HSPLandroidx/compose/ui/layout/MeasureScope;->layout$default(Landroidx/compose/ui/layout/MeasureScope;IILkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/layout/MeasureScope;->layout$default(Landroidx/compose/ui/layout/MeasureScope;IILkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/ui/layout/MeasureScope;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/layout/MeasureScope;->layout(IILjava/util/Map;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/ui/layout/MeasureScope$layout$1; HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->(IILjava/util/Map;Landroidx/compose/ui/layout/MeasureScope;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/layout/MeasureScope$layout$1;->(IILjava/util/Map;Landroidx/compose/ui/layout/MeasureScope;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getAlignmentLines()Ljava/util/Map; HPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getAlignmentLines()Ljava/util/Map; HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getHeight()I HPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getHeight()I HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getWidth()I HPLandroidx/compose/ui/layout/MeasureScope$layout$1;->getWidth()I HSPLandroidx/compose/ui/layout/MeasureScope$layout$1;->placeChildren()V HPLandroidx/compose/ui/layout/MeasureScope$layout$1;->placeChildren()V Landroidx/compose/ui/layout/Measured; Landroidx/compose/ui/layout/OnGloballyPositionedElement; HSPLandroidx/compose/ui/layout/OnGloballyPositionedElement;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/layout/OnGloballyPositionedElement;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/layout/OnGloballyPositionedElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/layout/OnGloballyPositionedElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/ui/layout/OnGloballyPositionedNode; HSPLandroidx/compose/ui/layout/OnGloballyPositionedNode;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/layout/OnGloballyPositionedNode;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/layout/OnGloballyPositionedNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V PLandroidx/compose/ui/layout/OnGloballyPositionedNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V Landroidx/compose/ui/layout/OnRemeasuredModifier; Landroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1; HSPLandroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V PLandroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1;->invoke(Landroidx/compose/ui/layout/Placeable$PlacementScope;)V HSPLandroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/layout/OnRemeasuredModifierKt$onSizeChanged$$inlined$debugInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/layout/OnSizeChangedModifier; HSPLandroidx/compose/ui/layout/OnSizeChangedModifier;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/layout/OnSizeChangedModifier;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/layout/OnSizeChangedModifier;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/layout/OnSizeChangedModifier;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/layout/OnSizeChangedModifier;->onRemeasured-ozmzZPI(J)V PLandroidx/compose/ui/layout/OnSizeChangedModifier;->onRemeasured-ozmzZPI(J)V Landroidx/compose/ui/layout/PinnableContainer; Landroidx/compose/ui/layout/PinnableContainer$PinnedHandle; Landroidx/compose/ui/layout/PinnableContainerKt; HSPLandroidx/compose/ui/layout/PinnableContainerKt;->()V PLandroidx/compose/ui/layout/PinnableContainerKt;->()V HSPLandroidx/compose/ui/layout/PinnableContainerKt;->getLocalPinnableContainer()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/ui/layout/PinnableContainerKt;->getLocalPinnableContainer()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Landroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1; HSPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->()V PLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->()V HSPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->(I)V PLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->(I)V HSPLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/layout/PinnableContainerKt$LocalPinnableContainer$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/layout/Placeable; HSPLandroidx/compose/ui/layout/Placeable;->()V HPLandroidx/compose/ui/layout/Placeable;->()V HSPLandroidx/compose/ui/layout/Placeable;->access$getApparentToRealOffset-nOcc-ac(Landroidx/compose/ui/layout/Placeable;)J HPLandroidx/compose/ui/layout/Placeable;->access$getApparentToRealOffset-nOcc-ac(Landroidx/compose/ui/layout/Placeable;)J HSPLandroidx/compose/ui/layout/Placeable;->getApparentToRealOffset-nOcc-ac()J PLandroidx/compose/ui/layout/Placeable;->getApparentToRealOffset-nOcc-ac()J HSPLandroidx/compose/ui/layout/Placeable;->getHeight()I HPLandroidx/compose/ui/layout/Placeable;->getHeight()I HSPLandroidx/compose/ui/layout/Placeable;->getLastMeasurementConstraints-msEJaDk$ui_release()J PLandroidx/compose/ui/layout/Placeable;->getLastMeasurementConstraints-msEJaDk$ui_release()J HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredHeight()I PLandroidx/compose/ui/layout/Placeable;->getMeasuredHeight()I HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredSize-YbymL2g()J HPLandroidx/compose/ui/layout/Placeable;->getMeasuredSize-YbymL2g()J HSPLandroidx/compose/ui/layout/Placeable;->getMeasuredWidth()I PLandroidx/compose/ui/layout/Placeable;->getMeasuredWidth()I HSPLandroidx/compose/ui/layout/Placeable;->getMeasurementConstraints-msEJaDk()J PLandroidx/compose/ui/layout/Placeable;->getMeasurementConstraints-msEJaDk()J HSPLandroidx/compose/ui/layout/Placeable;->getSize-YbymL2g()J PLandroidx/compose/ui/layout/Placeable;->getSize-YbymL2g()J HSPLandroidx/compose/ui/layout/Placeable;->getWidth()I HPLandroidx/compose/ui/layout/Placeable;->getWidth()I HSPLandroidx/compose/ui/layout/Placeable;->onMeasuredSizeChanged()V HPLandroidx/compose/ui/layout/Placeable;->onMeasuredSizeChanged()V HSPLandroidx/compose/ui/layout/Placeable;->setMeasuredSize-ozmzZPI(J)V PLandroidx/compose/ui/layout/Placeable;->setMeasuredSize-ozmzZPI(J)V HSPLandroidx/compose/ui/layout/Placeable;->setMeasurementConstraints-BRTryo0(J)V HPLandroidx/compose/ui/layout/Placeable;->setMeasurementConstraints-BRTryo0(J)V Landroidx/compose/ui/layout/Placeable$PlacementScope; HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->()V PLandroidx/compose/ui/layout/Placeable$PlacementScope;->()V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->()V PLandroidx/compose/ui/layout/Placeable$PlacementScope;->()V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$getLayoutDelegate$cp()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate; PLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$getLayoutDelegate$cp()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate; HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$getParentLayoutDirection$cp()Landroidx/compose/ui/unit/LayoutDirection; HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$getParentLayoutDirection$cp()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$getParentWidth$cp()I PLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$getParentWidth$cp()I HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$get_coordinates$cp()Landroidx/compose/ui/layout/LayoutCoordinates; PLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$get_coordinates$cp()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$setLayoutDelegate$cp(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$setLayoutDelegate$cp(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$setParentLayoutDirection$cp(Landroidx/compose/ui/unit/LayoutDirection;)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$setParentLayoutDirection$cp(Landroidx/compose/ui/unit/LayoutDirection;)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$setParentWidth$cp(I)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$setParentWidth$cp(I)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$set_coordinates$cp(Landroidx/compose/ui/layout/LayoutCoordinates;)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->access$set_coordinates$cp(Landroidx/compose/ui/layout/LayoutCoordinates;)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place(Landroidx/compose/ui/layout/Placeable;IIF)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place(Landroidx/compose/ui/layout/Placeable;IIF)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place-70tqf50$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V PLandroidx/compose/ui/layout/Placeable$PlacementScope;->place-70tqf50$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place-70tqf50(Landroidx/compose/ui/layout/Placeable;JF)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->place-70tqf50(Landroidx/compose/ui/layout/Placeable;JF)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelative$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelative$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelativeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeRelativeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;II)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;IILkotlin/jvm/functions/Function1;I)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;IILkotlin/jvm/functions/Function1;I)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer(Landroidx/compose/ui/layout/Placeable;IIFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer(Landroidx/compose/ui/layout/Placeable;IIFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer-aW-9-wM$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer-aW-9-wM$default(Landroidx/compose/ui/layout/Placeable$PlacementScope;Landroidx/compose/ui/layout/Placeable;J)V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer-aW-9-wM(Landroidx/compose/ui/layout/Placeable;JFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/layout/Placeable$PlacementScope;->placeWithLayer-aW-9-wM(Landroidx/compose/ui/layout/Placeable;JFLkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/layout/Placeable$PlacementScope$Companion; HSPLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;->()V PLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;->()V HSPLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;->access$configureForPlacingForAlignment(Landroidx/compose/ui/node/LookaheadCapablePlaceable;)Z HPLandroidx/compose/ui/layout/Placeable$PlacementScope$Companion;->access$configureForPlacingForAlignment(Landroidx/compose/ui/node/LookaheadCapablePlaceable;)Z Landroidx/compose/ui/layout/PlaceableKt; HSPLandroidx/compose/ui/layout/PlaceableKt;->()V PLandroidx/compose/ui/layout/PlaceableKt;->()V HSPLandroidx/compose/ui/layout/PlaceableKt;->access$getDefaultConstraints$p()J PLandroidx/compose/ui/layout/PlaceableKt;->access$getDefaultConstraints$p()J HSPLandroidx/compose/ui/layout/PlaceableKt;->access$getDefaultLayerBlock$p()Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/layout/PlaceableKt;->access$getDefaultLayerBlock$p()Lkotlin/jvm/functions/Function1; Landroidx/compose/ui/layout/Remeasurement; Landroidx/compose/ui/layout/RemeasurementModifier; Landroidx/compose/ui/layout/RootMeasurePolicy; HSPLandroidx/compose/ui/layout/RootMeasurePolicy;->()V PLandroidx/compose/ui/layout/RootMeasurePolicy;->()V HSPLandroidx/compose/ui/layout/RootMeasurePolicy;->()V PLandroidx/compose/ui/layout/RootMeasurePolicy;->()V HSPLandroidx/compose/ui/layout/RootMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; PLandroidx/compose/ui/layout/RootMeasurePolicy;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Ljava/util/List;J)Landroidx/compose/ui/layout/MeasureResult; Landroidx/compose/ui/layout/RootMeasurePolicy$measure$1; HSPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->()V PLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->()V HSPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->(I)V PLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->(I)V HSPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/layout/RootMeasurePolicy$measure$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/layout/ScaleFactor; HSPLandroidx/compose/ui/layout/ScaleFactor;->()V PLandroidx/compose/ui/layout/ScaleFactor;->()V HSPLandroidx/compose/ui/layout/ScaleFactor;->getScaleX-impl(J)F PLandroidx/compose/ui/layout/ScaleFactor;->getScaleX-impl(J)F HSPLandroidx/compose/ui/layout/ScaleFactor;->getScaleY-impl(J)F HPLandroidx/compose/ui/layout/ScaleFactor;->getScaleY-impl(J)F Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1; HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$$inlined$ComposeNode$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/State;)V HPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;->(Landroidx/compose/runtime/State;)V HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;->dispose()V HPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$5$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$6; HSPLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$6;->(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;II)V PLandroidx/compose/ui/layout/SubcomposeLayoutKt$SubcomposeLayout$6;->(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;II)V Landroidx/compose/ui/layout/SubcomposeLayoutState; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V PLandroidx/compose/ui/layout/SubcomposeLayoutState;->(Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy;)V HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->access$getSlotReusePolicy$p(Landroidx/compose/ui/layout/SubcomposeLayoutState;)Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy; PLandroidx/compose/ui/layout/SubcomposeLayoutState;->access$getSlotReusePolicy$p(Landroidx/compose/ui/layout/SubcomposeLayoutState;)Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->access$getState(Landroidx/compose/ui/layout/SubcomposeLayoutState;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; PLandroidx/compose/ui/layout/SubcomposeLayoutState;->access$getState(Landroidx/compose/ui/layout/SubcomposeLayoutState;)Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->access$set_state$p(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V PLandroidx/compose/ui/layout/SubcomposeLayoutState;->access$set_state$p(Landroidx/compose/ui/layout/SubcomposeLayoutState;Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->disposeCurrentNodes$ui_release()V PLandroidx/compose/ui/layout/SubcomposeLayoutState;->disposeCurrentNodes$ui_release()V HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->forceRecomposeChildren$ui_release()V HPLandroidx/compose/ui/layout/SubcomposeLayoutState;->forceRecomposeChildren$ui_release()V HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->getSetCompositionContext$ui_release()Lkotlin/jvm/functions/Function2; PLandroidx/compose/ui/layout/SubcomposeLayoutState;->getSetCompositionContext$ui_release()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->getSetMeasurePolicy$ui_release()Lkotlin/jvm/functions/Function2; PLandroidx/compose/ui/layout/SubcomposeLayoutState;->getSetMeasurePolicy$ui_release()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->getSetRoot$ui_release()Lkotlin/jvm/functions/Function2; PLandroidx/compose/ui/layout/SubcomposeLayoutState;->getSetRoot$ui_release()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState;->getState()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; PLandroidx/compose/ui/layout/SubcomposeLayoutState;->getState()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; Landroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1; HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->(Landroidx/compose/ui/layout/SubcomposeLayoutState;I)V PLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->(Landroidx/compose/ui/layout/SubcomposeLayoutState;I)V HSPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/layout/SubcomposeLayoutState$setRoot$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/layout/SubcomposeMeasureScope; Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy; Landroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet; HSPLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->()V HPLandroidx/compose/ui/layout/SubcomposeSlotReusePolicy$SlotIdsSet;->()V Landroidx/compose/ui/modifier/BackwardsCompatLocalMap; HSPLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->(Landroidx/compose/ui/modifier/ModifierLocalProvider;)V PLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->(Landroidx/compose/ui/modifier/ModifierLocalProvider;)V HSPLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z PLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z HSPLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->get$ui_release(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; PLandroidx/compose/ui/modifier/BackwardsCompatLocalMap;->get$ui_release(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; Landroidx/compose/ui/modifier/EmptyMap; HSPLandroidx/compose/ui/modifier/EmptyMap;->()V PLandroidx/compose/ui/modifier/EmptyMap;->()V HSPLandroidx/compose/ui/modifier/EmptyMap;->()V PLandroidx/compose/ui/modifier/EmptyMap;->()V HSPLandroidx/compose/ui/modifier/EmptyMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z PLandroidx/compose/ui/modifier/EmptyMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z Landroidx/compose/ui/modifier/ModifierLocal; HSPLandroidx/compose/ui/modifier/ModifierLocal;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/modifier/ModifierLocal;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/modifier/ModifierLocal;->getDefaultFactory$ui_release()Lkotlin/jvm/functions/Function0; PLandroidx/compose/ui/modifier/ModifierLocal;->getDefaultFactory$ui_release()Lkotlin/jvm/functions/Function0; Landroidx/compose/ui/modifier/ModifierLocalConsumer; Landroidx/compose/ui/modifier/ModifierLocalManager; HSPLandroidx/compose/ui/modifier/ModifierLocalManager;->(Landroidx/compose/ui/node/Owner;)V PLandroidx/compose/ui/modifier/ModifierLocalManager;->(Landroidx/compose/ui/node/Owner;)V HSPLandroidx/compose/ui/modifier/ModifierLocalManager;->invalidate()V PLandroidx/compose/ui/modifier/ModifierLocalManager;->invalidate()V HSPLandroidx/compose/ui/modifier/ModifierLocalManager;->removedProvider(Landroidx/compose/ui/node/BackwardsCompatNode;Landroidx/compose/ui/modifier/ProvidableModifierLocal;)V PLandroidx/compose/ui/modifier/ModifierLocalManager;->removedProvider(Landroidx/compose/ui/node/BackwardsCompatNode;Landroidx/compose/ui/modifier/ProvidableModifierLocal;)V HSPLandroidx/compose/ui/modifier/ModifierLocalManager;->triggerUpdates()V HPLandroidx/compose/ui/modifier/ModifierLocalManager;->triggerUpdates()V Landroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1; HSPLandroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1;->(Landroidx/compose/ui/modifier/ModifierLocalManager;)V PLandroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1;->(Landroidx/compose/ui/modifier/ModifierLocalManager;)V HSPLandroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/modifier/ModifierLocalManager$invalidate$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/modifier/ModifierLocalModifierNode; HSPLandroidx/compose/ui/modifier/ModifierLocalModifierNode;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; HPLandroidx/compose/ui/modifier/ModifierLocalModifierNode;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; HSPLandroidx/compose/ui/modifier/ModifierLocalModifierNode;->getProvidedValues()Landroidx/compose/ui/text/StringKt; HPLandroidx/compose/ui/modifier/ModifierLocalModifierNode;->getProvidedValues()Landroidx/compose/ui/text/StringKt; Landroidx/compose/ui/modifier/ModifierLocalProvider; Landroidx/compose/ui/modifier/ModifierLocalReadScope; Landroidx/compose/ui/modifier/ProvidableModifierLocal; HSPLandroidx/compose/ui/modifier/ProvidableModifierLocal;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/modifier/ProvidableModifierLocal;->(Lkotlin/jvm/functions/Function0;)V Landroidx/compose/ui/modifier/SingleLocalMap; HSPLandroidx/compose/ui/modifier/SingleLocalMap;->(Landroidx/compose/ui/modifier/ModifierLocal;)V HPLandroidx/compose/ui/modifier/SingleLocalMap;->(Landroidx/compose/ui/modifier/ModifierLocal;)V HSPLandroidx/compose/ui/modifier/SingleLocalMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z PLandroidx/compose/ui/modifier/SingleLocalMap;->contains$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;)Z PLandroidx/compose/ui/modifier/SingleLocalMap;->get$ui_release(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; HSPLandroidx/compose/ui/modifier/SingleLocalMap;->set$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;Ljava/lang/Object;)V HPLandroidx/compose/ui/modifier/SingleLocalMap;->set$ui_release(Landroidx/compose/ui/modifier/ModifierLocal;Ljava/lang/Object;)V Landroidx/compose/ui/node/AlignmentLines; HSPLandroidx/compose/ui/node/AlignmentLines;->(Landroidx/compose/ui/node/AlignmentLinesOwner;)V HPLandroidx/compose/ui/node/AlignmentLines;->(Landroidx/compose/ui/node/AlignmentLinesOwner;)V HSPLandroidx/compose/ui/node/AlignmentLines;->access$addAlignmentLine(Landroidx/compose/ui/node/AlignmentLines;Landroidx/compose/ui/layout/AlignmentLine;ILandroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/AlignmentLines;->access$addAlignmentLine(Landroidx/compose/ui/node/AlignmentLines;Landroidx/compose/ui/layout/AlignmentLine;ILandroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/AlignmentLines;->access$getAlignmentLineMap$p(Landroidx/compose/ui/node/AlignmentLines;)Ljava/util/HashMap; PLandroidx/compose/ui/node/AlignmentLines;->access$getAlignmentLineMap$p(Landroidx/compose/ui/node/AlignmentLines;)Ljava/util/HashMap; HSPLandroidx/compose/ui/node/AlignmentLines;->getAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; PLandroidx/compose/ui/node/AlignmentLines;->getAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; HSPLandroidx/compose/ui/node/AlignmentLines;->getDirty$ui_release()Z PLandroidx/compose/ui/node/AlignmentLines;->getDirty$ui_release()Z HSPLandroidx/compose/ui/node/AlignmentLines;->getLastCalculation()Ljava/util/HashMap; PLandroidx/compose/ui/node/AlignmentLines;->getLastCalculation()Ljava/util/HashMap; HSPLandroidx/compose/ui/node/AlignmentLines;->getQueried$ui_release()Z PLandroidx/compose/ui/node/AlignmentLines;->getQueried$ui_release()Z HSPLandroidx/compose/ui/node/AlignmentLines;->getRequired$ui_release()Z HPLandroidx/compose/ui/node/AlignmentLines;->getRequired$ui_release()Z HSPLandroidx/compose/ui/node/AlignmentLines;->getUsedDuringParentLayout$ui_release()Z PLandroidx/compose/ui/node/AlignmentLines;->getUsedDuringParentLayout$ui_release()Z HSPLandroidx/compose/ui/node/AlignmentLines;->onAlignmentsChanged()V HPLandroidx/compose/ui/node/AlignmentLines;->onAlignmentsChanged()V HSPLandroidx/compose/ui/node/AlignmentLines;->recalculate()V HPLandroidx/compose/ui/node/AlignmentLines;->recalculate()V HSPLandroidx/compose/ui/node/AlignmentLines;->recalculateQueryOwner()V HPLandroidx/compose/ui/node/AlignmentLines;->recalculateQueryOwner()V HSPLandroidx/compose/ui/node/AlignmentLines;->reset$ui_release()V PLandroidx/compose/ui/node/AlignmentLines;->reset$ui_release()V HSPLandroidx/compose/ui/node/AlignmentLines;->setPreviousUsedDuringParentLayout$ui_release(Z)V PLandroidx/compose/ui/node/AlignmentLines;->setPreviousUsedDuringParentLayout$ui_release(Z)V HSPLandroidx/compose/ui/node/AlignmentLines;->setUsedByModifierLayout$ui_release(Z)V PLandroidx/compose/ui/node/AlignmentLines;->setUsedByModifierLayout$ui_release(Z)V HSPLandroidx/compose/ui/node/AlignmentLines;->setUsedByModifierMeasurement$ui_release(Z)V PLandroidx/compose/ui/node/AlignmentLines;->setUsedByModifierMeasurement$ui_release(Z)V HSPLandroidx/compose/ui/node/AlignmentLines;->setUsedDuringParentLayout$ui_release(Z)V PLandroidx/compose/ui/node/AlignmentLines;->setUsedDuringParentLayout$ui_release(Z)V HSPLandroidx/compose/ui/node/AlignmentLines;->setUsedDuringParentMeasurement$ui_release(Z)V PLandroidx/compose/ui/node/AlignmentLines;->setUsedDuringParentMeasurement$ui_release(Z)V Landroidx/compose/ui/node/AlignmentLines$recalculate$1; HSPLandroidx/compose/ui/node/AlignmentLines$recalculate$1;->(Landroidx/compose/ui/node/LookaheadAlignmentLines;)V HPLandroidx/compose/ui/node/AlignmentLines$recalculate$1;->(Landroidx/compose/ui/node/LookaheadAlignmentLines;)V HSPLandroidx/compose/ui/node/AlignmentLines$recalculate$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/node/AlignmentLines$recalculate$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/node/AlignmentLinesOwner; Landroidx/compose/ui/node/BackwardsCompatNode; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->(Landroidx/compose/ui/Modifier$Element;)V HPLandroidx/compose/ui/node/BackwardsCompatNode;->(Landroidx/compose/ui/Modifier$Element;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V PLandroidx/compose/ui/node/BackwardsCompatNode;->draw(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; HPLandroidx/compose/ui/node/BackwardsCompatNode;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getElement()Landroidx/compose/ui/Modifier$Element; PLandroidx/compose/ui/node/BackwardsCompatNode;->getElement()Landroidx/compose/ui/Modifier$Element; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->getProvidedValues()Landroidx/compose/ui/text/StringKt; HPLandroidx/compose/ui/node/BackwardsCompatNode;->getProvidedValues()Landroidx/compose/ui/text/StringKt; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->initializeModifier(Z)V HPLandroidx/compose/ui/node/BackwardsCompatNode;->initializeModifier(Z)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/node/BackwardsCompatNode;->measure-3p2s80s(Landroidx/compose/ui/layout/MeasureScope;Landroidx/compose/ui/layout/Measurable;J)Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/node/BackwardsCompatNode;->modifyParentData(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onAttach()V HPLandroidx/compose/ui/node/BackwardsCompatNode;->onAttach()V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onDetach()V HPLandroidx/compose/ui/node/BackwardsCompatNode;->onDetach()V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V PLandroidx/compose/ui/node/BackwardsCompatNode;->onGloballyPositioned(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onMeasureResultChanged()V HPLandroidx/compose/ui/node/BackwardsCompatNode;->onMeasureResultChanged()V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/BackwardsCompatNode;->onPlaced(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->onRemeasured-ozmzZPI(J)V PLandroidx/compose/ui/node/BackwardsCompatNode;->onRemeasured-ozmzZPI(J)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->setElement(Landroidx/compose/ui/Modifier$Element;)V HPLandroidx/compose/ui/node/BackwardsCompatNode;->setElement(Landroidx/compose/ui/Modifier$Element;)V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->unInitializeModifier()V HPLandroidx/compose/ui/node/BackwardsCompatNode;->unInitializeModifier()V HSPLandroidx/compose/ui/node/BackwardsCompatNode;->updateModifierLocalConsumer()V HPLandroidx/compose/ui/node/BackwardsCompatNode;->updateModifierLocalConsumer()V Landroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2; HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->(Landroidx/compose/ui/node/BackwardsCompatNode;I)V HPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->(Landroidx/compose/ui/node/BackwardsCompatNode;I)V HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->invoke()V HPLandroidx/compose/ui/node/BackwardsCompatNode$initializeModifier$2;->invoke()V Landroidx/compose/ui/node/BackwardsCompatNodeKt; HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt;->()V PLandroidx/compose/ui/node/BackwardsCompatNodeKt;->()V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt;->access$getDetachedModifierLocalReadScope$p()Landroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1; PLandroidx/compose/ui/node/BackwardsCompatNodeKt;->access$getDetachedModifierLocalReadScope$p()Landroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1; HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt;->access$getUpdateModifierLocalConsumer$p()Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/node/BackwardsCompatNodeKt;->access$getUpdateModifierLocalConsumer$p()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt;->access$isChainUpdate(Landroidx/compose/ui/node/BackwardsCompatNode;)Z HPLandroidx/compose/ui/node/BackwardsCompatNodeKt;->access$isChainUpdate(Landroidx/compose/ui/node/BackwardsCompatNode;)Z Landroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1; HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;->()V PLandroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;->()V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; PLandroidx/compose/ui/node/BackwardsCompatNodeKt$DetachedModifierLocalReadScope$1;->getCurrent(Landroidx/compose/ui/modifier/ProvidableModifierLocal;)Ljava/lang/Object; Landroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1; HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->()V PLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->()V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->(I)V PLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->(I)V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Landroidx/compose/ui/node/AlignmentLinesOwner;)V HPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Landroidx/compose/ui/node/AlignmentLinesOwner;)V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/node/BackwardsCompatNodeKt$onDrawCacheReadsChanged$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/node/CanFocusChecker; HSPLandroidx/compose/ui/node/CanFocusChecker;->()V PLandroidx/compose/ui/node/CanFocusChecker;->()V HSPLandroidx/compose/ui/node/CanFocusChecker;->()V PLandroidx/compose/ui/node/CanFocusChecker;->()V HSPLandroidx/compose/ui/node/CanFocusChecker;->isCanFocusSet()Z PLandroidx/compose/ui/node/CanFocusChecker;->isCanFocusSet()Z HSPLandroidx/compose/ui/node/CanFocusChecker;->reset()V PLandroidx/compose/ui/node/CanFocusChecker;->reset()V HSPLandroidx/compose/ui/node/CanFocusChecker;->setCanFocus(Z)V PLandroidx/compose/ui/node/CanFocusChecker;->setCanFocus(Z)V Landroidx/compose/ui/node/ComposeUiNode; HSPLandroidx/compose/ui/node/ComposeUiNode;->()V PLandroidx/compose/ui/node/ComposeUiNode;->()V Landroidx/compose/ui/node/ComposeUiNode$Companion; HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->()V PLandroidx/compose/ui/node/ComposeUiNode$Companion;->()V HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->()V PLandroidx/compose/ui/node/ComposeUiNode$Companion;->()V HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getConstructor()Lkotlin/jvm/functions/Function0; HPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getConstructor()Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetCompositeKeyHash()Lkotlin/jvm/functions/Function2; HPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetCompositeKeyHash()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetMeasurePolicy()Lkotlin/jvm/functions/Function2; HPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetMeasurePolicy()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetModifier()Lkotlin/jvm/functions/Function2; PLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetModifier()Lkotlin/jvm/functions/Function2; HSPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetResolvedCompositionLocals()Lkotlin/jvm/functions/Function2; HPLandroidx/compose/ui/node/ComposeUiNode$Companion;->getSetResolvedCompositionLocals()Lkotlin/jvm/functions/Function2; Landroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1; HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->()V PLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->()V HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->(I)V PLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->(I)V HSPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/node/ComposeUiNode$Companion$SetDensity$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode; Landroidx/compose/ui/node/DelegatableNode; Landroidx/compose/ui/node/DelegatableNodeKt; HSPLandroidx/compose/ui/node/DelegatableNodeKt;->access$addLayoutNodeChildren(Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/node/DelegatableNodeKt;->access$addLayoutNodeChildren(Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/node/DelegatableNodeKt;->access$pop(Landroidx/compose/runtime/collection/MutableVector;)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/DelegatableNodeKt;->access$pop(Landroidx/compose/runtime/collection/MutableVector;)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/DelegatableNodeKt;->asLayoutModifierNode(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/node/LayoutModifierNode; HPLandroidx/compose/ui/node/DelegatableNodeKt;->asLayoutModifierNode(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/node/LayoutModifierNode; HSPLandroidx/compose/ui/node/DelegatableNodeKt;->requireCoordinator-64DMado(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/DelegatableNodeKt;->requireCoordinator-64DMado(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/DelegatableNodeKt;->requireLayoutNode(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/node/DelegatableNodeKt;->requireLayoutNode(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/DelegatableNodeKt;->requireOwner(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/Owner; HPLandroidx/compose/ui/node/DelegatableNodeKt;->requireOwner(Landroidx/compose/ui/node/DelegatableNode;)Landroidx/compose/ui/node/Owner; Landroidx/compose/ui/node/DelegatingNode; HSPLandroidx/compose/ui/node/DelegatingNode;->()V HPLandroidx/compose/ui/node/DelegatingNode;->()V HSPLandroidx/compose/ui/node/DelegatingNode;->delegate(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/DelegatingNode;->delegate(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/DelegatingNode;->getDelegate$ui_release()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/node/DelegatingNode;->getDelegate$ui_release()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/DelegatingNode;->getSelfKindSet$ui_release()I PLandroidx/compose/ui/node/DelegatingNode;->getSelfKindSet$ui_release()I HSPLandroidx/compose/ui/node/DelegatingNode;->markAsAttached$ui_release()V HPLandroidx/compose/ui/node/DelegatingNode;->markAsAttached$ui_release()V HSPLandroidx/compose/ui/node/DelegatingNode;->markAsDetached$ui_release()V HPLandroidx/compose/ui/node/DelegatingNode;->markAsDetached$ui_release()V HSPLandroidx/compose/ui/node/DelegatingNode;->runAttachLifecycle$ui_release()V HPLandroidx/compose/ui/node/DelegatingNode;->runAttachLifecycle$ui_release()V HSPLandroidx/compose/ui/node/DelegatingNode;->runDetachLifecycle$ui_release()V HPLandroidx/compose/ui/node/DelegatingNode;->runDetachLifecycle$ui_release()V HSPLandroidx/compose/ui/node/DelegatingNode;->updateCoordinator$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/DelegatingNode;->updateCoordinator$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V Landroidx/compose/ui/node/DepthSortedSet; HSPLandroidx/compose/ui/node/DepthSortedSet;->()V PLandroidx/compose/ui/node/DepthSortedSet;->()V HSPLandroidx/compose/ui/node/DepthSortedSet;->add(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/DepthSortedSet;->add(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/DepthSortedSet;->contains(Landroidx/compose/ui/node/LayoutNode;)Z HPLandroidx/compose/ui/node/DepthSortedSet;->contains(Landroidx/compose/ui/node/LayoutNode;)Z HSPLandroidx/compose/ui/node/DepthSortedSet;->isEmpty()Z HPLandroidx/compose/ui/node/DepthSortedSet;->isEmpty()Z HSPLandroidx/compose/ui/node/DepthSortedSet;->pop()Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/node/DepthSortedSet;->pop()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/DepthSortedSet;->remove(Landroidx/compose/ui/node/LayoutNode;)Z HPLandroidx/compose/ui/node/DepthSortedSet;->remove(Landroidx/compose/ui/node/LayoutNode;)Z Landroidx/compose/ui/node/DepthSortedSet$DepthComparator$1; HSPLandroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;->()V PLandroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;->()V HSPLandroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HPLandroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I Landroidx/compose/ui/node/DrawModifierNode; HSPLandroidx/compose/ui/node/DrawModifierNode;->onMeasureResultChanged()V HPLandroidx/compose/ui/node/DrawModifierNode;->onMeasureResultChanged()V Landroidx/compose/ui/node/GlobalPositionAwareModifierNode; Landroidx/compose/ui/node/HitTestResult; HSPLandroidx/compose/ui/node/HitTestResult;->()V PLandroidx/compose/ui/node/HitTestResult;->()V HSPLandroidx/compose/ui/node/HitTestResult;->access$getHitDepth$p(Landroidx/compose/ui/node/HitTestResult;)I PLandroidx/compose/ui/node/HitTestResult;->access$getHitDepth$p(Landroidx/compose/ui/node/HitTestResult;)I HSPLandroidx/compose/ui/node/HitTestResult;->access$setHitDepth$p(Landroidx/compose/ui/node/HitTestResult;I)V PLandroidx/compose/ui/node/HitTestResult;->access$setHitDepth$p(Landroidx/compose/ui/node/HitTestResult;I)V HSPLandroidx/compose/ui/node/HitTestResult;->clear()V PLandroidx/compose/ui/node/HitTestResult;->clear()V HSPLandroidx/compose/ui/node/HitTestResult;->findBestHitDistance-ptXAw2c()J HPLandroidx/compose/ui/node/HitTestResult;->findBestHitDistance-ptXAw2c()J HSPLandroidx/compose/ui/node/HitTestResult;->get(I)Ljava/lang/Object; HPLandroidx/compose/ui/node/HitTestResult;->get(I)Ljava/lang/Object; HSPLandroidx/compose/ui/node/HitTestResult;->hasHit()Z PLandroidx/compose/ui/node/HitTestResult;->hasHit()Z HSPLandroidx/compose/ui/node/HitTestResult;->hitInMinimumTouchTarget(Landroidx/compose/ui/Modifier$Node;FZLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/node/HitTestResult;->hitInMinimumTouchTarget(Landroidx/compose/ui/Modifier$Node;FZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/HitTestResult;->isEmpty()Z PLandroidx/compose/ui/node/HitTestResult;->isEmpty()Z HSPLandroidx/compose/ui/node/HitTestResult;->resizeToHitDepth()V HPLandroidx/compose/ui/node/HitTestResult;->resizeToHitDepth()V HSPLandroidx/compose/ui/node/HitTestResult;->size()I HPLandroidx/compose/ui/node/HitTestResult;->size()I Landroidx/compose/ui/node/InnerNodeCoordinator; HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->()V PLandroidx/compose/ui/node/InnerNodeCoordinator;->()V HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/InnerNodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->calculateAlignmentLine(Landroidx/compose/ui/layout/AlignmentLine;)I HPLandroidx/compose/ui/node/InnerNodeCoordinator;->calculateAlignmentLine(Landroidx/compose/ui/layout/AlignmentLine;)I HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/InnerNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->getTail()Landroidx/compose/ui/node/TailModifierNode; PLandroidx/compose/ui/node/InnerNodeCoordinator;->getTail()Landroidx/compose/ui/node/TailModifierNode; HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HPLandroidx/compose/ui/node/InnerNodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; HPLandroidx/compose/ui/node/InnerNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/node/InnerNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/InnerNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/InnerNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/node/InnerNodeCoordinator$LookaheadDelegateImpl; Landroidx/compose/ui/node/IntStack; HSPLandroidx/compose/ui/node/IntStack;->(I)V HPLandroidx/compose/ui/node/IntStack;->(I)V HSPLandroidx/compose/ui/node/IntStack;->get(I)I PLandroidx/compose/ui/node/IntStack;->get(I)I HSPLandroidx/compose/ui/node/IntStack;->getSize()I PLandroidx/compose/ui/node/IntStack;->getSize()I HSPLandroidx/compose/ui/node/IntStack;->isNotEmpty()Z PLandroidx/compose/ui/node/IntStack;->isNotEmpty()Z HSPLandroidx/compose/ui/node/IntStack;->pop()I PLandroidx/compose/ui/node/IntStack;->pop()I HSPLandroidx/compose/ui/node/IntStack;->pushDiagonal(III)V PLandroidx/compose/ui/node/IntStack;->pushDiagonal(III)V HSPLandroidx/compose/ui/node/IntStack;->pushRange(IIII)V PLandroidx/compose/ui/node/IntStack;->pushRange(IIII)V HSPLandroidx/compose/ui/node/IntStack;->sortDiagonals()V PLandroidx/compose/ui/node/IntStack;->sortDiagonals()V Landroidx/compose/ui/node/IntrinsicsPolicy; HSPLandroidx/compose/ui/node/IntrinsicsPolicy;->(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/IntrinsicsPolicy;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/IntrinsicsPolicy;->updateFrom(Landroidx/compose/ui/layout/MeasurePolicy;)V HPLandroidx/compose/ui/node/IntrinsicsPolicy;->updateFrom(Landroidx/compose/ui/layout/MeasurePolicy;)V Landroidx/compose/ui/node/LayerPositionalProperties; HSPLandroidx/compose/ui/node/LayerPositionalProperties;->()V PLandroidx/compose/ui/node/LayerPositionalProperties;->()V HSPLandroidx/compose/ui/node/LayerPositionalProperties;->copyFrom(Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope;)V HPLandroidx/compose/ui/node/LayerPositionalProperties;->copyFrom(Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope;)V HSPLandroidx/compose/ui/node/LayerPositionalProperties;->copyFrom(Landroidx/compose/ui/node/LayerPositionalProperties;)V HPLandroidx/compose/ui/node/LayerPositionalProperties;->copyFrom(Landroidx/compose/ui/node/LayerPositionalProperties;)V HSPLandroidx/compose/ui/node/LayerPositionalProperties;->hasSameValuesAs(Landroidx/compose/ui/node/LayerPositionalProperties;)Z HPLandroidx/compose/ui/node/LayerPositionalProperties;->hasSameValuesAs(Landroidx/compose/ui/node/LayerPositionalProperties;)Z Landroidx/compose/ui/node/LayoutAwareModifierNode; HSPLandroidx/compose/ui/node/LayoutAwareModifierNode;->onRemeasured-ozmzZPI(J)V PLandroidx/compose/ui/node/LayoutAwareModifierNode;->onRemeasured-ozmzZPI(J)V Landroidx/compose/ui/node/LayoutModifierNode; Landroidx/compose/ui/node/LayoutModifierNodeCoordinator; HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->()V PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->()V HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutModifierNode;)V PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutModifierNode;)V HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->calculateAlignmentLine(Landroidx/compose/ui/layout/AlignmentLine;)I HPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->calculateAlignmentLine(Landroidx/compose/ui/layout/AlignmentLine;)I HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getLayoutModifierNode()Landroidx/compose/ui/node/LayoutModifierNode; PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getLayoutModifierNode()Landroidx/compose/ui/node/LayoutModifierNode; HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getTail()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getWrappedNonNull()Landroidx/compose/ui/node/NodeCoordinator; PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->getWrappedNonNull()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; HPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;)V PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->performDraw(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->setLayoutModifierNode$ui_release(Landroidx/compose/ui/node/LayoutModifierNode;)V PLandroidx/compose/ui/node/LayoutModifierNodeCoordinator;->setLayoutModifierNode$ui_release(Landroidx/compose/ui/node/LayoutModifierNode;)V Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/LayoutNode;->$r8$lambda$7po1rmUuVs6tXeBa5BDq-nmH7XI(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutNode;)I HPLandroidx/compose/ui/node/LayoutNode;->$r8$lambda$7po1rmUuVs6tXeBa5BDq-nmH7XI(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/node/LayoutNode;)I HSPLandroidx/compose/ui/node/LayoutNode;->()V PLandroidx/compose/ui/node/LayoutNode;->()V HSPLandroidx/compose/ui/node/LayoutNode;->(IZ)V HPLandroidx/compose/ui/node/LayoutNode;->(IZ)V HSPLandroidx/compose/ui/node/LayoutNode;->(IZI)V HPLandroidx/compose/ui/node/LayoutNode;->(IZI)V HSPLandroidx/compose/ui/node/LayoutNode;->access$getConstructor$cp()Lkotlin/jvm/functions/Function0; PLandroidx/compose/ui/node/LayoutNode;->access$getConstructor$cp()Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/ui/node/LayoutNode;->access$setIgnoreRemeasureRequests$p(Landroidx/compose/ui/node/LayoutNode;Z)V PLandroidx/compose/ui/node/LayoutNode;->access$setIgnoreRemeasureRequests$p(Landroidx/compose/ui/node/LayoutNode;Z)V HSPLandroidx/compose/ui/node/LayoutNode;->attach$ui_release(Landroidx/compose/ui/node/Owner;)V HPLandroidx/compose/ui/node/LayoutNode;->attach$ui_release(Landroidx/compose/ui/node/Owner;)V HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreeIntrinsicsUsage$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->clearSubtreeIntrinsicsUsage$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->clearSubtreePlacementIntrinsicsUsage()V HPLandroidx/compose/ui/node/LayoutNode;->clearSubtreePlacementIntrinsicsUsage()V HSPLandroidx/compose/ui/node/LayoutNode;->detach$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->detach$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->dispatchOnPositionedCallbacks$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->dispatchOnPositionedCallbacks$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->draw$ui_release(Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/node/LayoutNode;->draw$ui_release(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/LayoutNode;->getCanMultiMeasure$ui_release()Z PLandroidx/compose/ui/node/LayoutNode;->getCanMultiMeasure$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getChildMeasurables$ui_release()Ljava/util/List; HPLandroidx/compose/ui/node/LayoutNode;->getChildMeasurables$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNode;->getChildren$ui_release()Ljava/util/List; HPLandroidx/compose/ui/node/LayoutNode;->getChildren$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNode;->getCollapsedSemantics$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; HPLandroidx/compose/ui/node/LayoutNode;->getCollapsedSemantics$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; HSPLandroidx/compose/ui/node/LayoutNode;->getCompositionLocalMap()Landroidx/compose/runtime/CompositionLocalMap; PLandroidx/compose/ui/node/LayoutNode;->getCompositionLocalMap()Landroidx/compose/runtime/CompositionLocalMap; HSPLandroidx/compose/ui/node/LayoutNode;->getDensity()Landroidx/compose/ui/unit/Density; HPLandroidx/compose/ui/node/LayoutNode;->getDensity()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/node/LayoutNode;->getDepth$ui_release()I HPLandroidx/compose/ui/node/LayoutNode;->getDepth$ui_release()I HSPLandroidx/compose/ui/node/LayoutNode;->getFoldedChildren$ui_release()Ljava/util/List; PLandroidx/compose/ui/node/LayoutNode;->getFoldedChildren$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNode;->getHeight()I PLandroidx/compose/ui/node/LayoutNode;->getHeight()I HSPLandroidx/compose/ui/node/LayoutNode;->getInnerCoordinator$ui_release()Landroidx/compose/ui/node/InnerNodeCoordinator; PLandroidx/compose/ui/node/LayoutNode;->getInnerCoordinator$ui_release()Landroidx/compose/ui/node/InnerNodeCoordinator; HSPLandroidx/compose/ui/node/LayoutNode;->getIntrinsicsUsageByParent$ui_release$enumunboxing$()I PLandroidx/compose/ui/node/LayoutNode;->getIntrinsicsUsageByParent$ui_release$enumunboxing$()I HSPLandroidx/compose/ui/node/LayoutNode;->getLayoutDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate; HPLandroidx/compose/ui/node/LayoutNode;->getLayoutDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate; HSPLandroidx/compose/ui/node/LayoutNode;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/node/LayoutNode;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/node/LayoutNode;->getLayoutPending$ui_release()Z HPLandroidx/compose/ui/node/LayoutNode;->getLayoutPending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getLayoutState$ui_release$enumunboxing$()I HPLandroidx/compose/ui/node/LayoutNode;->getLayoutState$ui_release$enumunboxing$()I HSPLandroidx/compose/ui/node/LayoutNode;->getLookaheadLayoutPending$ui_release()Z PLandroidx/compose/ui/node/LayoutNode;->getLookaheadLayoutPending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getLookaheadMeasurePending$ui_release()Z HPLandroidx/compose/ui/node/LayoutNode;->getLookaheadMeasurePending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getLookaheadPassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$LookaheadPassDelegate; PLandroidx/compose/ui/node/LayoutNode;->getLookaheadPassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$LookaheadPassDelegate; HSPLandroidx/compose/ui/node/LayoutNode;->getLookaheadRoot$ui_release()Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/node/LayoutNode;->getLookaheadRoot$ui_release()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/LayoutNode;->getMeasurePassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HPLandroidx/compose/ui/node/LayoutNode;->getMeasurePassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HSPLandroidx/compose/ui/node/LayoutNode;->getMeasurePending$ui_release()Z HPLandroidx/compose/ui/node/LayoutNode;->getMeasurePending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getMeasurePolicy()Landroidx/compose/ui/layout/MeasurePolicy; PLandroidx/compose/ui/node/LayoutNode;->getMeasurePolicy()Landroidx/compose/ui/layout/MeasurePolicy; HSPLandroidx/compose/ui/node/LayoutNode;->getNeedsOnPositionedDispatch$ui_release()Z PLandroidx/compose/ui/node/LayoutNode;->getNeedsOnPositionedDispatch$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNode;->getNodes$ui_release()Landroidx/compose/ui/node/NodeChain; PLandroidx/compose/ui/node/LayoutNode;->getNodes$ui_release()Landroidx/compose/ui/node/NodeChain; HSPLandroidx/compose/ui/node/LayoutNode;->getOuterCoordinator$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/LayoutNode;->getOuterCoordinator$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/LayoutNode;->getOwner$ui_release()Landroidx/compose/ui/node/Owner; PLandroidx/compose/ui/node/LayoutNode;->getOwner$ui_release()Landroidx/compose/ui/node/Owner; HSPLandroidx/compose/ui/node/LayoutNode;->getParent$ui_release()Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/node/LayoutNode;->getParent$ui_release()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/LayoutNode;->getPlaceOrder$ui_release()I PLandroidx/compose/ui/node/LayoutNode;->getPlaceOrder$ui_release()I HSPLandroidx/compose/ui/node/LayoutNode;->getSemanticsId()I PLandroidx/compose/ui/node/LayoutNode;->getSemanticsId()I HSPLandroidx/compose/ui/node/LayoutNode;->getSubcompositionsState$ui_release()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; PLandroidx/compose/ui/node/LayoutNode;->getSubcompositionsState$ui_release()Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState; HSPLandroidx/compose/ui/node/LayoutNode;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; PLandroidx/compose/ui/node/LayoutNode;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; HSPLandroidx/compose/ui/node/LayoutNode;->getWidth()I PLandroidx/compose/ui/node/LayoutNode;->getWidth()I HSPLandroidx/compose/ui/node/LayoutNode;->getZSortedChildren()Landroidx/compose/runtime/collection/MutableVector; HPLandroidx/compose/ui/node/LayoutNode;->getZSortedChildren()Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/ui/node/LayoutNode;->get_children$ui_release()Landroidx/compose/runtime/collection/MutableVector; HPLandroidx/compose/ui/node/LayoutNode;->get_children$ui_release()Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/compose/ui/node/LayoutNode;->hitTest-M_7yMNQ$ui_release(JLandroidx/compose/ui/node/HitTestResult;ZZ)V HPLandroidx/compose/ui/node/LayoutNode;->hitTest-M_7yMNQ$ui_release(JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/LayoutNode;->insertAt$ui_release(ILandroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/LayoutNode;->insertAt$ui_release(ILandroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayer$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->invalidateLayer$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateLayers$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->invalidateLayers$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateMeasurements$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->invalidateMeasurements$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateParentData$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->invalidateParentData$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateSemantics$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->invalidateSemantics$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->invalidateUnfoldedVirtualChildren()V PLandroidx/compose/ui/node/LayoutNode;->invalidateUnfoldedVirtualChildren()V HSPLandroidx/compose/ui/node/LayoutNode;->isAttached()Z HPLandroidx/compose/ui/node/LayoutNode;->isAttached()Z HSPLandroidx/compose/ui/node/LayoutNode;->isPlaced()Z HPLandroidx/compose/ui/node/LayoutNode;->isPlaced()Z HSPLandroidx/compose/ui/node/LayoutNode;->isValidOwnerScope()Z HPLandroidx/compose/ui/node/LayoutNode;->isValidOwnerScope()Z HSPLandroidx/compose/ui/node/LayoutNode;->markLayoutPending$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->markLayoutPending$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->markMeasurePending$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->markMeasurePending$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->onChildRemoved(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/LayoutNode;->onChildRemoved(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode;->onRelease()V HPLandroidx/compose/ui/node/LayoutNode;->onRelease()V HSPLandroidx/compose/ui/node/LayoutNode;->onZSortedChildrenInvalidated$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->onZSortedChildrenInvalidated$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->place$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->place$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->remeasure-_Sx5XlM$ui_release$default(Landroidx/compose/ui/node/LayoutNode;)Z HPLandroidx/compose/ui/node/LayoutNode;->remeasure-_Sx5XlM$ui_release$default(Landroidx/compose/ui/node/LayoutNode;)Z HSPLandroidx/compose/ui/node/LayoutNode;->remeasure-_Sx5XlM$ui_release(Landroidx/compose/ui/unit/Constraints;)Z HPLandroidx/compose/ui/node/LayoutNode;->remeasure-_Sx5XlM$ui_release(Landroidx/compose/ui/unit/Constraints;)Z HSPLandroidx/compose/ui/node/LayoutNode;->removeAll$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->removeAll$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->removeAt$ui_release(II)V PLandroidx/compose/ui/node/LayoutNode;->removeAt$ui_release(II)V HSPLandroidx/compose/ui/node/LayoutNode;->replace$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->replace$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->requestRelayout$ui_release(Z)V PLandroidx/compose/ui/node/LayoutNode;->requestRelayout$ui_release(Z)V HSPLandroidx/compose/ui/node/LayoutNode;->requestRemeasure$ui_release$default(Landroidx/compose/ui/node/LayoutNode;ZI)V HPLandroidx/compose/ui/node/LayoutNode;->requestRemeasure$ui_release$default(Landroidx/compose/ui/node/LayoutNode;ZI)V HSPLandroidx/compose/ui/node/LayoutNode;->rescheduleRemeasureOrRelayout$ui_release(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/LayoutNode;->rescheduleRemeasureOrRelayout$ui_release(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode;->resetSubtreeIntrinsicsUsage$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->resetSubtreeIntrinsicsUsage$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->setCanMultiMeasure$ui_release(Z)V PLandroidx/compose/ui/node/LayoutNode;->setCanMultiMeasure$ui_release(Z)V HSPLandroidx/compose/ui/node/LayoutNode;->setCompositionLocalMap(Landroidx/compose/runtime/CompositionLocalMap;)V HPLandroidx/compose/ui/node/LayoutNode;->setCompositionLocalMap(Landroidx/compose/runtime/CompositionLocalMap;)V HSPLandroidx/compose/ui/node/LayoutNode;->setDensity(Landroidx/compose/ui/unit/Density;)V HPLandroidx/compose/ui/node/LayoutNode;->setDensity(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/ui/node/LayoutNode;->setInnerLayerCoordinatorIsDirty$ui_release()V PLandroidx/compose/ui/node/LayoutNode;->setInnerLayerCoordinatorIsDirty$ui_release()V HSPLandroidx/compose/ui/node/LayoutNode;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V PLandroidx/compose/ui/node/LayoutNode;->setLayoutDirection(Landroidx/compose/ui/unit/LayoutDirection;)V HSPLandroidx/compose/ui/node/LayoutNode;->setLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/LayoutNode;->setLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNode;->setMeasurePolicy(Landroidx/compose/ui/layout/MeasurePolicy;)V HPLandroidx/compose/ui/node/LayoutNode;->setMeasurePolicy(Landroidx/compose/ui/layout/MeasurePolicy;)V HSPLandroidx/compose/ui/node/LayoutNode;->setModifier(Landroidx/compose/ui/Modifier;)V HPLandroidx/compose/ui/node/LayoutNode;->setModifier(Landroidx/compose/ui/Modifier;)V HSPLandroidx/compose/ui/node/LayoutNode;->setNeedsOnPositionedDispatch$ui_release(Z)V PLandroidx/compose/ui/node/LayoutNode;->setNeedsOnPositionedDispatch$ui_release(Z)V HSPLandroidx/compose/ui/node/LayoutNode;->setSubcompositionsState$ui_release(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V PLandroidx/compose/ui/node/LayoutNode;->setSubcompositionsState$ui_release(Landroidx/compose/ui/layout/LayoutNodeSubcompositionsState;)V HSPLandroidx/compose/ui/node/LayoutNode;->setViewConfiguration(Landroidx/compose/ui/platform/ViewConfiguration;)V HPLandroidx/compose/ui/node/LayoutNode;->setViewConfiguration(Landroidx/compose/ui/platform/ViewConfiguration;)V HSPLandroidx/compose/ui/node/LayoutNode;->updateChildrenIfDirty$ui_release()V HPLandroidx/compose/ui/node/LayoutNode;->updateChildrenIfDirty$ui_release()V Landroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0; HSPLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;->(I)V PLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;->(I)V HSPLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HPLandroidx/compose/ui/node/LayoutNode$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I Landroidx/compose/ui/node/LayoutNode$Companion$Constructor$1; HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->()V PLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->()V HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->(I)V PLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->(I)V HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->invoke()Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->invoke()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/LayoutNode$Companion$Constructor$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/node/LayoutNode$Companion$DummyViewConfiguration$1; HSPLandroidx/compose/ui/node/LayoutNode$Companion$DummyViewConfiguration$1;->()V PLandroidx/compose/ui/node/LayoutNode$Companion$DummyViewConfiguration$1;->()V Landroidx/compose/ui/node/LayoutNode$Companion$ErrorMeasurePolicy$1; HSPLandroidx/compose/ui/node/LayoutNode$Companion$ErrorMeasurePolicy$1;->()V PLandroidx/compose/ui/node/LayoutNode$Companion$ErrorMeasurePolicy$1;->()V Landroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy; HSPLandroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy;->(Ljava/lang/String;)V PLandroidx/compose/ui/node/LayoutNode$NoIntrinsicsMeasurePolicy;->(Ljava/lang/String;)V Landroidx/compose/ui/node/LayoutNode$WhenMappings; HSPLandroidx/compose/ui/node/LayoutNode$WhenMappings;->()V PLandroidx/compose/ui/node/LayoutNode$WhenMappings;->()V Landroidx/compose/ui/node/LayoutNode$_foldedChildren$1; HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->(Ljava/lang/Object;I)V HPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()V HPLandroidx/compose/ui/node/LayoutNode$_foldedChildren$1;->invoke()V Landroidx/compose/ui/node/LayoutNode$collapsedSemantics$1; HSPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1;->(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1;->(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/LayoutNode$collapsedSemantics$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/node/LayoutNodeDrawScope; HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->()V PLandroidx/compose/ui/node/LayoutNodeDrawScope;->()V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawArc-yD3GUKo(JFFJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawArc-yD3GUKo(JFFJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawContent()V HPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawContent()V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawDirect-x_KDEd0$ui_release(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/node/DrawModifierNode;)V HPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawDirect-x_KDEd0$ui_release(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/node/DrawModifierNode;)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;II)V HPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawImage-AZ2fEMs(Landroidx/compose/ui/graphics/ImageBitmap;JJJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;II)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawLine-NGM6Ib0(JJJFIFLandroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawLine-NGM6Ib0(JJJFIFLandroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRect-n-J9OG0(JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRect-n-J9OG0(JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-ZuiqVtQ(Landroidx/compose/ui/graphics/Brush;JJJFLandroidx/compose/ui/graphics/drawscope/DrawStyle;Landroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-u-Aw5IA(JJJJLandroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)V PLandroidx/compose/ui/node/LayoutNodeDrawScope;->drawRoundRect-u-Aw5IA(JJJJLandroidx/compose/ui/graphics/drawscope/DrawStyle;FLandroidx/compose/ui/graphics/ColorFilter;I)V HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1; PLandroidx/compose/ui/node/LayoutNodeDrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/CanvasDrawScope$drawContext$1; HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/node/LayoutNodeDrawScope;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getSize-NH-jbRc()J HPLandroidx/compose/ui/node/LayoutNodeDrawScope;->getSize-NH-jbRc()J HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->roundToPx-0680j_4(F)I PLandroidx/compose/ui/node/LayoutNodeDrawScope;->roundToPx-0680j_4(F)I HSPLandroidx/compose/ui/node/LayoutNodeDrawScope;->toPx-0680j_4(F)F PLandroidx/compose/ui/node/LayoutNodeDrawScope;->toPx-0680j_4(F)F Landroidx/compose/ui/node/LayoutNodeKt; HSPLandroidx/compose/ui/node/LayoutNodeKt;->()V PLandroidx/compose/ui/node/LayoutNodeKt;->()V HSPLandroidx/compose/ui/node/LayoutNodeKt;->access$getDefaultDensity$p()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/node/LayoutNodeKt;->access$getDefaultDensity$p()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/node/LayoutNodeKt;->requireOwner(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/Owner; HPLandroidx/compose/ui/node/LayoutNodeKt;->requireOwner(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/Owner; Landroidx/compose/ui/node/LayoutNodeLayoutDelegate; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$getLayoutNode$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$getLayoutNode$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$getLayoutPendingForAlignment$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$getLayoutPendingForAlignment$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$getNextChildPlaceOrder$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)I PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$getNextChildPlaceOrder$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$isOutMostLookaheadRoot(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;Landroidx/compose/ui/node/LayoutNode;)Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$isOutMostLookaheadRoot(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;Landroidx/compose/ui/node/LayoutNode;)Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$performMeasure-BRTryo0(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;J)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$performMeasure-BRTryo0(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;J)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setLayoutPending$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;Z)V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setLayoutPending$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;Z)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setLayoutPendingForAlignment$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setLayoutPendingForAlignment$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setLayoutState$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;I)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setLayoutState$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;I)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setNextChildPlaceOrder$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;I)V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->access$setNextChildPlaceOrder$p(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;I)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getAlignmentLinesOwner$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getAlignmentLinesOwner$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getChildrenAccessingCoordinatesDuringPlacement()I HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getChildrenAccessingCoordinatesDuringPlacement()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getCoordinatesAccessedDuringModifierPlacement()Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getCoordinatesAccessedDuringModifierPlacement()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getCoordinatesAccessedDuringPlacement()Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getCoordinatesAccessedDuringPlacement()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getHeight$ui_release()I PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getHeight$ui_release()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLastConstraints-DWUhwKw()Landroidx/compose/ui/unit/Constraints; PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLastConstraints-DWUhwKw()Landroidx/compose/ui/unit/Constraints; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLayoutPending$ui_release()Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLayoutPending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLayoutState$ui_release$enumunboxing$()I HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLayoutState$ui_release$enumunboxing$()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLookaheadLayoutPending$ui_release()Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLookaheadLayoutPending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLookaheadMeasurePending$ui_release()Z HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLookaheadMeasurePending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLookaheadPassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$LookaheadPassDelegate; PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getLookaheadPassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$LookaheadPassDelegate; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getMeasurePassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getMeasurePassDelegate$ui_release()Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getMeasurePending$ui_release()Z HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getMeasurePending$ui_release()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getOuterCoordinator()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getOuterCoordinator()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getWidth$ui_release()I PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->getWidth$ui_release()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->invalidateParentData()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->invalidateParentData()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->isOutMostLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->isOutMostLookaheadRoot(Landroidx/compose/ui/node/LayoutNode;)Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markChildrenDirty()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markChildrenDirty()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markLayoutPending$ui_release()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markLayoutPending$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markMeasurePending$ui_release()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->markMeasurePending$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->onCoordinatesUsed()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->onCoordinatesUsed()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->resetAlignmentLines()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->resetAlignmentLines()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringModifierPlacement(Z)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringModifierPlacement(Z)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringPlacement(Z)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->setCoordinatesAccessedDuringPlacement(Z)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->updateParentData()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate;->updateParentData()V Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$LookaheadPassDelegate; Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->access$checkChildrenPlaceOrderForUpdates(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->access$checkChildrenPlaceOrderForUpdates(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->access$clearPlaceOrder(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->access$clearPlaceOrder(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->calculateAlignmentLines()Ljava/util/HashMap; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->calculateAlignmentLines()Ljava/util/HashMap; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->forEachChildAlignmentLinesOwner(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->forEachChildAlignmentLinesOwner(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->get(Landroidx/compose/ui/layout/AlignmentLine;)I HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->get(Landroidx/compose/ui/layout/AlignmentLine;)I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getAlignmentLines()Landroidx/compose/ui/node/LookaheadAlignmentLines; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getAlignmentLines()Landroidx/compose/ui/node/LookaheadAlignmentLines; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getChildDelegates$ui_release()Ljava/util/List; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getChildDelegates$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getInnerCoordinator()Landroidx/compose/ui/node/InnerNodeCoordinator; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getInnerCoordinator()Landroidx/compose/ui/node/InnerNodeCoordinator; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getLastConstraints-DWUhwKw()Landroidx/compose/ui/unit/Constraints; PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getLastConstraints-DWUhwKw()Landroidx/compose/ui/unit/Constraints; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getMeasuredByParent$ui_release$enumunboxing$()I PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getMeasuredByParent$ui_release$enumunboxing$()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getMeasuredWidth()I PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getMeasuredWidth()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getParentAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getParentAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getParentData()Ljava/lang/Object; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getParentData()Ljava/lang/Object; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getPlaceOrder$ui_release()I PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getPlaceOrder$ui_release()I HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getZIndex$ui_release()F PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->getZIndex$ui_release()F HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->invalidateParentData()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->invalidateParentData()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->isPlaced()Z PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->isPlaced()Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->layoutChildren()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->layoutChildren()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->markNodeAndSubtreeAsPlaced()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->markNodeAndSubtreeAsPlaced()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->measure-BRTryo0(J)Landroidx/compose/ui/layout/Placeable; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->notifyChildrenUsingCoordinatesWhilePlacing()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->notifyChildrenUsingCoordinatesWhilePlacing()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->onNodeDetached()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->onNodeDetached()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->onNodePlaced$ui_release()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->onNodePlaced$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->placeOuterCoordinator-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->placeOuterCoordinator-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->remeasure-BRTryo0(J)Z HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->remeasure-BRTryo0(J)Z HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->replace()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->replace()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->setChildDelegatesDirty$ui_release()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->setChildDelegatesDirty$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->setMeasuredByParent$ui_release()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->setMeasuredByParent$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->setPlaced$ui_release()V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->setPlaced$ui_release()V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->updateParentData()Z HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate;->updateParentData()Z Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;->(Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;JF)V PLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;->(Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;JF)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;JI)V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->(Landroidx/compose/ui/node/LayoutNodeLayoutDelegate;JI)V HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->invoke()V HPLandroidx/compose/ui/node/LayoutNodeLayoutDelegate$performMeasure$2;->invoke()V Landroidx/compose/ui/node/LookaheadAlignmentLines; HSPLandroidx/compose/ui/node/LookaheadAlignmentLines;->(Landroidx/compose/ui/node/AlignmentLinesOwner;I)V PLandroidx/compose/ui/node/LookaheadAlignmentLines;->(Landroidx/compose/ui/node/AlignmentLinesOwner;I)V HSPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getAlignmentLinesMap(Landroidx/compose/ui/node/NodeCoordinator;)Ljava/util/Map; HPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getAlignmentLinesMap(Landroidx/compose/ui/node/NodeCoordinator;)Ljava/util/Map; HSPLandroidx/compose/ui/node/LookaheadAlignmentLines;->getPositionFor(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/layout/AlignmentLine;)I PLandroidx/compose/ui/node/LookaheadAlignmentLines;->getPositionFor(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/layout/AlignmentLine;)I Landroidx/compose/ui/node/LookaheadCapablePlaceable; HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->()V HPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->()V HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->get(Landroidx/compose/ui/layout/AlignmentLine;)I HPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->get(Landroidx/compose/ui/layout/AlignmentLine;)I HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->invalidateAlignmentLinesFromPositionChange(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->invalidateAlignmentLinesFromPositionChange(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isLookingAhead()Z PLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isLookingAhead()Z HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isPlacingForAlignment$ui_release()Z PLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isPlacingForAlignment$ui_release()Z HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isShallowPlacing$ui_release()Z HPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->isShallowPlacing$ui_release()Z HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->setPlacingForAlignment$ui_release(Z)V HPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->setPlacingForAlignment$ui_release(Z)V HSPLandroidx/compose/ui/node/LookaheadCapablePlaceable;->setShallowPlacing$ui_release(Z)V PLandroidx/compose/ui/node/LookaheadCapablePlaceable;->setShallowPlacing$ui_release(Z)V Landroidx/compose/ui/node/LookaheadDelegate; Landroidx/compose/ui/node/MeasureAndLayoutDelegate; HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->callOnLayoutCompletedListeners()V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->callOnLayoutCompletedListeners()V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->dispatchOnPositionedCallbacks(Z)V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->dispatchOnPositionedCallbacks(Z)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->doRemeasure-sdFAvZA(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/unit/Constraints;)Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->doRemeasure-sdFAvZA(Landroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/unit/Constraints;)Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getHasPendingMeasureOrLayout()Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getHasPendingMeasureOrLayout()Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getHasPendingOnPositionedCallbacks()Z PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getHasPendingOnPositionedCallbacks()Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getMeasureAffectsParent(Landroidx/compose/ui/node/LayoutNode;)Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->getMeasureAffectsParent(Landroidx/compose/ui/node/LayoutNode;)Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout(Lkotlin/jvm/functions/Function0;)Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureAndLayout(Lkotlin/jvm/functions/Function0;)Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureOnly()V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->measureOnly()V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->onNodeDetached(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->onNodeDetached(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->recurseRemeasure(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->recurseRemeasure(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureAndRelayoutIfNeeded(Landroidx/compose/ui/node/LayoutNode;Z)Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureAndRelayoutIfNeeded(Landroidx/compose/ui/node/LayoutNode;Z)Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureOnly(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->remeasureOnly(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRelayout(Landroidx/compose/ui/node/LayoutNode;Z)Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRelayout(Landroidx/compose/ui/node/LayoutNode;Z)Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRemeasure(Landroidx/compose/ui/node/LayoutNode;Z)Z HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->requestRemeasure(Landroidx/compose/ui/node/LayoutNode;Z)Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->updateRootConstraints-BRTryo0(J)V PLandroidx/compose/ui/node/MeasureAndLayoutDelegate;->updateRootConstraints-BRTryo0(J)V Landroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest; HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->(Landroidx/compose/ui/node/LayoutNode;ZZ)V PLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->(Landroidx/compose/ui/node/LayoutNode;ZZ)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->getNode()Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->getNode()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->isForced()Z PLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->isForced()Z HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->isLookahead()Z PLandroidx/compose/ui/node/MeasureAndLayoutDelegate$PostponedRequest;->isLookahead()Z Landroidx/compose/ui/node/MeasureAndLayoutDelegate$forceMeasureTheSubtree$pending$1; HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$forceMeasureTheSubtree$pending$1;->(Z)V HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$forceMeasureTheSubtree$pending$1;->(Z)V HSPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$forceMeasureTheSubtree$pending$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/node/MeasureAndLayoutDelegate$forceMeasureTheSubtree$pending$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/node/ModifierNodeElement; HSPLandroidx/compose/ui/node/ModifierNodeElement;->()V HPLandroidx/compose/ui/node/ModifierNodeElement;->()V Landroidx/compose/ui/node/NodeChain; HSPLandroidx/compose/ui/node/NodeChain;->(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/NodeChain;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/NodeChain;->access$createAndInsertNodeAsChild(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/NodeChain;->access$createAndInsertNodeAsChild(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeChain;->access$getAggregateChildKindSet(Landroidx/compose/ui/node/NodeChain;)I HPLandroidx/compose/ui/node/NodeChain;->access$getAggregateChildKindSet(Landroidx/compose/ui/node/NodeChain;)I HSPLandroidx/compose/ui/node/NodeChain;->access$propagateCoordinator(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/NodeChain;->access$propagateCoordinator(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/NodeChain;->createAndInsertNodeAsChild(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/NodeChain;->createAndInsertNodeAsChild(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeChain;->detachAndRemoveNode(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/NodeChain;->detachAndRemoveNode(Landroidx/compose/ui/Modifier$Node;)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeChain;->getHead$ui_release()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/NodeChain;->getHead$ui_release()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeChain;->getInnerCoordinator$ui_release()Landroidx/compose/ui/node/InnerNodeCoordinator; PLandroidx/compose/ui/node/NodeChain;->getInnerCoordinator$ui_release()Landroidx/compose/ui/node/InnerNodeCoordinator; HSPLandroidx/compose/ui/node/NodeChain;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/node/NodeChain;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/NodeChain;->getOuterCoordinator$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/NodeChain;->getOuterCoordinator$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeChain;->getTail$ui_release()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/node/NodeChain;->getTail$ui_release()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeChain;->has$ui_release()Z HPLandroidx/compose/ui/node/NodeChain;->has$ui_release()Z HSPLandroidx/compose/ui/node/NodeChain;->has-H91voCI$ui_release(I)Z HPLandroidx/compose/ui/node/NodeChain;->has-H91voCI$ui_release(I)Z HSPLandroidx/compose/ui/node/NodeChain;->markAsAttached()V HPLandroidx/compose/ui/node/NodeChain;->markAsAttached()V HSPLandroidx/compose/ui/node/NodeChain;->markAsDetached$ui_release()V PLandroidx/compose/ui/node/NodeChain;->markAsDetached$ui_release()V HSPLandroidx/compose/ui/node/NodeChain;->runAttachLifecycle()V HPLandroidx/compose/ui/node/NodeChain;->runAttachLifecycle()V HSPLandroidx/compose/ui/node/NodeChain;->runDetachLifecycle$ui_release()V PLandroidx/compose/ui/node/NodeChain;->runDetachLifecycle$ui_release()V HSPLandroidx/compose/ui/node/NodeChain;->structuralUpdate(ILandroidx/compose/runtime/collection/MutableVector;Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/Modifier$Node;Z)V HPLandroidx/compose/ui/node/NodeChain;->structuralUpdate(ILandroidx/compose/runtime/collection/MutableVector;Landroidx/compose/runtime/collection/MutableVector;Landroidx/compose/ui/Modifier$Node;Z)V HSPLandroidx/compose/ui/node/NodeChain;->syncAggregateChildKindSet()V HPLandroidx/compose/ui/node/NodeChain;->syncAggregateChildKindSet()V HSPLandroidx/compose/ui/node/NodeChain;->syncCoordinators()V HPLandroidx/compose/ui/node/NodeChain;->syncCoordinators()V HSPLandroidx/compose/ui/node/NodeChain;->updateFrom$ui_release(Landroidx/compose/ui/Modifier;)V HPLandroidx/compose/ui/node/NodeChain;->updateFrom$ui_release(Landroidx/compose/ui/Modifier;)V HSPLandroidx/compose/ui/node/NodeChain;->updateNode(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/node/NodeChain;->updateNode(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/ui/node/NodeChain$Differ; HSPLandroidx/compose/ui/node/NodeChain$Differ;->(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Node;ILandroidx/compose/runtime/collection/MutableVector;Landroidx/compose/runtime/collection/MutableVector;Z)V PLandroidx/compose/ui/node/NodeChain$Differ;->(Landroidx/compose/ui/node/NodeChain;Landroidx/compose/ui/Modifier$Node;ILandroidx/compose/runtime/collection/MutableVector;Landroidx/compose/runtime/collection/MutableVector;Z)V HSPLandroidx/compose/ui/node/NodeChain$Differ;->insert(I)V HPLandroidx/compose/ui/node/NodeChain$Differ;->insert(I)V HSPLandroidx/compose/ui/node/NodeChain$Differ;->setAfter(Landroidx/compose/runtime/collection/MutableVector;)V PLandroidx/compose/ui/node/NodeChain$Differ;->setAfter(Landroidx/compose/runtime/collection/MutableVector;)V HSPLandroidx/compose/ui/node/NodeChain$Differ;->setBefore(Landroidx/compose/runtime/collection/MutableVector;)V PLandroidx/compose/ui/node/NodeChain$Differ;->setBefore(Landroidx/compose/runtime/collection/MutableVector;)V HSPLandroidx/compose/ui/node/NodeChain$Differ;->setNode(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/ui/node/NodeChain$Differ;->setNode(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/node/NodeChain$Differ;->setOffset(I)V PLandroidx/compose/ui/node/NodeChain$Differ;->setOffset(I)V HSPLandroidx/compose/ui/node/NodeChain$Differ;->setShouldAttachOnInsert(Z)V PLandroidx/compose/ui/node/NodeChain$Differ;->setShouldAttachOnInsert(Z)V Landroidx/compose/ui/node/NodeChainKt; HSPLandroidx/compose/ui/node/NodeChainKt;->()V PLandroidx/compose/ui/node/NodeChainKt;->()V HSPLandroidx/compose/ui/node/NodeChainKt;->access$getSentinelHead$p()Landroidx/compose/ui/node/NodeChainKt$SentinelHead$1; HPLandroidx/compose/ui/node/NodeChainKt;->access$getSentinelHead$p()Landroidx/compose/ui/node/NodeChainKt$SentinelHead$1; HSPLandroidx/compose/ui/node/NodeChainKt;->actionForModifiers(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Element;)I HPLandroidx/compose/ui/node/NodeChainKt;->actionForModifiers(Landroidx/compose/ui/Modifier$Element;Landroidx/compose/ui/Modifier$Element;)I Landroidx/compose/ui/node/NodeChainKt$SentinelHead$1; HSPLandroidx/compose/ui/node/NodeChainKt$SentinelHead$1;->()V PLandroidx/compose/ui/node/NodeChainKt$SentinelHead$1;->()V Landroidx/compose/ui/node/NodeChainKt$fillVector$1; HSPLandroidx/compose/ui/node/NodeChainKt$fillVector$1;->(Landroidx/compose/runtime/collection/MutableVector;)V PLandroidx/compose/ui/node/NodeChainKt$fillVector$1;->(Landroidx/compose/runtime/collection/MutableVector;)V Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->()V PLandroidx/compose/ui/node/NodeCoordinator;->()V HSPLandroidx/compose/ui/node/NodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/NodeCoordinator;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->access$drawContainedDrawModifiers(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/node/NodeCoordinator;->access$drawContainedDrawModifiers(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->access$getGraphicsLayerScope$cp()Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope; PLandroidx/compose/ui/node/NodeCoordinator;->access$getGraphicsLayerScope$cp()Landroidx/compose/ui/graphics/ReusableGraphicsLayerScope; HSPLandroidx/compose/ui/node/NodeCoordinator;->access$getLayerPositionalProperties$p(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/LayerPositionalProperties; PLandroidx/compose/ui/node/NodeCoordinator;->access$getLayerPositionalProperties$p(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/LayerPositionalProperties; HSPLandroidx/compose/ui/node/NodeCoordinator;->access$getPointerInputSource$cp()Lorg/acra/file/CrashReportPersister; PLandroidx/compose/ui/node/NodeCoordinator;->access$getPointerInputSource$cp()Lorg/acra/file/CrashReportPersister; HSPLandroidx/compose/ui/node/NodeCoordinator;->access$getTmpLayerPositionalProperties$cp()Landroidx/compose/ui/node/LayerPositionalProperties; PLandroidx/compose/ui/node/NodeCoordinator;->access$getTmpLayerPositionalProperties$cp()Landroidx/compose/ui/node/LayerPositionalProperties; HSPLandroidx/compose/ui/node/NodeCoordinator;->access$hit-1hIXUjU(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V PLandroidx/compose/ui/node/NodeCoordinator;->access$hit-1hIXUjU(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V HPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/geometry/MutableRect;Z)V HSPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal-R5De75A(Landroidx/compose/ui/node/NodeCoordinator;J)J HPLandroidx/compose/ui/node/NodeCoordinator;->ancestorToLocal-R5De75A(Landroidx/compose/ui/node/NodeCoordinator;J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->calculateMinimumTouchTargetPadding-E7KxVPU(J)J HPLandroidx/compose/ui/node/NodeCoordinator;->calculateMinimumTouchTargetPadding-E7KxVPU(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->distanceInMinimumTouchTarget-tz77jQw(JJ)F HPLandroidx/compose/ui/node/NodeCoordinator;->distanceInMinimumTouchTarget-tz77jQw(JJ)F HSPLandroidx/compose/ui/node/NodeCoordinator;->draw(Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/node/NodeCoordinator;->draw(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->drawContainedDrawModifiers(Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/node/NodeCoordinator;->drawContainedDrawModifiers(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/NodeCoordinator;->findCommonAncestor$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->fromParentPosition-MK-Hz9U(J)J HPLandroidx/compose/ui/node/NodeCoordinator;->fromParentPosition-MK-Hz9U(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->getAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; HPLandroidx/compose/ui/node/NodeCoordinator;->getAlignmentLinesOwner()Landroidx/compose/ui/node/AlignmentLinesOwner; HSPLandroidx/compose/ui/node/NodeCoordinator;->getChild()Landroidx/compose/ui/node/LookaheadCapablePlaceable; PLandroidx/compose/ui/node/NodeCoordinator;->getChild()Landroidx/compose/ui/node/LookaheadCapablePlaceable; HSPLandroidx/compose/ui/node/NodeCoordinator;->getCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; PLandroidx/compose/ui/node/NodeCoordinator;->getCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/node/NodeCoordinator;->getDensity()F HPLandroidx/compose/ui/node/NodeCoordinator;->getDensity()F HSPLandroidx/compose/ui/node/NodeCoordinator;->getFontScale()F HPLandroidx/compose/ui/node/NodeCoordinator;->getFontScale()F HSPLandroidx/compose/ui/node/NodeCoordinator;->getHasMeasureResult()Z HPLandroidx/compose/ui/node/NodeCoordinator;->getHasMeasureResult()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->getLastLayerDrawingWasSkipped$ui_release()Z PLandroidx/compose/ui/node/NodeCoordinator;->getLastLayerDrawingWasSkipped$ui_release()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayer()Landroidx/compose/ui/node/OwnedLayer; HPLandroidx/compose/ui/node/NodeCoordinator;->getLayer()Landroidx/compose/ui/node/OwnedLayer; HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/node/NodeCoordinator;->getLayoutNode()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/node/NodeCoordinator;->getMeasureResult$ui_release()Landroidx/compose/ui/layout/MeasureResult; HPLandroidx/compose/ui/node/NodeCoordinator;->getMeasureResult$ui_release()Landroidx/compose/ui/layout/MeasureResult; HSPLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J PLandroidx/compose/ui/node/NodeCoordinator;->getMinimumTouchTargetSize-NH-jbRc()J HSPLandroidx/compose/ui/node/NodeCoordinator;->getParent()Landroidx/compose/ui/node/LookaheadCapablePlaceable; PLandroidx/compose/ui/node/NodeCoordinator;->getParent()Landroidx/compose/ui/node/LookaheadCapablePlaceable; HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HPLandroidx/compose/ui/node/NodeCoordinator;->getParentCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentData()Ljava/lang/Object; HPLandroidx/compose/ui/node/NodeCoordinator;->getParentData()Ljava/lang/Object; HSPLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HPLandroidx/compose/ui/node/NodeCoordinator;->getParentLayoutCoordinates()Landroidx/compose/ui/layout/LayoutCoordinates; HSPLandroidx/compose/ui/node/NodeCoordinator;->getPosition-nOcc-ac()J PLandroidx/compose/ui/node/NodeCoordinator;->getPosition-nOcc-ac()J HSPLandroidx/compose/ui/node/NodeCoordinator;->getWrapped$ui_release()Landroidx/compose/ui/node/NodeCoordinator; PLandroidx/compose/ui/node/NodeCoordinator;->getWrapped$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->getWrappedBy$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/node/NodeCoordinator;->getWrappedBy$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/node/NodeCoordinator;->getZIndex()F PLandroidx/compose/ui/node/NodeCoordinator;->getZIndex()F HSPLandroidx/compose/ui/node/NodeCoordinator;->head-H91voCI(I)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/NodeCoordinator;->head-H91voCI(I)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeCoordinator;->headNode(Z)Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/node/NodeCoordinator;->headNode(Z)Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/node/NodeCoordinator;->hit-1hIXUjU(Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HPLandroidx/compose/ui/node/NodeCoordinator;->hit-1hIXUjU(Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator;->hitTest-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HPLandroidx/compose/ui/node/NodeCoordinator;->hitTest-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HPLandroidx/compose/ui/node/NodeCoordinator;->hitTestChild-YqVAtuI(Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator;->invalidateLayer()V HPLandroidx/compose/ui/node/NodeCoordinator;->invalidateLayer()V HSPLandroidx/compose/ui/node/NodeCoordinator;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/node/NodeCoordinator;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/node/NodeCoordinator;->isAttached()Z HPLandroidx/compose/ui/node/NodeCoordinator;->isAttached()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z HPLandroidx/compose/ui/node/NodeCoordinator;->isTransparent()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->isValidOwnerScope()Z HPLandroidx/compose/ui/node/NodeCoordinator;->isValidOwnerScope()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->localBoundingBoxOf(Landroidx/compose/ui/layout/LayoutCoordinates;Z)Landroidx/compose/ui/geometry/Rect; HPLandroidx/compose/ui/node/NodeCoordinator;->localBoundingBoxOf(Landroidx/compose/ui/layout/LayoutCoordinates;Z)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/node/NodeCoordinator;->localPositionOf-R5De75A(Landroidx/compose/ui/layout/LayoutCoordinates;J)J HPLandroidx/compose/ui/node/NodeCoordinator;->localPositionOf-R5De75A(Landroidx/compose/ui/layout/LayoutCoordinates;J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->localToRoot-MK-Hz9U(J)J PLandroidx/compose/ui/node/NodeCoordinator;->localToRoot-MK-Hz9U(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->localToWindow-MK-Hz9U(J)J PLandroidx/compose/ui/node/NodeCoordinator;->localToWindow-MK-Hz9U(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->onCoordinatesUsed$ui_release()V HPLandroidx/compose/ui/node/NodeCoordinator;->onCoordinatesUsed$ui_release()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayoutModifierNodeChanged()V PLandroidx/compose/ui/node/NodeCoordinator;->onLayoutModifierNodeChanged()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onLayoutNodeAttach()V HPLandroidx/compose/ui/node/NodeCoordinator;->onLayoutNodeAttach()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onMeasured()V HPLandroidx/compose/ui/node/NodeCoordinator;->onMeasured()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onPlaced()V HPLandroidx/compose/ui/node/NodeCoordinator;->onPlaced()V HSPLandroidx/compose/ui/node/NodeCoordinator;->onRelease()V HPLandroidx/compose/ui/node/NodeCoordinator;->onRelease()V HSPLandroidx/compose/ui/node/NodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/node/NodeCoordinator;->placeAt-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->placeSelf-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/NodeCoordinator;->placeSelf-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->placeSelfApparentToRealOffset-f8xVGno(JFLkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/node/NodeCoordinator;->placeSelfApparentToRealOffset-f8xVGno(JFLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release(Landroidx/compose/ui/geometry/MutableRect;ZZ)V HPLandroidx/compose/ui/node/NodeCoordinator;->rectInParent$ui_release(Landroidx/compose/ui/geometry/MutableRect;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator;->replace$ui_release()V HPLandroidx/compose/ui/node/NodeCoordinator;->replace$ui_release()V HSPLandroidx/compose/ui/node/NodeCoordinator;->setMeasureResult$ui_release(Landroidx/compose/ui/layout/MeasureResult;)V HPLandroidx/compose/ui/node/NodeCoordinator;->setMeasureResult$ui_release(Landroidx/compose/ui/layout/MeasureResult;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setWrapped$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V PLandroidx/compose/ui/node/NodeCoordinator;->setWrapped$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->setWrappedBy$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V HPLandroidx/compose/ui/node/NodeCoordinator;->setWrappedBy$ui_release(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->shouldSharePointerInputWithSiblings()Z HPLandroidx/compose/ui/node/NodeCoordinator;->shouldSharePointerInputWithSiblings()Z HSPLandroidx/compose/ui/node/NodeCoordinator;->speculativeHit-JHbHoSQ(Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZF)V HPLandroidx/compose/ui/node/NodeCoordinator;->speculativeHit-JHbHoSQ(Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZF)V HSPLandroidx/compose/ui/node/NodeCoordinator;->toParentPosition-MK-Hz9U(J)J HPLandroidx/compose/ui/node/NodeCoordinator;->toParentPosition-MK-Hz9U(J)J HSPLandroidx/compose/ui/node/NodeCoordinator;->touchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HPLandroidx/compose/ui/node/NodeCoordinator;->touchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerBlock(ZLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerBlock(ZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters$default(Landroidx/compose/ui/node/NodeCoordinator;)V PLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters$default(Landroidx/compose/ui/node/NodeCoordinator;)V HSPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters(Z)V HPLandroidx/compose/ui/node/NodeCoordinator;->updateLayerParameters(Z)V HSPLandroidx/compose/ui/node/NodeCoordinator;->withinLayerBounds-k-4lQ0M(J)Z PLandroidx/compose/ui/node/NodeCoordinator;->withinLayerBounds-k-4lQ0M(J)Z Landroidx/compose/ui/node/NodeCoordinator$HitTestSource; Landroidx/compose/ui/node/NodeCoordinator$hit$1; HSPLandroidx/compose/ui/node/NodeCoordinator$hit$1;->(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HPLandroidx/compose/ui/node/NodeCoordinator$hit$1;->(Landroidx/compose/ui/node/NodeCoordinator;Landroidx/compose/ui/Modifier$Node;Landroidx/compose/ui/node/NodeCoordinator$HitTestSource;JLandroidx/compose/ui/node/HitTestResult;ZZ)V HSPLandroidx/compose/ui/node/NodeCoordinator$hit$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/NodeCoordinator$hit$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/node/NodeCoordinator$invoke$1; HSPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->invoke()V HPLandroidx/compose/ui/node/NodeCoordinator$invoke$1;->invoke()V Landroidx/compose/ui/node/NodeKindKt; HSPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateInsertedNode(Landroidx/compose/ui/Modifier$Node;)V HPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateInsertedNode(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNodeIncludingDelegates(Landroidx/compose/ui/Modifier$Node;II)V HPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNodeIncludingDelegates(Landroidx/compose/ui/Modifier$Node;II)V HSPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNodeSelf(Landroidx/compose/ui/Modifier$Node;II)V HPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateNodeSelf(Landroidx/compose/ui/Modifier$Node;II)V HSPLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateUpdatedNode(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/ui/node/NodeKindKt;->autoInvalidateUpdatedNode(Landroidx/compose/ui/Modifier$Node;)V HSPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Element;)I HPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Element;)I HSPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Node;)I HPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFrom(Landroidx/compose/ui/Modifier$Node;)I HSPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFromIncludingDelegates(Landroidx/compose/ui/Modifier$Node;)I HPLandroidx/compose/ui/node/NodeKindKt;->calculateNodeKindSetFromIncludingDelegates(Landroidx/compose/ui/Modifier$Node;)I HSPLandroidx/compose/ui/node/NodeKindKt;->getIncludeSelfInTraversal-H91voCI(I)Z HPLandroidx/compose/ui/node/NodeKindKt;->getIncludeSelfInTraversal-H91voCI(I)Z Landroidx/compose/ui/node/ObserverModifierNode; Landroidx/compose/ui/node/ObserverNodeOwnerScope; HSPLandroidx/compose/ui/node/ObserverNodeOwnerScope;->()V PLandroidx/compose/ui/node/ObserverNodeOwnerScope;->()V HSPLandroidx/compose/ui/node/ObserverNodeOwnerScope;->(Landroidx/compose/ui/node/ObserverModifierNode;)V HPLandroidx/compose/ui/node/ObserverNodeOwnerScope;->(Landroidx/compose/ui/node/ObserverModifierNode;)V HSPLandroidx/compose/ui/node/ObserverNodeOwnerScope;->access$getOnObserveReadsChanged$cp()Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/node/ObserverNodeOwnerScope;->access$getOnObserveReadsChanged$cp()Lkotlin/jvm/functions/Function1; Landroidx/compose/ui/node/OnPositionedDispatcher; HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->()V PLandroidx/compose/ui/node/OnPositionedDispatcher;->()V HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->dispatch()V HPLandroidx/compose/ui/node/OnPositionedDispatcher;->dispatch()V HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->dispatchHierarchy(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/OnPositionedDispatcher;->dispatchHierarchy(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->isNotEmpty()Z PLandroidx/compose/ui/node/OnPositionedDispatcher;->isNotEmpty()Z HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->onNodePositioned(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/node/OnPositionedDispatcher;->onNodePositioned(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/OnPositionedDispatcher;->onRootNodePositioned(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/OnPositionedDispatcher;->onRootNodePositioned(Landroidx/compose/ui/node/LayoutNode;)V Landroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator; HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->()V PLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->()V HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->()V PLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->()V HSPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HPLandroidx/compose/ui/node/OnPositionedDispatcher$Companion$DepthComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I Landroidx/compose/ui/node/OwnedLayer; Landroidx/compose/ui/node/Owner; HSPLandroidx/compose/ui/node/Owner;->measureAndLayout$default(Landroidx/compose/ui/node/Owner;)V PLandroidx/compose/ui/node/Owner;->measureAndLayout$default(Landroidx/compose/ui/node/Owner;)V Landroidx/compose/ui/node/Owner$OnLayoutCompletedListener; Landroidx/compose/ui/node/OwnerScope; Landroidx/compose/ui/node/OwnerSnapshotObserver; HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->clearInvalidObservations$ui_release()V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->clearInvalidObservations$ui_release()V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeLayoutModifierSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeLayoutModifierSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeLayoutSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeLayoutSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeMeasureSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeMeasureSnapshotReads$ui_release(Landroidx/compose/ui/node/LayoutNode;ZLkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeReads$ui_release(Landroidx/compose/ui/node/OwnerScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeReads$ui_release(Landroidx/compose/ui/node/OwnerScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeSemanticsReads$ui_release(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->observeSemanticsReads$ui_release(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/node/OwnerSnapshotObserver;->startObserving$ui_release()V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->startObserving$ui_release()V PLandroidx/compose/ui/node/OwnerSnapshotObserver;->stopObserving$ui_release()V Landroidx/compose/ui/node/ParentDataModifierNode; Landroidx/compose/ui/node/PointerInputModifierNode; HSPLandroidx/compose/ui/node/PointerInputModifierNode;->interceptOutOfBoundsChildEvents()V PLandroidx/compose/ui/node/PointerInputModifierNode;->interceptOutOfBoundsChildEvents()V HSPLandroidx/compose/ui/node/PointerInputModifierNode;->sharePointerInputWithSiblings()Z PLandroidx/compose/ui/node/PointerInputModifierNode;->sharePointerInputWithSiblings()Z Landroidx/compose/ui/node/SemanticsModifierNode; HSPLandroidx/compose/ui/node/SemanticsModifierNode;->getShouldClearDescendantSemantics()Z HPLandroidx/compose/ui/node/SemanticsModifierNode;->getShouldClearDescendantSemantics()Z HSPLandroidx/compose/ui/node/SemanticsModifierNode;->getShouldMergeDescendantSemantics()Z HPLandroidx/compose/ui/node/SemanticsModifierNode;->getShouldMergeDescendantSemantics()Z Landroidx/compose/ui/node/TailModifierNode; HSPLandroidx/compose/ui/node/TailModifierNode;->()V HPLandroidx/compose/ui/node/TailModifierNode;->()V HSPLandroidx/compose/ui/node/TailModifierNode;->getAttachHasBeenRun()Z PLandroidx/compose/ui/node/TailModifierNode;->getAttachHasBeenRun()Z HSPLandroidx/compose/ui/node/TailModifierNode;->onAttach()V HPLandroidx/compose/ui/node/TailModifierNode;->onAttach()V HSPLandroidx/compose/ui/node/TailModifierNode;->onDetach()V HPLandroidx/compose/ui/node/TailModifierNode;->onDetach()V Landroidx/compose/ui/node/TreeSet; HSPLandroidx/compose/ui/node/TreeSet;->(Landroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;)V PLandroidx/compose/ui/node/TreeSet;->(Landroidx/compose/ui/node/DepthSortedSet$DepthComparator$1;)V Landroidx/compose/ui/node/UiApplier; HSPLandroidx/compose/ui/node/UiApplier;->(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/node/UiApplier;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/node/UiApplier;->insertBottomUp(ILjava/lang/Object;)V PLandroidx/compose/ui/node/UiApplier;->insertBottomUp(ILjava/lang/Object;)V HSPLandroidx/compose/ui/node/UiApplier;->insertTopDown(ILjava/lang/Object;)V PLandroidx/compose/ui/node/UiApplier;->insertTopDown(ILjava/lang/Object;)V HSPLandroidx/compose/ui/node/UiApplier;->onClear()V PLandroidx/compose/ui/node/UiApplier;->onClear()V HSPLandroidx/compose/ui/node/UiApplier;->onEndChanges()V PLandroidx/compose/ui/node/UiApplier;->onEndChanges()V HSPLandroidx/compose/ui/node/UiApplier;->remove(II)V PLandroidx/compose/ui/node/UiApplier;->remove(II)V Landroidx/compose/ui/platform/AbstractComposeView; HSPLandroidx/compose/ui/platform/AbstractComposeView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/compose/ui/platform/AbstractComposeView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V PLandroidx/compose/ui/platform/AbstractComposeView;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->checkAddView()V PLandroidx/compose/ui/platform/AbstractComposeView;->checkAddView()V PLandroidx/compose/ui/platform/AbstractComposeView;->disposeComposition()V HSPLandroidx/compose/ui/platform/AbstractComposeView;->ensureCompositionCreated()V PLandroidx/compose/ui/platform/AbstractComposeView;->ensureCompositionCreated()V HSPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnLayout$ui_release(IIIIZ)V HPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnLayout$ui_release(IIIIZ)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnMeasure$ui_release(II)V HPLandroidx/compose/ui/platform/AbstractComposeView;->internalOnMeasure$ui_release(II)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->isAlive(Landroidx/compose/runtime/CompositionContext;)Z PLandroidx/compose/ui/platform/AbstractComposeView;->isAlive(Landroidx/compose/runtime/CompositionContext;)Z HSPLandroidx/compose/ui/platform/AbstractComposeView;->onAttachedToWindow()V PLandroidx/compose/ui/platform/AbstractComposeView;->onAttachedToWindow()V HSPLandroidx/compose/ui/platform/AbstractComposeView;->onLayout(ZIIII)V HPLandroidx/compose/ui/platform/AbstractComposeView;->onLayout(ZIIII)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->onMeasure(II)V HPLandroidx/compose/ui/platform/AbstractComposeView;->onMeasure(II)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->onRtlPropertiesChanged(I)V PLandroidx/compose/ui/platform/AbstractComposeView;->onRtlPropertiesChanged(I)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->resolveParentCompositionContext()Landroidx/compose/runtime/CompositionContext; HPLandroidx/compose/ui/platform/AbstractComposeView;->resolveParentCompositionContext()Landroidx/compose/runtime/CompositionContext; HSPLandroidx/compose/ui/platform/AbstractComposeView;->setParentCompositionContext(Landroidx/compose/runtime/CompositionContext;)V PLandroidx/compose/ui/platform/AbstractComposeView;->setParentCompositionContext(Landroidx/compose/runtime/CompositionContext;)V HSPLandroidx/compose/ui/platform/AbstractComposeView;->shouldDelayChildPressedState()Z PLandroidx/compose/ui/platform/AbstractComposeView;->shouldDelayChildPressedState()Z Landroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1; HSPLandroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;->(Landroidx/compose/ui/platform/AbstractComposeView;)V PLandroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;->(Landroidx/compose/ui/platform/AbstractComposeView;)V HSPLandroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/AbstractComposeView$ensureCompositionCreated$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/AccessibilityManager; Landroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods; HSPLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->()V PLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->()V HSPLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->()V PLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->()V HSPLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->setAvailableExtraData(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V HPLandroidx/compose/ui/platform/AccessibilityNodeInfoVerificationHelperMethods;->setAvailableExtraData(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V Landroidx/compose/ui/platform/AndroidAccessibilityManager; HSPLandroidx/compose/ui/platform/AndroidAccessibilityManager;->(Landroid/content/Context;)V PLandroidx/compose/ui/platform/AndroidAccessibilityManager;->(Landroid/content/Context;)V Landroidx/compose/ui/platform/AndroidClipboardManager; HSPLandroidx/compose/ui/platform/AndroidClipboardManager;->(Landroid/content/Context;)V PLandroidx/compose/ui/platform/AndroidClipboardManager;->(Landroid/content/Context;)V Landroidx/compose/ui/platform/AndroidComposeView; HSPLandroidx/compose/ui/platform/AndroidComposeView;->$r8$lambda$6rnsioIDxAVR319ScBkOteeoeiE(Landroidx/compose/ui/platform/AndroidComposeView;)V PLandroidx/compose/ui/platform/AndroidComposeView;->$r8$lambda$6rnsioIDxAVR319ScBkOteeoeiE(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->$r8$lambda$TvhWqMihl4JwF42Odovn0ewO6fk(Landroidx/compose/ui/platform/AndroidComposeView;Z)V PLandroidx/compose/ui/platform/AndroidComposeView;->$r8$lambda$TvhWqMihl4JwF42Odovn0ewO6fk(Landroidx/compose/ui/platform/AndroidComposeView;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->()V PLandroidx/compose/ui/platform/AndroidComposeView;->()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->(Landroid/content/Context;Lkotlin/coroutines/CoroutineContext;)V HPLandroidx/compose/ui/platform/AndroidComposeView;->(Landroid/content/Context;Lkotlin/coroutines/CoroutineContext;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$getGetBooleanMethod$cp()Ljava/lang/reflect/Method; PLandroidx/compose/ui/platform/AndroidComposeView;->access$getGetBooleanMethod$cp()Ljava/lang/reflect/Method; HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$getPreviousMotionEvent$p(Landroidx/compose/ui/platform/AndroidComposeView;)Landroid/view/MotionEvent; PLandroidx/compose/ui/platform/AndroidComposeView;->access$getPreviousMotionEvent$p(Landroidx/compose/ui/platform/AndroidComposeView;)Landroid/view/MotionEvent; HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$getSystemPropertiesClass$cp()Ljava/lang/Class; PLandroidx/compose/ui/platform/AndroidComposeView;->access$getSystemPropertiesClass$cp()Ljava/lang/Class; HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$get_viewTreeOwners(Landroidx/compose/ui/platform/AndroidComposeView;)Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; PLandroidx/compose/ui/platform/AndroidComposeView;->access$get_viewTreeOwners(Landroidx/compose/ui/platform/AndroidComposeView;)Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$setGetBooleanMethod$cp(Ljava/lang/reflect/Method;)V PLandroidx/compose/ui/platform/AndroidComposeView;->access$setGetBooleanMethod$cp(Ljava/lang/reflect/Method;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->access$setSystemPropertiesClass$cp(Ljava/lang/Class;)V PLandroidx/compose/ui/platform/AndroidComposeView;->access$setSystemPropertiesClass$cp(Ljava/lang/Class;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->boundsUpdatesEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/ui/platform/AndroidComposeView;->boundsUpdatesEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidComposeView;->calculatePositionInWindow-MK-Hz9U(J)J PLandroidx/compose/ui/platform/AndroidComposeView;->calculatePositionInWindow-MK-Hz9U(J)J HSPLandroidx/compose/ui/platform/AndroidComposeView;->clearChildInvalidObservations(Landroid/view/ViewGroup;)V HPLandroidx/compose/ui/platform/AndroidComposeView;->clearChildInvalidObservations(Landroid/view/ViewGroup;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->convertMeasureSpec-I7RO_PI(I)J HPLandroidx/compose/ui/platform/AndroidComposeView;->convertMeasureSpec-I7RO_PI(I)J HSPLandroidx/compose/ui/platform/AndroidComposeView;->createLayer(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/OwnedLayer; HPLandroidx/compose/ui/platform/AndroidComposeView;->createLayer(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/OwnedLayer; HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchDraw(Landroid/graphics/Canvas;)V HPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z HPLandroidx/compose/ui/platform/AndroidComposeView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/compose/ui/platform/AndroidComposeView;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V PLandroidx/compose/ui/platform/AndroidComposeView;->forceMeasureTheSubtree(Landroidx/compose/ui/node/LayoutNode;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AndroidAccessibilityManager; PLandroidx/compose/ui/platform/AndroidComposeView;->getAccessibilityManager()Landroidx/compose/ui/platform/AndroidAccessibilityManager; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui_release()Landroidx/compose/ui/platform/AndroidViewsHandler; HPLandroidx/compose/ui/platform/AndroidComposeView;->getAndroidViewsHandler$ui_release()Landroidx/compose/ui/platform/AndroidViewsHandler; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofill()Landroidx/compose/ui/autofill/AndroidAutofill; PLandroidx/compose/ui/platform/AndroidComposeView;->getAutofill()Landroidx/compose/ui/autofill/AndroidAutofill; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillTree()Landroidx/compose/ui/autofill/AutofillTree; PLandroidx/compose/ui/platform/AndroidComposeView;->getAutofillTree()Landroidx/compose/ui/autofill/AutofillTree; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/AndroidClipboardManager; PLandroidx/compose/ui/platform/AndroidComposeView;->getClipboardManager()Landroidx/compose/ui/platform/AndroidClipboardManager; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; PLandroidx/compose/ui/platform/AndroidComposeView;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getDensity()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/platform/AndroidComposeView;->getDensity()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getFocusOwner()Landroidx/compose/ui/focus/FocusOwner; HPLandroidx/compose/ui/platform/AndroidComposeView;->getFocusOwner()Landroidx/compose/ui/focus/FocusOwner; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getFontFamilyResolver()Landroidx/compose/ui/text/font/FontFamilyResolverImpl; PLandroidx/compose/ui/platform/AndroidComposeView;->getFontFamilyResolver()Landroidx/compose/ui/text/font/FontFamilyResolverImpl; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getFontLoader()Landroidx/compose/ui/platform/ViewLayer$Companion; PLandroidx/compose/ui/platform/AndroidComposeView;->getFontLoader()Landroidx/compose/ui/platform/ViewLayer$Companion; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getHapticFeedBack()Landroidx/compose/ui/hapticfeedback/PlatformHapticFeedback; PLandroidx/compose/ui/platform/AndroidComposeView;->getHapticFeedBack()Landroidx/compose/ui/hapticfeedback/PlatformHapticFeedback; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getInputModeManager()Landroidx/compose/ui/input/InputModeManagerImpl; PLandroidx/compose/ui/platform/AndroidComposeView;->getInputModeManager()Landroidx/compose/ui/input/InputModeManagerImpl; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/platform/AndroidComposeView;->getLayoutDirection()Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getModifierLocalManager()Landroidx/compose/ui/modifier/ModifierLocalManager; PLandroidx/compose/ui/platform/AndroidComposeView;->getModifierLocalManager()Landroidx/compose/ui/modifier/ModifierLocalManager; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getPointerIconService()Landroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1; PLandroidx/compose/ui/platform/AndroidComposeView;->getPointerIconService()Landroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getRoot()Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/platform/AndroidComposeView;->getRoot()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getSemanticsOwner()Landroidx/compose/ui/semantics/SemanticsOwner; HPLandroidx/compose/ui/platform/AndroidComposeView;->getSemanticsOwner()Landroidx/compose/ui/semantics/SemanticsOwner; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getSharedDrawScope()Landroidx/compose/ui/node/LayoutNodeDrawScope; PLandroidx/compose/ui/platform/AndroidComposeView;->getSharedDrawScope()Landroidx/compose/ui/node/LayoutNodeDrawScope; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getShowLayoutBounds()Z PLandroidx/compose/ui/platform/AndroidComposeView;->getShowLayoutBounds()Z HSPLandroidx/compose/ui/platform/AndroidComposeView;->getSnapshotObserver()Landroidx/compose/ui/node/OwnerSnapshotObserver; HPLandroidx/compose/ui/platform/AndroidComposeView;->getSnapshotObserver()Landroidx/compose/ui/node/OwnerSnapshotObserver; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getTextInputService()Landroidx/compose/ui/text/input/TextInputService; PLandroidx/compose/ui/platform/AndroidComposeView;->getTextInputService()Landroidx/compose/ui/text/input/TextInputService; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getTextToolbar()Landroidx/compose/ui/platform/AndroidTextToolbar; PLandroidx/compose/ui/platform/AndroidComposeView;->getTextToolbar()Landroidx/compose/ui/platform/AndroidTextToolbar; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; PLandroidx/compose/ui/platform/AndroidComposeView;->getViewConfiguration()Landroidx/compose/ui/platform/ViewConfiguration; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getViewTreeOwners()Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; HPLandroidx/compose/ui/platform/AndroidComposeView;->getViewTreeOwners()Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; HSPLandroidx/compose/ui/platform/AndroidComposeView;->getWindowInfo()Landroidx/compose/ui/platform/WindowInfoImpl; PLandroidx/compose/ui/platform/AndroidComposeView;->getWindowInfo()Landroidx/compose/ui/platform/WindowInfoImpl; HSPLandroidx/compose/ui/platform/AndroidComposeView;->handleMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I HPLandroidx/compose/ui/platform/AndroidComposeView;->handleMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayers(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayers(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayoutNodeMeasurement(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/platform/AndroidComposeView;->invalidateLayoutNodeMeasurement(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->isBadMotionEvent(Landroid/view/MotionEvent;)Z HPLandroidx/compose/ui/platform/AndroidComposeView;->isBadMotionEvent(Landroid/view/MotionEvent;)Z HSPLandroidx/compose/ui/platform/AndroidComposeView;->isInBounds(Landroid/view/MotionEvent;)Z HPLandroidx/compose/ui/platform/AndroidComposeView;->isInBounds(Landroid/view/MotionEvent;)Z HSPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J HPLandroidx/compose/ui/platform/AndroidComposeView;->localToScreen-MK-Hz9U(J)J HSPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout(Z)V HPLandroidx/compose/ui/platform/AndroidComposeView;->measureAndLayout(Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->notifyLayerIsDirty$ui_release(Landroidx/compose/ui/node/OwnedLayer;Z)V HPLandroidx/compose/ui/platform/AndroidComposeView;->notifyLayerIsDirty$ui_release(Landroidx/compose/ui/node/OwnedLayer;Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onAttachedToWindow()V HPLandroidx/compose/ui/platform/AndroidComposeView;->onAttachedToWindow()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onDetach(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/platform/AndroidComposeView;->onDetach(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/platform/AndroidComposeView;->onDetachedFromWindow()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onDraw(Landroid/graphics/Canvas;)V HPLandroidx/compose/ui/platform/AndroidComposeView;->onDraw(Landroid/graphics/Canvas;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onEndApplyChanges()V HPLandroidx/compose/ui/platform/AndroidComposeView;->onEndApplyChanges()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onLayout(ZIIII)V HPLandroidx/compose/ui/platform/AndroidComposeView;->onLayout(ZIIII)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onLayoutChange(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/platform/AndroidComposeView;->onLayoutChange(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onMeasure(II)V HPLandroidx/compose/ui/platform/AndroidComposeView;->onMeasure(II)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestMeasure(Landroidx/compose/ui/node/LayoutNode;ZZZ)V HPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestMeasure(Landroidx/compose/ui/node/LayoutNode;ZZZ)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRequestRelayout(Landroidx/compose/ui/node/LayoutNode;ZZ)V PLandroidx/compose/ui/platform/AndroidComposeView;->onRequestRelayout(Landroidx/compose/ui/node/LayoutNode;ZZ)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onResume(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/compose/ui/platform/AndroidComposeView;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onRtlPropertiesChanged(I)V PLandroidx/compose/ui/platform/AndroidComposeView;->onRtlPropertiesChanged(I)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onSemanticsChange()V HPLandroidx/compose/ui/platform/AndroidComposeView;->onSemanticsChange()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->onWindowFocusChanged(Z)V PLandroidx/compose/ui/platform/AndroidComposeView;->onWindowFocusChanged(Z)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V HPLandroidx/compose/ui/platform/AndroidComposeView;->recalculateWindowPosition()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->recycle$ui_release(Landroidx/compose/ui/node/OwnedLayer;)V PLandroidx/compose/ui/platform/AndroidComposeView;->recycle$ui_release(Landroidx/compose/ui/node/OwnedLayer;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->registerOnEndApplyChangesListener(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/platform/AndroidComposeView;->registerOnEndApplyChangesListener(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->requestClearInvalidObservations()V PLandroidx/compose/ui/platform/AndroidComposeView;->requestClearInvalidObservations()V HSPLandroidx/compose/ui/platform/AndroidComposeView;->scheduleMeasureAndLayout(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/platform/AndroidComposeView;->scheduleMeasureAndLayout(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->screenToLocal-MK-Hz9U(J)J HPLandroidx/compose/ui/platform/AndroidComposeView;->screenToLocal-MK-Hz9U(J)J HSPLandroidx/compose/ui/platform/AndroidComposeView;->sendMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I HPLandroidx/compose/ui/platform/AndroidComposeView;->sendMotionEvent-8iAsVTc(Landroid/view/MotionEvent;)I HSPLandroidx/compose/ui/platform/AndroidComposeView;->setConfigurationChangeObserver(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/platform/AndroidComposeView;->setConfigurationChangeObserver(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->setOnViewTreeOwnersAvailable(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/platform/AndroidComposeView;->setOnViewTreeOwnersAvailable(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/platform/AndroidComposeView;->updatePositionCacheAndDispatch()V HPLandroidx/compose/ui/platform/AndroidComposeView;->updatePositionCacheAndDispatch()V Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2; HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;->(Landroidx/compose/ui/platform/AndroidComposeView;)V PLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;->(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;->onGlobalLayout()V HPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda2;->onGlobalLayout()V Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda3; HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda3;->(Landroidx/compose/ui/platform/AndroidComposeView;)V PLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda3;->(Landroidx/compose/ui/platform/AndroidComposeView;)V Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda4; HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda4;->(Landroidx/compose/ui/platform/AndroidComposeView;)V PLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda4;->(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda4;->onTouchModeChanged(Z)V PLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda4;->onTouchModeChanged(Z)V Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda5; HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda5;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda5;->(Ljava/lang/Object;I)V Landroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners; HSPLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->(Landroidx/lifecycle/LifecycleOwner;Landroidx/savedstate/SavedStateRegistryOwner;)V PLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->(Landroidx/lifecycle/LifecycleOwner;Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->getLifecycleOwner()Landroidx/lifecycle/LifecycleOwner; HPLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->getLifecycleOwner()Landroidx/lifecycle/LifecycleOwner; HSPLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->getSavedStateRegistryOwner()Landroidx/savedstate/SavedStateRegistryOwner; PLandroidx/compose/ui/platform/AndroidComposeView$ViewTreeOwners;->getSavedStateRegistryOwner()Landroidx/savedstate/SavedStateRegistryOwner; Landroidx/compose/ui/platform/AndroidComposeView$focusOwner$1; HSPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->(Landroidx/compose/ui/platform/AndroidComposeView;I)V PLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->(Landroidx/compose/ui/platform/AndroidComposeView;I)V HSPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->invoke(Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/platform/AndroidComposeView$focusOwner$1;->invoke(Lkotlin/jvm/functions/Function0;)V Landroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1; HSPLandroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1;->(Landroidx/compose/ui/platform/AndroidComposeView;)V PLandroidx/compose/ui/platform/AndroidComposeView$pointerIconService$1;->(Landroidx/compose/ui/platform/AndroidComposeView;)V Landroidx/compose/ui/platform/AndroidComposeView$removeAndroidView$1; Landroidx/compose/ui/platform/AndroidComposeView$resendMotionEventRunnable$1; HSPLandroidx/compose/ui/platform/AndroidComposeView$resendMotionEventRunnable$1;->(Landroidx/compose/ui/platform/AndroidComposeView;)V PLandroidx/compose/ui/platform/AndroidComposeView$resendMotionEventRunnable$1;->(Landroidx/compose/ui/platform/AndroidComposeView;)V Landroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2; HSPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->invoke()Ljava/lang/Object; HPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->invoke()Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->invoke()V HPLandroidx/compose/ui/platform/AndroidComposeView$viewTreeOwners$2;->invoke()V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->()V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->(Landroidx/compose/ui/platform/AndroidComposeView;)V HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->(Landroidx/compose/ui/platform/AndroidComposeView;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$createNodeInfo(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;I)Landroid/view/accessibility/AccessibilityNodeInfo; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$createNodeInfo(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;I)Landroid/view/accessibility/AccessibilityNodeInfo; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getHandler$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Landroid/os/Handler; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->access$getSemanticsChangeChecker$p(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)Landroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticLambda5; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsUpdatesEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->boundsUpdatesEventLoop(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityManager$ui_release()Landroid/view/accessibility/AccessibilityManager; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityManager$ui_release()Landroid/view/accessibility/AccessibilityManager; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilityNodeProvider(Landroid/view/View;)Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionEnd(Landroidx/compose/ui/semantics/SemanticsNode;)I HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionEnd(Landroidx/compose/ui/semantics/SemanticsNode;)I HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionStart(Landroidx/compose/ui/semantics/SemanticsNode;)I HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getAccessibilitySelectionStart(Landroidx/compose/ui/semantics/SemanticsNode;)I HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes$ui_release()Ljava/util/Map; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getCurrentSemanticsNodes$ui_release()Ljava/util/Map; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getEnabledStateListener$ui_release()Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getEnabledStateListener$ui_release()Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;)Z HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoIsCheckable(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoStateDescriptionOrNull(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoStateDescriptionOrNull(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoText(Landroidx/compose/ui/semantics/SemanticsNode;)Landroid/text/SpannableString; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getInfoText(Landroidx/compose/ui/semantics/SemanticsNode;)Landroid/text/SpannableString; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getIterableTextForAccessibility(Landroidx/compose/ui/semantics/SemanticsNode;)Ljava/lang/String; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTextForTextField(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/AnnotatedString; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTextForTextField(Landroidx/compose/ui/semantics/SemanticsConfiguration;)Landroidx/compose/ui/text/AnnotatedString; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTouchExplorationStateListener$ui_release()Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda2; PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->getTouchExplorationStateListener$ui_release()Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda2; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isEnabledForAccessibility()Z HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isEnabledForAccessibility()Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isScreenReaderFocusable(Landroidx/compose/ui/semantics/SemanticsNode;)Z HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->isScreenReaderFocusable(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onLayoutChange$ui_release(Landroidx/compose/ui/node/LayoutNode;)V HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onLayoutChange$ui_release(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onSemanticsChange$ui_release()V HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onSemanticsChange$ui_release()V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollBackward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollBackward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollForward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->populateAccessibilityNodeInfoProperties$canScrollForward(Landroidx/compose/ui/semantics/ScrollAxisRange;)Z HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setContentCaptureSession$ui_release(Landroidx/core/view/contentcapture/ContentCaptureSessionCompat;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->setContentCaptureSession$ui_release(Landroidx/core/view/contentcapture/ContentCaptureSessionCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;->trimToSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda2; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda2;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$$ExternalSyntheticLambda2;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewAttachedToWindow(Landroid/view/View;)V HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;->onViewDetachedFromWindow(Landroid/view/View;)V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->addSetProgressAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api24Impl;->addSetProgressAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->addPageActions(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$Api29Impl;->addPageActions(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;)V HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; HPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$MyNodeProvider;->createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo; Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy;->(Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/Map;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$SemanticsNodeCopy;->(Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/Map;)V Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1; HSPLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->(Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$boundsUpdatesEventLoop$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ; HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V PLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V PLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->disallowForceDark(Landroid/view/View;)V PLandroidx/compose/ui/platform/AndroidComposeViewForceDarkModeQ;->disallowForceDark(Landroid/view/View;)V Landroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO; HSPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->()V PLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->()V PLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->()V HSPLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->focusable(Landroid/view/View;IZ)V PLandroidx/compose/ui/platform/AndroidComposeViewVerificationHelperMethodsO;->focusable(Landroid/view/View;IZ)V Landroidx/compose/ui/platform/AndroidComposeView_androidKt; HSPLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->()V PLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->()V HSPLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->access$layoutDirectionFromInt(I)Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->access$layoutDirectionFromInt(I)Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->getLocaleLayoutDirection(Landroid/content/res/Configuration;)Landroidx/compose/ui/unit/LayoutDirection; PLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->getLocaleLayoutDirection(Landroid/content/res/Configuration;)Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->getPlatformTextInputServiceInterceptor()Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/platform/AndroidComposeView_androidKt;->getPlatformTextInputServiceInterceptor()Lkotlin/jvm/functions/Function1; Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->()V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->()V HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->ProvideAndroidCompositionLocals(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->ProvideAndroidCompositionLocals(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalConfiguration()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalConfiguration()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalContext()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalContext()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalImageVectorCache()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalImageVectorCache()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalLifecycleOwner()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalLifecycleOwner()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalSavedStateRegistryOwner()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalSavedStateRegistryOwner()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalView()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalView()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;->(Landroidx/compose/ui/platform/DisposableSaveableStateRegistry;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;->(Landroidx/compose/ui/platform/DisposableSaveableStateRegistry;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$2$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4;->(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;I)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$4;->(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function2;I)V Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;->(Landroid/content/Context;Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;->(Landroid/content/Context;Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$1$invoke$$inlined$onDispose$1;->dispose()V Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1; HSPLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;->(Landroid/content/res/Configuration;Landroidx/compose/ui/res/ImageVectorCache;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;->(Landroid/content/res/Configuration;Landroidx/compose/ui/res/ImageVectorCache;)V PLandroidx/compose/ui/platform/AndroidCompositionLocals_androidKt$obtainImageVectorCache$callbacks$1$1;->onTrimMemory(I)V Landroidx/compose/ui/platform/AndroidTextToolbar; HSPLandroidx/compose/ui/platform/AndroidTextToolbar;->(Landroid/view/View;)V PLandroidx/compose/ui/platform/AndroidTextToolbar;->(Landroid/view/View;)V Landroidx/compose/ui/platform/AndroidUiDispatcher; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->()V PLandroidx/compose/ui/platform/AndroidUiDispatcher;->()V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->(Landroid/view/Choreographer;Landroid/os/Handler;)V PLandroidx/compose/ui/platform/AndroidUiDispatcher;->(Landroid/view/Choreographer;Landroid/os/Handler;)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getHandler$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Landroid/os/Handler; PLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getHandler$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Landroid/os/Handler; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getLock$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Ljava/lang/Object; PLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getLock$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getMain$delegate$cp()Lkotlin/Lazy; PLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getMain$delegate$cp()Lkotlin/Lazy; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getToRunOnFrame$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Ljava/util/List; PLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$getToRunOnFrame$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)Ljava/util/List; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performFrameDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;J)V HPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performFrameDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;J)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performTrampolineDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V HPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$performTrampolineDispatch(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$setScheduledFrameDispatch$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V PLandroidx/compose/ui/platform/AndroidUiDispatcher;->access$setScheduledFrameDispatch$p(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HPLandroidx/compose/ui/platform/AndroidUiDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->getChoreographer()Landroid/view/Choreographer; PLandroidx/compose/ui/platform/AndroidUiDispatcher;->getChoreographer()Landroid/view/Choreographer; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->getFrameClock()Landroidx/compose/ui/platform/AndroidUiFrameClock; PLandroidx/compose/ui/platform/AndroidUiDispatcher;->getFrameClock()Landroidx/compose/ui/platform/AndroidUiFrameClock; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher;->postFrameCallback$ui_release(Landroid/view/Choreographer$FrameCallback;)V HPLandroidx/compose/ui/platform/AndroidUiDispatcher;->postFrameCallback$ui_release(Landroid/view/Choreographer$FrameCallback;)V Landroidx/compose/ui/platform/AndroidUiDispatcher$Companion$currentThread$1; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$currentThread$1;->()V PLandroidx/compose/ui/platform/AndroidUiDispatcher$Companion$currentThread$1;->()V Landroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1; HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V PLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->(Landroidx/compose/ui/platform/AndroidUiDispatcher;)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->doFrame(J)V HPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->doFrame(J)V HSPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->run()V HPLandroidx/compose/ui/platform/AndroidUiDispatcher$dispatchCallback$1;->run()V Landroidx/compose/ui/platform/AndroidUiFrameClock; HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->(Landroid/view/Choreographer;Landroidx/compose/ui/platform/AndroidUiDispatcher;)V PLandroidx/compose/ui/platform/AndroidUiFrameClock;->(Landroid/view/Choreographer;Landroidx/compose/ui/platform/AndroidUiDispatcher;)V HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; PLandroidx/compose/ui/platform/AndroidUiFrameClock;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; PLandroidx/compose/ui/platform/AndroidUiFrameClock;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; PLandroidx/compose/ui/platform/AndroidUiFrameClock;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/ui/platform/AndroidUiFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/AndroidUiFrameClock;->withFrameNanos(Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1; HSPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;Landroidx/compose/ui/platform/AndroidUiFrameClock;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;Landroidx/compose/ui/platform/AndroidUiFrameClock;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->doFrame(J)V HPLandroidx/compose/ui/platform/AndroidUiFrameClock$withFrameNanos$2$callback$1;->doFrame(J)V Landroidx/compose/ui/platform/AndroidUriHandler; HSPLandroidx/compose/ui/platform/AndroidUriHandler;->(Landroid/content/Context;)V PLandroidx/compose/ui/platform/AndroidUriHandler;->(Landroid/content/Context;)V Landroidx/compose/ui/platform/AndroidViewConfiguration; HSPLandroidx/compose/ui/platform/AndroidViewConfiguration;->(Landroid/view/ViewConfiguration;)V PLandroidx/compose/ui/platform/AndroidViewConfiguration;->(Landroid/view/ViewConfiguration;)V PLandroidx/compose/ui/platform/AndroidViewConfiguration;->getTouchSlop()F Landroidx/compose/ui/platform/AndroidViewsHandler; HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V PLandroidx/compose/ui/platform/AndroidViewsHandler;->(Landroid/content/Context;)V HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; HPLandroidx/compose/ui/platform/AndroidViewsHandler;->getLayoutNodeToHolder()Ljava/util/HashMap; HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V PLandroidx/compose/ui/platform/AndroidViewsHandler;->onLayout(ZIIII)V HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V HPLandroidx/compose/ui/platform/AndroidViewsHandler;->onMeasure(II)V HSPLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V PLandroidx/compose/ui/platform/AndroidViewsHandler;->requestLayout()V Landroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)I PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)I HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)Z PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)Z HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;I)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;I)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$10(Landroid/graphics/RenderNode;F)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$10(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/RenderNode;I)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/RenderNode;I)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;F)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;I)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;I)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$4(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$4(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$5(Landroid/graphics/RenderNode;F)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$5(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$6(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$6(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$7(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$7(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$8(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$8(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$9(Landroid/graphics/RenderNode;F)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m$9(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Canvas;Landroid/graphics/RenderNode;)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Canvas;Landroid/graphics/RenderNode;)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)F HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)F HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)I HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)I HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Z HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Z HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;F)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;I)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;I)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Landroid/graphics/Outline;)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Landroid/graphics/Outline;)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Z)V HPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Z)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)V HSPLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V PLandroidx/compose/ui/platform/Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/graphics/Matrix;)V Landroidx/compose/ui/platform/CalculateMatrixToWindow; Landroidx/compose/ui/platform/CalculateMatrixToWindowApi29; HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->()V PLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->()V HSPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V HPLandroidx/compose/ui/platform/CalculateMatrixToWindowApi29;->calculateMatrixToWindow-EL8BTi8(Landroid/view/View;[F)V Landroidx/compose/ui/platform/ClipboardManager; Landroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt; HSPLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;->()V PLandroidx/compose/ui/platform/ComposableSingletons$Wrapper_androidKt;->()V Landroidx/compose/ui/platform/ComposeView; HSPLandroidx/compose/ui/platform/ComposeView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLandroidx/compose/ui/platform/ComposeView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/compose/ui/platform/ComposeView;->Content(Landroidx/compose/runtime/Composer;I)V PLandroidx/compose/ui/platform/ComposeView;->Content(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; PLandroidx/compose/ui/platform/ComposeView;->getAccessibilityClassName()Ljava/lang/CharSequence; HSPLandroidx/compose/ui/platform/ComposeView;->getShouldCreateCompositionOnAttachedToWindow()Z PLandroidx/compose/ui/platform/ComposeView;->getShouldCreateCompositionOnAttachedToWindow()Z HSPLandroidx/compose/ui/platform/ComposeView;->setContent(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLandroidx/compose/ui/platform/ComposeView;->setContent(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V Landroidx/compose/ui/platform/ComposeView$Content$1; HSPLandroidx/compose/ui/platform/ComposeView$Content$1;->(Landroidx/compose/ui/platform/ComposeView;I)V PLandroidx/compose/ui/platform/ComposeView$Content$1;->(Landroidx/compose/ui/platform/ComposeView;I)V Landroidx/compose/ui/platform/CompositionLocalsKt; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->()V PLandroidx/compose/ui/platform/CompositionLocalsKt;->()V HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->ProvideCommonCompositionLocals(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/UriHandler;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLandroidx/compose/ui/platform/CompositionLocalsKt;->ProvideCommonCompositionLocals(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/UriHandler;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalAccessibilityManager()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalAccessibilityManager()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalDensity()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalDensity()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalFontFamilyResolver()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalFontFamilyResolver()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalHapticFeedback()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalHapticFeedback()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalInputModeManager()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalInputModeManager()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalLayoutDirection()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalLayoutDirection()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalUriHandler()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalUriHandler()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalViewConfiguration()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLandroidx/compose/ui/platform/CompositionLocalsKt;->getLocalViewConfiguration()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Landroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1; HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->()V PLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->()V HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->(I)V PLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->(I)V HSPLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/platform/CompositionLocalsKt$LocalDensity$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1; HSPLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;->(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/UriHandler;Lkotlin/jvm/functions/Function2;II)V PLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;->(Landroidx/compose/ui/node/Owner;Landroidx/compose/ui/platform/UriHandler;Lkotlin/jvm/functions/Function2;II)V HSPLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;->invoke(Landroidx/compose/runtime/Composer;I)V PLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/CompositionLocalsKt$ProvideCommonCompositionLocals$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/DelegatingSoftwareKeyboardController; HSPLandroidx/compose/ui/platform/DelegatingSoftwareKeyboardController;->(Landroidx/compose/ui/text/input/TextInputService;)V PLandroidx/compose/ui/platform/DelegatingSoftwareKeyboardController;->(Landroidx/compose/ui/text/input/TextInputService;)V Landroidx/compose/ui/platform/DeviceRenderNode; Landroidx/compose/ui/platform/DisposableSaveableStateRegistry; HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->canBeSaved(Ljava/lang/Object;)Z HPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->canBeSaved(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->consumeRestored(Ljava/lang/String;)Ljava/lang/Object; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->dispose()V HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry;->registerProvider(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Landroidx/compose/runtime/saveable/SaveableStateRegistryImpl$registerProvider$3; Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1; HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;->(ZLandroidx/savedstate/SavedStateRegistry;Ljava/lang/String;)V PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;->(ZLandroidx/savedstate/SavedStateRegistry;Ljava/lang/String;)V PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1; HSPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V PLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1;->(Landroidx/compose/runtime/saveable/SaveableStateRegistry;)V HPLandroidx/compose/ui/platform/DisposableSaveableStateRegistry_androidKt$DisposableSaveableStateRegistry$registered$1;->saveState()Landroid/os/Bundle; Landroidx/compose/ui/platform/GlobalSnapshotManager; HSPLandroidx/compose/ui/platform/GlobalSnapshotManager;->()V PLandroidx/compose/ui/platform/GlobalSnapshotManager;->()V HSPLandroidx/compose/ui/platform/GlobalSnapshotManager;->ensureStarted()V PLandroidx/compose/ui/platform/GlobalSnapshotManager;->ensureStarted()V Landroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1; HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->(Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->(Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2; HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/GlobalSnapshotManager$ensureStarted$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/InfiniteAnimationPolicy; HSPLandroidx/compose/ui/platform/InfiniteAnimationPolicy;->()V PLandroidx/compose/ui/platform/InfiniteAnimationPolicy;->()V Landroidx/compose/ui/platform/InfiniteAnimationPolicy$Key; HSPLandroidx/compose/ui/platform/InfiniteAnimationPolicy$Key;->()V PLandroidx/compose/ui/platform/InfiniteAnimationPolicy$Key;->()V HSPLandroidx/compose/ui/platform/InfiniteAnimationPolicy$Key;->()V PLandroidx/compose/ui/platform/InfiniteAnimationPolicy$Key;->()V Landroidx/compose/ui/platform/InspectableModifier; HSPLandroidx/compose/ui/platform/InspectableModifier;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/platform/InspectableModifier;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/platform/InspectableModifier;->getEnd()Landroidx/compose/ui/platform/InspectableModifier$End; PLandroidx/compose/ui/platform/InspectableModifier;->getEnd()Landroidx/compose/ui/platform/InspectableModifier$End; Landroidx/compose/ui/platform/InspectableModifier$End; HSPLandroidx/compose/ui/platform/InspectableModifier$End;->()V HPLandroidx/compose/ui/platform/InspectableModifier$End;->()V Landroidx/compose/ui/platform/InspectableValueKt; HSPLandroidx/compose/ui/platform/InspectableValueKt;->()V PLandroidx/compose/ui/platform/InspectableValueKt;->()V HSPLandroidx/compose/ui/platform/InspectableValueKt;->getNoInspectorInfo()Lkotlin/jvm/functions/Function1; HPLandroidx/compose/ui/platform/InspectableValueKt;->getNoInspectorInfo()Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/ui/platform/InspectableValueKt;->inspectableWrapper(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/platform/InspectableValueKt;->inspectableWrapper(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1; HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->()V PLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->()V HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->(I)V PLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->(I)V HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; HPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; HSPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/InspectableValueKt$NoInspectorInfo$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/InspectorValueInfo; HSPLandroidx/compose/ui/platform/InspectorValueInfo;->(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/platform/InspectorValueInfo;->(Lkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/platform/LayerMatrixCache; HSPLandroidx/compose/ui/platform/LayerMatrixCache;->(Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/platform/LayerMatrixCache;->(Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateInverseMatrix-bWbORWo(Ljava/lang/Object;)[F HPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateInverseMatrix-bWbORWo(Ljava/lang/Object;)[F HSPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateMatrix-GrdbGEg(Ljava/lang/Object;)[F HPLandroidx/compose/ui/platform/LayerMatrixCache;->calculateMatrix-GrdbGEg(Ljava/lang/Object;)[F HSPLandroidx/compose/ui/platform/LayerMatrixCache;->invalidate()V PLandroidx/compose/ui/platform/LayerMatrixCache;->invalidate()V Landroidx/compose/ui/platform/MotionDurationScaleImpl; HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->()V PLandroidx/compose/ui/platform/MotionDurationScaleImpl;->()V HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->getScaleFactor()F PLandroidx/compose/ui/platform/MotionDurationScaleImpl;->getScaleFactor()F HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; PLandroidx/compose/ui/platform/MotionDurationScaleImpl;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLandroidx/compose/ui/platform/MotionDurationScaleImpl;->setScaleFactor(F)V PLandroidx/compose/ui/platform/MotionDurationScaleImpl;->setScaleFactor(F)V Landroidx/compose/ui/platform/OutlineResolver; HSPLandroidx/compose/ui/platform/OutlineResolver;->(Landroidx/compose/ui/unit/Density;)V HPLandroidx/compose/ui/platform/OutlineResolver;->(Landroidx/compose/ui/unit/Density;)V HSPLandroidx/compose/ui/platform/OutlineResolver;->getOutline()Landroid/graphics/Outline; HPLandroidx/compose/ui/platform/OutlineResolver;->getOutline()Landroid/graphics/Outline; HSPLandroidx/compose/ui/platform/OutlineResolver;->getOutlineClipSupported()Z PLandroidx/compose/ui/platform/OutlineResolver;->getOutlineClipSupported()Z HSPLandroidx/compose/ui/platform/OutlineResolver;->isInOutline-k-4lQ0M(J)Z PLandroidx/compose/ui/platform/OutlineResolver;->isInOutline-k-4lQ0M(J)Z HSPLandroidx/compose/ui/platform/OutlineResolver;->update(Landroidx/compose/ui/graphics/Shape;FZFLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Z HPLandroidx/compose/ui/platform/OutlineResolver;->update(Landroidx/compose/ui/graphics/Shape;FZFLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Z HSPLandroidx/compose/ui/platform/OutlineResolver;->update-uvyYCjk(J)V PLandroidx/compose/ui/platform/OutlineResolver;->update-uvyYCjk(J)V HSPLandroidx/compose/ui/platform/OutlineResolver;->updateCache()V HPLandroidx/compose/ui/platform/OutlineResolver;->updateCache()V Landroidx/compose/ui/platform/RenderNodeApi29; HSPLandroidx/compose/ui/platform/RenderNodeApi29;->()V PLandroidx/compose/ui/platform/RenderNodeApi29;->()V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->discardDisplayList()V HPLandroidx/compose/ui/platform/RenderNodeApi29;->discardDisplayList()V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->drawInto(Landroid/graphics/Canvas;)V PLandroidx/compose/ui/platform/RenderNodeApi29;->drawInto(Landroid/graphics/Canvas;)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getAlpha()F HPLandroidx/compose/ui/platform/RenderNodeApi29;->getAlpha()F HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getClipToBounds()Z PLandroidx/compose/ui/platform/RenderNodeApi29;->getClipToBounds()Z HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getClipToOutline()Z HPLandroidx/compose/ui/platform/RenderNodeApi29;->getClipToOutline()Z HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getElevation()F HPLandroidx/compose/ui/platform/RenderNodeApi29;->getElevation()F HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getHasDisplayList()Z HPLandroidx/compose/ui/platform/RenderNodeApi29;->getHasDisplayList()Z HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getHeight()I HPLandroidx/compose/ui/platform/RenderNodeApi29;->getHeight()I HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getLeft()I HPLandroidx/compose/ui/platform/RenderNodeApi29;->getLeft()I HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getMatrix(Landroid/graphics/Matrix;)V PLandroidx/compose/ui/platform/RenderNodeApi29;->getMatrix(Landroid/graphics/Matrix;)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getTop()I PLandroidx/compose/ui/platform/RenderNodeApi29;->getTop()I HSPLandroidx/compose/ui/platform/RenderNodeApi29;->getWidth()I HPLandroidx/compose/ui/platform/RenderNodeApi29;->getWidth()I HSPLandroidx/compose/ui/platform/RenderNodeApi29;->offsetLeftAndRight(I)V PLandroidx/compose/ui/platform/RenderNodeApi29;->offsetLeftAndRight(I)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->offsetTopAndBottom(I)V PLandroidx/compose/ui/platform/RenderNodeApi29;->offsetTopAndBottom(I)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->record(Landroidx/compose/runtime/Stack;Landroidx/compose/ui/graphics/Path;Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->record(Landroidx/compose/runtime/Stack;Landroidx/compose/ui/graphics/Path;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setAlpha(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setAlpha(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setAmbientShadowColor(I)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setAmbientShadowColor(I)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setCameraDistance(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setCameraDistance(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setClipToBounds(Z)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setClipToBounds(Z)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setClipToOutline(Z)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setClipToOutline(Z)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setCompositingStrategy-aDBOjCE(I)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setCompositingStrategy-aDBOjCE(I)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setElevation(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setElevation(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setHasOverlappingRendering()Z PLandroidx/compose/ui/platform/RenderNodeApi29;->setHasOverlappingRendering()Z HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setOutline(Landroid/graphics/Outline;)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setOutline(Landroid/graphics/Outline;)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setPivotX(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setPivotX(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setPivotY(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setPivotY(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setPosition(IIII)Z PLandroidx/compose/ui/platform/RenderNodeApi29;->setPosition(IIII)Z HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRenderEffect(Landroidx/compose/ui/graphics/RenderEffect;)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setRenderEffect(Landroidx/compose/ui/graphics/RenderEffect;)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationX(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationX(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationY(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationY(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationZ(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setRotationZ(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setScaleX(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setScaleX(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setScaleY(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setScaleY(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setSpotShadowColor(I)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setSpotShadowColor(I)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setTranslationX(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setTranslationX(F)V HSPLandroidx/compose/ui/platform/RenderNodeApi29;->setTranslationY(F)V HPLandroidx/compose/ui/platform/RenderNodeApi29;->setTranslationY(F)V Landroidx/compose/ui/platform/RenderNodeLayer; HSPLandroidx/compose/ui/platform/RenderNodeLayer;->()V PLandroidx/compose/ui/platform/RenderNodeLayer;->()V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->(Landroidx/compose/ui/platform/AndroidComposeView;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->destroy()V PLandroidx/compose/ui/platform/RenderNodeLayer;->destroy()V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->drawLayer(Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->drawLayer(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->invalidate()V HPLandroidx/compose/ui/platform/RenderNodeLayer;->invalidate()V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->isInLayer-k-4lQ0M(J)Z HPLandroidx/compose/ui/platform/RenderNodeLayer;->isInLayer-k-4lQ0M(J)Z HSPLandroidx/compose/ui/platform/RenderNodeLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->mapBounds(Landroidx/compose/ui/geometry/MutableRect;Z)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->mapOffset-8S9VItk(JZ)J HPLandroidx/compose/ui/platform/RenderNodeLayer;->mapOffset-8S9VItk(JZ)J HSPLandroidx/compose/ui/platform/RenderNodeLayer;->move--gyyYBs(J)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->move--gyyYBs(J)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->resize-ozmzZPI(J)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->resize-ozmzZPI(J)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->reuseLayer(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/platform/RenderNodeLayer;->reuseLayer(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->setDirty(Z)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->setDirty(Z)V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->updateDisplayList()V HPLandroidx/compose/ui/platform/RenderNodeLayer;->updateDisplayList()V HSPLandroidx/compose/ui/platform/RenderNodeLayer;->updateLayerProperties-dDxr-wY(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZLandroidx/compose/ui/graphics/RenderEffect;JJILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)V HPLandroidx/compose/ui/platform/RenderNodeLayer;->updateLayerProperties-dDxr-wY(FFFFFFFFFFJLandroidx/compose/ui/graphics/Shape;ZLandroidx/compose/ui/graphics/RenderEffect;JJILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)V Landroidx/compose/ui/platform/ScrollObservationScope; Landroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds; HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Rect;)V PLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->(Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Rect;)V HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getAdjustedBounds()Landroid/graphics/Rect; HPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getAdjustedBounds()Landroid/graphics/Rect; HSPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; HPLandroidx/compose/ui/platform/SemanticsNodeWithAdjustedBounds;->getSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; Landroidx/compose/ui/platform/UriHandler; Landroidx/compose/ui/platform/ViewCompositionStrategy; Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$1; HSPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$1;->(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;Landroidx/customview/poolingcontainer/PoolingContainerListener;)V PLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$1;->(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat$1;Landroidx/customview/poolingcontainer/PoolingContainerListener;)V Landroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$poolingContainerListener$1; HSPLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$poolingContainerListener$1;->(Landroidx/compose/ui/platform/AbstractComposeView;)V PLandroidx/compose/ui/platform/ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool$installFor$poolingContainerListener$1;->(Landroidx/compose/ui/platform/AbstractComposeView;)V Landroidx/compose/ui/platform/ViewCompositionStrategy_androidKt; HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->()V PLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->()V HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$canBeSavedToBundle(Ljava/lang/Object;)Z PLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$canBeSavedToBundle(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z HPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$enabled(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z HPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$excludeLineAndPageGranularities(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$isVisible(Landroidx/compose/ui/semantics/SemanticsNode;)Z HPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->access$isVisible(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->canBeSavedToBundle(Ljava/lang/Object;)Z HPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->canBeSavedToBundle(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->getAllUncoveredSemanticsNodesToMap$findAllSemanticNodesRecursive(Landroid/graphics/Region;Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/LinkedHashMap;Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Region;)V HPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->getAllUncoveredSemanticsNodesToMap$findAllSemanticNodesRecursive(Landroid/graphics/Region;Landroidx/compose/ui/semantics/SemanticsNode;Ljava/util/LinkedHashMap;Landroidx/compose/ui/semantics/SemanticsNode;Landroid/graphics/Region;)V HSPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->getAllUncoveredSemanticsNodesToMap(Landroidx/compose/ui/semantics/SemanticsOwner;)Ljava/util/LinkedHashMap; HPLandroidx/compose/ui/platform/ViewCompositionStrategy_androidKt;->getAllUncoveredSemanticsNodesToMap(Landroidx/compose/ui/semantics/SemanticsOwner;)Ljava/util/LinkedHashMap; Landroidx/compose/ui/platform/ViewConfiguration; HSPLandroidx/compose/ui/platform/ViewConfiguration;->getMinimumTouchTargetSize-MYxV2XQ()J HPLandroidx/compose/ui/platform/ViewConfiguration;->getMinimumTouchTargetSize-MYxV2XQ()J Landroidx/compose/ui/platform/ViewLayer; HSPLandroidx/compose/ui/platform/ViewLayer;->()V PLandroidx/compose/ui/platform/ViewLayer;->()V HSPLandroidx/compose/ui/platform/ViewLayer;->access$getShouldUseDispatchDraw$cp()Z PLandroidx/compose/ui/platform/ViewLayer;->access$getShouldUseDispatchDraw$cp()Z Landroidx/compose/ui/platform/ViewLayer$Companion; HSPLandroidx/compose/ui/platform/ViewLayer$Companion;->()V PLandroidx/compose/ui/platform/ViewLayer$Companion;->()V HSPLandroidx/compose/ui/platform/ViewLayer$Companion;->()V PLandroidx/compose/ui/platform/ViewLayer$Companion;->()V HSPLandroidx/compose/ui/platform/ViewLayer$Companion;->access$getIsShowingLayoutBounds()Z PLandroidx/compose/ui/platform/ViewLayer$Companion;->access$getIsShowingLayoutBounds()Z Landroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1; HSPLandroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1;->()V PLandroidx/compose/ui/platform/ViewLayer$Companion$OutlineProvider$1;->()V Landroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1; HSPLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->()V PLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->()V HSPLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->(I)V PLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->(I)V HSPLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/platform/ViewLayer$Companion$getMatrix$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WeakCache; HSPLandroidx/compose/ui/platform/WeakCache;->()V PLandroidx/compose/ui/platform/WeakCache;->()V HSPLandroidx/compose/ui/platform/WeakCache;->pop()Ljava/lang/Object; HPLandroidx/compose/ui/platform/WeakCache;->pop()Ljava/lang/Object; HSPLandroidx/compose/ui/platform/WeakCache;->push(Ljava/lang/Object;)V HPLandroidx/compose/ui/platform/WeakCache;->push(Ljava/lang/Object;)V Landroidx/compose/ui/platform/WindowInfoImpl; HSPLandroidx/compose/ui/platform/WindowInfoImpl;->()V PLandroidx/compose/ui/platform/WindowInfoImpl;->()V HSPLandroidx/compose/ui/platform/WindowInfoImpl;->()V PLandroidx/compose/ui/platform/WindowInfoImpl;->()V HSPLandroidx/compose/ui/platform/WindowInfoImpl;->setKeyboardModifiers-5xRPYO0(I)V PLandroidx/compose/ui/platform/WindowInfoImpl;->setKeyboardModifiers-5xRPYO0(I)V HSPLandroidx/compose/ui/platform/WindowInfoImpl;->setWindowFocused(Z)V PLandroidx/compose/ui/platform/WindowInfoImpl;->setWindowFocused(Z)V Landroidx/compose/ui/platform/WindowRecomposerFactory; HSPLandroidx/compose/ui/platform/WindowRecomposerFactory;->()V PLandroidx/compose/ui/platform/WindowRecomposerFactory;->()V Landroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1; HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;->()V PLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;->()V HSPLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;->()V PLandroidx/compose/ui/platform/WindowRecomposerFactory$Companion$LifecycleAware$1;->()V Landroidx/compose/ui/platform/WindowRecomposerPolicy; HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy;->()V PLandroidx/compose/ui/platform/WindowRecomposerPolicy;->()V HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy;->createAndInstallWindowRecomposer$ui_release(Landroid/view/View;)Landroidx/compose/runtime/Recomposer; HPLandroidx/compose/ui/platform/WindowRecomposerPolicy;->createAndInstallWindowRecomposer$ui_release(Landroid/view/View;)Landroidx/compose/runtime/Recomposer; Landroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1; HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->(Lkotlinx/coroutines/Job;)V PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->(Lkotlinx/coroutines/Job;)V HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V Landroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1; HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->(Landroidx/compose/runtime/Recomposer;Landroid/view/View;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->(Landroidx/compose/runtime/Recomposer;Landroid/view/View;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposerPolicy$createAndInstallWindowRecomposer$unsetJob$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WindowRecomposer_androidKt; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->()V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->()V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->access$getAnimationScaleFlowFor(Landroid/content/Context;)Lkotlinx/coroutines/flow/StateFlow; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->access$getAnimationScaleFlowFor(Landroid/content/Context;)Lkotlinx/coroutines/flow/StateFlow; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->getCompositionContext(Landroid/view/View;)Landroidx/compose/runtime/CompositionContext; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt;->getCompositionContext(Landroid/view/View;)Landroidx/compose/runtime/CompositionContext; Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->(Landroid/view/View;Landroidx/compose/runtime/Recomposer;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->(Landroid/view/View;Landroidx/compose/runtime/Recomposer;)V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewAttachedToWindow(Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$1;->onViewDetachedFromWindow(Landroid/view/View;)V Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/PausableMonotonicFrameClock;Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/internal/Ref$ObjectRef;Landroid/view/View;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->(Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/runtime/PausableMonotonicFrameClock;Landroidx/compose/runtime/Recomposer;Lkotlin/jvm/internal/Ref$ObjectRef;Landroid/view/View;)V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings;->()V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$WhenMappings;->()V Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/compose/runtime/Recomposer;Landroidx/lifecycle/LifecycleOwner;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;Landroid/view/View;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/compose/runtime/Recomposer;Landroidx/lifecycle/LifecycleOwner;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2;Landroid/view/View;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->(Lkotlinx/coroutines/flow/StateFlow;Landroidx/compose/ui/platform/MotionDurationScaleImpl;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->(Lkotlinx/coroutines/flow/StateFlow;Landroidx/compose/ui/platform/MotionDurationScaleImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;->(Landroidx/compose/ui/platform/MotionDurationScaleImpl;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;->(Landroidx/compose/ui/platform/MotionDurationScaleImpl;)V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$createLifecycleAwareWindowRecomposer$2$onStateChanged$1$1$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->(Landroid/content/ContentResolver;Landroid/net/Uri;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;Lkotlinx/coroutines/channels/Channel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->(Landroid/content/ContentResolver;Landroid/net/Uri;Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;Lkotlinx/coroutines/channels/Channel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1; HSPLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;->(Lkotlinx/coroutines/channels/Channel;Landroid/os/Handler;)V PLandroidx/compose/ui/platform/WindowRecomposer_androidKt$getAnimationScaleFlowFor$1$1$contentObserver$1;->(Lkotlinx/coroutines/channels/Channel;Landroid/os/Handler;)V Landroidx/compose/ui/platform/WrappedComposition; HSPLandroidx/compose/ui/platform/WrappedComposition;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/runtime/CompositionImpl;)V PLandroidx/compose/ui/platform/WrappedComposition;->(Landroidx/compose/ui/platform/AndroidComposeView;Landroidx/compose/runtime/CompositionImpl;)V HSPLandroidx/compose/ui/platform/WrappedComposition;->access$getAddedToLifecycle$p(Landroidx/compose/ui/platform/WrappedComposition;)Landroidx/lifecycle/Lifecycle; PLandroidx/compose/ui/platform/WrappedComposition;->access$getAddedToLifecycle$p(Landroidx/compose/ui/platform/WrappedComposition;)Landroidx/lifecycle/Lifecycle; HSPLandroidx/compose/ui/platform/WrappedComposition;->access$getDisposed$p(Landroidx/compose/ui/platform/WrappedComposition;)Z PLandroidx/compose/ui/platform/WrappedComposition;->access$getDisposed$p(Landroidx/compose/ui/platform/WrappedComposition;)Z HSPLandroidx/compose/ui/platform/WrappedComposition;->access$setAddedToLifecycle$p(Landroidx/compose/ui/platform/WrappedComposition;Landroidx/lifecycle/Lifecycle;)V PLandroidx/compose/ui/platform/WrappedComposition;->access$setAddedToLifecycle$p(Landroidx/compose/ui/platform/WrappedComposition;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/compose/ui/platform/WrappedComposition;->access$setLastContent$p(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/platform/WrappedComposition;->access$setLastContent$p(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/platform/WrappedComposition;->dispose()V HSPLandroidx/compose/ui/platform/WrappedComposition;->getOriginal()Landroidx/compose/runtime/Composition; PLandroidx/compose/ui/platform/WrappedComposition;->getOriginal()Landroidx/compose/runtime/Composition; HSPLandroidx/compose/ui/platform/WrappedComposition;->getOwner()Landroidx/compose/ui/platform/AndroidComposeView; PLandroidx/compose/ui/platform/WrappedComposition;->getOwner()Landroidx/compose/ui/platform/AndroidComposeView; HSPLandroidx/compose/ui/platform/WrappedComposition;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/compose/ui/platform/WrappedComposition;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/compose/ui/platform/WrappedComposition;->setContent(Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/platform/WrappedComposition;->setContent(Lkotlin/jvm/functions/Function2;)V Landroidx/compose/ui/platform/WrappedComposition$setContent$1; HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HPLandroidx/compose/ui/platform/WrappedComposition$setContent$1;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WrappedComposition$setContent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1; HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;I)V PLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/jvm/functions/Function2;I)V HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->invoke(Landroidx/compose/runtime/Composer;I)V PLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1; HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/coroutines/Continuation;)V PLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->(Landroidx/compose/ui/platform/WrappedComposition;Lkotlin/coroutines/Continuation;)V HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/platform/WrappedComposition$setContent$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods; HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->()V PLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->()V HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->()V PLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->()V HSPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->onDescendantInvalidated(Landroidx/compose/ui/platform/AndroidComposeView;)V HPLandroidx/compose/ui/platform/WrapperRenderNodeLayerHelperMethods;->onDescendantInvalidated(Landroidx/compose/ui/platform/AndroidComposeView;)V Landroidx/compose/ui/platform/WrapperVerificationHelperMethods; HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->()V PLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->()V HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->()V PLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->()V HSPLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->attributeSourceResourceMap(Landroid/view/View;)Ljava/util/Map; PLandroidx/compose/ui/platform/WrapperVerificationHelperMethods;->attributeSourceResourceMap(Landroid/view/View;)Ljava/util/Map; Landroidx/compose/ui/platform/Wrapper_androidKt; HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->()V PLandroidx/compose/ui/platform/Wrapper_androidKt;->()V HSPLandroidx/compose/ui/platform/Wrapper_androidKt;->setContent(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)Landroidx/compose/runtime/Composition; PLandroidx/compose/ui/platform/Wrapper_androidKt;->setContent(Landroidx/compose/ui/platform/AbstractComposeView;Landroidx/compose/runtime/CompositionContext;Landroidx/compose/runtime/internal/ComposableLambdaImpl;)Landroidx/compose/runtime/Composition; Landroidx/compose/ui/platform/accessibility/CollectionInfoKt; HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->calculateIfHorizontallyStacked(Ljava/util/ArrayList;)Z HPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->calculateIfHorizontallyStacked(Ljava/util/ArrayList;)Z HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->hasCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;)Z HPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->hasCollectionInfo(Landroidx/compose/ui/semantics/SemanticsNode;)Z HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionItemInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V HPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt;->setCollectionItemInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;Landroidx/compose/ui/semantics/SemanticsNode;)V Landroidx/compose/ui/platform/accessibility/CollectionInfoKt$setCollectionItemInfo$itemInfo$1; HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt$setCollectionItemInfo$itemInfo$1;->()V PLandroidx/compose/ui/platform/accessibility/CollectionInfoKt$setCollectionItemInfo$itemInfo$1;->()V HSPLandroidx/compose/ui/platform/accessibility/CollectionInfoKt$setCollectionItemInfo$itemInfo$1;->(I)V PLandroidx/compose/ui/platform/accessibility/CollectionInfoKt$setCollectionItemInfo$itemInfo$1;->(I)V Landroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback; HSPLandroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/platform/actionmodecallback/TextActionModeCallback;->(Lkotlin/jvm/functions/Function0;)V Landroidx/compose/ui/res/ImageVectorCache; HSPLandroidx/compose/ui/res/ImageVectorCache;->()V PLandroidx/compose/ui/res/ImageVectorCache;->()V PLandroidx/compose/ui/res/ImageVectorCache;->clear()V HSPLandroidx/compose/ui/res/ImageVectorCache;->get(Landroidx/compose/ui/res/ImageVectorCache$Key;)Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; PLandroidx/compose/ui/res/ImageVectorCache;->get(Landroidx/compose/ui/res/ImageVectorCache$Key;)Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; HSPLandroidx/compose/ui/res/ImageVectorCache;->set(Landroidx/compose/ui/res/ImageVectorCache$Key;Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;)V PLandroidx/compose/ui/res/ImageVectorCache;->set(Landroidx/compose/ui/res/ImageVectorCache$Key;Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;)V Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; HSPLandroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;->(Landroidx/compose/ui/graphics/vector/ImageVector;I)V PLandroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;->(Landroidx/compose/ui/graphics/vector/ImageVector;I)V HSPLandroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;->getImageVector()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry;->getImageVector()Landroidx/compose/ui/graphics/vector/ImageVector; Landroidx/compose/ui/res/ImageVectorCache$Key; HSPLandroidx/compose/ui/res/ImageVectorCache$Key;->(ILandroid/content/res/Resources$Theme;)V PLandroidx/compose/ui/res/ImageVectorCache$Key;->(ILandroid/content/res/Resources$Theme;)V HSPLandroidx/compose/ui/res/ImageVectorCache$Key;->hashCode()I PLandroidx/compose/ui/res/ImageVectorCache$Key;->hashCode()I Landroidx/compose/ui/semantics/AccessibilityAction; HSPLandroidx/compose/ui/semantics/AccessibilityAction;->(Ljava/lang/String;Lkotlin/Function;)V HPLandroidx/compose/ui/semantics/AccessibilityAction;->(Ljava/lang/String;Lkotlin/Function;)V HSPLandroidx/compose/ui/semantics/AccessibilityAction;->getLabel()Ljava/lang/String; HPLandroidx/compose/ui/semantics/AccessibilityAction;->getLabel()Ljava/lang/String; Landroidx/compose/ui/semantics/AppendedSemanticsElement; HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->(ZLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->(ZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; HPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/semantics/AppendedSemanticsElement;->update(Landroidx/compose/ui/Modifier$Node;)V PLandroidx/compose/ui/semantics/AppendedSemanticsElement;->update(Landroidx/compose/ui/Modifier$Node;)V Landroidx/compose/ui/semantics/ClearAndSetSemanticsElement; HSPLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; HSPLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/semantics/ClearAndSetSemanticsElement;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/semantics/CollectionInfo; HSPLandroidx/compose/ui/semantics/CollectionInfo;->(II)V PLandroidx/compose/ui/semantics/CollectionInfo;->(II)V PLandroidx/compose/ui/semantics/CollectionInfo;->getColumnCount()I PLandroidx/compose/ui/semantics/CollectionInfo;->getRowCount()I Landroidx/compose/ui/semantics/CoreSemanticsModifierNode; HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->(ZZLkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->(ZZLkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldClearDescendantSemantics()Z HPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldClearDescendantSemantics()Z HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldMergeDescendantSemantics()Z HPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->getShouldMergeDescendantSemantics()Z HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->setMergeDescendants(Z)V PLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->setMergeDescendants(Z)V HSPLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->setProperties(Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/semantics/CoreSemanticsModifierNode;->setProperties(Lkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/semantics/CustomAccessibilityAction; Landroidx/compose/ui/semantics/EmptySemanticsElement; HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->()V PLandroidx/compose/ui/semantics/EmptySemanticsElement;->()V HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->()V PLandroidx/compose/ui/semantics/EmptySemanticsElement;->()V HSPLandroidx/compose/ui/semantics/EmptySemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; PLandroidx/compose/ui/semantics/EmptySemanticsElement;->create()Landroidx/compose/ui/Modifier$Node; Landroidx/compose/ui/semantics/EmptySemanticsModifier; HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->()V PLandroidx/compose/ui/semantics/EmptySemanticsModifier;->()V HSPLandroidx/compose/ui/semantics/EmptySemanticsModifier;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V PLandroidx/compose/ui/semantics/EmptySemanticsModifier;->applySemantics(Landroidx/compose/ui/semantics/SemanticsConfiguration;)V Landroidx/compose/ui/semantics/LiveRegionMode; Landroidx/compose/ui/semantics/ProgressBarRangeInfo; Landroidx/compose/ui/semantics/Role; HSPLandroidx/compose/ui/semantics/Role;->(I)V HPLandroidx/compose/ui/semantics/Role;->(I)V HSPLandroidx/compose/ui/semantics/Role;->box-impl(I)Landroidx/compose/ui/semantics/Role; HPLandroidx/compose/ui/semantics/Role;->box-impl(I)Landroidx/compose/ui/semantics/Role; HSPLandroidx/compose/ui/semantics/Role;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/semantics/Role;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/semantics/Role;->unbox-impl()I HPLandroidx/compose/ui/semantics/Role;->unbox-impl()I Landroidx/compose/ui/semantics/ScrollAxisRange; HSPLandroidx/compose/ui/semantics/ScrollAxisRange;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Z)V PLandroidx/compose/ui/semantics/ScrollAxisRange;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Z)V HSPLandroidx/compose/ui/semantics/ScrollAxisRange;->getMaxValue()Lkotlin/jvm/functions/Function0; PLandroidx/compose/ui/semantics/ScrollAxisRange;->getMaxValue()Lkotlin/jvm/functions/Function0; HSPLandroidx/compose/ui/semantics/ScrollAxisRange;->getValue()Lkotlin/jvm/functions/Function0; PLandroidx/compose/ui/semantics/ScrollAxisRange;->getValue()Lkotlin/jvm/functions/Function0; Landroidx/compose/ui/semantics/SemanticsActions; HSPLandroidx/compose/ui/semantics/SemanticsActions;->()V PLandroidx/compose/ui/semantics/SemanticsActions;->()V HSPLandroidx/compose/ui/semantics/SemanticsActions;->getClearTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getClearTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCollapse()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getCollapse()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCopyText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getCopyText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCustomActions()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getCustomActions()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getCutText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getCutText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getDismiss()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getDismiss()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getExpand()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getExpand()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getGetTextLayoutResult()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getGetTextLayoutResult()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getOnClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getOnClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getOnImeAction()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getOnImeAction()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getOnLongClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getOnLongClick()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageDown()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getPageDown()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageLeft()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getPageLeft()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageRight()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getPageRight()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPageUp()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getPageUp()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getPasteText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getPasteText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getRequestFocus()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getRequestFocus()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getScrollBy()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getScrollBy()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getScrollToIndex()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetProgress()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getSetProgress()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetSelection()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getSetSelection()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsActions;->getSetText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getSetTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getSetTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsActions;->getShowTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsActions;->getShowTextSubstitution()Landroidx/compose/ui/semantics/SemanticsPropertyKey; Landroidx/compose/ui/semantics/SemanticsConfiguration; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->()V HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->contains(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Z HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->contains(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Z HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->get(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->get(Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->getOrElse(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; PLandroidx/compose/ui/semantics/SemanticsConfiguration;->getOrElse(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->getOrElseNullable(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->getOrElseNullable(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->isClearingSemantics()Z PLandroidx/compose/ui/semantics/SemanticsConfiguration;->isClearingSemantics()Z HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->isMergingSemanticsOfDescendants()Z HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->isMergingSemanticsOfDescendants()Z HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V HPLandroidx/compose/ui/semantics/SemanticsConfiguration;->set(Landroidx/compose/ui/semantics/SemanticsPropertyKey;Ljava/lang/Object;)V HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->setClearingSemantics(Z)V PLandroidx/compose/ui/semantics/SemanticsConfiguration;->setClearingSemantics(Z)V HSPLandroidx/compose/ui/semantics/SemanticsConfiguration;->setMergingSemanticsOfDescendants(Z)V PLandroidx/compose/ui/semantics/SemanticsConfiguration;->setMergingSemanticsOfDescendants(Z)V Landroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1; HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->()V PLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->()V PLandroidx/compose/ui/semantics/SemanticsConfigurationKt$getOrNull$1;->()V Landroidx/compose/ui/semantics/SemanticsModifier; Landroidx/compose/ui/semantics/SemanticsModifierKt; HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->()V PLandroidx/compose/ui/semantics/SemanticsModifierKt;->()V HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->generateSemanticsId()I HPLandroidx/compose/ui/semantics/SemanticsModifierKt;->generateSemanticsId()I HSPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; HPLandroidx/compose/ui/semantics/SemanticsModifierKt;->semantics(Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/Modifier; Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/Modifier$Node;ZLandroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HPLandroidx/compose/ui/semantics/SemanticsNode;->(Landroidx/compose/ui/Modifier$Node;ZLandroidx/compose/ui/node/LayoutNode;Landroidx/compose/ui/semantics/SemanticsConfiguration;)V HSPLandroidx/compose/ui/semantics/SemanticsNode;->fakeSemanticsNode-ypyhhiA(Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/semantics/SemanticsNode; HPLandroidx/compose/ui/semantics/SemanticsNode;->fakeSemanticsNode-ypyhhiA(Landroidx/compose/ui/semantics/Role;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->fillOneLayerOfSemanticsWrappers(Landroidx/compose/ui/node/LayoutNode;Ljava/util/ArrayList;)V HPLandroidx/compose/ui/semantics/SemanticsNode;->fillOneLayerOfSemanticsWrappers(Landroidx/compose/ui/node/LayoutNode;Ljava/util/ArrayList;)V HSPLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HPLandroidx/compose/ui/semantics/SemanticsNode;->findCoordinatorToGetBounds$ui_release()Landroidx/compose/ui/node/NodeCoordinator; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HPLandroidx/compose/ui/semantics/SemanticsNode;->getBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren(ZZ)Ljava/util/List; HPLandroidx/compose/ui/semantics/SemanticsNode;->getChildren(ZZ)Ljava/util/List; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; HPLandroidx/compose/ui/semantics/SemanticsNode;->getConfig()Landroidx/compose/ui/semantics/SemanticsConfiguration; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getId()I HPLandroidx/compose/ui/semantics/SemanticsNode;->getId()I HSPLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutInfo()Landroidx/compose/ui/node/LayoutNode; PLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutInfo()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutNode$ui_release()Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/semantics/SemanticsNode;->getLayoutNode$ui_release()Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; HPLandroidx/compose/ui/semantics/SemanticsNode;->getParent()Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getReplacedChildren$ui_release()Ljava/util/List; HPLandroidx/compose/ui/semantics/SemanticsNode;->getReplacedChildren$ui_release()Ljava/util/List; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getTouchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HPLandroidx/compose/ui/semantics/SemanticsNode;->getTouchBoundsInRoot()Landroidx/compose/ui/geometry/Rect; HSPLandroidx/compose/ui/semantics/SemanticsNode;->getUnmergedConfig$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; HPLandroidx/compose/ui/semantics/SemanticsNode;->getUnmergedConfig$ui_release()Landroidx/compose/ui/semantics/SemanticsConfiguration; HSPLandroidx/compose/ui/semantics/SemanticsNode;->isFake$ui_release()Z HPLandroidx/compose/ui/semantics/SemanticsNode;->isFake$ui_release()Z HSPLandroidx/compose/ui/semantics/SemanticsNode;->isMergingSemanticsOfDescendants()Z PLandroidx/compose/ui/semantics/SemanticsNode;->isMergingSemanticsOfDescendants()Z HSPLandroidx/compose/ui/semantics/SemanticsNode;->isUnmergedLeafNode$ui_release()Z HPLandroidx/compose/ui/semantics/SemanticsNode;->isUnmergedLeafNode$ui_release()Z HSPLandroidx/compose/ui/semantics/SemanticsNode;->unmergedChildren$ui_release(Z)Ljava/util/List; HPLandroidx/compose/ui/semantics/SemanticsNode;->unmergedChildren$ui_release(Z)Ljava/util/List; Landroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1; HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->(Ljava/lang/Object;I)V HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/semantics/SemanticsNode$emitFakeNodes$fakeNode$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1; HSPLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V HPLandroidx/compose/ui/semantics/SemanticsNode$fakeSemanticsNode$fakeNode$1;->(Lkotlin/jvm/functions/Function1;)V Landroidx/compose/ui/semantics/SemanticsNode$parent$1; HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->()V PLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->(I)V PLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->(I)V HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; HPLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->invoke(Landroidx/compose/ui/node/LayoutNode;)Ljava/lang/Boolean; HSPLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/semantics/SemanticsNode$parent$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/semantics/SemanticsNodeKt; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->SemanticsNode(Landroidx/compose/ui/node/LayoutNode;Z)Landroidx/compose/ui/semantics/SemanticsNode; HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->SemanticsNode(Landroidx/compose/ui/node/LayoutNode;Z)Landroidx/compose/ui/semantics/SemanticsNode; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->findClosestParentNode(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->findClosestParentNode(Landroidx/compose/ui/node/LayoutNode;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/node/LayoutNode; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOrNull(Landroidx/compose/ui/semantics/SemanticsConfiguration;Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOrNull(Landroidx/compose/ui/semantics/SemanticsConfiguration;Landroidx/compose/ui/semantics/SemanticsPropertyKey;)Ljava/lang/Object; HSPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterMergingSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; HPLandroidx/compose/ui/semantics/SemanticsNodeKt;->getOuterMergingSemantics(Landroidx/compose/ui/node/LayoutNode;)Landroidx/compose/ui/node/SemanticsModifierNode; Landroidx/compose/ui/semantics/SemanticsOwner; HSPLandroidx/compose/ui/semantics/SemanticsOwner;->(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/compose/ui/semantics/SemanticsOwner;->(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/compose/ui/semantics/SemanticsOwner;->getUnmergedRootSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; HPLandroidx/compose/ui/semantics/SemanticsOwner;->getUnmergedRootSemanticsNode()Landroidx/compose/ui/semantics/SemanticsNode; Landroidx/compose/ui/semantics/SemanticsProperties; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->()V PLandroidx/compose/ui/semantics/SemanticsProperties;->()V HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getCollectionInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getCollectionInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getCollectionItemInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getCollectionItemInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getContentDescription()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getContentDescription()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getDisabled()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getDisabled()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getEditableText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getEditableText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getError()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getError()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getFocused()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getFocused()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getHeading()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getHeading()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getHorizontalScrollAxisRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getHorizontalScrollAxisRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getIndexForKey()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getInvisibleToUser()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getInvisibleToUser()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getIsTraversalGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getIsTraversalGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getLiveRegion()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getLiveRegion()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getPaneTitle()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getPaneTitle()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getPassword()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getPassword()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getProgressBarRangeInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getProgressBarRangeInfo()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getRole()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getRole()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getSelectableGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getSelectableGroup()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getSelected()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getSelected()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getStateDescription()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getStateDescription()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getTestTag()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getTestTag()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getText()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getTextSelectionRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; PLandroidx/compose/ui/semantics/SemanticsProperties;->getTextSelectionRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getToggleableState()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getToggleableState()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsProperties;->getVerticalScrollAxisRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; HPLandroidx/compose/ui/semantics/SemanticsProperties;->getVerticalScrollAxisRange()Landroidx/compose/ui/semantics/SemanticsPropertyKey; Landroidx/compose/ui/semantics/SemanticsPropertiesAndroid; Landroidx/compose/ui/semantics/SemanticsPropertiesKt; HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->()V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/jvm/functions/Function1;)V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->getTextLayoutResult$default(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->onLongClick(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V HPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->onLongClick(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setCollectionInfo(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/semantics/CollectionInfo;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContainer(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContainer(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContentDescription(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V HPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setContentDescription(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setFocused(Landroidx/compose/ui/semantics/SemanticsConfiguration;Z)V HPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setFocused(Landroidx/compose/ui/semantics/SemanticsConfiguration;Z)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setRole-kuIjeqM(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;I)V HPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setRole-kuIjeqM(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;I)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setSelected(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Z)V HPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setSelected(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Z)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setText(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/text/AnnotatedString;)V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setText(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/text/AnnotatedString;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTraversalGroup(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setTraversalGroup(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setVerticalScrollAxisRange(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/semantics/ScrollAxisRange;)V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt;->setVerticalScrollAxisRange(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Landroidx/compose/ui/semantics/ScrollAxisRange;)V Landroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1; HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V PLandroidx/compose/ui/semantics/SemanticsPropertiesKt$ActionPropertyKey$1;->()V Landroidx/compose/ui/semantics/SemanticsPropertyKey; HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;)V PLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V PLandroidx/compose/ui/semantics/SemanticsPropertyKey;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->setValue(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/Object;)V HPLandroidx/compose/ui/semantics/SemanticsPropertyKey;->setValue(Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/Object;)V Landroidx/compose/ui/semantics/SemanticsPropertyKey$1; HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V PLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->()V HSPLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->(I)V PLandroidx/compose/ui/semantics/SemanticsPropertyKey$1;->(I)V Landroidx/compose/ui/semantics/SemanticsPropertyReceiver; Landroidx/compose/ui/state/ToggleableState; Landroidx/compose/ui/text/AndroidParagraph; HSPLandroidx/compose/ui/text/AndroidParagraph;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;IZJ)V HPLandroidx/compose/ui/text/AndroidParagraph;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;IZJ)V HSPLandroidx/compose/ui/text/AndroidParagraph;->constructTextLayout(IILandroid/text/TextUtils$TruncateAt;IIIII)Landroidx/compose/ui/text/android/TextLayout; HPLandroidx/compose/ui/text/AndroidParagraph;->constructTextLayout(IILandroid/text/TextUtils$TruncateAt;IIIII)Landroidx/compose/ui/text/android/TextLayout; HSPLandroidx/compose/ui/text/AndroidParagraph;->getDidExceedMaxLines()Z PLandroidx/compose/ui/text/AndroidParagraph;->getDidExceedMaxLines()Z HSPLandroidx/compose/ui/text/AndroidParagraph;->getHeight()F PLandroidx/compose/ui/text/AndroidParagraph;->getHeight()F HSPLandroidx/compose/ui/text/AndroidParagraph;->getLineBaseline$ui_text_release(I)F PLandroidx/compose/ui/text/AndroidParagraph;->getLineBaseline$ui_text_release(I)F HSPLandroidx/compose/ui/text/AndroidParagraph;->getLineCount()I PLandroidx/compose/ui/text/AndroidParagraph;->getLineCount()I HSPLandroidx/compose/ui/text/AndroidParagraph;->getTextPaint$ui_text_release()Landroidx/compose/ui/text/platform/AndroidTextPaint; HPLandroidx/compose/ui/text/AndroidParagraph;->getTextPaint$ui_text_release()Landroidx/compose/ui/text/platform/AndroidTextPaint; HSPLandroidx/compose/ui/text/AndroidParagraph;->getWidth()F HPLandroidx/compose/ui/text/AndroidParagraph;->getWidth()F HSPLandroidx/compose/ui/text/AndroidParagraph;->paint(Landroidx/compose/ui/graphics/Canvas;)V HPLandroidx/compose/ui/text/AndroidParagraph;->paint(Landroidx/compose/ui/graphics/Canvas;)V HSPLandroidx/compose/ui/text/AndroidParagraph;->paint-LG529CI(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/drawscope/DrawStyle;I)V HPLandroidx/compose/ui/text/AndroidParagraph;->paint-LG529CI(Landroidx/compose/ui/graphics/Canvas;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/drawscope/DrawStyle;I)V Landroidx/compose/ui/text/AndroidParagraph$wordBoundary$2; HSPLandroidx/compose/ui/text/AndroidParagraph$wordBoundary$2;->(Ljava/lang/Object;I)V HPLandroidx/compose/ui/text/AndroidParagraph$wordBoundary$2;->(Ljava/lang/Object;I)V Landroidx/compose/ui/text/AnnotatedString; HSPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/ArrayList;I)V PLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/ArrayList;I)V HSPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V HPLandroidx/compose/ui/text/AnnotatedString;->(Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V HSPLandroidx/compose/ui/text/AnnotatedString;->getSpanStylesOrNull$ui_text_release()Ljava/util/List; PLandroidx/compose/ui/text/AnnotatedString;->getSpanStylesOrNull$ui_text_release()Ljava/util/List; HSPLandroidx/compose/ui/text/AnnotatedString;->getText()Ljava/lang/String; PLandroidx/compose/ui/text/AnnotatedString;->getText()Ljava/lang/String; HSPLandroidx/compose/ui/text/AnnotatedString;->getTtsAnnotations(I)Ljava/util/List; HPLandroidx/compose/ui/text/AnnotatedString;->getTtsAnnotations(I)Ljava/util/List; HSPLandroidx/compose/ui/text/AnnotatedString;->getUrlAnnotations(I)Ljava/util/List; HPLandroidx/compose/ui/text/AnnotatedString;->getUrlAnnotations(I)Ljava/util/List; HSPLandroidx/compose/ui/text/AnnotatedString;->length()I HPLandroidx/compose/ui/text/AnnotatedString;->length()I Landroidx/compose/ui/text/AnnotatedString$Range; Landroidx/compose/ui/text/ParagraphIntrinsics; Landroidx/compose/ui/text/ParagraphStyle; HSPLandroidx/compose/ui/text/ParagraphStyle;->(Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/PlatformParagraphStyle;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/LineBreak;Landroidx/compose/ui/text/style/Hyphens;Landroidx/compose/ui/text/style/TextMotion;)V HPLandroidx/compose/ui/text/ParagraphStyle;->(Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/PlatformParagraphStyle;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/LineBreak;Landroidx/compose/ui/text/style/Hyphens;Landroidx/compose/ui/text/style/TextMotion;)V HSPLandroidx/compose/ui/text/ParagraphStyle;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/ParagraphStyle;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/ParagraphStyle;->getHyphens-EaSxIns()Landroidx/compose/ui/text/style/Hyphens; PLandroidx/compose/ui/text/ParagraphStyle;->getHyphens-EaSxIns()Landroidx/compose/ui/text/style/Hyphens; HSPLandroidx/compose/ui/text/ParagraphStyle;->getHyphensOrDefault-vmbZdU8$ui_text_release()I PLandroidx/compose/ui/text/ParagraphStyle;->getHyphensOrDefault-vmbZdU8$ui_text_release()I HSPLandroidx/compose/ui/text/ParagraphStyle;->getLineBreak-LgCVezo()Landroidx/compose/ui/text/style/LineBreak; PLandroidx/compose/ui/text/ParagraphStyle;->getLineBreak-LgCVezo()Landroidx/compose/ui/text/style/LineBreak; HSPLandroidx/compose/ui/text/ParagraphStyle;->getLineBreakOrDefault-rAG3T2k$ui_text_release()I PLandroidx/compose/ui/text/ParagraphStyle;->getLineBreakOrDefault-rAG3T2k$ui_text_release()I HSPLandroidx/compose/ui/text/ParagraphStyle;->getLineHeight-XSAIIZE()J PLandroidx/compose/ui/text/ParagraphStyle;->getLineHeight-XSAIIZE()J HSPLandroidx/compose/ui/text/ParagraphStyle;->getLineHeightStyle()Landroidx/compose/ui/text/style/LineHeightStyle; PLandroidx/compose/ui/text/ParagraphStyle;->getLineHeightStyle()Landroidx/compose/ui/text/style/LineHeightStyle; HSPLandroidx/compose/ui/text/ParagraphStyle;->getPlatformStyle()Landroidx/compose/ui/text/PlatformParagraphStyle; PLandroidx/compose/ui/text/ParagraphStyle;->getPlatformStyle()Landroidx/compose/ui/text/PlatformParagraphStyle; HSPLandroidx/compose/ui/text/ParagraphStyle;->getTextAlign-buA522U()Landroidx/compose/ui/text/style/TextAlign; PLandroidx/compose/ui/text/ParagraphStyle;->getTextAlign-buA522U()Landroidx/compose/ui/text/style/TextAlign; HSPLandroidx/compose/ui/text/ParagraphStyle;->getTextAlignOrDefault-e0LSkKk$ui_text_release()I PLandroidx/compose/ui/text/ParagraphStyle;->getTextAlignOrDefault-e0LSkKk$ui_text_release()I HSPLandroidx/compose/ui/text/ParagraphStyle;->getTextDirection-mmuk1to()Landroidx/compose/ui/text/style/TextDirection; PLandroidx/compose/ui/text/ParagraphStyle;->getTextDirection-mmuk1to()Landroidx/compose/ui/text/style/TextDirection; HSPLandroidx/compose/ui/text/ParagraphStyle;->getTextIndent()Landroidx/compose/ui/text/style/TextIndent; PLandroidx/compose/ui/text/ParagraphStyle;->getTextIndent()Landroidx/compose/ui/text/style/TextIndent; HSPLandroidx/compose/ui/text/ParagraphStyle;->getTextMotion()Landroidx/compose/ui/text/style/TextMotion; PLandroidx/compose/ui/text/ParagraphStyle;->getTextMotion()Landroidx/compose/ui/text/style/TextMotion; HSPLandroidx/compose/ui/text/ParagraphStyle;->merge(Landroidx/compose/ui/text/ParagraphStyle;)Landroidx/compose/ui/text/ParagraphStyle; HPLandroidx/compose/ui/text/ParagraphStyle;->merge(Landroidx/compose/ui/text/ParagraphStyle;)Landroidx/compose/ui/text/ParagraphStyle; Landroidx/compose/ui/text/ParagraphStyleKt; HSPLandroidx/compose/ui/text/ParagraphStyleKt;->()V PLandroidx/compose/ui/text/ParagraphStyleKt;->()V HSPLandroidx/compose/ui/text/ParagraphStyleKt;->fastMerge-HtYhynw(Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/PlatformParagraphStyle;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/LineBreak;Landroidx/compose/ui/text/style/Hyphens;Landroidx/compose/ui/text/style/TextMotion;)Landroidx/compose/ui/text/ParagraphStyle; HPLandroidx/compose/ui/text/ParagraphStyleKt;->fastMerge-HtYhynw(Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDirection;JLandroidx/compose/ui/text/style/TextIndent;Landroidx/compose/ui/text/PlatformParagraphStyle;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/LineBreak;Landroidx/compose/ui/text/style/Hyphens;Landroidx/compose/ui/text/style/TextMotion;)Landroidx/compose/ui/text/ParagraphStyle; HSPLandroidx/compose/ui/text/ParagraphStyleKt;->resolveParagraphStyleDefaults(Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/ParagraphStyle; HPLandroidx/compose/ui/text/ParagraphStyleKt;->resolveParagraphStyleDefaults(Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/ParagraphStyle; Landroidx/compose/ui/text/PlatformParagraphStyle; HSPLandroidx/compose/ui/text/PlatformParagraphStyle;->()V PLandroidx/compose/ui/text/PlatformParagraphStyle;->()V HSPLandroidx/compose/ui/text/PlatformParagraphStyle;->()V PLandroidx/compose/ui/text/PlatformParagraphStyle;->()V HSPLandroidx/compose/ui/text/PlatformParagraphStyle;->(ZI)V PLandroidx/compose/ui/text/PlatformParagraphStyle;->(ZI)V Landroidx/compose/ui/text/PlatformTextStyle; HSPLandroidx/compose/ui/text/PlatformTextStyle;->()V PLandroidx/compose/ui/text/PlatformTextStyle;->()V HSPLandroidx/compose/ui/text/PlatformTextStyle;->(Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/text/PlatformParagraphStyle;)V PLandroidx/compose/ui/text/PlatformTextStyle;->(Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/text/PlatformParagraphStyle;)V HSPLandroidx/compose/ui/text/PlatformTextStyle;->getParagraphStyle()Landroidx/compose/ui/text/PlatformParagraphStyle; PLandroidx/compose/ui/text/PlatformTextStyle;->getParagraphStyle()Landroidx/compose/ui/text/PlatformParagraphStyle; HSPLandroidx/compose/ui/text/PlatformTextStyle;->getSpanStyle()Landroidx/compose/ui/text/PlatformSpanStyle; PLandroidx/compose/ui/text/PlatformTextStyle;->getSpanStyle()Landroidx/compose/ui/text/PlatformSpanStyle; Landroidx/compose/ui/text/SpanStyle; HSPLandroidx/compose/ui/text/SpanStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;I)V HPLandroidx/compose/ui/text/SpanStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;I)V HSPLandroidx/compose/ui/text/SpanStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V HPLandroidx/compose/ui/text/SpanStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V HSPLandroidx/compose/ui/text/SpanStyle;->(Landroidx/compose/ui/text/style/TextForegroundStyle;JLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V HPLandroidx/compose/ui/text/SpanStyle;->(Landroidx/compose/ui/text/style/TextForegroundStyle;JLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V HSPLandroidx/compose/ui/text/SpanStyle;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/SpanStyle;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/SpanStyle;->getAlpha()F HPLandroidx/compose/ui/text/SpanStyle;->getAlpha()F HSPLandroidx/compose/ui/text/SpanStyle;->getBackground-0d7_KjU()J PLandroidx/compose/ui/text/SpanStyle;->getBackground-0d7_KjU()J HSPLandroidx/compose/ui/text/SpanStyle;->getBaselineShift-5SSeXJ0()Landroidx/compose/ui/text/style/BaselineShift; PLandroidx/compose/ui/text/SpanStyle;->getBaselineShift-5SSeXJ0()Landroidx/compose/ui/text/style/BaselineShift; HSPLandroidx/compose/ui/text/SpanStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; HPLandroidx/compose/ui/text/SpanStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/text/SpanStyle;->getColor-0d7_KjU()J HPLandroidx/compose/ui/text/SpanStyle;->getColor-0d7_KjU()J HSPLandroidx/compose/ui/text/SpanStyle;->getDrawStyle()Landroidx/compose/ui/graphics/drawscope/DrawStyle; PLandroidx/compose/ui/text/SpanStyle;->getDrawStyle()Landroidx/compose/ui/graphics/drawscope/DrawStyle; HSPLandroidx/compose/ui/text/SpanStyle;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; HPLandroidx/compose/ui/text/SpanStyle;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; HSPLandroidx/compose/ui/text/SpanStyle;->getFontFeatureSettings()Ljava/lang/String; PLandroidx/compose/ui/text/SpanStyle;->getFontFeatureSettings()Ljava/lang/String; HSPLandroidx/compose/ui/text/SpanStyle;->getFontSize-XSAIIZE()J PLandroidx/compose/ui/text/SpanStyle;->getFontSize-XSAIIZE()J HSPLandroidx/compose/ui/text/SpanStyle;->getFontStyle-4Lr2A7w()Landroidx/compose/ui/text/font/FontStyle; PLandroidx/compose/ui/text/SpanStyle;->getFontStyle-4Lr2A7w()Landroidx/compose/ui/text/font/FontStyle; HSPLandroidx/compose/ui/text/SpanStyle;->getFontSynthesis-ZQGJjVo()Landroidx/compose/ui/text/font/FontSynthesis; PLandroidx/compose/ui/text/SpanStyle;->getFontSynthesis-ZQGJjVo()Landroidx/compose/ui/text/font/FontSynthesis; HSPLandroidx/compose/ui/text/SpanStyle;->getFontWeight()Landroidx/compose/ui/text/font/FontWeight; PLandroidx/compose/ui/text/SpanStyle;->getFontWeight()Landroidx/compose/ui/text/font/FontWeight; HSPLandroidx/compose/ui/text/SpanStyle;->getLetterSpacing-XSAIIZE()J PLandroidx/compose/ui/text/SpanStyle;->getLetterSpacing-XSAIIZE()J HSPLandroidx/compose/ui/text/SpanStyle;->getLocaleList()Landroidx/compose/ui/text/intl/LocaleList; PLandroidx/compose/ui/text/SpanStyle;->getLocaleList()Landroidx/compose/ui/text/intl/LocaleList; HSPLandroidx/compose/ui/text/SpanStyle;->getPlatformStyle()Landroidx/compose/ui/text/PlatformSpanStyle; PLandroidx/compose/ui/text/SpanStyle;->getPlatformStyle()Landroidx/compose/ui/text/PlatformSpanStyle; HSPLandroidx/compose/ui/text/SpanStyle;->getShadow()Landroidx/compose/ui/graphics/Shadow; PLandroidx/compose/ui/text/SpanStyle;->getShadow()Landroidx/compose/ui/graphics/Shadow; HSPLandroidx/compose/ui/text/SpanStyle;->getTextDecoration()Landroidx/compose/ui/text/style/TextDecoration; PLandroidx/compose/ui/text/SpanStyle;->getTextDecoration()Landroidx/compose/ui/text/style/TextDecoration; HSPLandroidx/compose/ui/text/SpanStyle;->getTextForegroundStyle$ui_text_release()Landroidx/compose/ui/text/style/TextForegroundStyle; PLandroidx/compose/ui/text/SpanStyle;->getTextForegroundStyle$ui_text_release()Landroidx/compose/ui/text/style/TextForegroundStyle; HSPLandroidx/compose/ui/text/SpanStyle;->getTextGeometricTransform()Landroidx/compose/ui/text/style/TextGeometricTransform; PLandroidx/compose/ui/text/SpanStyle;->getTextGeometricTransform()Landroidx/compose/ui/text/style/TextGeometricTransform; HSPLandroidx/compose/ui/text/SpanStyle;->hasSameLayoutAffectingAttributes$ui_text_release(Landroidx/compose/ui/text/SpanStyle;)Z HPLandroidx/compose/ui/text/SpanStyle;->hasSameLayoutAffectingAttributes$ui_text_release(Landroidx/compose/ui/text/SpanStyle;)Z HSPLandroidx/compose/ui/text/SpanStyle;->hasSameNonLayoutAttributes$ui_text_release(Landroidx/compose/ui/text/SpanStyle;)Z HPLandroidx/compose/ui/text/SpanStyle;->hasSameNonLayoutAttributes$ui_text_release(Landroidx/compose/ui/text/SpanStyle;)Z HSPLandroidx/compose/ui/text/SpanStyle;->merge(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle; HPLandroidx/compose/ui/text/SpanStyle;->merge(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle; Landroidx/compose/ui/text/SpanStyleKt; HSPLandroidx/compose/ui/text/SpanStyleKt;->()V PLandroidx/compose/ui/text/SpanStyleKt;->()V HSPLandroidx/compose/ui/text/SpanStyleKt;->fastMerge-dSHsh3o(Landroidx/compose/ui/text/SpanStyle;JLandroidx/compose/ui/graphics/Brush;FJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)Landroidx/compose/ui/text/SpanStyle; HPLandroidx/compose/ui/text/SpanStyleKt;->fastMerge-dSHsh3o(Landroidx/compose/ui/text/SpanStyle;JLandroidx/compose/ui/graphics/Brush;FJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontSynthesis;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/text/style/BaselineShift;Landroidx/compose/ui/text/style/TextGeometricTransform;Landroidx/compose/ui/text/intl/LocaleList;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/PlatformSpanStyle;Landroidx/compose/ui/graphics/drawscope/DrawStyle;)Landroidx/compose/ui/text/SpanStyle; HSPLandroidx/compose/ui/text/SpanStyleKt;->resolveSpanStyleDefaults(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle; HPLandroidx/compose/ui/text/SpanStyleKt;->resolveSpanStyleDefaults(Landroidx/compose/ui/text/SpanStyle;)Landroidx/compose/ui/text/SpanStyle; Landroidx/compose/ui/text/StringKt; HSPLandroidx/compose/ui/text/StringKt;->()V HPLandroidx/compose/ui/text/StringKt;->()V HSPLandroidx/compose/ui/text/StringKt;->checkElementIndex$runtime_release(II)V PLandroidx/compose/ui/text/StringKt;->checkElementIndex$runtime_release(II)V PLandroidx/compose/ui/text/StringKt;->getExplore()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/text/StringKt;->getFilterList()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getFilterList()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/text/StringKt;->getHelpOutline()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getHelpOutline()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/text/StringKt;->getInfo()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getInfo()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getPalette()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/text/StringKt;->getRefresh()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getRefresh()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/text/StringKt;->getSearch()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getSearch()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/compose/ui/text/StringKt;->getSettings()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getSettings()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/compose/ui/text/StringKt;->getSync()Landroidx/compose/ui/graphics/vector/ImageVector; Landroidx/compose/ui/text/TextRange; HSPLandroidx/compose/ui/text/TextRange;->()V PLandroidx/compose/ui/text/TextRange;->()V HSPLandroidx/compose/ui/text/TextRange;->access$getZero$cp()J PLandroidx/compose/ui/text/TextRange;->access$getZero$cp()J HSPLandroidx/compose/ui/text/TextRange;->getEnd-impl(J)I PLandroidx/compose/ui/text/TextRange;->getEnd-impl(J)I Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/ui/text/TextStyle;->()V PLandroidx/compose/ui/text/TextStyle;->()V HSPLandroidx/compose/ui/text/TextStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextAlign;JI)V HPLandroidx/compose/ui/text/TextStyle;->(JJLandroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontFamily;Ljava/lang/String;JLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/text/style/TextAlign;JI)V HSPLandroidx/compose/ui/text/TextStyle;->(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;)V HPLandroidx/compose/ui/text/TextStyle;->(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;)V HSPLandroidx/compose/ui/text/TextStyle;->(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/text/PlatformTextStyle;)V HPLandroidx/compose/ui/text/TextStyle;->(Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/ParagraphStyle;Landroidx/compose/ui/text/PlatformTextStyle;)V HSPLandroidx/compose/ui/text/TextStyle;->access$getDefault$cp()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/ui/text/TextStyle;->access$getDefault$cp()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/ui/text/TextStyle;->copy-v2rsoow$default(IJJJJLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/graphics/drawscope/Stroke;Landroidx/compose/ui/text/PlatformTextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/TextAlign;)Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/ui/text/TextStyle;->copy-v2rsoow$default(IJJJJLandroidx/compose/ui/graphics/Shadow;Landroidx/compose/ui/graphics/drawscope/Stroke;Landroidx/compose/ui/text/PlatformTextStyle;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/style/LineHeightStyle;Landroidx/compose/ui/text/style/TextAlign;)Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/ui/text/TextStyle;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/TextStyle;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/TextStyle;->getAlpha()F PLandroidx/compose/ui/text/TextStyle;->getAlpha()F HSPLandroidx/compose/ui/text/TextStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; PLandroidx/compose/ui/text/TextStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/text/TextStyle;->getColor-0d7_KjU()J HPLandroidx/compose/ui/text/TextStyle;->getColor-0d7_KjU()J HSPLandroidx/compose/ui/text/TextStyle;->getDrawStyle()Landroidx/compose/ui/graphics/drawscope/DrawStyle; PLandroidx/compose/ui/text/TextStyle;->getDrawStyle()Landroidx/compose/ui/graphics/drawscope/DrawStyle; HSPLandroidx/compose/ui/text/TextStyle;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; HPLandroidx/compose/ui/text/TextStyle;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; HSPLandroidx/compose/ui/text/TextStyle;->getFontStyle-4Lr2A7w()Landroidx/compose/ui/text/font/FontStyle; HPLandroidx/compose/ui/text/TextStyle;->getFontStyle-4Lr2A7w()Landroidx/compose/ui/text/font/FontStyle; HSPLandroidx/compose/ui/text/TextStyle;->getFontSynthesis-ZQGJjVo()Landroidx/compose/ui/text/font/FontSynthesis; HPLandroidx/compose/ui/text/TextStyle;->getFontSynthesis-ZQGJjVo()Landroidx/compose/ui/text/font/FontSynthesis; HSPLandroidx/compose/ui/text/TextStyle;->getFontWeight()Landroidx/compose/ui/text/font/FontWeight; HPLandroidx/compose/ui/text/TextStyle;->getFontWeight()Landroidx/compose/ui/text/font/FontWeight; HSPLandroidx/compose/ui/text/TextStyle;->getLetterSpacing-XSAIIZE()J PLandroidx/compose/ui/text/TextStyle;->getLetterSpacing-XSAIIZE()J HSPLandroidx/compose/ui/text/TextStyle;->getLineBreak-LgCVezo()Landroidx/compose/ui/text/style/LineBreak; PLandroidx/compose/ui/text/TextStyle;->getLineBreak-LgCVezo()Landroidx/compose/ui/text/style/LineBreak; HSPLandroidx/compose/ui/text/TextStyle;->getLineHeight-XSAIIZE()J PLandroidx/compose/ui/text/TextStyle;->getLineHeight-XSAIIZE()J HSPLandroidx/compose/ui/text/TextStyle;->getLineHeightStyle()Landroidx/compose/ui/text/style/LineHeightStyle; PLandroidx/compose/ui/text/TextStyle;->getLineHeightStyle()Landroidx/compose/ui/text/style/LineHeightStyle; HSPLandroidx/compose/ui/text/TextStyle;->getLocaleList()Landroidx/compose/ui/text/intl/LocaleList; HPLandroidx/compose/ui/text/TextStyle;->getLocaleList()Landroidx/compose/ui/text/intl/LocaleList; HSPLandroidx/compose/ui/text/TextStyle;->getParagraphStyle$ui_text_release()Landroidx/compose/ui/text/ParagraphStyle; PLandroidx/compose/ui/text/TextStyle;->getParagraphStyle$ui_text_release()Landroidx/compose/ui/text/ParagraphStyle; HSPLandroidx/compose/ui/text/TextStyle;->getPlatformStyle()Landroidx/compose/ui/text/PlatformTextStyle; HPLandroidx/compose/ui/text/TextStyle;->getPlatformStyle()Landroidx/compose/ui/text/PlatformTextStyle; HSPLandroidx/compose/ui/text/TextStyle;->getShadow()Landroidx/compose/ui/graphics/Shadow; PLandroidx/compose/ui/text/TextStyle;->getShadow()Landroidx/compose/ui/graphics/Shadow; HSPLandroidx/compose/ui/text/TextStyle;->getSpanStyle$ui_text_release()Landroidx/compose/ui/text/SpanStyle; PLandroidx/compose/ui/text/TextStyle;->getSpanStyle$ui_text_release()Landroidx/compose/ui/text/SpanStyle; HSPLandroidx/compose/ui/text/TextStyle;->getTextAlign-buA522U()Landroidx/compose/ui/text/style/TextAlign; PLandroidx/compose/ui/text/TextStyle;->getTextAlign-buA522U()Landroidx/compose/ui/text/style/TextAlign; HSPLandroidx/compose/ui/text/TextStyle;->getTextDecoration()Landroidx/compose/ui/text/style/TextDecoration; PLandroidx/compose/ui/text/TextStyle;->getTextDecoration()Landroidx/compose/ui/text/style/TextDecoration; HSPLandroidx/compose/ui/text/TextStyle;->getTextDirection-mmuk1to()Landroidx/compose/ui/text/style/TextDirection; HPLandroidx/compose/ui/text/TextStyle;->getTextDirection-mmuk1to()Landroidx/compose/ui/text/style/TextDirection; HSPLandroidx/compose/ui/text/TextStyle;->getTextIndent()Landroidx/compose/ui/text/style/TextIndent; PLandroidx/compose/ui/text/TextStyle;->getTextIndent()Landroidx/compose/ui/text/style/TextIndent; HSPLandroidx/compose/ui/text/TextStyle;->getTextMotion()Landroidx/compose/ui/text/style/TextMotion; HPLandroidx/compose/ui/text/TextStyle;->getTextMotion()Landroidx/compose/ui/text/style/TextMotion; HSPLandroidx/compose/ui/text/TextStyle;->hasSameDrawAffectingAttributes(Landroidx/compose/ui/text/TextStyle;)Z HPLandroidx/compose/ui/text/TextStyle;->hasSameDrawAffectingAttributes(Landroidx/compose/ui/text/TextStyle;)Z HSPLandroidx/compose/ui/text/TextStyle;->hasSameLayoutAffectingAttributes(Landroidx/compose/ui/text/TextStyle;)Z HPLandroidx/compose/ui/text/TextStyle;->hasSameLayoutAffectingAttributes(Landroidx/compose/ui/text/TextStyle;)Z HSPLandroidx/compose/ui/text/TextStyle;->merge(Landroidx/compose/ui/text/TextStyle;)Landroidx/compose/ui/text/TextStyle; HPLandroidx/compose/ui/text/TextStyle;->merge(Landroidx/compose/ui/text/TextStyle;)Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/ui/text/TextStyle;->merge-Z1GrekI$default(IJJJJLandroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDecoration;)Landroidx/compose/ui/text/TextStyle; HPLandroidx/compose/ui/text/TextStyle;->merge-Z1GrekI$default(IJJJJLandroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/style/TextAlign;Landroidx/compose/ui/text/style/TextDecoration;)Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/ui/text/TextStyle;->toSpanStyle()Landroidx/compose/ui/text/SpanStyle; PLandroidx/compose/ui/text/TextStyle;->toSpanStyle()Landroidx/compose/ui/text/SpanStyle; Landroidx/compose/ui/text/android/BoringLayoutFactoryDefault; HSPLandroidx/compose/ui/text/android/BoringLayoutFactoryDefault;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;)Landroid/text/BoringLayout$Metrics; HPLandroidx/compose/ui/text/android/BoringLayoutFactoryDefault;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;)Landroid/text/BoringLayout$Metrics; Landroidx/compose/ui/text/android/LayoutCompatKt; HSPLandroidx/compose/ui/text/android/LayoutCompatKt;->()V PLandroidx/compose/ui/text/android/LayoutCompatKt;->()V HSPLandroidx/compose/ui/text/android/LayoutCompatKt;->create(Ljava/lang/CharSequence;IILandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IFFIZZIIII[I[I)Landroid/text/StaticLayout; HPLandroidx/compose/ui/text/android/LayoutCompatKt;->create(Ljava/lang/CharSequence;IILandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IFFIZZIIII[I[I)Landroid/text/StaticLayout; Landroidx/compose/ui/text/android/LayoutIntrinsics; HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;->(Ljava/lang/CharSequence;Landroidx/compose/ui/text/platform/AndroidTextPaint;I)V HPLandroidx/compose/ui/text/android/LayoutIntrinsics;->(Ljava/lang/CharSequence;Landroidx/compose/ui/text/platform/AndroidTextPaint;I)V HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getBoringMetrics()Landroid/text/BoringLayout$Metrics; HPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getBoringMetrics()Landroid/text/BoringLayout$Metrics; HSPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getMaxIntrinsicWidth()F HPLandroidx/compose/ui/text/android/LayoutIntrinsics;->getMaxIntrinsicWidth()F Landroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0; HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)V HPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)V HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)Z PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/graphics/RenderNode;)Z HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/RenderNode;)V PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$2(Landroid/graphics/RenderNode;)V HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;)I PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/graphics/RenderNode;)I HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/RenderNode; PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/RenderNode; HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m()V PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m()V HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)F PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)F HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)I HPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)I HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Landroid/graphics/RecordingCanvas; PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Landroid/graphics/RecordingCanvas; HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Z HPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;)Z HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;F)V HPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;F)V HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;IIII)Z PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;IIII)Z HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Landroid/graphics/Matrix;)V HPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Landroid/graphics/Matrix;)V HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Z)V HPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/RenderNode;Z)V HSPLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Ljava/util/Map; PLandroidx/compose/ui/text/android/Paint29$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Ljava/util/Map; Landroidx/compose/ui/text/android/StaticLayoutFactory23; HSPLandroidx/compose/ui/text/android/StaticLayoutFactory23;->()V PLandroidx/compose/ui/text/android/StaticLayoutFactory23;->()V HSPLandroidx/compose/ui/text/android/StaticLayoutFactory23;->create(Landroidx/compose/ui/text/android/StaticLayoutParams;)Landroid/text/StaticLayout; HPLandroidx/compose/ui/text/android/StaticLayoutFactory23;->create(Landroidx/compose/ui/text/android/StaticLayoutParams;)Landroid/text/StaticLayout; Landroidx/compose/ui/text/android/StaticLayoutFactory26; HSPLandroidx/compose/ui/text/android/StaticLayoutFactory26;->setJustificationMode(Landroid/text/StaticLayout$Builder;I)V PLandroidx/compose/ui/text/android/StaticLayoutFactory26;->setJustificationMode(Landroid/text/StaticLayout$Builder;I)V Landroidx/compose/ui/text/android/StaticLayoutFactory28; HSPLandroidx/compose/ui/text/android/StaticLayoutFactory28;->setUseLineSpacingFromFallbacks(Landroid/text/StaticLayout$Builder;Z)V PLandroidx/compose/ui/text/android/StaticLayoutFactory28;->setUseLineSpacingFromFallbacks(Landroid/text/StaticLayout$Builder;Z)V Landroidx/compose/ui/text/android/StaticLayoutFactory33; Landroidx/compose/ui/text/android/StaticLayoutFactoryImpl; Landroidx/compose/ui/text/android/StaticLayoutParams; HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->(Ljava/lang/CharSequence;IILandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IFFIZZIIII[I[I)V HPLandroidx/compose/ui/text/android/StaticLayoutParams;->(Ljava/lang/CharSequence;IILandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextDirectionHeuristic;Landroid/text/Layout$Alignment;ILandroid/text/TextUtils$TruncateAt;IFFIZZIIII[I[I)V HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getAlignment()Landroid/text/Layout$Alignment; PLandroidx/compose/ui/text/android/StaticLayoutParams;->getAlignment()Landroid/text/Layout$Alignment; HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getBreakStrategy()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getBreakStrategy()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getEllipsize()Landroid/text/TextUtils$TruncateAt; PLandroidx/compose/ui/text/android/StaticLayoutParams;->getEllipsize()Landroid/text/TextUtils$TruncateAt; HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getEllipsizedWidth()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getEllipsizedWidth()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getEnd()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getEnd()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getHyphenationFrequency()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getHyphenationFrequency()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getIncludePadding()Z PLandroidx/compose/ui/text/android/StaticLayoutParams;->getIncludePadding()Z HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getJustificationMode()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getJustificationMode()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getLeftIndents()[I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getLeftIndents()[I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getLineSpacingExtra()F PLandroidx/compose/ui/text/android/StaticLayoutParams;->getLineSpacingExtra()F HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getLineSpacingMultiplier()F PLandroidx/compose/ui/text/android/StaticLayoutParams;->getLineSpacingMultiplier()F HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getMaxLines()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getMaxLines()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getPaint()Landroid/text/TextPaint; PLandroidx/compose/ui/text/android/StaticLayoutParams;->getPaint()Landroid/text/TextPaint; HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getRightIndents()[I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getRightIndents()[I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getStart()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getStart()I HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getText()Ljava/lang/CharSequence; PLandroidx/compose/ui/text/android/StaticLayoutParams;->getText()Ljava/lang/CharSequence; HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getTextDir()Landroid/text/TextDirectionHeuristic; PLandroidx/compose/ui/text/android/StaticLayoutParams;->getTextDir()Landroid/text/TextDirectionHeuristic; HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getUseFallbackLineSpacing()Z PLandroidx/compose/ui/text/android/StaticLayoutParams;->getUseFallbackLineSpacing()Z HSPLandroidx/compose/ui/text/android/StaticLayoutParams;->getWidth()I PLandroidx/compose/ui/text/android/StaticLayoutParams;->getWidth()I Landroidx/compose/ui/text/android/TextAlignmentAdapter; HSPLandroidx/compose/ui/text/android/TextAlignmentAdapter;->()V PLandroidx/compose/ui/text/android/TextAlignmentAdapter;->()V HSPLandroidx/compose/ui/text/android/TextAlignmentAdapter;->get(I)Landroid/text/Layout$Alignment; PLandroidx/compose/ui/text/android/TextAlignmentAdapter;->get(I)Landroid/text/Layout$Alignment; Landroidx/compose/ui/text/android/TextAndroidCanvas; HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;->()V PLandroidx/compose/ui/text/android/TextAndroidCanvas;->()V HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V HPLandroidx/compose/ui/text/android/TextAndroidCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;->getClipBounds(Landroid/graphics/Rect;)Z HPLandroidx/compose/ui/text/android/TextAndroidCanvas;->getClipBounds(Landroid/graphics/Rect;)Z HSPLandroidx/compose/ui/text/android/TextAndroidCanvas;->setCanvas(Landroid/graphics/Canvas;)V PLandroidx/compose/ui/text/android/TextAndroidCanvas;->setCanvas(Landroid/graphics/Canvas;)V Landroidx/compose/ui/text/android/TextLayout; HSPLandroidx/compose/ui/text/android/TextLayout;->(Ljava/lang/CharSequence;FLandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextUtils$TruncateAt;IZIIIIIILandroidx/compose/ui/text/android/LayoutIntrinsics;)V HPLandroidx/compose/ui/text/android/TextLayout;->(Ljava/lang/CharSequence;FLandroidx/compose/ui/text/platform/AndroidTextPaint;ILandroid/text/TextUtils$TruncateAt;IZIIIIIILandroidx/compose/ui/text/android/LayoutIntrinsics;)V HSPLandroidx/compose/ui/text/android/TextLayout;->getDidExceedMaxLines()Z PLandroidx/compose/ui/text/android/TextLayout;->getDidExceedMaxLines()Z HSPLandroidx/compose/ui/text/android/TextLayout;->getHeight()I HPLandroidx/compose/ui/text/android/TextLayout;->getHeight()I HSPLandroidx/compose/ui/text/android/TextLayout;->getIncludePadding()Z PLandroidx/compose/ui/text/android/TextLayout;->getIncludePadding()Z HSPLandroidx/compose/ui/text/android/TextLayout;->getLineBaseline(I)F PLandroidx/compose/ui/text/android/TextLayout;->getLineBaseline(I)F HSPLandroidx/compose/ui/text/android/TextLayout;->getLineCount()I PLandroidx/compose/ui/text/android/TextLayout;->getLineCount()I HSPLandroidx/compose/ui/text/android/TextLayout;->getText()Ljava/lang/CharSequence; HPLandroidx/compose/ui/text/android/TextLayout;->getText()Ljava/lang/CharSequence; HSPLandroidx/compose/ui/text/android/TextLayout;->isFallbackLinespacingApplied$ui_text_release()Z HPLandroidx/compose/ui/text/android/TextLayout;->isFallbackLinespacingApplied$ui_text_release()Z HSPLandroidx/compose/ui/text/android/TextLayout;->paint(Landroid/graphics/Canvas;)V HPLandroidx/compose/ui/text/android/TextLayout;->paint(Landroid/graphics/Canvas;)V Landroidx/compose/ui/text/android/TextLayout$layoutHelper$2; HSPLandroidx/compose/ui/text/android/TextLayout$layoutHelper$2;->(Landroidx/compose/ui/text/android/TextLayout;)V HPLandroidx/compose/ui/text/android/TextLayout$layoutHelper$2;->(Landroidx/compose/ui/text/android/TextLayout;)V Landroidx/compose/ui/text/android/TextLayoutKt; HSPLandroidx/compose/ui/text/android/TextLayoutKt;->()V PLandroidx/compose/ui/text/android/TextLayoutKt;->()V HSPLandroidx/compose/ui/text/android/TextLayoutKt;->access$getLineHeightPaddings([Landroidx/compose/ui/text/android/style/LineHeightStyleSpan;)J HPLandroidx/compose/ui/text/android/TextLayoutKt;->access$getLineHeightPaddings([Landroidx/compose/ui/text/android/style/LineHeightStyleSpan;)J HSPLandroidx/compose/ui/text/android/TextLayoutKt;->access$getSharedTextAndroidCanvas$p()Landroidx/compose/ui/text/android/TextAndroidCanvas; PLandroidx/compose/ui/text/android/TextLayoutKt;->access$getSharedTextAndroidCanvas$p()Landroidx/compose/ui/text/android/TextAndroidCanvas; HSPLandroidx/compose/ui/text/android/TextLayoutKt;->access$getVerticalPaddings(Landroidx/compose/ui/text/android/TextLayout;)J HPLandroidx/compose/ui/text/android/TextLayoutKt;->access$getVerticalPaddings(Landroidx/compose/ui/text/android/TextLayout;)J HSPLandroidx/compose/ui/text/android/TextLayoutKt;->getTextDirectionHeuristic(I)Landroid/text/TextDirectionHeuristic; HPLandroidx/compose/ui/text/android/TextLayoutKt;->getTextDirectionHeuristic(I)Landroid/text/TextDirectionHeuristic; Landroidx/compose/ui/text/android/style/LetterSpacingSpanEm; Landroidx/compose/ui/text/android/style/LetterSpacingSpanPx; Landroidx/compose/ui/text/android/style/LineHeightStyleSpan; HSPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->(FIZZF)V HPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->(FIZZF)V HSPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V HPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V HSPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->getFirstAscentDiff()I PLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->getFirstAscentDiff()I HSPLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->getLastDescentDiff()I PLandroidx/compose/ui/text/android/style/LineHeightStyleSpan;->getLastDescentDiff()I Landroidx/compose/ui/text/android/style/PlaceholderSpan; Landroidx/compose/ui/text/android/style/SkewXSpan; Landroidx/compose/ui/text/caches/ContainerHelpersKt; HSPLandroidx/compose/ui/text/caches/ContainerHelpersKt;->()V PLandroidx/compose/ui/text/caches/ContainerHelpersKt;->()V Landroidx/compose/ui/text/caches/LruCache; HSPLandroidx/compose/ui/text/caches/LruCache;->()V PLandroidx/compose/ui/text/caches/LruCache;->()V HSPLandroidx/compose/ui/text/caches/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/text/caches/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/text/caches/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/text/caches/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/compose/ui/text/caches/LruCache;->size()I PLandroidx/compose/ui/text/caches/LruCache;->size()I Landroidx/compose/ui/text/caches/SimpleArrayMap; HSPLandroidx/compose/ui/text/caches/SimpleArrayMap;->()V PLandroidx/compose/ui/text/caches/SimpleArrayMap;->()V Landroidx/compose/ui/text/font/AndroidFontLoader; HSPLandroidx/compose/ui/text/font/AndroidFontLoader;->(Landroid/content/Context;)V PLandroidx/compose/ui/text/font/AndroidFontLoader;->(Landroid/content/Context;)V Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor; HSPLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;->(I)V PLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;->(I)V HSPLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;->interceptFontWeight(Landroidx/compose/ui/text/font/FontWeight;)Landroidx/compose/ui/text/font/FontWeight; PLandroidx/compose/ui/text/font/AndroidFontResolveInterceptor;->interceptFontWeight(Landroidx/compose/ui/text/font/FontWeight;)Landroidx/compose/ui/text/font/FontWeight; Landroidx/compose/ui/text/font/AsyncTypefaceCache; HSPLandroidx/compose/ui/text/font/AsyncTypefaceCache;->()V PLandroidx/compose/ui/text/font/AsyncTypefaceCache;->()V Landroidx/compose/ui/text/font/DefaultFontFamily; HSPLandroidx/compose/ui/text/font/DefaultFontFamily;->()V PLandroidx/compose/ui/text/font/DefaultFontFamily;->()V Landroidx/compose/ui/text/font/FileBasedFontFamily; Landroidx/compose/ui/text/font/FontFamily; HSPLandroidx/compose/ui/text/font/FontFamily;->()V PLandroidx/compose/ui/text/font/FontFamily;->()V HSPLandroidx/compose/ui/text/font/FontFamily;->()V PLandroidx/compose/ui/text/font/FontFamily;->()V HSPLandroidx/compose/ui/text/font/FontFamily;->access$getSansSerif$cp()Landroidx/compose/ui/text/font/GenericFontFamily; PLandroidx/compose/ui/text/font/FontFamily;->access$getSansSerif$cp()Landroidx/compose/ui/text/font/GenericFontFamily; Landroidx/compose/ui/text/font/FontFamilyResolverImpl; HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->(Landroidx/compose/ui/text/font/AndroidFontLoader;Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;)V PLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->(Landroidx/compose/ui/text/font/AndroidFontLoader;Landroidx/compose/ui/text/font/AndroidFontResolveInterceptor;)V HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->access$getCreateDefaultTypeface$p(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)Lkotlin/jvm/functions/Function1; PLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->access$getCreateDefaultTypeface$p(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)Lkotlin/jvm/functions/Function1; HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->access$getFontListFontFamilyTypefaceAdapter$p(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter; PLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->access$getFontListFontFamilyTypefaceAdapter$p(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter; HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->access$getPlatformFamilyTypefaceAdapter$p(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)Landroidx/compose/runtime/Stack; PLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->access$getPlatformFamilyTypefaceAdapter$p(Landroidx/compose/ui/text/font/FontFamilyResolverImpl;)Landroidx/compose/runtime/Stack; HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->getPlatformFontLoader$ui_text_release()Landroidx/compose/ui/text/font/AndroidFontLoader; PLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->getPlatformFontLoader$ui_text_release()Landroidx/compose/ui/text/font/AndroidFontLoader; HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve-DPcqOEQ(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;II)Landroidx/compose/ui/text/font/TypefaceResult; HPLandroidx/compose/ui/text/font/FontFamilyResolverImpl;->resolve-DPcqOEQ(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;II)Landroidx/compose/ui/text/font/TypefaceResult; Landroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1; HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;->(Ljava/lang/Object;Landroidx/compose/ui/text/font/TypefaceRequest;I)V HPLandroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;->(Ljava/lang/Object;Landroidx/compose/ui/text/font/TypefaceRequest;I)V HSPLandroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/compose/ui/text/font/FontFamilyResolverImpl$resolve$result$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/text/font/FontFamilyResolverKt; HSPLandroidx/compose/ui/text/font/FontFamilyResolverKt;->()V PLandroidx/compose/ui/text/font/FontFamilyResolverKt;->()V HSPLandroidx/compose/ui/text/font/FontFamilyResolverKt;->getGlobalAsyncTypefaceCache()Landroidx/compose/ui/text/font/AsyncTypefaceCache; PLandroidx/compose/ui/text/font/FontFamilyResolverKt;->getGlobalAsyncTypefaceCache()Landroidx/compose/ui/text/font/AsyncTypefaceCache; HSPLandroidx/compose/ui/text/font/FontFamilyResolverKt;->getGlobalTypefaceRequestCache()Landroidx/compose/ui/text/font/TypefaceRequestCache; PLandroidx/compose/ui/text/font/FontFamilyResolverKt;->getGlobalTypefaceRequestCache()Landroidx/compose/ui/text/font/TypefaceRequestCache; Landroidx/compose/ui/text/font/FontKt; HSPLandroidx/compose/ui/text/font/FontKt;->PlatformTypefaces()Landroidx/compose/ui/text/font/PlatformTypefaces; PLandroidx/compose/ui/text/font/FontKt;->PlatformTypefaces()Landroidx/compose/ui/text/font/PlatformTypefaces; HSPLandroidx/compose/ui/text/font/FontKt;->createFontFamilyResolver(Landroid/content/Context;)Landroidx/compose/ui/text/font/FontFamilyResolverImpl; PLandroidx/compose/ui/text/font/FontKt;->createFontFamilyResolver(Landroid/content/Context;)Landroidx/compose/ui/text/font/FontFamilyResolverImpl; Landroidx/compose/ui/text/font/FontListFontFamily; Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter; HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->()V PLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->()V HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->(Landroidx/compose/ui/text/font/AsyncTypefaceCache;)V PLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->(Landroidx/compose/ui/text/font/AsyncTypefaceCache;)V HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;Landroidx/compose/ui/text/font/AndroidFontLoader;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/text/font/TypefaceResult; PLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter;->resolve(Landroidx/compose/ui/text/font/TypefaceRequest;Landroidx/compose/ui/text/font/AndroidFontLoader;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/text/font/TypefaceResult; Landroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter$special$$inlined$CoroutineExceptionHandler$1; HSPLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter$special$$inlined$CoroutineExceptionHandler$1;->(Lkotlinx/coroutines/CoroutineExceptionHandler$Key;)V PLandroidx/compose/ui/text/font/FontListFontFamilyTypefaceAdapter$special$$inlined$CoroutineExceptionHandler$1;->(Lkotlinx/coroutines/CoroutineExceptionHandler$Key;)V Landroidx/compose/ui/text/font/FontStyle; HSPLandroidx/compose/ui/text/font/FontStyle;->(I)V HPLandroidx/compose/ui/text/font/FontStyle;->(I)V HSPLandroidx/compose/ui/text/font/FontStyle;->box-impl(I)Landroidx/compose/ui/text/font/FontStyle; HPLandroidx/compose/ui/text/font/FontStyle;->box-impl(I)Landroidx/compose/ui/text/font/FontStyle; HSPLandroidx/compose/ui/text/font/FontStyle;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/font/FontStyle;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/font/FontStyle;->unbox-impl()I PLandroidx/compose/ui/text/font/FontStyle;->unbox-impl()I Landroidx/compose/ui/text/font/FontStyle$Companion; HSPLandroidx/compose/ui/text/font/FontStyle$Companion;->()V PLandroidx/compose/ui/text/font/FontStyle$Companion;->()V Landroidx/compose/ui/text/font/FontSynthesis; HSPLandroidx/compose/ui/text/font/FontSynthesis;->(I)V HPLandroidx/compose/ui/text/font/FontSynthesis;->(I)V HSPLandroidx/compose/ui/text/font/FontSynthesis;->box-impl(I)Landroidx/compose/ui/text/font/FontSynthesis; HPLandroidx/compose/ui/text/font/FontSynthesis;->box-impl(I)Landroidx/compose/ui/text/font/FontSynthesis; HSPLandroidx/compose/ui/text/font/FontSynthesis;->unbox-impl()I PLandroidx/compose/ui/text/font/FontSynthesis;->unbox-impl()I Landroidx/compose/ui/text/font/FontWeight; HSPLandroidx/compose/ui/text/font/FontWeight;->()V PLandroidx/compose/ui/text/font/FontWeight;->()V HSPLandroidx/compose/ui/text/font/FontWeight;->(I)V PLandroidx/compose/ui/text/font/FontWeight;->(I)V HSPLandroidx/compose/ui/text/font/FontWeight;->access$getMedium$cp()Landroidx/compose/ui/text/font/FontWeight; PLandroidx/compose/ui/text/font/FontWeight;->access$getMedium$cp()Landroidx/compose/ui/text/font/FontWeight; HSPLandroidx/compose/ui/text/font/FontWeight;->access$getNormal$cp()Landroidx/compose/ui/text/font/FontWeight; PLandroidx/compose/ui/text/font/FontWeight;->access$getNormal$cp()Landroidx/compose/ui/text/font/FontWeight; HSPLandroidx/compose/ui/text/font/FontWeight;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/text/font/FontWeight;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/font/FontWeight;->getWeight()I PLandroidx/compose/ui/text/font/FontWeight;->getWeight()I HSPLandroidx/compose/ui/text/font/FontWeight;->hashCode()I PLandroidx/compose/ui/text/font/FontWeight;->hashCode()I Landroidx/compose/ui/text/font/GenericFontFamily; HSPLandroidx/compose/ui/text/font/GenericFontFamily;->(Ljava/lang/String;Ljava/lang/String;)V PLandroidx/compose/ui/text/font/GenericFontFamily;->(Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/compose/ui/text/font/GenericFontFamily;->getName()Ljava/lang/String; PLandroidx/compose/ui/text/font/GenericFontFamily;->getName()Ljava/lang/String; Landroidx/compose/ui/text/font/PlatformResolveInterceptor; HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor;->()V PLandroidx/compose/ui/text/font/PlatformResolveInterceptor;->()V Landroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion; HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;->()V PLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;->()V HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;->()V PLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion;->()V Landroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1; HSPLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1;->()V PLandroidx/compose/ui/text/font/PlatformResolveInterceptor$Companion$Default$1;->()V Landroidx/compose/ui/text/font/PlatformTypefaces; Landroidx/compose/ui/text/font/PlatformTypefacesApi; HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi;->(I)V PLandroidx/compose/ui/text/font/PlatformTypefacesApi;->(I)V HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi;->createAndroidTypefaceApi28-RetOiIg(Ljava/lang/String;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; PLandroidx/compose/ui/text/font/PlatformTypefacesApi;->createAndroidTypefaceApi28-RetOiIg(Ljava/lang/String;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; HSPLandroidx/compose/ui/text/font/PlatformTypefacesApi;->createNamed-RetOiIg(Landroidx/compose/ui/text/font/GenericFontFamily;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; PLandroidx/compose/ui/text/font/PlatformTypefacesApi;->createNamed-RetOiIg(Landroidx/compose/ui/text/font/GenericFontFamily;Landroidx/compose/ui/text/font/FontWeight;I)Landroid/graphics/Typeface; Landroidx/compose/ui/text/font/SystemFontFamily; HSPLandroidx/compose/ui/text/font/SystemFontFamily;->()V PLandroidx/compose/ui/text/font/SystemFontFamily;->()V Landroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0; HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/NotificationChannel;Z)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/NotificationChannel;Z)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannel;Landroid/net/Uri;Landroid/media/AudioAttributes;)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannel;Landroid/net/Uri;Landroid/media/AudioAttributes;)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannel;Ljava/lang/String;)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannel;Z)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannel;Z)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;I)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;I)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;I)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;I)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Z)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Z)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;)V HPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V HPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/util/List;)V HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;Ljava/lang/CharSequence;I)Landroid/app/NotificationChannel; PLandroidx/compose/ui/text/font/TypefaceCompatApi26$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;Ljava/lang/CharSequence;I)Landroid/app/NotificationChannel; Landroidx/compose/ui/text/font/TypefaceCompatApi26$toAndroidString$1; HSPLandroidx/compose/ui/text/font/TypefaceCompatApi26$toAndroidString$1;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/text/font/TypefaceCompatApi26$toAndroidString$1;->(Ljava/lang/Object;I)V Landroidx/compose/ui/text/font/TypefaceRequest; HSPLandroidx/compose/ui/text/font/TypefaceRequest;->(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;IILjava/lang/Object;)V HPLandroidx/compose/ui/text/font/TypefaceRequest;->(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;IILjava/lang/Object;)V HSPLandroidx/compose/ui/text/font/TypefaceRequest;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/font/TypefaceRequest;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/font/TypefaceRequest;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; PLandroidx/compose/ui/text/font/TypefaceRequest;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; HSPLandroidx/compose/ui/text/font/TypefaceRequest;->getFontStyle-_-LCdwA()I PLandroidx/compose/ui/text/font/TypefaceRequest;->getFontStyle-_-LCdwA()I HSPLandroidx/compose/ui/text/font/TypefaceRequest;->getFontWeight()Landroidx/compose/ui/text/font/FontWeight; PLandroidx/compose/ui/text/font/TypefaceRequest;->getFontWeight()Landroidx/compose/ui/text/font/FontWeight; HSPLandroidx/compose/ui/text/font/TypefaceRequest;->hashCode()I HPLandroidx/compose/ui/text/font/TypefaceRequest;->hashCode()I Landroidx/compose/ui/text/font/TypefaceRequestCache; HSPLandroidx/compose/ui/text/font/TypefaceRequestCache;->()V PLandroidx/compose/ui/text/font/TypefaceRequestCache;->()V HSPLandroidx/compose/ui/text/font/TypefaceRequestCache;->runCached(Landroidx/compose/ui/text/font/TypefaceRequest;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/text/font/TypefaceResult; HPLandroidx/compose/ui/text/font/TypefaceRequestCache;->runCached(Landroidx/compose/ui/text/font/TypefaceRequest;Lkotlin/jvm/functions/Function1;)Landroidx/compose/ui/text/font/TypefaceResult; Landroidx/compose/ui/text/font/TypefaceResult; Landroidx/compose/ui/text/font/TypefaceResult$Immutable; HSPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->(Ljava/lang/Object;Z)V PLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->(Ljava/lang/Object;Z)V HSPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->getCacheable()Z PLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->getCacheable()Z HSPLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->getValue()Ljava/lang/Object; PLandroidx/compose/ui/text/font/TypefaceResult$Immutable;->getValue()Ljava/lang/Object; Landroidx/compose/ui/text/input/CursorAnchorInfoController; HSPLandroidx/compose/ui/text/input/CursorAnchorInfoController;->(Landroidx/compose/ui/text/input/InputMethodManagerImpl;)V PLandroidx/compose/ui/text/input/CursorAnchorInfoController;->(Landroidx/compose/ui/text/input/InputMethodManagerImpl;)V Landroidx/compose/ui/text/input/ImeOptions; HSPLandroidx/compose/ui/text/input/ImeOptions;->()V PLandroidx/compose/ui/text/input/ImeOptions;->()V HSPLandroidx/compose/ui/text/input/ImeOptions;->(ZIZII)V PLandroidx/compose/ui/text/input/ImeOptions;->(ZIZII)V HSPLandroidx/compose/ui/text/input/ImeOptions;->access$getDefault$cp()Landroidx/compose/ui/text/input/ImeOptions; PLandroidx/compose/ui/text/input/ImeOptions;->access$getDefault$cp()Landroidx/compose/ui/text/input/ImeOptions; Landroidx/compose/ui/text/input/InputMethodManager; Landroidx/compose/ui/text/input/InputMethodManagerImpl; HSPLandroidx/compose/ui/text/input/InputMethodManagerImpl;->(Landroid/view/View;)V PLandroidx/compose/ui/text/input/InputMethodManagerImpl;->(Landroid/view/View;)V Landroidx/compose/ui/text/input/InputMethodManagerImpl$imm$2; HSPLandroidx/compose/ui/text/input/InputMethodManagerImpl$imm$2;->(Ljava/lang/Object;I)V PLandroidx/compose/ui/text/input/InputMethodManagerImpl$imm$2;->(Ljava/lang/Object;I)V Landroidx/compose/ui/text/input/OffsetMapping; Landroidx/compose/ui/text/input/PlatformTextInputService; Landroidx/compose/ui/text/input/TextFieldValue; HSPLandroidx/compose/ui/text/input/TextFieldValue;->()V PLandroidx/compose/ui/text/input/TextFieldValue;->()V HSPLandroidx/compose/ui/text/input/TextFieldValue;->(Landroidx/compose/ui/text/AnnotatedString;JLandroidx/compose/ui/text/TextRange;)V PLandroidx/compose/ui/text/input/TextFieldValue;->(Landroidx/compose/ui/text/AnnotatedString;JLandroidx/compose/ui/text/TextRange;)V HSPLandroidx/compose/ui/text/input/TextFieldValue;->(Ljava/lang/String;JI)V PLandroidx/compose/ui/text/input/TextFieldValue;->(Ljava/lang/String;JI)V HSPLandroidx/compose/ui/text/input/TextFieldValue;->getText()Ljava/lang/String; PLandroidx/compose/ui/text/input/TextFieldValue;->getText()Ljava/lang/String; Landroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1; HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;->()V PLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;->()V HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;->()V PLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$1;->()V Landroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2; HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;->()V PLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;->()V HSPLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;->(I)V PLandroidx/compose/ui/text/input/TextFieldValue$Companion$Saver$2;->(I)V Landroidx/compose/ui/text/input/TextInputService; HSPLandroidx/compose/ui/text/input/TextInputService;->(Landroidx/compose/ui/text/input/PlatformTextInputService;)V PLandroidx/compose/ui/text/input/TextInputService;->(Landroidx/compose/ui/text/input/PlatformTextInputService;)V Landroidx/compose/ui/text/input/TextInputServiceAndroid; HSPLandroidx/compose/ui/text/input/TextInputServiceAndroid;->(Landroid/view/View;)V PLandroidx/compose/ui/text/input/TextInputServiceAndroid;->(Landroid/view/View;)V Landroidx/compose/ui/text/input/TextInputServiceAndroid$TextInputCommand; Landroidx/compose/ui/text/input/TextInputServiceAndroid_androidKt$$ExternalSyntheticLambda0; HSPLandroidx/compose/ui/text/input/TextInputServiceAndroid_androidKt$$ExternalSyntheticLambda0;->(Landroid/view/Choreographer;)V PLandroidx/compose/ui/text/input/TextInputServiceAndroid_androidKt$$ExternalSyntheticLambda0;->(Landroid/view/Choreographer;)V Landroidx/compose/ui/text/input/VisualTransformation; HSPLandroidx/compose/ui/text/input/VisualTransformation;->()V PLandroidx/compose/ui/text/input/VisualTransformation;->()V Landroidx/compose/ui/text/input/VisualTransformation$Companion; HSPLandroidx/compose/ui/text/input/VisualTransformation$Companion;->()V PLandroidx/compose/ui/text/input/VisualTransformation$Companion;->()V HSPLandroidx/compose/ui/text/input/VisualTransformation$Companion;->()V PLandroidx/compose/ui/text/input/VisualTransformation$Companion;->()V HSPLandroidx/compose/ui/text/input/VisualTransformation$Companion;->getNone()Landroidx/compose/ui/text/input/VisualTransformation; PLandroidx/compose/ui/text/input/VisualTransformation$Companion;->getNone()Landroidx/compose/ui/text/input/VisualTransformation; Landroidx/compose/ui/text/intl/AndroidLocale; HSPLandroidx/compose/ui/text/intl/AndroidLocale;->(Ljava/util/Locale;)V PLandroidx/compose/ui/text/intl/AndroidLocale;->(Ljava/util/Locale;)V Landroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24; HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24;->()V PLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24;->()V HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24;->getCurrent()Landroidx/compose/ui/text/intl/LocaleList; HPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24;->getCurrent()Landroidx/compose/ui/text/intl/LocaleList; Landroidx/compose/ui/text/intl/Locale; HSPLandroidx/compose/ui/text/intl/Locale;->()V PLandroidx/compose/ui/text/intl/Locale;->()V HSPLandroidx/compose/ui/text/intl/Locale;->(Landroidx/compose/ui/text/intl/AndroidLocale;)V PLandroidx/compose/ui/text/intl/Locale;->(Landroidx/compose/ui/text/intl/AndroidLocale;)V Landroidx/compose/ui/text/intl/LocaleList; HSPLandroidx/compose/ui/text/intl/LocaleList;->()V PLandroidx/compose/ui/text/intl/LocaleList;->()V HSPLandroidx/compose/ui/text/intl/LocaleList;->(Ljava/util/List;)V PLandroidx/compose/ui/text/intl/LocaleList;->(Ljava/util/List;)V HSPLandroidx/compose/ui/text/intl/LocaleList;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/intl/LocaleList;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/text/intl/PlatformLocaleKt; HSPLandroidx/compose/ui/text/intl/PlatformLocaleKt;->()V PLandroidx/compose/ui/text/intl/PlatformLocaleKt;->()V HSPLandroidx/compose/ui/text/intl/PlatformLocaleKt;->getPlatformLocaleDelegate()Landroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24; PLandroidx/compose/ui/text/intl/PlatformLocaleKt;->getPlatformLocaleDelegate()Landroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24; Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt; HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->()V PLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->()V HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->createCharSequence(Ljava/lang/String;FLandroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function4;Z)Ljava/lang/CharSequence; HPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt;->createCharSequence(Ljava/lang/String;FLandroidx/compose/ui/text/TextStyle;Ljava/util/List;Ljava/util/List;Landroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function4;Z)Ljava/lang/CharSequence; Landroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1; HSPLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1;->()V PLandroidx/compose/ui/text/platform/AndroidParagraphHelper_androidKt$NoopSpan$1;->()V Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics; HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;Landroidx/compose/ui/unit/Density;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V HPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;Landroidx/compose/ui/unit/Density;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getCharSequence$ui_text_release()Ljava/lang/CharSequence; PLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getCharSequence$ui_text_release()Ljava/lang/CharSequence; HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getFontFamilyResolver()Landroidx/compose/ui/text/font/FontFamilyResolverImpl; PLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getFontFamilyResolver()Landroidx/compose/ui/text/font/FontFamilyResolverImpl; HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getHasStaleResolvedFonts()Z HPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getHasStaleResolvedFonts()Z HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getLayoutIntrinsics$ui_text_release()Landroidx/compose/ui/text/android/LayoutIntrinsics; PLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getLayoutIntrinsics$ui_text_release()Landroidx/compose/ui/text/android/LayoutIntrinsics; HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getMaxIntrinsicWidth()F HPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getMaxIntrinsicWidth()F HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getStyle()Landroidx/compose/ui/text/TextStyle; PLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getStyle()Landroidx/compose/ui/text/TextStyle; HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getTextDirectionHeuristic$ui_text_release()I PLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getTextDirectionHeuristic$ui_text_release()I HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getTextPaint$ui_text_release()Landroidx/compose/ui/text/platform/AndroidTextPaint; HPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;->getTextPaint$ui_text_release()Landroidx/compose/ui/text/platform/AndroidTextPaint; Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1; HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;)V HPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;->(Landroidx/compose/ui/text/platform/AndroidParagraphIntrinsics;)V HSPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/compose/ui/text/platform/AndroidParagraphIntrinsics$resolveTypeface$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/compose/ui/text/platform/AndroidTextPaint; HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->(F)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->(F)V HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->getBlendMode-0nO6VwU()I PLandroidx/compose/ui/text/platform/AndroidTextPaint;->getBlendMode-0nO6VwU()I HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBlendMode-s9anfk8(I)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBlendMode-s9anfk8(I)V HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBrush-12SF9DM(Landroidx/compose/ui/graphics/Brush;JF)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setBrush-12SF9DM(Landroidx/compose/ui/graphics/Brush;JF)V HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setColor-8_81llA(J)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setColor-8_81llA(J)V HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setDrawStyle(Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setDrawStyle(Landroidx/compose/ui/graphics/drawscope/DrawStyle;)V HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setShadow(Landroidx/compose/ui/graphics/Shadow;)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setShadow(Landroidx/compose/ui/graphics/Shadow;)V HSPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setTextDecoration(Landroidx/compose/ui/text/style/TextDecoration;)V HPLandroidx/compose/ui/text/platform/AndroidTextPaint;->setTextDecoration(Landroidx/compose/ui/text/style/TextDecoration;)V Landroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Typeface;IZ)Landroid/graphics/Typeface; PLandroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Typeface;IZ)Landroid/graphics/Typeface; HSPLandroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Looper;)Landroid/os/Handler; HSPLandroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;Z)V PLandroidx/compose/ui/text/platform/Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/text/StaticLayout$Builder;Z)V Landroidx/compose/ui/text/platform/DefaultImpl; HSPLandroidx/compose/ui/text/platform/DefaultImpl;->()V PLandroidx/compose/ui/text/platform/DefaultImpl;->()V HSPLandroidx/compose/ui/text/platform/DefaultImpl;->access$setLoadState$p(Landroidx/compose/ui/text/platform/DefaultImpl;Landroidx/compose/runtime/State;)V PLandroidx/compose/ui/text/platform/DefaultImpl;->access$setLoadState$p(Landroidx/compose/ui/text/platform/DefaultImpl;Landroidx/compose/runtime/State;)V HSPLandroidx/compose/ui/text/platform/DefaultImpl;->getFontLoadState()Landroidx/compose/runtime/State; PLandroidx/compose/ui/text/platform/DefaultImpl;->getFontLoadState()Landroidx/compose/runtime/State; HSPLandroidx/compose/ui/text/platform/DefaultImpl;->getFontLoaded()Landroidx/compose/runtime/State; HPLandroidx/compose/ui/text/platform/DefaultImpl;->getFontLoaded()Landroidx/compose/runtime/State; Landroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1; HSPLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;->(Landroidx/compose/runtime/ParcelableSnapshotMutableState;Landroidx/compose/ui/text/platform/DefaultImpl;)V PLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;->(Landroidx/compose/runtime/ParcelableSnapshotMutableState;Landroidx/compose/ui/text/platform/DefaultImpl;)V HSPLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;->onFailed()V PLandroidx/compose/ui/text/platform/DefaultImpl$getFontLoadState$initCallback$1;->onFailed()V Landroidx/compose/ui/text/platform/EmojiCompatStatus; HSPLandroidx/compose/ui/text/platform/EmojiCompatStatus;->()V PLandroidx/compose/ui/text/platform/EmojiCompatStatus;->()V HSPLandroidx/compose/ui/text/platform/EmojiCompatStatus;->()V PLandroidx/compose/ui/text/platform/EmojiCompatStatus;->()V HSPLandroidx/compose/ui/text/platform/EmojiCompatStatus;->getFontLoaded()Landroidx/compose/runtime/State; HPLandroidx/compose/ui/text/platform/EmojiCompatStatus;->getFontLoaded()Landroidx/compose/runtime/State; Landroidx/compose/ui/text/platform/EmojiCompatStatusDelegate; Landroidx/compose/ui/text/platform/EmojiCompatStatusKt; HSPLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->()V PLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->()V HSPLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->access$getFalsey$p()Landroidx/compose/ui/text/platform/ImmutableBool; PLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->access$getFalsey$p()Landroidx/compose/ui/text/platform/ImmutableBool; HSPLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->access$getHasEmojiCompat(Landroidx/compose/ui/text/TextStyle;)Z HPLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->access$getHasEmojiCompat(Landroidx/compose/ui/text/TextStyle;)Z HSPLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->toAccessibilitySpannableString(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;Landroidx/compose/ui/text/platform/URLSpanCache;)Landroid/text/SpannableString; HPLandroidx/compose/ui/text/platform/EmojiCompatStatusKt;->toAccessibilitySpannableString(Landroidx/compose/ui/text/AnnotatedString;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/font/FontFamilyResolverImpl;Landroidx/compose/ui/text/platform/URLSpanCache;)Landroid/text/SpannableString; Landroidx/compose/ui/text/platform/ImmutableBool; HSPLandroidx/compose/ui/text/platform/ImmutableBool;->(Z)V PLandroidx/compose/ui/text/platform/ImmutableBool;->(Z)V HSPLandroidx/compose/ui/text/platform/ImmutableBool;->getValue()Ljava/lang/Object; HPLandroidx/compose/ui/text/platform/ImmutableBool;->getValue()Ljava/lang/Object; Landroidx/compose/ui/text/platform/URLSpanCache; HSPLandroidx/compose/ui/text/platform/URLSpanCache;->()V PLandroidx/compose/ui/text/platform/URLSpanCache;->()V Landroidx/compose/ui/text/platform/extensions/LocaleListHelperMethods; Landroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt; HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->resolveLineHeightInPx-o2QH7mI(JFLandroidx/compose/ui/unit/Density;)F HPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->resolveLineHeightInPx-o2QH7mI(JFLandroidx/compose/ui/unit/Density;)F HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setLineHeight-KmRG4DE(Landroid/text/Spannable;JFLandroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/style/LineHeightStyle;)V HPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setLineHeight-KmRG4DE(Landroid/text/Spannable;JFLandroidx/compose/ui/unit/Density;Landroidx/compose/ui/text/style/LineHeightStyle;)V HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setSpanStyles(Landroid/text/Spannable;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Landroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function4;)V HPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt;->setSpanStyles(Landroid/text/Spannable;Landroidx/compose/ui/text/TextStyle;Ljava/util/List;Landroidx/compose/ui/unit/Density;Lkotlin/jvm/functions/Function4;)V Landroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt$setFontAttributes$1; HSPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt$setFontAttributes$1;->(Landroid/text/Spannable;Lkotlin/jvm/functions/Function4;)V HPLandroidx/compose/ui/text/platform/extensions/SpannableExtensions_androidKt$setFontAttributes$1;->(Landroid/text/Spannable;Lkotlin/jvm/functions/Function4;)V Landroidx/compose/ui/text/platform/style/ShaderBrushSpan; Landroidx/compose/ui/text/style/BaselineShift; HSPLandroidx/compose/ui/text/style/BaselineShift;->()V PLandroidx/compose/ui/text/style/BaselineShift;->()V HSPLandroidx/compose/ui/text/style/BaselineShift;->(F)V HPLandroidx/compose/ui/text/style/BaselineShift;->(F)V HSPLandroidx/compose/ui/text/style/BaselineShift;->box-impl(F)Landroidx/compose/ui/text/style/BaselineShift; PLandroidx/compose/ui/text/style/BaselineShift;->box-impl(F)Landroidx/compose/ui/text/style/BaselineShift; HSPLandroidx/compose/ui/text/style/BaselineShift;->unbox-impl()F PLandroidx/compose/ui/text/style/BaselineShift;->unbox-impl()F Landroidx/compose/ui/text/style/BrushStyle; Landroidx/compose/ui/text/style/ColorStyle; HSPLandroidx/compose/ui/text/style/ColorStyle;->(J)V HPLandroidx/compose/ui/text/style/ColorStyle;->(J)V HSPLandroidx/compose/ui/text/style/ColorStyle;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/style/ColorStyle;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/style/ColorStyle;->getAlpha()F HPLandroidx/compose/ui/text/style/ColorStyle;->getAlpha()F HSPLandroidx/compose/ui/text/style/ColorStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; HPLandroidx/compose/ui/text/style/ColorStyle;->getBrush()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/text/style/ColorStyle;->getColor-0d7_KjU()J PLandroidx/compose/ui/text/style/ColorStyle;->getColor-0d7_KjU()J Landroidx/compose/ui/text/style/Hyphens; HSPLandroidx/compose/ui/text/style/Hyphens;->(I)V HPLandroidx/compose/ui/text/style/Hyphens;->(I)V HSPLandroidx/compose/ui/text/style/Hyphens;->box-impl(I)Landroidx/compose/ui/text/style/Hyphens; PLandroidx/compose/ui/text/style/Hyphens;->box-impl(I)Landroidx/compose/ui/text/style/Hyphens; HSPLandroidx/compose/ui/text/style/Hyphens;->unbox-impl()I PLandroidx/compose/ui/text/style/Hyphens;->unbox-impl()I Landroidx/compose/ui/text/style/LineBreak; HSPLandroidx/compose/ui/text/style/LineBreak;->(I)V HPLandroidx/compose/ui/text/style/LineBreak;->(I)V HSPLandroidx/compose/ui/text/style/LineBreak;->access$getSimple$cp()I PLandroidx/compose/ui/text/style/LineBreak;->access$getSimple$cp()I HSPLandroidx/compose/ui/text/style/LineBreak;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak; PLandroidx/compose/ui/text/style/LineBreak;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak; HSPLandroidx/compose/ui/text/style/LineBreak;->unbox-impl()I PLandroidx/compose/ui/text/style/LineBreak;->unbox-impl()I Landroidx/compose/ui/text/style/LineBreak$Strategy; HSPLandroidx/compose/ui/text/style/LineBreak$Strategy;->(I)V HPLandroidx/compose/ui/text/style/LineBreak$Strategy;->(I)V HSPLandroidx/compose/ui/text/style/LineBreak$Strategy;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak$Strategy; PLandroidx/compose/ui/text/style/LineBreak$Strategy;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak$Strategy; HSPLandroidx/compose/ui/text/style/LineBreak$Strategy;->unbox-impl()I PLandroidx/compose/ui/text/style/LineBreak$Strategy;->unbox-impl()I Landroidx/compose/ui/text/style/LineBreak$Strictness; HSPLandroidx/compose/ui/text/style/LineBreak$Strictness;->(I)V HPLandroidx/compose/ui/text/style/LineBreak$Strictness;->(I)V HSPLandroidx/compose/ui/text/style/LineBreak$Strictness;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak$Strictness; PLandroidx/compose/ui/text/style/LineBreak$Strictness;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak$Strictness; HSPLandroidx/compose/ui/text/style/LineBreak$Strictness;->unbox-impl()I PLandroidx/compose/ui/text/style/LineBreak$Strictness;->unbox-impl()I Landroidx/compose/ui/text/style/LineBreak$WordBreak; HSPLandroidx/compose/ui/text/style/LineBreak$WordBreak;->(I)V HPLandroidx/compose/ui/text/style/LineBreak$WordBreak;->(I)V HSPLandroidx/compose/ui/text/style/LineBreak$WordBreak;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak$WordBreak; PLandroidx/compose/ui/text/style/LineBreak$WordBreak;->box-impl(I)Landroidx/compose/ui/text/style/LineBreak$WordBreak; HSPLandroidx/compose/ui/text/style/LineBreak$WordBreak;->unbox-impl()I PLandroidx/compose/ui/text/style/LineBreak$WordBreak;->unbox-impl()I Landroidx/compose/ui/text/style/LineHeightStyle; HSPLandroidx/compose/ui/text/style/LineHeightStyle;->()V PLandroidx/compose/ui/text/style/LineHeightStyle;->()V HSPLandroidx/compose/ui/text/style/LineHeightStyle;->(FI)V PLandroidx/compose/ui/text/style/LineHeightStyle;->(FI)V HSPLandroidx/compose/ui/text/style/LineHeightStyle;->access$getDefault$cp()Landroidx/compose/ui/text/style/LineHeightStyle; PLandroidx/compose/ui/text/style/LineHeightStyle;->access$getDefault$cp()Landroidx/compose/ui/text/style/LineHeightStyle; HSPLandroidx/compose/ui/text/style/LineHeightStyle;->getAlignment-PIaL0Z0()F PLandroidx/compose/ui/text/style/LineHeightStyle;->getAlignment-PIaL0Z0()F HSPLandroidx/compose/ui/text/style/LineHeightStyle;->getTrim-EVpEnUU()I PLandroidx/compose/ui/text/style/LineHeightStyle;->getTrim-EVpEnUU()I Landroidx/compose/ui/text/style/LineHeightStyle$Alignment; HSPLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->()V PLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->()V HSPLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->access$getCenter$cp()F PLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->access$getCenter$cp()F HSPLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->access$getProportional$cp()F PLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->access$getProportional$cp()F HSPLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->constructor-impl(F)V PLandroidx/compose/ui/text/style/LineHeightStyle$Alignment;->constructor-impl(F)V Landroidx/compose/ui/text/style/TextAlign; HSPLandroidx/compose/ui/text/style/TextAlign;->(I)V HPLandroidx/compose/ui/text/style/TextAlign;->(I)V HSPLandroidx/compose/ui/text/style/TextAlign;->box-impl(I)Landroidx/compose/ui/text/style/TextAlign; PLandroidx/compose/ui/text/style/TextAlign;->box-impl(I)Landroidx/compose/ui/text/style/TextAlign; HSPLandroidx/compose/ui/text/style/TextAlign;->equals(Ljava/lang/Object;)Z PLandroidx/compose/ui/text/style/TextAlign;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/style/TextAlign;->unbox-impl()I PLandroidx/compose/ui/text/style/TextAlign;->unbox-impl()I Landroidx/compose/ui/text/style/TextDecoration; HSPLandroidx/compose/ui/text/style/TextDecoration;->()V PLandroidx/compose/ui/text/style/TextDecoration;->()V HSPLandroidx/compose/ui/text/style/TextDecoration;->(I)V PLandroidx/compose/ui/text/style/TextDecoration;->(I)V HSPLandroidx/compose/ui/text/style/TextDecoration;->access$getNone$cp()Landroidx/compose/ui/text/style/TextDecoration; PLandroidx/compose/ui/text/style/TextDecoration;->access$getNone$cp()Landroidx/compose/ui/text/style/TextDecoration; HSPLandroidx/compose/ui/text/style/TextDecoration;->access$getUnderline$cp()Landroidx/compose/ui/text/style/TextDecoration; PLandroidx/compose/ui/text/style/TextDecoration;->access$getUnderline$cp()Landroidx/compose/ui/text/style/TextDecoration; HSPLandroidx/compose/ui/text/style/TextDecoration;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/style/TextDecoration;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/text/style/TextDirection; HSPLandroidx/compose/ui/text/style/TextDirection;->(I)V HPLandroidx/compose/ui/text/style/TextDirection;->(I)V HSPLandroidx/compose/ui/text/style/TextDirection;->box-impl(I)Landroidx/compose/ui/text/style/TextDirection; PLandroidx/compose/ui/text/style/TextDirection;->box-impl(I)Landroidx/compose/ui/text/style/TextDirection; HSPLandroidx/compose/ui/text/style/TextDirection;->unbox-impl()I PLandroidx/compose/ui/text/style/TextDirection;->unbox-impl()I Landroidx/compose/ui/text/style/TextForegroundStyle; HSPLandroidx/compose/ui/text/style/TextForegroundStyle;->merge(Landroidx/compose/ui/text/style/TextForegroundStyle;)Landroidx/compose/ui/text/style/TextForegroundStyle; HPLandroidx/compose/ui/text/style/TextForegroundStyle;->merge(Landroidx/compose/ui/text/style/TextForegroundStyle;)Landroidx/compose/ui/text/style/TextForegroundStyle; Landroidx/compose/ui/text/style/TextForegroundStyle$Companion; HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Companion;->()V PLandroidx/compose/ui/text/style/TextForegroundStyle$Companion;->()V HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Companion;->from-8_81llA(J)Landroidx/compose/ui/text/style/TextForegroundStyle; HPLandroidx/compose/ui/text/style/TextForegroundStyle$Companion;->from-8_81llA(J)Landroidx/compose/ui/text/style/TextForegroundStyle; Landroidx/compose/ui/text/style/TextForegroundStyle$Unspecified; HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->()V PLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->()V HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->()V PLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->()V HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getAlpha()F PLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getAlpha()F HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getBrush()Landroidx/compose/ui/graphics/Brush; PLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getBrush()Landroidx/compose/ui/graphics/Brush; HSPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getColor-0d7_KjU()J HPLandroidx/compose/ui/text/style/TextForegroundStyle$Unspecified;->getColor-0d7_KjU()J Landroidx/compose/ui/text/style/TextForegroundStyle$merge$1; HSPLandroidx/compose/ui/text/style/TextForegroundStyle$merge$1;->(Landroidx/compose/ui/text/style/TextForegroundStyle;I)V HPLandroidx/compose/ui/text/style/TextForegroundStyle$merge$1;->(Landroidx/compose/ui/text/style/TextForegroundStyle;I)V HSPLandroidx/compose/ui/text/style/TextForegroundStyle$merge$1;->invoke()Ljava/lang/Object; PLandroidx/compose/ui/text/style/TextForegroundStyle$merge$1;->invoke()Ljava/lang/Object; Landroidx/compose/ui/text/style/TextGeometricTransform; HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->()V PLandroidx/compose/ui/text/style/TextGeometricTransform;->()V HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->(FF)V PLandroidx/compose/ui/text/style/TextGeometricTransform;->(FF)V HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->access$getNone$cp()Landroidx/compose/ui/text/style/TextGeometricTransform; PLandroidx/compose/ui/text/style/TextGeometricTransform;->access$getNone$cp()Landroidx/compose/ui/text/style/TextGeometricTransform; HSPLandroidx/compose/ui/text/style/TextGeometricTransform;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/style/TextGeometricTransform;->equals(Ljava/lang/Object;)Z Landroidx/compose/ui/text/style/TextIndent; HSPLandroidx/compose/ui/text/style/TextIndent;->()V PLandroidx/compose/ui/text/style/TextIndent;->()V HSPLandroidx/compose/ui/text/style/TextIndent;->(JJ)V PLandroidx/compose/ui/text/style/TextIndent;->(JJ)V HSPLandroidx/compose/ui/text/style/TextIndent;->access$getNone$cp()Landroidx/compose/ui/text/style/TextIndent; PLandroidx/compose/ui/text/style/TextIndent;->access$getNone$cp()Landroidx/compose/ui/text/style/TextIndent; HSPLandroidx/compose/ui/text/style/TextIndent;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/text/style/TextIndent;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/text/style/TextIndent;->getFirstLine-XSAIIZE()J PLandroidx/compose/ui/text/style/TextIndent;->getFirstLine-XSAIIZE()J HSPLandroidx/compose/ui/text/style/TextIndent;->getRestLine-XSAIIZE()J PLandroidx/compose/ui/text/style/TextIndent;->getRestLine-XSAIIZE()J Landroidx/compose/ui/text/style/TextMotion; HSPLandroidx/compose/ui/text/style/TextMotion;->()V PLandroidx/compose/ui/text/style/TextMotion;->()V HSPLandroidx/compose/ui/text/style/TextMotion;->(ZI)V PLandroidx/compose/ui/text/style/TextMotion;->(ZI)V HSPLandroidx/compose/ui/text/style/TextMotion;->access$getStatic$cp()Landroidx/compose/ui/text/style/TextMotion; PLandroidx/compose/ui/text/style/TextMotion;->access$getStatic$cp()Landroidx/compose/ui/text/style/TextMotion; HSPLandroidx/compose/ui/text/style/TextMotion;->getLinearity-4e0Vf04$ui_text_release()I PLandroidx/compose/ui/text/style/TextMotion;->getLinearity-4e0Vf04$ui_text_release()I HSPLandroidx/compose/ui/text/style/TextMotion;->getSubpixelTextPositioning$ui_text_release()Z PLandroidx/compose/ui/text/style/TextMotion;->getSubpixelTextPositioning$ui_text_release()Z Landroidx/compose/ui/text/style/TextOverflow; Landroidx/compose/ui/unit/Constraints; HSPLandroidx/compose/ui/unit/Constraints;->()V PLandroidx/compose/ui/unit/Constraints;->()V HSPLandroidx/compose/ui/unit/Constraints;->(J)V HPLandroidx/compose/ui/unit/Constraints;->(J)V HSPLandroidx/compose/ui/unit/Constraints;->access$getMinHeightOffsets$cp()[I PLandroidx/compose/ui/unit/Constraints;->access$getMinHeightOffsets$cp()[I HSPLandroidx/compose/ui/unit/Constraints;->box-impl(J)Landroidx/compose/ui/unit/Constraints; HPLandroidx/compose/ui/unit/Constraints;->box-impl(J)Landroidx/compose/ui/unit/Constraints; HSPLandroidx/compose/ui/unit/Constraints;->copy-Zbe2FdA$default(JIIIII)J HPLandroidx/compose/ui/unit/Constraints;->copy-Zbe2FdA$default(JIIIII)J HSPLandroidx/compose/ui/unit/Constraints;->copy-Zbe2FdA(IIII)J HPLandroidx/compose/ui/unit/Constraints;->copy-Zbe2FdA(IIII)J HSPLandroidx/compose/ui/unit/Constraints;->equals-impl0(JJ)Z HPLandroidx/compose/ui/unit/Constraints;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/unit/Constraints;->getHasBoundedHeight-impl(J)Z PLandroidx/compose/ui/unit/Constraints;->getHasBoundedHeight-impl(J)Z HSPLandroidx/compose/ui/unit/Constraints;->getHasBoundedWidth-impl(J)Z PLandroidx/compose/ui/unit/Constraints;->getHasBoundedWidth-impl(J)Z HSPLandroidx/compose/ui/unit/Constraints;->getHasFixedHeight-impl(J)Z PLandroidx/compose/ui/unit/Constraints;->getHasFixedHeight-impl(J)Z HSPLandroidx/compose/ui/unit/Constraints;->getHasFixedWidth-impl(J)Z PLandroidx/compose/ui/unit/Constraints;->getHasFixedWidth-impl(J)Z HSPLandroidx/compose/ui/unit/Constraints;->getMaxHeight-impl(J)I HPLandroidx/compose/ui/unit/Constraints;->getMaxHeight-impl(J)I HSPLandroidx/compose/ui/unit/Constraints;->getMaxWidth-impl(J)I HPLandroidx/compose/ui/unit/Constraints;->getMaxWidth-impl(J)I HSPLandroidx/compose/ui/unit/Constraints;->getMinHeight-impl(J)I HPLandroidx/compose/ui/unit/Constraints;->getMinHeight-impl(J)I HSPLandroidx/compose/ui/unit/Constraints;->getMinWidth-impl(J)I HPLandroidx/compose/ui/unit/Constraints;->getMinWidth-impl(J)I HSPLandroidx/compose/ui/unit/Constraints;->unbox-impl()J PLandroidx/compose/ui/unit/Constraints;->unbox-impl()J Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/unit/Density;->roundToPx-0680j_4(F)I HPLandroidx/compose/ui/unit/Density;->roundToPx-0680j_4(F)I HSPLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(F)F PLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(F)F HSPLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(I)F HPLandroidx/compose/ui/unit/Density;->toDp-u2uoSUM(I)F HSPLandroidx/compose/ui/unit/Density;->toPx--R2X_6o(J)F HPLandroidx/compose/ui/unit/Density;->toPx--R2X_6o(J)F HSPLandroidx/compose/ui/unit/Density;->toPx-0680j_4(F)F HPLandroidx/compose/ui/unit/Density;->toPx-0680j_4(F)F HSPLandroidx/compose/ui/unit/Density;->toSize-XkaWNTQ(J)J HPLandroidx/compose/ui/unit/Density;->toSize-XkaWNTQ(J)J Landroidx/compose/ui/unit/DensityImpl; HSPLandroidx/compose/ui/unit/DensityImpl;->(FF)V HPLandroidx/compose/ui/unit/DensityImpl;->(FF)V HSPLandroidx/compose/ui/unit/DensityImpl;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/unit/DensityImpl;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/DensityImpl;->getDensity()F HPLandroidx/compose/ui/unit/DensityImpl;->getDensity()F HSPLandroidx/compose/ui/unit/DensityImpl;->getFontScale()F HPLandroidx/compose/ui/unit/DensityImpl;->getFontScale()F Landroidx/compose/ui/unit/Dp; HSPLandroidx/compose/ui/unit/Dp;->()V PLandroidx/compose/ui/unit/Dp;->()V HSPLandroidx/compose/ui/unit/Dp;->(F)V HPLandroidx/compose/ui/unit/Dp;->(F)V HSPLandroidx/compose/ui/unit/Dp;->box-impl(F)Landroidx/compose/ui/unit/Dp; PLandroidx/compose/ui/unit/Dp;->box-impl(F)Landroidx/compose/ui/unit/Dp; HSPLandroidx/compose/ui/unit/Dp;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/unit/Dp;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/Dp;->equals-impl0(FF)Z HPLandroidx/compose/ui/unit/Dp;->equals-impl0(FF)Z HSPLandroidx/compose/ui/unit/Dp;->unbox-impl()F PLandroidx/compose/ui/unit/Dp;->unbox-impl()F Landroidx/compose/ui/unit/DpKt; HSPLandroidx/compose/ui/unit/DpKt;->Constraints$default(III)J HPLandroidx/compose/ui/unit/DpKt;->Constraints$default(III)J HSPLandroidx/compose/ui/unit/DpKt;->Constraints(IIII)J HPLandroidx/compose/ui/unit/DpKt;->Constraints(IIII)J HSPLandroidx/compose/ui/unit/DpKt;->Density$default()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/unit/DpKt;->Density$default()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/unit/DpKt;->Density()Landroidx/compose/ui/unit/Density; PLandroidx/compose/ui/unit/DpKt;->Density()Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/unit/DpKt;->Density(Landroid/content/Context;)Landroidx/compose/ui/unit/Density; HPLandroidx/compose/ui/unit/DpKt;->Density(Landroid/content/Context;)Landroidx/compose/ui/unit/Density; HSPLandroidx/compose/ui/unit/DpKt;->DpOffset-YgX7TsA(FF)J PLandroidx/compose/ui/unit/DpKt;->DpOffset-YgX7TsA(FF)J HSPLandroidx/compose/ui/unit/DpKt;->DpSize-YgX7TsA(FF)J HPLandroidx/compose/ui/unit/DpKt;->DpSize-YgX7TsA(FF)J HSPLandroidx/compose/ui/unit/DpKt;->IntOffset(II)J HPLandroidx/compose/ui/unit/DpKt;->IntOffset(II)J HSPLandroidx/compose/ui/unit/DpKt;->IntSize(II)J PLandroidx/compose/ui/unit/DpKt;->IntSize(II)J HSPLandroidx/compose/ui/unit/DpKt;->constrain-4WqzIAM(JJ)J HPLandroidx/compose/ui/unit/DpKt;->constrain-4WqzIAM(JJ)J HSPLandroidx/compose/ui/unit/DpKt;->constrain-N9IONVI(JJ)J HPLandroidx/compose/ui/unit/DpKt;->constrain-N9IONVI(JJ)J HSPLandroidx/compose/ui/unit/DpKt;->constrainHeight-K40F9xA(IJ)I HPLandroidx/compose/ui/unit/DpKt;->constrainHeight-K40F9xA(IJ)I HSPLandroidx/compose/ui/unit/DpKt;->constrainWidth-K40F9xA(IJ)I HPLandroidx/compose/ui/unit/DpKt;->constrainWidth-K40F9xA(IJ)I HSPLandroidx/compose/ui/unit/DpKt;->getSp(I)J HPLandroidx/compose/ui/unit/DpKt;->getSp(I)J HSPLandroidx/compose/ui/unit/DpKt;->isUnspecified--R2X_6o(J)Z HPLandroidx/compose/ui/unit/DpKt;->isUnspecified--R2X_6o(J)Z HSPLandroidx/compose/ui/unit/DpKt;->offset-NN6Ew-U(JII)J HPLandroidx/compose/ui/unit/DpKt;->offset-NN6Ew-U(JII)J HSPLandroidx/compose/ui/unit/DpKt;->pack(JF)J HPLandroidx/compose/ui/unit/DpKt;->pack(JF)J HSPLandroidx/compose/ui/unit/DpKt;->toSize-ozmzZPI(J)J HPLandroidx/compose/ui/unit/DpKt;->toSize-ozmzZPI(J)J Landroidx/compose/ui/unit/DpOffset; HSPLandroidx/compose/ui/unit/DpOffset;->()V PLandroidx/compose/ui/unit/DpOffset;->()V Landroidx/compose/ui/unit/DpSize; HSPLandroidx/compose/ui/unit/DpSize;->()V PLandroidx/compose/ui/unit/DpSize;->()V HSPLandroidx/compose/ui/unit/DpSize;->access$getUnspecified$cp()J PLandroidx/compose/ui/unit/DpSize;->access$getUnspecified$cp()J HSPLandroidx/compose/ui/unit/DpSize;->getHeight-D9Ej5fM(J)F HPLandroidx/compose/ui/unit/DpSize;->getHeight-D9Ej5fM(J)F HSPLandroidx/compose/ui/unit/DpSize;->getWidth-D9Ej5fM(J)F HPLandroidx/compose/ui/unit/DpSize;->getWidth-D9Ej5fM(J)F Landroidx/compose/ui/unit/IntOffset; HSPLandroidx/compose/ui/unit/IntOffset;->()V PLandroidx/compose/ui/unit/IntOffset;->()V HSPLandroidx/compose/ui/unit/IntOffset;->(J)V HPLandroidx/compose/ui/unit/IntOffset;->(J)V HSPLandroidx/compose/ui/unit/IntOffset;->access$getZero$cp()J HPLandroidx/compose/ui/unit/IntOffset;->access$getZero$cp()J HSPLandroidx/compose/ui/unit/IntOffset;->box-impl(J)Landroidx/compose/ui/unit/IntOffset; HPLandroidx/compose/ui/unit/IntOffset;->box-impl(J)Landroidx/compose/ui/unit/IntOffset; HPLandroidx/compose/ui/unit/IntOffset;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/IntOffset;->equals-impl0(JJ)Z HPLandroidx/compose/ui/unit/IntOffset;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/unit/IntOffset;->getY-impl(J)I HPLandroidx/compose/ui/unit/IntOffset;->getY-impl(J)I HSPLandroidx/compose/ui/unit/IntOffset;->unbox-impl()J PLandroidx/compose/ui/unit/IntOffset;->unbox-impl()J Landroidx/compose/ui/unit/IntSize; HSPLandroidx/compose/ui/unit/IntSize;->()V PLandroidx/compose/ui/unit/IntSize;->()V HSPLandroidx/compose/ui/unit/IntSize;->(J)V HPLandroidx/compose/ui/unit/IntSize;->(J)V HSPLandroidx/compose/ui/unit/IntSize;->box-impl(J)Landroidx/compose/ui/unit/IntSize; HPLandroidx/compose/ui/unit/IntSize;->box-impl(J)Landroidx/compose/ui/unit/IntSize; HSPLandroidx/compose/ui/unit/IntSize;->equals(Ljava/lang/Object;)Z HPLandroidx/compose/ui/unit/IntSize;->equals(Ljava/lang/Object;)Z HSPLandroidx/compose/ui/unit/IntSize;->equals-impl(JLjava/lang/Object;)Z PLandroidx/compose/ui/unit/IntSize;->equals-impl(JLjava/lang/Object;)Z HSPLandroidx/compose/ui/unit/IntSize;->equals-impl0(JJ)Z PLandroidx/compose/ui/unit/IntSize;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/unit/IntSize;->getHeight-impl(J)I HPLandroidx/compose/ui/unit/IntSize;->getHeight-impl(J)I HSPLandroidx/compose/ui/unit/IntSize;->unbox-impl()J PLandroidx/compose/ui/unit/IntSize;->unbox-impl()J Landroidx/compose/ui/unit/LayoutDirection; HSPLandroidx/compose/ui/unit/LayoutDirection;->()V PLandroidx/compose/ui/unit/LayoutDirection;->()V HSPLandroidx/compose/ui/unit/LayoutDirection;->(Ljava/lang/String;I)V PLandroidx/compose/ui/unit/LayoutDirection;->(Ljava/lang/String;I)V Landroidx/compose/ui/unit/TextUnit; HSPLandroidx/compose/ui/unit/TextUnit;->()V PLandroidx/compose/ui/unit/TextUnit;->()V HSPLandroidx/compose/ui/unit/TextUnit;->access$getUnspecified$cp()J PLandroidx/compose/ui/unit/TextUnit;->access$getUnspecified$cp()J HSPLandroidx/compose/ui/unit/TextUnit;->equals-impl0(JJ)Z PLandroidx/compose/ui/unit/TextUnit;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/unit/TextUnit;->getType-UIouoOA(J)J HPLandroidx/compose/ui/unit/TextUnit;->getType-UIouoOA(J)J HSPLandroidx/compose/ui/unit/TextUnit;->getValue-impl(J)F HPLandroidx/compose/ui/unit/TextUnit;->getValue-impl(J)F Landroidx/compose/ui/unit/TextUnitType; HSPLandroidx/compose/ui/unit/TextUnitType;->(J)V PLandroidx/compose/ui/unit/TextUnitType;->(J)V HSPLandroidx/compose/ui/unit/TextUnitType;->box-impl(J)Landroidx/compose/ui/unit/TextUnitType; PLandroidx/compose/ui/unit/TextUnitType;->box-impl(J)Landroidx/compose/ui/unit/TextUnitType; HSPLandroidx/compose/ui/unit/TextUnitType;->equals-impl0(JJ)Z PLandroidx/compose/ui/unit/TextUnitType;->equals-impl0(JJ)Z HSPLandroidx/compose/ui/unit/TextUnitType;->unbox-impl()J PLandroidx/compose/ui/unit/TextUnitType;->unbox-impl()J Landroidx/compose/ui/viewinterop/AndroidViewHolder; Landroidx/compose/ui/window/DialogWindowProvider; Landroidx/compose/ui/window/PopupPositionProvider; Landroidx/compose/ui/window/PopupProperties; HSPLandroidx/compose/ui/window/PopupProperties;->(ZZI)V PLandroidx/compose/ui/window/PopupProperties;->(ZZI)V PLandroidx/concurrent/futures/AbstractResolvableFuture;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture;->complete(Landroidx/concurrent/futures/AbstractResolvableFuture;)V PLandroidx/concurrent/futures/AbstractResolvableFuture;->set(Ljava/lang/Object;)Z PLandroidx/concurrent/futures/AbstractResolvableFuture$AtomicHelper;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture$Listener;->(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casListeners(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;Landroidx/concurrent/futures/AbstractResolvableFuture$Listener;)Z PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casValue(Landroidx/concurrent/futures/AbstractResolvableFuture;Ljava/lang/Object;Ljava/lang/Object;)Z PLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper;->casWaiters(Landroidx/concurrent/futures/AbstractResolvableFuture;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;Landroidx/concurrent/futures/AbstractResolvableFuture$Waiter;)Z PLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;->()V PLandroidx/concurrent/futures/AbstractResolvableFuture$Waiter;->(I)V PLandroidx/concurrent/futures/ResolvableFuture;->()V PLandroidx/concurrent/futures/ResolvableFuture;->create()Landroidx/concurrent/futures/ResolvableFuture; PLandroidx/concurrent/futures/ResolvableFuture;->set(Ljava/lang/Object;)Z Landroidx/core/app/ActivityCompat$RequestPermissionsRequestCodeValidator; Landroidx/core/app/ComponentActivity; HSPLandroidx/core/app/ComponentActivity;->()V PLandroidx/core/app/ComponentActivity;->()V HSPLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/core/app/ComponentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V Landroidx/core/app/CoreComponentFactory; HSPLandroidx/core/app/CoreComponentFactory;->()V PLandroidx/core/app/CoreComponentFactory;->()V HSPLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity; PLandroidx/core/app/CoreComponentFactory;->instantiateActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity; HSPLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application; PLandroidx/core/app/CoreComponentFactory;->instantiateApplication(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/app/Application; HSPLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider; PLandroidx/core/app/CoreComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader;Ljava/lang/String;)Landroid/content/ContentProvider; HSPLandroidx/core/app/CoreComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver; PLandroidx/core/app/CoreComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver; Landroidx/core/app/NavUtils; HSPLandroidx/core/app/NavUtils;->getParentActivityName(Landroid/content/Context;Landroid/content/ComponentName;)Ljava/lang/String; PLandroidx/core/app/NavUtils;->getParentActivityName(Landroid/content/Context;Landroid/content/ComponentName;)Ljava/lang/String; Landroidx/core/app/NotificationChannelCompat; HSPLandroidx/core/app/NotificationChannelCompat;->(Ljava/lang/String;I)V PLandroidx/core/app/NotificationChannelCompat;->(Ljava/lang/String;I)V Landroidx/core/app/NotificationChannelCompat$Api26Impl; HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->createNotificationChannel(Ljava/lang/String;Ljava/lang/CharSequence;I)Landroid/app/NotificationChannel; PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->createNotificationChannel(Ljava/lang/String;Ljava/lang/CharSequence;I)Landroid/app/NotificationChannel; HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->enableLights(Landroid/app/NotificationChannel;Z)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->enableLights(Landroid/app/NotificationChannel;Z)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->enableVibration(Landroid/app/NotificationChannel;Z)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->enableVibration(Landroid/app/NotificationChannel;Z)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setDescription(Landroid/app/NotificationChannel;Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setDescription(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setGroup(Landroid/app/NotificationChannel;Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setGroup(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setLightColor(Landroid/app/NotificationChannel;I)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setLightColor(Landroid/app/NotificationChannel;I)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setShowBadge(Landroid/app/NotificationChannel;Z)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setShowBadge(Landroid/app/NotificationChannel;Z)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setSound(Landroid/app/NotificationChannel;Landroid/net/Uri;Landroid/media/AudioAttributes;)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setSound(Landroid/app/NotificationChannel;Landroid/net/Uri;Landroid/media/AudioAttributes;)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setVibrationPattern(Landroid/app/NotificationChannel;[J)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl;->setVibrationPattern(Landroid/app/NotificationChannel;[J)V Landroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1; HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m$1()V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m$1()V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m()V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m()V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;I)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;I)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;Z)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;Z)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;[J)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannel;[J)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationManager;Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationManager;Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/app/NotificationChannelGroup; PLandroidx/core/app/NotificationChannelCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/app/NotificationChannelGroup; Landroidx/core/app/NotificationChannelCompat$Builder; HSPLandroidx/core/app/NotificationChannelCompat$Builder;->(Ljava/lang/String;I)V PLandroidx/core/app/NotificationChannelCompat$Builder;->(Ljava/lang/String;I)V HSPLandroidx/core/app/NotificationChannelCompat$Builder;->build()Landroidx/core/app/NotificationChannelCompat; PLandroidx/core/app/NotificationChannelCompat$Builder;->build()Landroidx/core/app/NotificationChannelCompat; HSPLandroidx/core/app/NotificationChannelCompat$Builder;->setGroup(Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelCompat$Builder;->setGroup(Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelCompat$Builder;->setName(Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelCompat$Builder;->setName(Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelCompat$Builder;->setShowBadge()V PLandroidx/core/app/NotificationChannelCompat$Builder;->setShowBadge()V HSPLandroidx/core/app/NotificationChannelCompat$Builder;->setSound()V PLandroidx/core/app/NotificationChannelCompat$Builder;->setSound()V Landroidx/core/app/NotificationChannelGroupCompat; HSPLandroidx/core/app/NotificationChannelGroupCompat;->(Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelGroupCompat;->(Ljava/lang/String;)V Landroidx/core/app/NotificationChannelGroupCompat$Api26Impl; HSPLandroidx/core/app/NotificationChannelGroupCompat$Api26Impl;->createNotificationChannelGroup(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/app/NotificationChannelGroup; PLandroidx/core/app/NotificationChannelGroupCompat$Api26Impl;->createNotificationChannelGroup(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/app/NotificationChannelGroup; Landroidx/core/app/NotificationChannelGroupCompat$Api28Impl; HSPLandroidx/core/app/NotificationChannelGroupCompat$Api28Impl;->setDescription(Landroid/app/NotificationChannelGroup;Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelGroupCompat$Api28Impl;->setDescription(Landroid/app/NotificationChannelGroup;Ljava/lang/String;)V Landroidx/core/app/NotificationChannelGroupCompat$Builder; HSPLandroidx/core/app/NotificationChannelGroupCompat$Builder;->(Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelGroupCompat$Builder;->(Ljava/lang/String;)V HSPLandroidx/core/app/NotificationChannelGroupCompat$Builder;->build()Landroidx/core/app/NotificationChannelGroupCompat; PLandroidx/core/app/NotificationChannelGroupCompat$Builder;->build()Landroidx/core/app/NotificationChannelGroupCompat; HSPLandroidx/core/app/NotificationChannelGroupCompat$Builder;->setName(Ljava/lang/String;)V PLandroidx/core/app/NotificationChannelGroupCompat$Builder;->setName(Ljava/lang/String;)V Landroidx/core/app/NotificationManagerCompat; HSPLandroidx/core/app/NotificationManagerCompat;->()V PLandroidx/core/app/NotificationManagerCompat;->()V HSPLandroidx/core/app/NotificationManagerCompat;->(Landroid/content/Context;)V PLandroidx/core/app/NotificationManagerCompat;->(Landroid/content/Context;)V HSPLandroidx/core/app/NotificationManagerCompat;->cancel(I)V PLandroidx/core/app/NotificationManagerCompat;->cancel(I)V HSPLandroidx/core/app/NotificationManagerCompat;->createNotificationChannelGroupsCompat(Ljava/util/List;)V PLandroidx/core/app/NotificationManagerCompat;->createNotificationChannelGroupsCompat(Ljava/util/List;)V HSPLandroidx/core/app/NotificationManagerCompat;->createNotificationChannelsCompat(Ljava/util/List;)V PLandroidx/core/app/NotificationManagerCompat;->createNotificationChannelsCompat(Ljava/util/List;)V HSPLandroidx/core/app/NotificationManagerCompat;->deleteNotificationChannel(Ljava/lang/String;)V PLandroidx/core/app/NotificationManagerCompat;->deleteNotificationChannel(Ljava/lang/String;)V HSPLandroidx/core/app/NotificationManagerCompat;->from(Landroid/content/Context;)Landroidx/core/app/NotificationManagerCompat; PLandroidx/core/app/NotificationManagerCompat;->from(Landroid/content/Context;)Landroidx/core/app/NotificationManagerCompat; Landroidx/core/app/NotificationManagerCompat$Api26Impl; HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannelGroups(Landroid/app/NotificationManager;Ljava/util/List;)V PLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannelGroups(Landroid/app/NotificationManager;Ljava/util/List;)V HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannels(Landroid/app/NotificationManager;Ljava/util/List;)V PLandroidx/core/app/NotificationManagerCompat$Api26Impl;->createNotificationChannels(Landroid/app/NotificationManager;Ljava/util/List;)V HSPLandroidx/core/app/NotificationManagerCompat$Api26Impl;->deleteNotificationChannel(Landroid/app/NotificationManager;Ljava/lang/String;)V PLandroidx/core/app/NotificationManagerCompat$Api26Impl;->deleteNotificationChannel(Landroid/app/NotificationManager;Ljava/lang/String;)V Landroidx/core/app/TaskStackBuilder$SupportParentable; Landroidx/core/content/ContextCompat; HSPLandroidx/core/content/ContextCompat;->()V PLandroidx/core/content/ContextCompat;->()V HSPLandroidx/core/content/ContextCompat;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/core/content/ContextCompat;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; HSPLandroidx/core/content/ContextCompat;->getMainExecutor(Landroid/content/Context;)Ljava/util/concurrent/Executor; PLandroidx/core/content/ContextCompat;->getMainExecutor(Landroid/content/Context;)Ljava/util/concurrent/Executor; Landroidx/core/content/ContextCompat$Api21Impl; HSPLandroidx/core/content/ContextCompat$Api21Impl;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; PLandroidx/core/content/ContextCompat$Api21Impl;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; Landroidx/core/content/ContextCompat$Api28Impl; HSPLandroidx/core/content/ContextCompat$Api28Impl;->getMainExecutor(Landroid/content/Context;)Ljava/util/concurrent/Executor; PLandroidx/core/content/ContextCompat$Api28Impl;->getMainExecutor(Landroid/content/Context;)Ljava/util/concurrent/Executor; Landroidx/core/content/FileProvider; HSPLandroidx/core/content/FileProvider;->()V PLandroidx/core/content/FileProvider;->()V HSPLandroidx/core/content/FileProvider;->()V PLandroidx/core/content/FileProvider;->()V HSPLandroidx/core/content/FileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V PLandroidx/core/content/FileProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V HSPLandroidx/core/content/FileProvider;->onCreate()Z PLandroidx/core/content/FileProvider;->onCreate()Z Landroidx/core/content/res/ComplexColorCompat; HSPLandroidx/core/content/res/ComplexColorCompat;->(Landroid/graphics/Shader;Landroid/content/res/ColorStateList;I)V HPLandroidx/core/content/res/ComplexColorCompat;->(Landroid/graphics/Shader;Landroid/content/res/ColorStateList;I)V HSPLandroidx/core/content/res/ComplexColorCompat;->from(I)Landroidx/core/content/res/ComplexColorCompat; PLandroidx/core/content/res/ComplexColorCompat;->from(I)Landroidx/core/content/res/ComplexColorCompat; HSPLandroidx/core/content/res/ComplexColorCompat;->getColor()I PLandroidx/core/content/res/ComplexColorCompat;->getColor()I HSPLandroidx/core/content/res/ComplexColorCompat;->getShader()Landroid/graphics/Shader; PLandroidx/core/content/res/ComplexColorCompat;->getShader()Landroid/graphics/Shader; HSPLandroidx/core/content/res/ComplexColorCompat;->isGradient()Z PLandroidx/core/content/res/ComplexColorCompat;->isGradient()Z HSPLandroidx/core/content/res/ComplexColorCompat;->willDraw()Z PLandroidx/core/content/res/ComplexColorCompat;->willDraw()Z Landroidx/core/content/res/TypedArrayKt; HSPLandroidx/core/content/res/TypedArrayKt;->()V PLandroidx/core/content/res/TypedArrayKt;->()V HSPLandroidx/core/content/res/TypedArrayKt;->getColorOrThrow(Landroid/content/res/TypedArray;I)I HPLandroidx/core/content/res/TypedArrayKt;->getColorOrThrow(Landroid/content/res/TypedArray;I)I HSPLandroidx/core/content/res/TypedArrayKt;->getNamedComplexColor(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;Ljava/lang/String;I)Landroidx/core/content/res/ComplexColorCompat; HPLandroidx/core/content/res/TypedArrayKt;->getNamedComplexColor(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;Ljava/lang/String;I)Landroidx/core/content/res/ComplexColorCompat; HSPLandroidx/core/content/res/TypedArrayKt;->getNamedFloat(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;IF)F HPLandroidx/core/content/res/TypedArrayKt;->getNamedFloat(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;IF)F HSPLandroidx/core/content/res/TypedArrayKt;->getNamedInt(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;II)I HPLandroidx/core/content/res/TypedArrayKt;->getNamedInt(Landroid/content/res/TypedArray;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;II)I HSPLandroidx/core/content/res/TypedArrayKt;->getResourceIdOrThrow(Landroid/content/res/TypedArray;I)I HPLandroidx/core/content/res/TypedArrayKt;->getResourceIdOrThrow(Landroid/content/res/TypedArray;I)I HSPLandroidx/core/content/res/TypedArrayKt;->hasAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z HPLandroidx/core/content/res/TypedArrayKt;->hasAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z HSPLandroidx/core/content/res/TypedArrayKt;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; HPLandroidx/core/content/res/TypedArrayKt;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; Landroidx/core/graphics/Insets; HSPLandroidx/core/graphics/Insets;->()V PLandroidx/core/graphics/Insets;->()V HSPLandroidx/core/graphics/Insets;->(IIII)V HPLandroidx/core/graphics/Insets;->(IIII)V HSPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z HPLandroidx/core/graphics/Insets;->equals(Ljava/lang/Object;)Z HSPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; PLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets; HSPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; PLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets; Landroidx/core/graphics/Insets$Api29Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/core/graphics/Insets$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$4()V PLandroidx/core/graphics/Insets$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$4()V HSPLandroidx/core/graphics/Insets$Api29Impl$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets$Builder; PLandroidx/core/graphics/Insets$Api29Impl$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets$Builder; Landroidx/core/graphics/PathParser; HSPLandroidx/core/graphics/PathParser;->copyOfRange([FI)[F HPLandroidx/core/graphics/PathParser;->copyOfRange([FI)[F HSPLandroidx/core/graphics/PathParser;->createNodesFromPathData(Ljava/lang/String;)[Landroidx/core/graphics/PathParser$PathDataNode; HPLandroidx/core/graphics/PathParser;->createNodesFromPathData(Ljava/lang/String;)[Landroidx/core/graphics/PathParser$PathDataNode; HSPLandroidx/core/graphics/PathParser;->createPathFromPathData(Ljava/lang/String;)Landroid/graphics/Path; HPLandroidx/core/graphics/PathParser;->createPathFromPathData(Ljava/lang/String;)Landroid/graphics/Path; Landroidx/core/graphics/PathParser$PathDataNode; HSPLandroidx/core/graphics/PathParser$PathDataNode;->(C[F)V PLandroidx/core/graphics/PathParser$PathDataNode;->(C[F)V HSPLandroidx/core/graphics/PathParser$PathDataNode;->nodesToPath([Landroidx/core/graphics/PathParser$PathDataNode;Landroid/graphics/Path;)V HPLandroidx/core/graphics/PathParser$PathDataNode;->nodesToPath([Landroidx/core/graphics/PathParser$PathDataNode;Landroid/graphics/Path;)V Landroidx/core/math/MathUtils; HSPLandroidx/core/math/MathUtils;->CornerRadius(FF)J HPLandroidx/core/math/MathUtils;->CornerRadius(FF)J HSPLandroidx/core/math/MathUtils;->Offset(FF)J HPLandroidx/core/math/MathUtils;->Offset(FF)J HSPLandroidx/core/math/MathUtils;->Rect-tz77jQw(JJ)Landroidx/compose/ui/geometry/Rect; HPLandroidx/core/math/MathUtils;->Rect-tz77jQw(JJ)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/core/math/MathUtils;->RoundRect-gG7oq9Y(FFFFJ)Landroidx/compose/ui/geometry/RoundRect; PLandroidx/core/math/MathUtils;->RoundRect-gG7oq9Y(FFFFJ)Landroidx/compose/ui/geometry/RoundRect; HSPLandroidx/core/math/MathUtils;->Size(FF)J HPLandroidx/core/math/MathUtils;->Size(FF)J HSPLandroidx/core/math/MathUtils;->TextRange(II)J PLandroidx/core/math/MathUtils;->TextRange(II)J HSPLandroidx/core/math/MathUtils;->access$DistanceAndInLayer(FZ)J HPLandroidx/core/math/MathUtils;->access$DistanceAndInLayer(FZ)J HSPLandroidx/core/math/MathUtils;->access$calculateAlignmentAndPlaceChildAsNeeded(Landroidx/compose/ui/node/LookaheadCapablePlaceable;Landroidx/compose/ui/layout/AlignmentLine;)I HPLandroidx/core/math/MathUtils;->access$calculateAlignmentAndPlaceChildAsNeeded(Landroidx/compose/ui/node/LookaheadCapablePlaceable;Landroidx/compose/ui/layout/AlignmentLine;)I HSPLandroidx/core/math/MathUtils;->access$insertEntryAtIndex([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; HPLandroidx/core/math/MathUtils;->access$insertEntryAtIndex([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; HSPLandroidx/core/math/MathUtils;->access$lowestBitOf(J)I HPLandroidx/core/math/MathUtils;->access$lowestBitOf(J)I HSPLandroidx/core/math/MathUtils;->access$nextUntil-hw7D004(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/Modifier$Node; HPLandroidx/core/math/MathUtils;->access$nextUntil-hw7D004(Landroidx/compose/ui/node/DelegatableNode;I)Landroidx/compose/ui/Modifier$Node; PLandroidx/core/math/MathUtils;->access$removeEntryAtIndex([Ljava/lang/Object;I)[Ljava/lang/Object; HSPLandroidx/core/math/MathUtils;->adapt$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Landroidx/compose/ui/graphics/colorspace/ColorSpace; PLandroidx/core/math/MathUtils;->adapt$default(Landroidx/compose/ui/graphics/colorspace/ColorSpace;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Landroidx/compose/ui/graphics/colorspace/ColorSpace; HSPLandroidx/core/math/MathUtils;->binarySearch(I[I)I HPLandroidx/core/math/MathUtils;->binarySearch(I[I)I HSPLandroidx/core/math/MathUtils;->bitsForSlot(II)I PLandroidx/core/math/MathUtils;->bitsForSlot(II)I HSPLandroidx/core/math/MathUtils;->chromaticAdaptation([F[F[F)[F PLandroidx/core/math/MathUtils;->chromaticAdaptation([F[F[F)[F HSPLandroidx/core/math/MathUtils;->coerceIn-8ffj60Q(JI)J PLandroidx/core/math/MathUtils;->coerceIn-8ffj60Q(JI)J HSPLandroidx/core/math/MathUtils;->compare(Landroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Z PLandroidx/core/math/MathUtils;->compare(Landroidx/compose/ui/graphics/colorspace/WhitePoint;Landroidx/compose/ui/graphics/colorspace/WhitePoint;)Z HSPLandroidx/core/math/MathUtils;->compareTo-S_HNhKs(JJ)I HPLandroidx/core/math/MathUtils;->compareTo-S_HNhKs(JJ)I HSPLandroidx/core/math/MathUtils;->composableLambda(Landroidx/compose/runtime/Composer;ILkotlin/jvm/internal/Lambda;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; HPLandroidx/core/math/MathUtils;->composableLambda(Landroidx/compose/runtime/Composer;ILkotlin/jvm/internal/Lambda;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; HSPLandroidx/core/math/MathUtils;->composableLambdaInstance(ZILkotlin/jvm/internal/Lambda;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; HPLandroidx/core/math/MathUtils;->composableLambdaInstance(ZILkotlin/jvm/internal/Lambda;)Landroidx/compose/runtime/internal/ComposableLambdaImpl; HSPLandroidx/core/math/MathUtils;->currentValueOf(Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode;Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; HPLandroidx/core/math/MathUtils;->currentValueOf(Landroidx/compose/ui/node/CompositionLocalConsumerModifierNode;Landroidx/compose/runtime/ProvidableCompositionLocal;)Ljava/lang/Object; HSPLandroidx/core/math/MathUtils;->dataStoreFile(Landroid/content/Context;Ljava/lang/String;)Ljava/io/File; PLandroidx/core/math/MathUtils;->dataStoreFile(Landroid/content/Context;Ljava/lang/String;)Ljava/io/File; HSPLandroidx/core/math/MathUtils;->getEllipsizedLeftPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F HPLandroidx/core/math/MathUtils;->getEllipsizedLeftPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F HSPLandroidx/core/math/MathUtils;->getEllipsizedRightPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F HPLandroidx/core/math/MathUtils;->getEllipsizedRightPadding(Landroid/text/Layout;ILandroid/graphics/Paint;)F HSPLandroidx/core/math/MathUtils;->getGetApp()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/core/math/MathUtils;->getGetApp()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/core/math/MathUtils;->getLabel()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/core/math/MathUtils;->getLabel()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/core/math/MathUtils;->getMoreVert()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/core/math/MathUtils;->getMoreVert()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/core/math/MathUtils;->getQueryStats()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/core/math/MathUtils;->getQueryStats()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/core/math/MathUtils;->getSecurity()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/core/math/MathUtils;->getSettingsBackupRestore()Landroidx/compose/ui/graphics/vector/ImageVector; PLandroidx/core/math/MathUtils;->getSettingsBackupRestore()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLandroidx/core/math/MathUtils;->hasFontAttributes(Landroidx/compose/ui/text/SpanStyle;)Z HPLandroidx/core/math/MathUtils;->hasFontAttributes(Landroidx/compose/ui/text/SpanStyle;)Z HSPLandroidx/core/math/MathUtils;->invalidateDraw(Landroidx/compose/ui/node/DrawModifierNode;)V HPLandroidx/core/math/MathUtils;->invalidateDraw(Landroidx/compose/ui/node/DrawModifierNode;)V HSPLandroidx/core/math/MathUtils;->invalidateMeasurement(Landroidx/compose/ui/node/LayoutModifierNode;)V PLandroidx/core/math/MathUtils;->invalidateMeasurement(Landroidx/compose/ui/node/LayoutModifierNode;)V HSPLandroidx/core/math/MathUtils;->invalidateSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)V HPLandroidx/core/math/MathUtils;->invalidateSemantics(Landroidx/compose/ui/node/SemanticsModifierNode;)V HSPLandroidx/core/math/MathUtils;->inverse3x3([F)[F PLandroidx/core/math/MathUtils;->inverse3x3([F)[F HSPLandroidx/core/math/MathUtils;->invertTo-JiSxe2E([F[F)Z HPLandroidx/core/math/MathUtils;->invertTo-JiSxe2E([F[F)Z HSPLandroidx/core/math/MathUtils;->isAtEnd(Lorg/xmlpull/v1/XmlPullParser;)Z HPLandroidx/core/math/MathUtils;->isAtEnd(Lorg/xmlpull/v1/XmlPullParser;)Z HSPLandroidx/core/math/MathUtils;->isFinite-k-4lQ0M(J)Z HPLandroidx/core/math/MathUtils;->isFinite-k-4lQ0M(J)Z HSPLandroidx/core/math/MathUtils;->isInLayer-impl(J)Z HPLandroidx/core/math/MathUtils;->isInLayer-impl(J)Z HSPLandroidx/core/math/MathUtils;->isInOutline(Landroidx/compose/ui/graphics/BrushKt;FF)Z HPLandroidx/core/math/MathUtils;->isInOutline(Landroidx/compose/ui/graphics/BrushKt;FF)Z HSPLandroidx/core/math/MathUtils;->isSimple(Landroidx/compose/ui/geometry/RoundRect;)Z HPLandroidx/core/math/MathUtils;->isSimple(Landroidx/compose/ui/geometry/RoundRect;)Z HSPLandroidx/core/math/MathUtils;->lerp(FFF)F HPLandroidx/core/math/MathUtils;->lerp(FFF)F HSPLandroidx/core/math/MathUtils;->loadVectorResourceInner(Landroid/content/res/Resources$Theme;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I)Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; HPLandroidx/core/math/MathUtils;->loadVectorResourceInner(Landroid/content/res/Resources$Theme;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I)Landroidx/compose/ui/res/ImageVectorCache$ImageVectorEntry; HSPLandroidx/core/math/MathUtils;->modifierLocalMapOf(Lkotlin/Pair;)Landroidx/compose/ui/modifier/SingleLocalMap; PLandroidx/core/math/MathUtils;->modifierLocalMapOf(Lkotlin/Pair;)Landroidx/compose/ui/modifier/SingleLocalMap; HSPLandroidx/core/math/MathUtils;->mul3x3([F[F)[F PLandroidx/core/math/MathUtils;->mul3x3([F[F)[F HSPLandroidx/core/math/MathUtils;->mul3x3Diag([F[F)[F PLandroidx/core/math/MathUtils;->mul3x3Diag([F[F)[F HSPLandroidx/core/math/MathUtils;->mul3x3Float3([F[F)V PLandroidx/core/math/MathUtils;->mul3x3Float3([F[F)V HSPLandroidx/core/math/MathUtils;->mul3x3Float3_0(FFF[F)F PLandroidx/core/math/MathUtils;->mul3x3Float3_0(FFF[F)F HSPLandroidx/core/math/MathUtils;->mul3x3Float3_1(FFF[F)F PLandroidx/core/math/MathUtils;->mul3x3Float3_1(FFF[F)F HSPLandroidx/core/math/MathUtils;->mul3x3Float3_2(FFF[F)F PLandroidx/core/math/MathUtils;->mul3x3Float3_2(FFF[F)F HSPLandroidx/core/math/MathUtils;->observeReads(Landroidx/compose/ui/Modifier$Node;Lkotlin/jvm/functions/Function0;)V HPLandroidx/core/math/MathUtils;->observeReads(Landroidx/compose/ui/Modifier$Node;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/core/math/MathUtils;->painterResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/painter/Painter; HPLandroidx/core/math/MathUtils;->painterResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/painter/Painter; HSPLandroidx/core/math/MathUtils;->persistentCompositionLocalHashMapOf()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; PLandroidx/core/math/MathUtils;->persistentCompositionLocalHashMapOf()Landroidx/compose/runtime/internal/PersistentCompositionLocalHashMap; HSPLandroidx/core/math/MathUtils;->replacableWith(Landroidx/compose/runtime/RecomposeScope;Landroidx/compose/runtime/RecomposeScopeImpl;)Z HPLandroidx/core/math/MathUtils;->replacableWith(Landroidx/compose/runtime/RecomposeScope;Landroidx/compose/runtime/RecomposeScopeImpl;)Z HSPLandroidx/core/math/MathUtils;->resolveDefaults(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/TextStyle; HPLandroidx/core/math/MathUtils;->resolveDefaults(Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/unit/LayoutDirection;)Landroidx/compose/ui/text/TextStyle; HSPLandroidx/core/math/MathUtils;->resources(Landroidx/compose/runtime/Composer;)Landroid/content/res/Resources; HPLandroidx/core/math/MathUtils;->resources(Landroidx/compose/runtime/Composer;)Landroid/content/res/Resources; HSPLandroidx/core/math/MathUtils;->seekToStartTag(Landroid/content/res/XmlResourceParser;)V HPLandroidx/core/math/MathUtils;->seekToStartTag(Landroid/content/res/XmlResourceParser;)V HSPLandroidx/core/math/MathUtils;->setInt-A6tL2VI(Landroidx/compose/runtime/changelist/Operations;II)V HPLandroidx/core/math/MathUtils;->setInt-A6tL2VI(Landroidx/compose/runtime/changelist/Operations;II)V HSPLandroidx/core/math/MathUtils;->setObject-DKhxnng(Landroidx/compose/runtime/changelist/Operations;ILjava/lang/Object;)V HPLandroidx/core/math/MathUtils;->setObject-DKhxnng(Landroidx/compose/runtime/changelist/Operations;ILjava/lang/Object;)V HSPLandroidx/core/math/MathUtils;->setPlaceholders(Landroid/text/Spannable;Ljava/util/List;Landroidx/compose/ui/unit/Density;)V HPLandroidx/core/math/MathUtils;->setPlaceholders(Landroid/text/Spannable;Ljava/util/List;Landroidx/compose/ui/unit/Density;)V HSPLandroidx/core/math/MathUtils;->stringResource(ILandroidx/compose/runtime/Composer;)Ljava/lang/String; HPLandroidx/core/math/MathUtils;->stringResource(ILandroidx/compose/runtime/Composer;)Ljava/lang/String; HSPLandroidx/core/math/MathUtils;->toRect-uvyYCjk(J)Landroidx/compose/ui/geometry/Rect; PLandroidx/core/math/MathUtils;->toRect-uvyYCjk(J)Landroidx/compose/ui/geometry/Rect; HSPLandroidx/core/math/MathUtils;->vectorResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/vector/ImageVector; HPLandroidx/core/math/MathUtils;->vectorResource(ILandroidx/compose/runtime/Composer;)Landroidx/compose/ui/graphics/vector/ImageVector; Landroidx/core/os/BuildCompat; HSPLandroidx/core/os/BuildCompat;->()V PLandroidx/core/os/BuildCompat;->()V HSPLandroidx/core/os/BuildCompat;->isAtLeastT()Z PLandroidx/core/os/BuildCompat;->isAtLeastT()Z Landroidx/core/os/BuildCompat$Api30Impl; HSPLandroidx/core/os/BuildCompat$Api30Impl;->()V PLandroidx/core/os/BuildCompat$Api30Impl;->()V HSPLandroidx/core/os/BuildCompat$Api30Impl;->()V PLandroidx/core/os/BuildCompat$Api30Impl;->()V HSPLandroidx/core/os/BuildCompat$Api30Impl;->getExtensionVersion(I)I PLandroidx/core/os/BuildCompat$Api30Impl;->getExtensionVersion(I)I Landroidx/core/os/BundleKt; HSPLandroidx/core/os/BundleKt;->createAsync$1(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/core/os/BundleKt;->createAsync$1(Landroid/os/Looper;)Landroid/os/Handler; Landroidx/core/os/CancellationSignal$OnCancelListener; Landroidx/core/os/LocaleListCompat; HSPLandroidx/core/os/LocaleListCompat;->()V PLandroidx/core/os/LocaleListCompat;->()V HSPLandroidx/core/os/LocaleListCompat;->(Landroidx/core/os/LocaleListPlatformWrapper;)V PLandroidx/core/os/LocaleListCompat;->(Landroidx/core/os/LocaleListPlatformWrapper;)V HSPLandroidx/core/os/LocaleListCompat;->create([Ljava/util/Locale;)Landroidx/core/os/LocaleListCompat; PLandroidx/core/os/LocaleListCompat;->create([Ljava/util/Locale;)Landroidx/core/os/LocaleListCompat; HSPLandroidx/core/os/LocaleListCompat;->forLanguageTags(Ljava/lang/String;)Landroidx/core/os/LocaleListCompat; PLandroidx/core/os/LocaleListCompat;->forLanguageTags(Ljava/lang/String;)Landroidx/core/os/LocaleListCompat; HSPLandroidx/core/os/LocaleListCompat;->isEmpty()Z PLandroidx/core/os/LocaleListCompat;->isEmpty()Z HSPLandroidx/core/os/LocaleListCompat;->wrap(Landroid/os/LocaleList;)Landroidx/core/os/LocaleListCompat; PLandroidx/core/os/LocaleListCompat;->wrap(Landroid/os/LocaleList;)Landroidx/core/os/LocaleListCompat; Landroidx/core/os/LocaleListCompat$Api21Impl; HSPLandroidx/core/os/LocaleListCompat$Api21Impl;->()V PLandroidx/core/os/LocaleListCompat$Api21Impl;->()V HSPLandroidx/core/os/LocaleListCompat$Api21Impl;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale; PLandroidx/core/os/LocaleListCompat$Api21Impl;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale; Landroidx/core/os/LocaleListCompat$Api24Impl; HSPLandroidx/core/os/LocaleListCompat$Api24Impl;->createLocaleList([Ljava/util/Locale;)Landroid/os/LocaleList; PLandroidx/core/os/LocaleListCompat$Api24Impl;->createLocaleList([Ljava/util/Locale;)Landroid/os/LocaleList; Landroidx/core/os/LocaleListInterface; Landroidx/core/os/LocaleListPlatformWrapper; HSPLandroidx/core/os/LocaleListPlatformWrapper;->(Ljava/lang/Object;)V PLandroidx/core/os/LocaleListPlatformWrapper;->(Ljava/lang/Object;)V HSPLandroidx/core/os/LocaleListPlatformWrapper;->isEmpty()Z PLandroidx/core/os/LocaleListPlatformWrapper;->isEmpty()Z Landroidx/core/os/TraceCompat; HSPLandroidx/core/os/TraceCompat;->()V PLandroidx/core/os/TraceCompat;->()V HSPLandroidx/core/os/TraceCompat;->beginSection(Ljava/lang/String;)V PLandroidx/core/os/TraceCompat;->beginSection(Ljava/lang/String;)V HSPLandroidx/core/os/TraceCompat;->endSection()V PLandroidx/core/os/TraceCompat;->endSection()V Landroidx/core/os/TraceCompat$Api18Impl; HSPLandroidx/core/os/TraceCompat$Api18Impl;->beginSection(Ljava/lang/String;)V PLandroidx/core/os/TraceCompat$Api18Impl;->beginSection(Ljava/lang/String;)V HSPLandroidx/core/os/TraceCompat$Api18Impl;->endSection()V PLandroidx/core/os/TraceCompat$Api18Impl;->endSection()V Landroidx/core/splashscreen/MaskedDrawable; HSPLandroidx/core/splashscreen/MaskedDrawable;->(Landroid/graphics/drawable/Drawable;F)V PLandroidx/core/splashscreen/MaskedDrawable;->(Landroid/graphics/drawable/Drawable;F)V HSPLandroidx/core/splashscreen/MaskedDrawable;->draw(Landroid/graphics/Canvas;)V PLandroidx/core/splashscreen/MaskedDrawable;->draw(Landroid/graphics/Canvas;)V HSPLandroidx/core/splashscreen/MaskedDrawable;->getOpacity()I HPLandroidx/core/splashscreen/MaskedDrawable;->getOpacity()I HSPLandroidx/core/splashscreen/MaskedDrawable;->onBoundsChange(Landroid/graphics/Rect;)V PLandroidx/core/splashscreen/MaskedDrawable;->onBoundsChange(Landroid/graphics/Rect;)V Landroidx/core/splashscreen/SplashScreen; HSPLandroidx/core/splashscreen/SplashScreen;->(Landroid/app/Activity;)V PLandroidx/core/splashscreen/SplashScreen;->(Landroid/app/Activity;)V HSPLandroidx/core/splashscreen/SplashScreen;->access$install(Landroidx/core/splashscreen/SplashScreen;)V PLandroidx/core/splashscreen/SplashScreen;->access$install(Landroidx/core/splashscreen/SplashScreen;)V HSPLandroidx/core/splashscreen/SplashScreen;->setKeepOnScreenCondition(Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition;)V PLandroidx/core/splashscreen/SplashScreen;->setKeepOnScreenCondition(Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition;)V HSPLandroidx/core/splashscreen/SplashScreen;->setOnExitAnimationListener(Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener;)V PLandroidx/core/splashscreen/SplashScreen;->setOnExitAnimationListener(Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener;)V Landroidx/core/splashscreen/SplashScreen$Impl; HSPLandroidx/core/splashscreen/SplashScreen$Impl;->(Landroid/app/Activity;)V PLandroidx/core/splashscreen/SplashScreen$Impl;->(Landroid/app/Activity;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->access$getMSplashScreenViewProvider$p(Landroidx/core/splashscreen/SplashScreen$Impl;)Landroidx/core/splashscreen/SplashScreenViewProvider; PLandroidx/core/splashscreen/SplashScreen$Impl;->access$getMSplashScreenViewProvider$p(Landroidx/core/splashscreen/SplashScreen$Impl;)Landroidx/core/splashscreen/SplashScreenViewProvider; HSPLandroidx/core/splashscreen/SplashScreen$Impl;->access$setMSplashScreenViewProvider$p(Landroidx/core/splashscreen/SplashScreen$Impl;Landroidx/core/splashscreen/SplashScreenViewProvider;)V PLandroidx/core/splashscreen/SplashScreen$Impl;->access$setMSplashScreenViewProvider$p(Landroidx/core/splashscreen/SplashScreen$Impl;Landroidx/core/splashscreen/SplashScreenViewProvider;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->dispatchOnExitAnimation(Landroidx/core/splashscreen/SplashScreenViewProvider;)V PLandroidx/core/splashscreen/SplashScreen$Impl;->dispatchOnExitAnimation(Landroidx/core/splashscreen/SplashScreenViewProvider;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->getSplashScreenWaitPredicate()Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition; PLandroidx/core/splashscreen/SplashScreen$Impl;->getSplashScreenWaitPredicate()Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition; HSPLandroidx/core/splashscreen/SplashScreen$Impl;->install()V PLandroidx/core/splashscreen/SplashScreen$Impl;->install()V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->setKeepOnScreenCondition(Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition;)V PLandroidx/core/splashscreen/SplashScreen$Impl;->setKeepOnScreenCondition(Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->setOnExitAnimationListener(Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener;)V PLandroidx/core/splashscreen/SplashScreen$Impl;->setOnExitAnimationListener(Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl;->setPostSplashScreenTheme(Landroid/content/res/Resources$Theme;Landroid/util/TypedValue;)V PLandroidx/core/splashscreen/SplashScreen$Impl;->setPostSplashScreenTheme(Landroid/content/res/Resources$Theme;Landroid/util/TypedValue;)V Landroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0; HSPLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0;->(Landroidx/core/splashscreen/SplashScreenViewProvider;Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener;)V PLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0;->(Landroidx/core/splashscreen/SplashScreenViewProvider;Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0;->run()V PLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda0;->run()V Landroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda1; HSPLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda1;->()V PLandroidx/core/splashscreen/SplashScreen$Impl$$ExternalSyntheticLambda1;->()V Landroidx/core/splashscreen/SplashScreen$Impl$setKeepOnScreenCondition$1; HSPLandroidx/core/splashscreen/SplashScreen$Impl$setKeepOnScreenCondition$1;->(Landroidx/core/splashscreen/SplashScreen$Impl;Landroid/view/View;I)V PLandroidx/core/splashscreen/SplashScreen$Impl$setKeepOnScreenCondition$1;->(Landroidx/core/splashscreen/SplashScreen$Impl;Landroid/view/View;I)V HSPLandroidx/core/splashscreen/SplashScreen$Impl$setKeepOnScreenCondition$1;->onPreDraw()Z HPLandroidx/core/splashscreen/SplashScreen$Impl$setKeepOnScreenCondition$1;->onPreDraw()Z Landroidx/core/splashscreen/SplashScreen$Impl$setOnExitAnimationListener$2; HSPLandroidx/core/splashscreen/SplashScreen$Impl$setOnExitAnimationListener$2;->(Landroidx/core/splashscreen/SplashScreen$Impl;Landroidx/core/splashscreen/SplashScreenViewProvider;)V PLandroidx/core/splashscreen/SplashScreen$Impl$setOnExitAnimationListener$2;->(Landroidx/core/splashscreen/SplashScreen$Impl;Landroidx/core/splashscreen/SplashScreenViewProvider;)V HSPLandroidx/core/splashscreen/SplashScreen$Impl$setOnExitAnimationListener$2;->onLayoutChange(Landroid/view/View;IIIIIIII)V PLandroidx/core/splashscreen/SplashScreen$Impl$setOnExitAnimationListener$2;->onLayoutChange(Landroid/view/View;IIIIIIII)V Landroidx/core/splashscreen/SplashScreen$KeepOnScreenCondition; Landroidx/core/splashscreen/SplashScreen$OnExitAnimationListener; Landroidx/core/splashscreen/SplashScreenViewProvider; HSPLandroidx/core/splashscreen/SplashScreenViewProvider;->(Landroid/app/Activity;)V PLandroidx/core/splashscreen/SplashScreenViewProvider;->(Landroid/app/Activity;)V HSPLandroidx/core/splashscreen/SplashScreenViewProvider;->getIconView()Landroid/view/View; PLandroidx/core/splashscreen/SplashScreenViewProvider;->getIconView()Landroid/view/View; HSPLandroidx/core/splashscreen/SplashScreenViewProvider;->getView()Landroid/view/ViewGroup; PLandroidx/core/splashscreen/SplashScreenViewProvider;->getView()Landroid/view/ViewGroup; HSPLandroidx/core/splashscreen/SplashScreenViewProvider;->remove()V PLandroidx/core/splashscreen/SplashScreenViewProvider;->remove()V Landroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl; HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->(Landroid/app/Activity;)V PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->(Landroid/app/Activity;)V HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->createSplashScreenView()V PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->createSplashScreenView()V HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->getActivity()Landroid/app/Activity; PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->getActivity()Landroid/app/Activity; HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->getIconView()Landroid/view/View; PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->getIconView()Landroid/view/View; HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->getSplashScreenView()Landroid/view/ViewGroup; PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->getSplashScreenView()Landroid/view/ViewGroup; HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->remove()V PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;->remove()V Landroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl$_splashScreenView$2; HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl$_splashScreenView$2;->(Landroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;)V PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl$_splashScreenView$2;->(Landroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl;)V HSPLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl$_splashScreenView$2;->invoke()Ljava/lang/Object; PLandroidx/core/splashscreen/SplashScreenViewProvider$ViewImpl$_splashScreenView$2;->invoke()Ljava/lang/Object; Landroidx/core/text/TextUtilsCompat; Landroidx/core/util/Consumer; Landroidx/core/util/DebugUtils; HSPLandroidx/core/util/DebugUtils;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V PLandroidx/core/util/DebugUtils;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V Landroidx/core/view/AccessibilityDelegateCompat; HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V PLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->()V PLandroidx/core/view/AccessibilityDelegateCompat;->()V HSPLandroidx/core/view/AccessibilityDelegateCompat;->(Landroid/view/View$AccessibilityDelegate;)V PLandroidx/core/view/AccessibilityDelegateCompat;->(Landroid/view/View$AccessibilityDelegate;)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->getBridge()Landroid/view/View$AccessibilityDelegate; PLandroidx/core/view/AccessibilityDelegateCompat;->getBridge()Landroid/view/View$AccessibilityDelegate; HSPLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/core/view/AccessibilityDelegateCompat;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z HSPLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V Landroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter; HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->(Landroidx/core/view/AccessibilityDelegateCompat;)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; HPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider; HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z HSPLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V PLandroidx/core/view/AccessibilityDelegateCompat$AccessibilityDelegateAdapter;->sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V Landroidx/core/view/ContentInfoCompat$Builder; HSPLandroidx/core/view/ContentInfoCompat$Builder;->()V PLandroidx/core/view/ContentInfoCompat$Builder;->()V HSPLandroidx/core/view/ContentInfoCompat$Builder;->(Landroid/view/View;)V PLandroidx/core/view/ContentInfoCompat$Builder;->(Landroid/view/View;)V HSPLandroidx/core/view/ContentInfoCompat$Builder;->build()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ContentInfoCompat$Builder;->build()Landroidx/core/view/WindowInsetsCompat; Landroidx/core/view/ContentInfoCompat$Compat; Landroidx/core/view/DisplayCutoutCompat; HSPLandroidx/core/view/DisplayCutoutCompat;->wrap(Landroid/view/DisplayCutout;)Landroidx/core/view/DisplayCutoutCompat; PLandroidx/core/view/DisplayCutoutCompat;->wrap(Landroid/view/DisplayCutout;)Landroidx/core/view/DisplayCutoutCompat; Landroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0; HSPLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannelGroup;Ljava/lang/String;)V PLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationChannelGroup;Ljava/lang/String;)V HSPLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;)Ljava/util/concurrent/Executor; PLandroidx/core/view/DisplayCutoutCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;)Ljava/util/concurrent/Executor; Landroidx/core/view/KeyEventDispatcher$Component; Landroidx/core/view/NestedScrollingParent2; Landroidx/core/view/NestedScrollingParent3; Landroidx/core/view/OnApplyWindowInsetsListener; Landroidx/core/view/OnReceiveContentViewBehavior; Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl20; HSPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl20;->(Landroid/view/View;)V PLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl20;->(Landroid/view/View;)V Landroidx/core/view/SoftwareKeyboardControllerCompat$Impl30; HSPLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl30;->(Landroid/view/View;)V PLandroidx/core/view/SoftwareKeyboardControllerCompat$Impl30;->(Landroid/view/View;)V Landroidx/core/view/ViewCompat; HSPLandroidx/core/view/ViewCompat;->()V PLandroidx/core/view/ViewCompat;->()V HSPLandroidx/core/view/ViewCompat;->getContentCaptureSession(Landroid/view/View;)Landroidx/core/view/contentcapture/ContentCaptureSessionCompat; PLandroidx/core/view/ViewCompat;->getContentCaptureSession(Landroid/view/View;)Landroidx/core/view/contentcapture/ContentCaptureSessionCompat; HSPLandroidx/core/view/ViewCompat;->getParentForAccessibility(Landroid/view/View;)Landroid/view/ViewParent; PLandroidx/core/view/ViewCompat;->getParentForAccessibility(Landroid/view/View;)Landroid/view/ViewParent; HSPLandroidx/core/view/ViewCompat;->hasOnClickListeners(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat;->hasOnClickListeners(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->isLaidOut(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat;->isLaidOut(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/ViewCompat;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V PLandroidx/core/view/ViewCompat;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V HSPLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;I)V PLandroidx/core/view/ViewCompat;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;I)V HSPLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V PLandroidx/core/view/ViewCompat;->setAccessibilityDelegate(Landroid/view/View;Landroidx/core/view/AccessibilityDelegateCompat;)V HSPLandroidx/core/view/ViewCompat;->setImportantForContentCapture(Landroid/view/View;)V PLandroidx/core/view/ViewCompat;->setImportantForContentCapture(Landroid/view/View;)V HSPLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V PLandroidx/core/view/ViewCompat;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V HSPLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V PLandroidx/core/view/ViewCompat;->setWindowInsetsAnimationCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V Landroidx/core/view/ViewCompat$$ExternalSyntheticLambda0; HSPLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;->()V PLandroidx/core/view/ViewCompat$$ExternalSyntheticLambda0;->()V Landroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager; HSPLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->()V PLandroidx/core/view/ViewCompat$AccessibilityPaneVisibilityManager;->()V Landroidx/core/view/ViewCompat$Api15Impl; HSPLandroidx/core/view/ViewCompat$Api15Impl;->hasOnClickListeners(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat$Api15Impl;->hasOnClickListeners(Landroid/view/View;)Z Landroidx/core/view/ViewCompat$Api16Impl; HSPLandroidx/core/view/ViewCompat$Api16Impl;->getImportantForAccessibility(Landroid/view/View;)I PLandroidx/core/view/ViewCompat$Api16Impl;->getImportantForAccessibility(Landroid/view/View;)I HSPLandroidx/core/view/ViewCompat$Api16Impl;->getParentForAccessibility(Landroid/view/View;)Landroid/view/ViewParent; PLandroidx/core/view/ViewCompat$Api16Impl;->getParentForAccessibility(Landroid/view/View;)Landroid/view/ViewParent; HSPLandroidx/core/view/ViewCompat$Api16Impl;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V PLandroidx/core/view/ViewCompat$Api16Impl;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V HSPLandroidx/core/view/ViewCompat$Api16Impl;->setImportantForAccessibility(Landroid/view/View;I)V PLandroidx/core/view/ViewCompat$Api16Impl;->setImportantForAccessibility(Landroid/view/View;I)V Landroidx/core/view/ViewCompat$Api19Impl; HSPLandroidx/core/view/ViewCompat$Api19Impl;->isAttachedToWindow(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat$Api19Impl;->isAttachedToWindow(Landroid/view/View;)Z HSPLandroidx/core/view/ViewCompat$Api19Impl;->isLaidOut(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat$Api19Impl;->isLaidOut(Landroid/view/View;)Z Landroidx/core/view/ViewCompat$Api20Impl; HSPLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; Landroidx/core/view/ViewCompat$Api21Impl; HSPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V PLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V Landroidx/core/view/ViewCompat$Api21Impl$1; HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V PLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets; Landroidx/core/view/ViewCompat$Api23Impl; HSPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat; Landroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/NotificationManager;Ljava/util/List;)V PLandroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/NotificationManager;Ljava/util/List;)V HSPLandroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;Ljava/util/List;)V PLandroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;Ljava/util/List;)V Landroidx/core/view/ViewCompat$Api29Impl; HSPLandroidx/core/view/ViewCompat$Api29Impl;->getContentCaptureSession(Landroid/view/View;)Landroid/view/contentcapture/ContentCaptureSession; PLandroidx/core/view/ViewCompat$Api29Impl;->getContentCaptureSession(Landroid/view/View;)Landroid/view/contentcapture/ContentCaptureSession; HSPLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V PLandroidx/core/view/ViewCompat$Api29Impl;->saveAttributeDataForStyleable(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V Landroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$2()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m$3()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Landroid/view/contentcapture/ContentCaptureSession; PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)Landroid/view/contentcapture/ContentCaptureSession; HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/content/Context;[ILandroid/util/AttributeSet;Landroid/content/res/TypedArray;II)V HSPLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; PLandroidx/core/view/ViewCompat$Api29Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets; Landroidx/core/view/ViewCompat$Api30Impl; HSPLandroidx/core/view/ViewCompat$Api30Impl;->setImportantForContentCapture(Landroid/view/View;I)V PLandroidx/core/view/ViewCompat$Api30Impl;->setImportantForContentCapture(Landroid/view/View;I)V Landroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m()I PLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m()I HSPLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;I)V PLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;I)V HSPLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/view/WindowInsetsAnimation$Callback;)V PLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;Landroid/view/WindowInsetsAnimation$Callback;)V HSPLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;Z)V PLandroidx/core/view/ViewCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;Z)V Landroidx/core/view/ViewKt; HSPLandroidx/core/view/ViewKt;->()V PLandroidx/core/view/ViewKt;->()V PLandroidx/core/view/ViewKt;->getAncestors(Landroidx/compose/ui/platform/AbstractComposeView;)Lkotlin/sequences/Sequence; HSPLandroidx/core/view/ViewKt;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V PLandroidx/core/view/ViewKt;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V PLandroidx/core/view/ViewKt$ancestors$1;->()V PLandroidx/core/view/ViewKt$ancestors$1;->()V HPLandroidx/core/view/ViewKt$ancestors$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/core/view/ViewPropertyAnimatorListener; Landroidx/core/view/WindowCompat$Api30Impl; HSPLandroidx/core/view/WindowCompat$Api30Impl;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V PLandroidx/core/view/WindowCompat$Api30Impl;->setDecorFitsSystemWindows(Landroid/view/Window;Z)V Landroidx/core/view/WindowInsetsAnimationCompat$Callback; HSPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V PLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->(I)V HSPLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->getDispatchMode()I PLandroidx/core/view/WindowInsetsAnimationCompat$Callback;->getDispatchMode()I Landroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback; HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V PLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/WindowInsetsCompat;->()V PLandroidx/core/view/WindowInsetsCompat;->()V HSPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V HSPLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V HSPLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/WindowInsetsCompat;->copyRootViewBounds(Landroid/view/View;)V PLandroidx/core/view/WindowInsetsCompat;->copyRootViewBounds(Landroid/view/View;)V HSPLandroidx/core/view/WindowInsetsCompat;->getDisplayCutout()Landroidx/core/view/DisplayCutoutCompat; PLandroidx/core/view/WindowInsetsCompat;->getDisplayCutout()Landroidx/core/view/DisplayCutoutCompat; HSPLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; PLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; PLandroidx/core/view/WindowInsetsCompat;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I PLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I HSPLandroidx/core/view/WindowInsetsCompat;->isVisible(I)Z PLandroidx/core/view/WindowInsetsCompat;->isVisible(I)Z HSPLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V PLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V HSPLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; PLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets; HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/View;Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; HPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/View;Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat; Landroidx/core/view/WindowInsetsCompat$BuilderImpl; HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V Landroidx/core/view/WindowInsetsCompat$BuilderImpl29; HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat; Landroidx/core/view/WindowInsetsCompat$BuilderImpl30; HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V PLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V Landroidx/core/view/WindowInsetsCompat$Impl; HSPLandroidx/core/view/WindowInsetsCompat$Impl;->()V PLandroidx/core/view/WindowInsetsCompat$Impl;->()V HSPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V Landroidx/core/view/WindowInsetsCompat$Impl20; HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; PLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V PLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V PLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V Landroidx/core/view/WindowInsetsCompat$Impl21; HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat; Landroidx/core/view/WindowInsetsCompat$Impl28; HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; PLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat; HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->getDisplayCutout()Landroidx/core/view/DisplayCutoutCompat; PLandroidx/core/view/WindowInsetsCompat$Impl28;->getDisplayCutout()Landroidx/core/view/DisplayCutoutCompat; Landroidx/core/view/WindowInsetsCompat$Impl29; HSPLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V Landroidx/core/view/WindowInsetsCompat$Impl30; HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->()V PLandroidx/core/view/WindowInsetsCompat$Impl30;->()V HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V PLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V PLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets; HPLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; PLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsetsIgnoringVisibility(I)Landroidx/core/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->isVisible(I)Z HPLandroidx/core/view/WindowInsetsCompat$Impl30;->isVisible(I)Z Landroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1()I HPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; HPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsetsController;)V PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/view/WindowInsetsController;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$2()I PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$2()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$3()I PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$3()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/view/WindowInsetsController;)V PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$3(Landroid/view/WindowInsetsController;)V HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$4()I PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$4()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$5()I PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$5()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$6()I PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m$6()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m()I HPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m()I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets; PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/WindowInsets; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)Landroid/view/WindowInsetsController; PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)Landroid/view/WindowInsetsController; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; HPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets; HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Z PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;I)Z HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsetsController;)I PLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsetsController;)I HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V HPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V Landroidx/core/view/WindowInsetsCompat$TypeImpl30; HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I HPLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I Landroidx/core/view/WindowInsetsControllerCompat; HSPLandroidx/core/view/WindowInsetsControllerCompat;->(Landroid/view/View;Landroid/view/Window;)V PLandroidx/core/view/WindowInsetsControllerCompat;->(Landroid/view/View;Landroid/view/Window;)V HSPLandroidx/core/view/WindowInsetsControllerCompat;->isAppearanceLightNavigationBars()Z PLandroidx/core/view/WindowInsetsControllerCompat;->isAppearanceLightNavigationBars()Z HSPLandroidx/core/view/WindowInsetsControllerCompat;->isAppearanceLightStatusBars()Z PLandroidx/core/view/WindowInsetsControllerCompat;->isAppearanceLightStatusBars()Z HSPLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightNavigationBars(Z)V PLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightNavigationBars(Z)V HSPLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightStatusBars(Z)V PLandroidx/core/view/WindowInsetsControllerCompat;->setAppearanceLightStatusBars(Z)V Landroidx/core/view/WindowInsetsControllerCompat$Impl30; HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/Window;Landroidx/core/view/ContentInfoCompat$Builder;)V PLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->(Landroid/view/Window;Landroidx/core/view/ContentInfoCompat$Builder;)V HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->isAppearanceLightNavigationBars()Z PLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->isAppearanceLightNavigationBars()Z HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->isAppearanceLightStatusBars()Z PLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->isAppearanceLightStatusBars()Z HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightNavigationBars(Z)V PLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightNavigationBars(Z)V HSPLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightStatusBars(Z)V PLandroidx/core/view/WindowInsetsControllerCompat$Impl30;->setAppearanceLightStatusBars(Z)V Landroidx/core/view/accessibility/AccessibilityEventCompat; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(I)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(I)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addAction(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addChild(Landroid/view/View;I)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->addChild(Landroid/view/View;I)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/ArrayList; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->extrasIntList(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getMovementGranularities()I HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getMovementGranularities()I HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->getText()Ljava/lang/CharSequence; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocusable()Z HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocusable()Z HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocused()Z HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->isFocused()Z HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->obtain()Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->obtain()Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setAccessibilityFocused(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setAccessibilityFocused(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setBoundsInScreen(Landroid/graphics/Rect;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setBoundsInScreen(Landroid/graphics/Rect;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCheckable(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCheckable(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClassName(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClickable(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setClickable(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionItemInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setCollectionItemInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setContentDescription(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setContentDescription(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEditable(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEditable(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEnabled(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setEnabled(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocusable(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocusable(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocused(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setFocused(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setImportantForAccessibility()V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setImportantForAccessibility()V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setLongClickable(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setLongClickable(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setMovementGranularities(I)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setMovementGranularities(I)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPackageName(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPackageName(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPaneTitle(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;I)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setParent(Landroid/view/View;I)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPassword(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setPassword(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setRoleDescription(Ljava/lang/String;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setRoleDescription(Ljava/lang/String;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setScreenReaderFocusable(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setSelected(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setSelected(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setSource(Landroid/view/View;I)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setSource(Landroid/view/View;I)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setStateDescription(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setText(Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setText(Ljava/lang/CharSequence;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setTextSelection(II)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setTextSelection(II)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setVisibleToUser(Z)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->setVisibleToUser(Z)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landroid/view/accessibility/AccessibilityNodeInfo; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->()V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/Class;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/Class;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/String;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(ILjava/lang/String;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/String;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;->(Ljava/lang/Object;ILjava/lang/String;Landroidx/core/view/accessibility/AccessibilityViewCommand;Ljava/lang/Class;)V Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api19Impl; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api19Impl;->getExtras(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroid/os/Bundle; HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api19Impl;->getExtras(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroid/os/Bundle; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V HPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$Api30Impl;->setStateDescription(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->obtain(IIIIZ)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat;->obtain(IIIIZ)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$CollectionItemInfoCompat; Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat;->(Ljava/lang/Object;)V PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat;->(Ljava/lang/Object;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat;->obtain(III)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat; PLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat;->obtain(III)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$RangeInfoCompat; Landroidx/core/view/accessibility/AccessibilityNodeProviderCompat; HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->(Landroid/view/accessibility/AccessibilityNodeProvider;)V PLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->(Landroid/view/accessibility/AccessibilityNodeProvider;)V HSPLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->getProvider()Ljava/lang/Object; PLandroidx/core/view/accessibility/AccessibilityNodeProviderCompat;->getProvider()Ljava/lang/Object; Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveAtGranularityArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveHtmlArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$MoveWindowArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$ScrollToPositionArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$SetProgressArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$SetSelectionArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments; Landroidx/customview/poolingcontainer/PoolingContainer; HSPLandroidx/customview/poolingcontainer/PoolingContainer;->addPoolingContainerListener(Landroid/view/View;Landroidx/customview/poolingcontainer/PoolingContainerListener;)V PLandroidx/customview/poolingcontainer/PoolingContainer;->addPoolingContainerListener(Landroid/view/View;Landroidx/customview/poolingcontainer/PoolingContainerListener;)V HSPLandroidx/customview/poolingcontainer/PoolingContainer;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; PLandroidx/customview/poolingcontainer/PoolingContainer;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; Landroidx/customview/poolingcontainer/PoolingContainerListener; Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; HSPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V PLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V HSPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->addListener(Landroidx/customview/poolingcontainer/PoolingContainerListener;)V PLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->addListener(Landroidx/customview/poolingcontainer/PoolingContainerListener;)V Landroidx/datastore/core/CorruptionException; Landroidx/datastore/core/CorruptionHandler; Landroidx/datastore/core/Data; HSPLandroidx/datastore/core/Data;->(Ljava/lang/Object;I)V PLandroidx/datastore/core/Data;->(Ljava/lang/Object;I)V HSPLandroidx/datastore/core/Data;->getValue()Ljava/lang/Object; PLandroidx/datastore/core/Data;->getValue()Ljava/lang/Object; Landroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->(Ljava/util/List;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->(Ljava/util/List;Lkotlin/coroutines/Continuation;)V HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$getInitializer$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$1; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$1;->(Landroidx/datastore/core/SingleProcessDataStore$Companion;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$1;->(Landroidx/datastore/core/SingleProcessDataStore$Companion;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->(Ljava/util/List;Ljava/util/List;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->(Ljava/util/List;Ljava/util/List;Lkotlin/coroutines/Continuation;)V HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/DataMigrationInitializer$Companion$runMigrations$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/core/DataStore; Landroidx/datastore/core/DataStoreFactory; HSPLandroidx/datastore/core/DataStoreFactory;->()V PLandroidx/datastore/core/DataStoreFactory;->()V HSPLandroidx/datastore/core/DataStoreFactory;->create(Landroidx/datastore/core/Serializer;Ljava/util/List;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function0;)Landroidx/datastore/core/SingleProcessDataStore; PLandroidx/datastore/core/DataStoreFactory;->create(Landroidx/datastore/core/Serializer;Ljava/util/List;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function0;)Landroidx/datastore/core/SingleProcessDataStore; Landroidx/datastore/core/Final; Landroidx/datastore/core/ReadException; Landroidx/datastore/core/Serializer; Landroidx/datastore/core/SimpleActor; HSPLandroidx/datastore/core/SimpleActor;->(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V PLandroidx/datastore/core/SimpleActor;->(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)V HSPLandroidx/datastore/core/SimpleActor;->access$getConsumeMessage$p(Landroidx/datastore/core/SimpleActor;)Lkotlin/jvm/functions/Function2; PLandroidx/datastore/core/SimpleActor;->access$getConsumeMessage$p(Landroidx/datastore/core/SimpleActor;)Lkotlin/jvm/functions/Function2; HSPLandroidx/datastore/core/SimpleActor;->access$getMessageQueue$p(Landroidx/datastore/core/SimpleActor;)Lkotlinx/coroutines/channels/Channel; PLandroidx/datastore/core/SimpleActor;->access$getMessageQueue$p(Landroidx/datastore/core/SimpleActor;)Lkotlinx/coroutines/channels/Channel; HSPLandroidx/datastore/core/SimpleActor;->access$getRemainingMessages$p(Landroidx/datastore/core/SimpleActor;)Ljava/util/concurrent/atomic/AtomicInteger; PLandroidx/datastore/core/SimpleActor;->access$getRemainingMessages$p(Landroidx/datastore/core/SimpleActor;)Ljava/util/concurrent/atomic/AtomicInteger; HSPLandroidx/datastore/core/SimpleActor;->access$getScope$p(Landroidx/datastore/core/SimpleActor;)Lkotlinx/coroutines/CoroutineScope; PLandroidx/datastore/core/SimpleActor;->access$getScope$p(Landroidx/datastore/core/SimpleActor;)Lkotlinx/coroutines/CoroutineScope; HSPLandroidx/datastore/core/SimpleActor;->offer(Ljava/lang/Object;)V PLandroidx/datastore/core/SimpleActor;->offer(Ljava/lang/Object;)V Landroidx/datastore/core/SimpleActor$1; HSPLandroidx/datastore/core/SimpleActor$1;->(Lkotlin/jvm/functions/Function1;Landroidx/datastore/core/SimpleActor;Lkotlin/jvm/functions/Function2;)V PLandroidx/datastore/core/SimpleActor$1;->(Lkotlin/jvm/functions/Function1;Landroidx/datastore/core/SimpleActor;Lkotlin/jvm/functions/Function2;)V Landroidx/datastore/core/SimpleActor$offer$2; HSPLandroidx/datastore/core/SimpleActor$offer$2;->(Landroidx/datastore/core/SimpleActor;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SimpleActor$offer$2;->(Landroidx/datastore/core/SimpleActor;Lkotlin/coroutines/Continuation;)V HSPLandroidx/datastore/core/SimpleActor$offer$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/SimpleActor$offer$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/datastore/core/SimpleActor$offer$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SimpleActor$offer$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore; HSPLandroidx/datastore/core/SingleProcessDataStore;->()V PLandroidx/datastore/core/SingleProcessDataStore;->()V HSPLandroidx/datastore/core/SingleProcessDataStore;->(Lkotlin/jvm/functions/Function0;Landroidx/datastore/core/Serializer;Ljava/util/List;Lorg/acra/log/AndroidLogDelegate;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/datastore/core/SingleProcessDataStore;->(Lkotlin/jvm/functions/Function0;Landroidx/datastore/core/Serializer;Ljava/util/List;Lorg/acra/log/AndroidLogDelegate;Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/datastore/core/SingleProcessDataStore;->access$getActiveFiles$cp()Ljava/util/LinkedHashSet; PLandroidx/datastore/core/SingleProcessDataStore;->access$getActiveFiles$cp()Ljava/util/LinkedHashSet; HSPLandroidx/datastore/core/SingleProcessDataStore;->access$getActiveFilesLock$cp()Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->access$getActiveFilesLock$cp()Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore;->access$getActor$p(Landroidx/datastore/core/SingleProcessDataStore;)Landroidx/datastore/core/SimpleActor; PLandroidx/datastore/core/SingleProcessDataStore;->access$getActor$p(Landroidx/datastore/core/SingleProcessDataStore;)Landroidx/datastore/core/SimpleActor; HSPLandroidx/datastore/core/SingleProcessDataStore;->access$getDownstreamFlow$p(Landroidx/datastore/core/SingleProcessDataStore;)Lkotlinx/coroutines/flow/MutableStateFlow; PLandroidx/datastore/core/SingleProcessDataStore;->access$getDownstreamFlow$p(Landroidx/datastore/core/SingleProcessDataStore;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLandroidx/datastore/core/SingleProcessDataStore;->access$getProduceFile$p(Landroidx/datastore/core/SingleProcessDataStore;)Lkotlin/jvm/functions/Function0; PLandroidx/datastore/core/SingleProcessDataStore;->access$getProduceFile$p(Landroidx/datastore/core/SingleProcessDataStore;)Lkotlin/jvm/functions/Function0; HSPLandroidx/datastore/core/SingleProcessDataStore;->access$handleRead(Landroidx/datastore/core/SingleProcessDataStore;Landroidx/datastore/core/SingleProcessDataStore$Message$Read;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->access$handleRead(Landroidx/datastore/core/SingleProcessDataStore;Landroidx/datastore/core/SingleProcessDataStore$Message$Read;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore;->getData()Lkotlinx/coroutines/flow/Flow; PLandroidx/datastore/core/SingleProcessDataStore;->getData()Lkotlinx/coroutines/flow/Flow; HSPLandroidx/datastore/core/SingleProcessDataStore;->getFile()Ljava/io/File; PLandroidx/datastore/core/SingleProcessDataStore;->getFile()Ljava/io/File; HSPLandroidx/datastore/core/SingleProcessDataStore;->readAndInit(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readAndInit(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore;->readAndInitOrPropagateFailure(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readAndInitOrPropagateFailure(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore;->readData(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readData(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore;->readDataOrHandleCorruption(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore;->readDataOrHandleCorruption(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$Companion; HSPLandroidx/datastore/core/SingleProcessDataStore$Companion;->()V PLandroidx/datastore/core/SingleProcessDataStore$Companion;->()V HSPLandroidx/datastore/core/SingleProcessDataStore$Companion;->access$runMigrations(Landroidx/datastore/core/SingleProcessDataStore$Companion;Ljava/util/List;Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$Companion;->access$runMigrations(Landroidx/datastore/core/SingleProcessDataStore$Companion;Ljava/util/List;Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$Message; HSPLandroidx/datastore/core/SingleProcessDataStore$Message;->()V PLandroidx/datastore/core/SingleProcessDataStore$Message;->()V Landroidx/datastore/core/SingleProcessDataStore$Message$Read; HSPLandroidx/datastore/core/SingleProcessDataStore$Message$Read;->(Landroidx/datastore/core/State;)V PLandroidx/datastore/core/SingleProcessDataStore$Message$Read;->(Landroidx/datastore/core/State;)V Landroidx/datastore/core/SingleProcessDataStore$actor$1; HSPLandroidx/datastore/core/SingleProcessDataStore$actor$1;->(Landroidx/datastore/core/SingleProcessDataStore;)V PLandroidx/datastore/core/SingleProcessDataStore$actor$1;->(Landroidx/datastore/core/SingleProcessDataStore;)V Landroidx/datastore/core/SingleProcessDataStore$actor$2; HSPLandroidx/datastore/core/SingleProcessDataStore$actor$2;->()V PLandroidx/datastore/core/SingleProcessDataStore$actor$2;->()V HSPLandroidx/datastore/core/SingleProcessDataStore$actor$2;->()V PLandroidx/datastore/core/SingleProcessDataStore$actor$2;->()V Landroidx/datastore/core/SingleProcessDataStore$actor$3; HSPLandroidx/datastore/core/SingleProcessDataStore$actor$3;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V HSPLandroidx/datastore/core/SingleProcessDataStore$actor$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$actor$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$data$1; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V HSPLandroidx/datastore/core/SingleProcessDataStore$data$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/SingleProcessDataStore$data$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$data$1$1; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->(Landroidx/datastore/core/State;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->(Landroidx/datastore/core/State;Lkotlin/coroutines/Continuation;)V HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;)V HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2$1; HSPLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2$1;->(Landroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2$1;->(Landroidx/datastore/core/SingleProcessDataStore$data$1$invokeSuspend$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/SingleProcessDataStore$file$2; HSPLandroidx/datastore/core/SingleProcessDataStore$file$2;->(Landroidx/datastore/core/SingleProcessDataStore;)V PLandroidx/datastore/core/SingleProcessDataStore$file$2;->(Landroidx/datastore/core/SingleProcessDataStore;)V HSPLandroidx/datastore/core/SingleProcessDataStore$file$2;->invoke()Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$file$2;->invoke()Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$readAndInit$1; HSPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1; HSPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->(Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/datastore/core/SingleProcessDataStore;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->(Lkotlinx/coroutines/sync/Mutex;Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/datastore/core/SingleProcessDataStore;)V HSPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->updateData(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;->updateData(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1$updateData$1; HSPLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1$updateData$1;->(Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1$updateData$1;->(Landroidx/datastore/core/SingleProcessDataStore$readAndInit$api$1;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/SingleProcessDataStore$readAndInitOrPropagateFailure$1; HSPLandroidx/datastore/core/SingleProcessDataStore$readAndInitOrPropagateFailure$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readAndInitOrPropagateFailure$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/SingleProcessDataStore$readData$1; HSPLandroidx/datastore/core/SingleProcessDataStore$readData$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readData$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/SingleProcessDataStore$readDataOrHandleCorruption$1; HSPLandroidx/datastore/core/SingleProcessDataStore$readDataOrHandleCorruption$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V PLandroidx/datastore/core/SingleProcessDataStore$readDataOrHandleCorruption$1;->(Landroidx/datastore/core/SingleProcessDataStore;Lkotlin/coroutines/Continuation;)V Landroidx/datastore/core/State; HSPLandroidx/datastore/core/State;->()V PLandroidx/datastore/core/State;->()V Landroidx/datastore/core/UnInitialized; HSPLandroidx/datastore/core/UnInitialized;->()V PLandroidx/datastore/core/UnInitialized;->()V HSPLandroidx/datastore/core/UnInitialized;->()V PLandroidx/datastore/core/UnInitialized;->()V Landroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1; HSPLandroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1;->()V PLandroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1;->()V HSPLandroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1;->()V PLandroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1;->()V HSPLandroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/datastore/preferences/PreferenceDataStoreDelegateKt$preferencesDataStore$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/datastore/preferences/PreferenceDataStoreFile; HSPLandroidx/datastore/preferences/PreferenceDataStoreFile;->preferencesDataStore$default()Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate; PLandroidx/datastore/preferences/PreferenceDataStoreFile;->preferencesDataStore$default()Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate; HSPLandroidx/datastore/preferences/PreferenceDataStoreFile;->preferencesDataStoreFile(Landroid/content/Context;Ljava/lang/String;)Ljava/io/File; PLandroidx/datastore/preferences/PreferenceDataStoreFile;->preferencesDataStoreFile(Landroid/content/Context;Ljava/lang/String;)Ljava/io/File; Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate; HSPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CoroutineScope;)V PLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/CoroutineScope;)V HSPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->access$getName$p(Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;)Ljava/lang/String; PLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->access$getName$p(Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;)Ljava/lang/String; HSPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; PLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate$getValue$1$1; HSPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate$getValue$1$1;->(Landroid/content/Context;Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;)V PLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate$getValue$1$1;->(Landroid/content/Context;Landroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate;)V HSPLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate$getValue$1$1;->invoke()Ljava/lang/Object; PLandroidx/datastore/preferences/PreferenceDataStoreSingletonDelegate$getValue$1$1;->invoke()Ljava/lang/Object; Landroidx/datastore/preferences/core/MutablePreferences; HSPLandroidx/datastore/preferences/core/MutablePreferences;->(Ljava/util/Map;Z)V PLandroidx/datastore/preferences/core/MutablePreferences;->(Ljava/util/Map;Z)V HSPLandroidx/datastore/preferences/core/MutablePreferences;->(Z)V PLandroidx/datastore/preferences/core/MutablePreferences;->(Z)V HSPLandroidx/datastore/preferences/core/MutablePreferences;->equals(Ljava/lang/Object;)Z PLandroidx/datastore/preferences/core/MutablePreferences;->equals(Ljava/lang/Object;)Z HSPLandroidx/datastore/preferences/core/MutablePreferences;->get(Landroidx/datastore/preferences/core/Preferences$Key;)Ljava/lang/Object; PLandroidx/datastore/preferences/core/MutablePreferences;->get(Landroidx/datastore/preferences/core/Preferences$Key;)Ljava/lang/Object; HSPLandroidx/datastore/preferences/core/MutablePreferences;->hashCode()I PLandroidx/datastore/preferences/core/MutablePreferences;->hashCode()I Landroidx/datastore/preferences/core/PreferenceDataStore; HSPLandroidx/datastore/preferences/core/PreferenceDataStore;->(Landroidx/datastore/core/SingleProcessDataStore;)V PLandroidx/datastore/preferences/core/PreferenceDataStore;->(Landroidx/datastore/core/SingleProcessDataStore;)V HSPLandroidx/datastore/preferences/core/PreferenceDataStore;->getData()Lkotlinx/coroutines/flow/Flow; PLandroidx/datastore/preferences/core/PreferenceDataStore;->getData()Lkotlinx/coroutines/flow/Flow; Landroidx/datastore/preferences/core/PreferenceDataStoreFactory$create$delegate$1; HSPLandroidx/datastore/preferences/core/PreferenceDataStoreFactory$create$delegate$1;->(Lkotlin/jvm/functions/Function0;)V PLandroidx/datastore/preferences/core/PreferenceDataStoreFactory$create$delegate$1;->(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/datastore/preferences/core/PreferenceDataStoreFactory$create$delegate$1;->invoke()Ljava/lang/Object; PLandroidx/datastore/preferences/core/PreferenceDataStoreFactory$create$delegate$1;->invoke()Ljava/lang/Object; Landroidx/datastore/preferences/core/Preferences$Key; HSPLandroidx/datastore/preferences/core/Preferences$Key;->(Ljava/lang/String;)V PLandroidx/datastore/preferences/core/Preferences$Key;->(Ljava/lang/String;)V HSPLandroidx/datastore/preferences/core/Preferences$Key;->hashCode()I PLandroidx/datastore/preferences/core/Preferences$Key;->hashCode()I Landroidx/datastore/preferences/core/PreferencesSerializer; HSPLandroidx/datastore/preferences/core/PreferencesSerializer;->()V PLandroidx/datastore/preferences/core/PreferencesSerializer;->()V HSPLandroidx/datastore/preferences/core/PreferencesSerializer;->()V PLandroidx/datastore/preferences/core/PreferencesSerializer;->()V HSPLandroidx/datastore/preferences/core/PreferencesSerializer;->create(Ljava/util/List;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function0;)Landroidx/datastore/preferences/core/PreferenceDataStore; PLandroidx/datastore/preferences/core/PreferencesSerializer;->create(Ljava/util/List;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function0;)Landroidx/datastore/preferences/core/PreferenceDataStore; HSPLandroidx/datastore/preferences/core/PreferencesSerializer;->getDefaultValue()Ljava/lang/Object; PLandroidx/datastore/preferences/core/PreferencesSerializer;->getDefaultValue()Ljava/lang/Object; Landroidx/datastore/preferences/protobuf/InvalidProtocolBufferException; Landroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0; HSPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->(Ljava/lang/String;)V PLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->(Ljava/lang/String;)V HSPLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLandroidx/emoji2/text/ConcurrencyHelpers$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; Landroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl; HSPLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/emoji2/text/ConcurrencyHelpers$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; Landroidx/emoji2/text/DefaultEmojiCompatConfig; HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig;->()V PLandroidx/emoji2/text/DefaultEmojiCompatConfig;->()V Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory; HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->$r8$lambda$2V1iWTiAwNxOBlVvz73bbuEdzIw(Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;Landroidx/emoji2/text/DefaultEmojiCompatConfig;Ljava/util/concurrent/ThreadPoolExecutor;)V PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->$r8$lambda$2V1iWTiAwNxOBlVvz73bbuEdzIw(Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;Landroidx/emoji2/text/DefaultEmojiCompatConfig;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->()V PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->()V HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->(Landroid/content/Context;)V PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->(Landroid/content/Context;)V HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->create(Landroid/content/Context;)Landroidx/emoji2/text/FontRequestEmojiCompatConfig; HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->load(Landroidx/emoji2/text/DefaultEmojiCompatConfig;)V PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;->load(Landroidx/emoji2/text/DefaultEmojiCompatConfig;)V Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19; HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->()V PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->()V HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->queryIntentContentProviders(Landroid/content/pm/PackageManager;Landroid/content/Intent;)Ljava/util/List; PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API19;->queryIntentContentProviders(Landroid/content/pm/PackageManager;Landroid/content/Intent;)Ljava/util/List; Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28; HSPLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->()V PLandroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigHelper_API28;->()V Landroidx/emoji2/text/DefaultGlyphChecker; HSPLandroidx/emoji2/text/DefaultGlyphChecker;->()V PLandroidx/emoji2/text/DefaultGlyphChecker;->()V HSPLandroidx/emoji2/text/DefaultGlyphChecker;->()V PLandroidx/emoji2/text/DefaultGlyphChecker;->()V Landroidx/emoji2/text/EmojiCompat; HSPLandroidx/emoji2/text/EmojiCompat;->()V PLandroidx/emoji2/text/EmojiCompat;->()V HSPLandroidx/emoji2/text/EmojiCompat;->(Landroidx/emoji2/text/EmojiCompat$Config;)V PLandroidx/emoji2/text/EmojiCompat;->(Landroidx/emoji2/text/EmojiCompat$Config;)V HSPLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat; PLandroidx/emoji2/text/EmojiCompat;->get()Landroidx/emoji2/text/EmojiCompat; HSPLandroidx/emoji2/text/EmojiCompat;->getLoadState()I PLandroidx/emoji2/text/EmojiCompat;->getLoadState()I HSPLandroidx/emoji2/text/EmojiCompat;->init(Landroidx/emoji2/text/EmojiCompat$Config;)V PLandroidx/emoji2/text/EmojiCompat;->init(Landroidx/emoji2/text/EmojiCompat$Config;)V HSPLandroidx/emoji2/text/EmojiCompat;->isConfigured()Z PLandroidx/emoji2/text/EmojiCompat;->isConfigured()Z HSPLandroidx/emoji2/text/EmojiCompat;->load()V PLandroidx/emoji2/text/EmojiCompat;->load()V HSPLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadFailed(Ljava/lang/Throwable;)V PLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadFailed(Ljava/lang/Throwable;)V HSPLandroidx/emoji2/text/EmojiCompat;->registerInitCallback(Landroidx/emoji2/text/EmojiCompat$InitCallback;)V PLandroidx/emoji2/text/EmojiCompat;->registerInitCallback(Landroidx/emoji2/text/EmojiCompat$InitCallback;)V Landroidx/emoji2/text/EmojiCompat$CompatInternal; HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal;->(Landroidx/emoji2/text/EmojiCompat;)V PLandroidx/emoji2/text/EmojiCompat$CompatInternal;->(Landroidx/emoji2/text/EmojiCompat;)V Landroidx/emoji2/text/EmojiCompat$CompatInternal19; HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->(Landroidx/emoji2/text/EmojiCompat;)V PLandroidx/emoji2/text/EmojiCompat$CompatInternal19;->(Landroidx/emoji2/text/EmojiCompat;)V Landroidx/emoji2/text/EmojiCompat$CompatInternal19$1; HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V PLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->(Landroidx/emoji2/text/EmojiCompat$CompatInternal19;)V HSPLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->onFailed(Ljava/lang/Throwable;)V PLandroidx/emoji2/text/EmojiCompat$CompatInternal19$1;->onFailed(Ljava/lang/Throwable;)V Landroidx/emoji2/text/EmojiCompat$Config; HSPLandroidx/emoji2/text/EmojiCompat$Config;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;)V PLandroidx/emoji2/text/EmojiCompat$Config;->(Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader;)V Landroidx/emoji2/text/EmojiCompat$DefaultSpanFactory; HSPLandroidx/emoji2/text/EmojiCompat$DefaultSpanFactory;->()V PLandroidx/emoji2/text/EmojiCompat$DefaultSpanFactory;->()V Landroidx/emoji2/text/EmojiCompat$GlyphChecker; Landroidx/emoji2/text/EmojiCompat$InitCallback; HSPLandroidx/emoji2/text/EmojiCompat$InitCallback;->()V PLandroidx/emoji2/text/EmojiCompat$InitCallback;->()V Landroidx/emoji2/text/EmojiCompat$ListenerDispatcher; HSPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->(Ljava/util/List;ILjava/lang/Throwable;)V PLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->(Ljava/util/List;ILjava/lang/Throwable;)V HSPLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->run()V PLandroidx/emoji2/text/EmojiCompat$ListenerDispatcher;->run()V Landroidx/emoji2/text/EmojiCompat$MetadataRepoLoader; Landroidx/emoji2/text/EmojiCompatInitializer; HSPLandroidx/emoji2/text/EmojiCompatInitializer;->()V PLandroidx/emoji2/text/EmojiCompatInitializer;->()V HSPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Boolean; PLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Boolean; HSPLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLandroidx/emoji2/text/EmojiCompatInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; HSPLandroidx/emoji2/text/EmojiCompatInitializer;->dependencies()Ljava/util/List; PLandroidx/emoji2/text/EmojiCompatInitializer;->dependencies()Ljava/util/List; Landroidx/emoji2/text/EmojiCompatInitializer$1; HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V PLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V Landroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0; HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;Landroidx/emoji2/text/DefaultEmojiCompatConfig;Ljava/util/concurrent/ThreadPoolExecutor;)V PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->(Landroidx/emoji2/text/DefaultEmojiCompatConfig$DefaultEmojiCompatConfigFactory;Landroidx/emoji2/text/DefaultEmojiCompatConfig;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V PLandroidx/emoji2/text/EmojiCompatInitializer$BackgroundDefaultLoader$$ExternalSyntheticLambda0;->run()V Landroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable; HSPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->()V PLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->()V HSPLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V PLandroidx/emoji2/text/EmojiCompatInitializer$LoadEmojiCompatRunnable;->run()V Landroidx/emoji2/text/EmojiProcessor$EmojiProcessCallback; Landroidx/emoji2/text/FontRequestEmojiCompatConfig; HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->()V PLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->()V HSPLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->(Landroid/content/Context;)V PLandroidx/emoji2/text/FontRequestEmojiCompatConfig;->(Landroid/content/Context;)V Landroidx/fragment/app/DialogFragment$1; HSPLandroidx/fragment/app/DialogFragment$1;->(Ljava/lang/Object;I)V PLandroidx/fragment/app/DialogFragment$1;->(Ljava/lang/Object;I)V Landroidx/fragment/app/FragmentActivity; HSPLandroidx/fragment/app/FragmentActivity;->()V PLandroidx/fragment/app/FragmentActivity;->()V PLandroidx/fragment/app/FragmentActivity;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager; PLandroidx/fragment/app/FragmentActivity;->markFragmentsCreated()V PLandroidx/fragment/app/FragmentActivity;->markState(Landroidx/fragment/app/FragmentManager;)Z HSPLandroidx/fragment/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V PLandroidx/fragment/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/FragmentActivity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentActivity;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HSPLandroidx/fragment/app/FragmentActivity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentActivity;->onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; PLandroidx/fragment/app/FragmentActivity;->onDestroy()V PLandroidx/fragment/app/FragmentActivity;->onPause()V HSPLandroidx/fragment/app/FragmentActivity;->onPostResume()V PLandroidx/fragment/app/FragmentActivity;->onPostResume()V HSPLandroidx/fragment/app/FragmentActivity;->onResume()V PLandroidx/fragment/app/FragmentActivity;->onResume()V HSPLandroidx/fragment/app/FragmentActivity;->onStart()V PLandroidx/fragment/app/FragmentActivity;->onStart()V HSPLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V PLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V PLandroidx/fragment/app/FragmentActivity;->onStop()V Landroidx/fragment/app/FragmentActivity$1; HSPLandroidx/fragment/app/FragmentActivity$1;->(Landroidx/appcompat/app/AppCompatActivity;)V PLandroidx/fragment/app/FragmentActivity$1;->(Landroidx/appcompat/app/AppCompatActivity;)V PLandroidx/fragment/app/FragmentActivity$1;->saveState()Landroid/os/Bundle; Landroidx/fragment/app/FragmentActivity$2; HSPLandroidx/fragment/app/FragmentActivity$2;->(Landroidx/appcompat/app/AppCompatActivity;)V PLandroidx/fragment/app/FragmentActivity$2;->(Landroidx/appcompat/app/AppCompatActivity;)V HSPLandroidx/fragment/app/FragmentActivity$2;->onContextAvailable(Landroid/content/Context;)V PLandroidx/fragment/app/FragmentActivity$2;->onContextAvailable(Landroid/content/Context;)V Landroidx/fragment/app/FragmentActivity$HostCallbacks; HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->(Landroidx/appcompat/app/AppCompatActivity;)V PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->(Landroidx/appcompat/app/AppCompatActivity;)V HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getActivityResultRegistry()Landroidx/activity/result/ActivityResultRegistry; HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getLifecycle()Landroidx/lifecycle/Lifecycle; HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getOnBackPressedDispatcher()Landroidx/activity/OnBackPressedDispatcher; HSPLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; Landroidx/fragment/app/FragmentContainer; HSPLandroidx/fragment/app/FragmentContainer;->()V PLandroidx/fragment/app/FragmentContainer;->()V Landroidx/fragment/app/FragmentContainerView; Landroidx/fragment/app/FragmentController; HSPLandroidx/fragment/app/FragmentController;->(Landroidx/fragment/app/FragmentHostCallback;)V PLandroidx/fragment/app/FragmentController;->(Landroidx/fragment/app/FragmentHostCallback;)V HSPLandroidx/fragment/app/FragmentController;->attachHost()V PLandroidx/fragment/app/FragmentController;->attachHost()V HSPLandroidx/fragment/app/FragmentController;->createController(Landroidx/fragment/app/FragmentHostCallback;)Landroidx/fragment/app/FragmentController; PLandroidx/fragment/app/FragmentController;->createController(Landroidx/fragment/app/FragmentHostCallback;)Landroidx/fragment/app/FragmentController; HSPLandroidx/fragment/app/FragmentController;->dispatchActivityCreated()V PLandroidx/fragment/app/FragmentController;->dispatchActivityCreated()V HSPLandroidx/fragment/app/FragmentController;->dispatchCreate()V PLandroidx/fragment/app/FragmentController;->dispatchCreate()V PLandroidx/fragment/app/FragmentController;->dispatchDestroy()V PLandroidx/fragment/app/FragmentController;->dispatchPause()V HSPLandroidx/fragment/app/FragmentController;->dispatchResume()V PLandroidx/fragment/app/FragmentController;->dispatchResume()V HSPLandroidx/fragment/app/FragmentController;->dispatchStart()V PLandroidx/fragment/app/FragmentController;->dispatchStart()V PLandroidx/fragment/app/FragmentController;->dispatchStop()V HSPLandroidx/fragment/app/FragmentController;->execPendingActions()V PLandroidx/fragment/app/FragmentController;->execPendingActions()V PLandroidx/fragment/app/FragmentController;->getSupportFragmentManager()Landroidx/fragment/app/FragmentManager; HSPLandroidx/fragment/app/FragmentController;->noteStateNotSaved()V PLandroidx/fragment/app/FragmentController;->noteStateNotSaved()V HSPLandroidx/fragment/app/FragmentController;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; PLandroidx/fragment/app/FragmentController;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; PLandroidx/fragment/app/FragmentController;->saveAllState()Landroid/os/Parcelable; Landroidx/fragment/app/FragmentFactory; HSPLandroidx/fragment/app/FragmentFactory;->()V PLandroidx/fragment/app/FragmentFactory;->()V HSPLandroidx/fragment/app/FragmentFactory;->()V PLandroidx/fragment/app/FragmentFactory;->()V Landroidx/fragment/app/FragmentHostCallback; HSPLandroidx/fragment/app/FragmentHostCallback;->(Landroidx/appcompat/app/AppCompatActivity;)V PLandroidx/fragment/app/FragmentHostCallback;->(Landroidx/appcompat/app/AppCompatActivity;)V HSPLandroidx/fragment/app/FragmentHostCallback;->getHandler()Landroid/os/Handler; PLandroidx/fragment/app/FragmentHostCallback;->getHandler()Landroid/os/Handler; Landroidx/fragment/app/FragmentLayoutInflaterFactory; HSPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentLayoutInflaterFactory;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; HPLandroidx/fragment/app/FragmentLayoutInflaterFactory;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View; Landroidx/fragment/app/FragmentLifecycleCallbacksDispatcher; HSPLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->(Landroidx/fragment/app/FragmentManager;)V Landroidx/fragment/app/FragmentManager; HSPLandroidx/fragment/app/FragmentManager;->()V HPLandroidx/fragment/app/FragmentManager;->()V HSPLandroidx/fragment/app/FragmentManager;->attachController(Landroidx/fragment/app/FragmentHostCallback;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V PLandroidx/fragment/app/FragmentManager;->attachController(Landroidx/fragment/app/FragmentHostCallback;Landroidx/fragment/app/FragmentContainer;Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager;->collectAllSpecialEffectsController()Ljava/util/HashSet; HPLandroidx/fragment/app/FragmentManager;->collectAllSpecialEffectsController()Ljava/util/HashSet; HSPLandroidx/fragment/app/FragmentManager;->dispatchActivityCreated()V PLandroidx/fragment/app/FragmentManager;->dispatchActivityCreated()V HSPLandroidx/fragment/app/FragmentManager;->dispatchCreate()V PLandroidx/fragment/app/FragmentManager;->dispatchCreate()V PLandroidx/fragment/app/FragmentManager;->dispatchDestroy()V PLandroidx/fragment/app/FragmentManager;->dispatchPause()V HSPLandroidx/fragment/app/FragmentManager;->dispatchResume()V PLandroidx/fragment/app/FragmentManager;->dispatchResume()V HSPLandroidx/fragment/app/FragmentManager;->dispatchStart()V PLandroidx/fragment/app/FragmentManager;->dispatchStart()V HSPLandroidx/fragment/app/FragmentManager;->dispatchStateChange(I)V HPLandroidx/fragment/app/FragmentManager;->dispatchStateChange(I)V PLandroidx/fragment/app/FragmentManager;->dispatchStop()V HSPLandroidx/fragment/app/FragmentManager;->doPendingDeferredStart()V PLandroidx/fragment/app/FragmentManager;->doPendingDeferredStart()V HSPLandroidx/fragment/app/FragmentManager;->ensureExecReady(Z)V HPLandroidx/fragment/app/FragmentManager;->ensureExecReady(Z)V HSPLandroidx/fragment/app/FragmentManager;->execPendingActions(Z)Z HPLandroidx/fragment/app/FragmentManager;->execPendingActions(Z)Z PLandroidx/fragment/app/FragmentManager;->forcePostponedTransactions()V HSPLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I PLandroidx/fragment/app/FragmentManager;->getBackStackEntryCount()I PLandroidx/fragment/app/FragmentManager;->getFragments()Ljava/util/List; HSPLandroidx/fragment/app/FragmentManager;->getLayoutInflaterFactory()Landroid/view/LayoutInflater$Factory2; PLandroidx/fragment/app/FragmentManager;->getLayoutInflaterFactory()Landroid/view/LayoutInflater$Factory2; PLandroidx/fragment/app/FragmentManager;->isLoggingEnabled(I)Z HSPLandroidx/fragment/app/FragmentManager;->isStateSaved()Z PLandroidx/fragment/app/FragmentManager;->isStateSaved()Z HSPLandroidx/fragment/app/FragmentManager;->moveToState(IZ)V PLandroidx/fragment/app/FragmentManager;->moveToState(IZ)V HSPLandroidx/fragment/app/FragmentManager;->noteStateNotSaved()V PLandroidx/fragment/app/FragmentManager;->noteStateNotSaved()V PLandroidx/fragment/app/FragmentManager;->saveAllState()Landroid/os/Parcelable; HSPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V HPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V HSPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V HPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V Landroidx/fragment/app/FragmentManager$1; HSPLandroidx/fragment/app/FragmentManager$1;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentManager$1;->(Landroidx/fragment/app/FragmentManager;)V Landroidx/fragment/app/FragmentManager$2; HSPLandroidx/fragment/app/FragmentManager$2;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentManager$2;->(Landroidx/fragment/app/FragmentManager;)V Landroidx/fragment/app/FragmentManager$3; HSPLandroidx/fragment/app/FragmentManager$3;->(Landroidx/fragment/app/FragmentManager;)V PLandroidx/fragment/app/FragmentManager$3;->(Landroidx/fragment/app/FragmentManager;)V Landroidx/fragment/app/FragmentManager$9; HSPLandroidx/fragment/app/FragmentManager$9;->(Landroidx/fragment/app/FragmentManager;I)V PLandroidx/fragment/app/FragmentManager$9;->(Landroidx/fragment/app/FragmentManager;I)V Landroidx/fragment/app/FragmentManager$FragmentIntentSenderContract; HSPLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;->()V PLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;->()V Landroidx/fragment/app/FragmentManagerImpl; HSPLandroidx/fragment/app/FragmentManagerImpl;->()V PLandroidx/fragment/app/FragmentManagerImpl;->()V Landroidx/fragment/app/FragmentManagerViewModel; HSPLandroidx/fragment/app/FragmentManagerViewModel;->()V PLandroidx/fragment/app/FragmentManagerViewModel;->()V HSPLandroidx/fragment/app/FragmentManagerViewModel;->(Z)V PLandroidx/fragment/app/FragmentManagerViewModel;->(Z)V HSPLandroidx/fragment/app/FragmentManagerViewModel;->getInstance(Landroidx/lifecycle/ViewModelStore;)Landroidx/fragment/app/FragmentManagerViewModel; PLandroidx/fragment/app/FragmentManagerViewModel;->getInstance(Landroidx/lifecycle/ViewModelStore;)Landroidx/fragment/app/FragmentManagerViewModel; PLandroidx/fragment/app/FragmentManagerViewModel;->onCleared()V HSPLandroidx/fragment/app/FragmentManagerViewModel;->setIsStateSaved(Z)V PLandroidx/fragment/app/FragmentManagerViewModel;->setIsStateSaved(Z)V Landroidx/fragment/app/FragmentManagerViewModel$1; HSPLandroidx/fragment/app/FragmentManagerViewModel$1;->()V PLandroidx/fragment/app/FragmentManagerViewModel$1;->()V HSPLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLandroidx/fragment/app/FragmentManagerViewModel$1;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; Landroidx/fragment/app/FragmentOnAttachListener; Landroidx/fragment/app/FragmentStore; HSPLandroidx/fragment/app/FragmentStore;->()V PLandroidx/fragment/app/FragmentStore;->()V HSPLandroidx/fragment/app/FragmentStore;->burpActive()V HPLandroidx/fragment/app/FragmentStore;->burpActive()V HSPLandroidx/fragment/app/FragmentStore;->dispatchStateChange(I)V HPLandroidx/fragment/app/FragmentStore;->dispatchStateChange(I)V HSPLandroidx/fragment/app/FragmentStore;->getActiveFragmentStateManagers()Ljava/util/ArrayList; HPLandroidx/fragment/app/FragmentStore;->getActiveFragmentStateManagers()Ljava/util/ArrayList; HSPLandroidx/fragment/app/FragmentStore;->getFragments()Ljava/util/List; HPLandroidx/fragment/app/FragmentStore;->getFragments()Ljava/util/List; HSPLandroidx/fragment/app/FragmentStore;->moveToExpectedState()V HPLandroidx/fragment/app/FragmentStore;->moveToExpectedState()V PLandroidx/fragment/app/FragmentStore;->saveActiveFragments()Ljava/util/ArrayList; HSPLandroidx/fragment/app/FragmentStore;->setNonConfig(Landroidx/fragment/app/FragmentManagerViewModel;)V PLandroidx/fragment/app/FragmentStore;->setNonConfig(Landroidx/fragment/app/FragmentManagerViewModel;)V Landroidx/glance/appwidget/GlanceAppWidget; HSPLandroidx/glance/appwidget/GlanceAppWidget;->()V PLandroidx/glance/appwidget/GlanceAppWidget;->()V Landroidx/glance/appwidget/GlanceAppWidgetKt; HSPLandroidx/glance/appwidget/GlanceAppWidgetKt;->updateAll(Ltachiyomi/presentation/widget/UpdatesGridGlanceWidget;Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetKt;->updateAll(Ltachiyomi/presentation/widget/UpdatesGridGlanceWidget;Landroid/content/Context;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/glance/appwidget/GlanceAppWidgetKt$updateAll$1; HSPLandroidx/glance/appwidget/GlanceAppWidgetKt$updateAll$1;->(Lkotlin/coroutines/Continuation;)V PLandroidx/glance/appwidget/GlanceAppWidgetKt$updateAll$1;->(Lkotlin/coroutines/Continuation;)V HSPLandroidx/glance/appwidget/GlanceAppWidgetKt$updateAll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetKt$updateAll$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/glance/appwidget/GlanceAppWidgetManager; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager;->()V PLandroidx/glance/appwidget/GlanceAppWidgetManager;->()V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager;->(Landroid/content/Context;)V PLandroidx/glance/appwidget/GlanceAppWidgetManager;->(Landroid/content/Context;)V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager;->access$getOrCreateDataStore(Landroidx/glance/appwidget/GlanceAppWidgetManager;)Landroidx/datastore/core/DataStore; PLandroidx/glance/appwidget/GlanceAppWidgetManager;->access$getOrCreateDataStore(Landroidx/glance/appwidget/GlanceAppWidgetManager;)Landroidx/datastore/core/DataStore; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager;->access$getState(Landroidx/glance/appwidget/GlanceAppWidgetManager;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetManager;->access$getState(Landroidx/glance/appwidget/GlanceAppWidgetManager;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager;->getGlanceIds(Ljava/lang/Class;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; PLandroidx/glance/appwidget/GlanceAppWidgetManager;->getGlanceIds(Ljava/lang/Class;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager;->getState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetManager;->getState(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Landroidx/glance/appwidget/GlanceAppWidgetManager$Companion; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$Companion;->()V PLandroidx/glance/appwidget/GlanceAppWidgetManager$Companion;->()V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$Companion;->()V PLandroidx/glance/appwidget/GlanceAppWidgetManager$Companion;->()V Landroidx/glance/appwidget/GlanceAppWidgetManager$State; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$State;->()V PLandroidx/glance/appwidget/GlanceAppWidgetManager$State;->()V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$State;->(Ljava/util/Map;Ljava/util/Map;)V PLandroidx/glance/appwidget/GlanceAppWidgetManager$State;->(Ljava/util/Map;Ljava/util/Map;)V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$State;->getProviderNameToReceivers()Ljava/util/Map; PLandroidx/glance/appwidget/GlanceAppWidgetManager$State;->getProviderNameToReceivers()Ljava/util/Map; Landroidx/glance/appwidget/GlanceAppWidgetManager$dataStore$2; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$dataStore$2;->(Ljava/lang/Object;I)V PLandroidx/glance/appwidget/GlanceAppWidgetManager$dataStore$2;->(Ljava/lang/Object;I)V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$dataStore$2;->invoke()Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetManager$dataStore$2;->invoke()Ljava/lang/Object; Landroidx/glance/appwidget/GlanceAppWidgetManager$getGlanceIds$1; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$getGlanceIds$1;->(Landroidx/glance/appwidget/GlanceAppWidgetManager;Lkotlin/coroutines/Continuation;)V PLandroidx/glance/appwidget/GlanceAppWidgetManager$getGlanceIds$1;->(Landroidx/glance/appwidget/GlanceAppWidgetManager;Lkotlin/coroutines/Continuation;)V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$getGlanceIds$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetManager$getGlanceIds$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/glance/appwidget/GlanceAppWidgetManager$getState$1; HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$getState$1;->(Landroidx/glance/appwidget/GlanceAppWidgetManager;Lkotlin/coroutines/Continuation;)V PLandroidx/glance/appwidget/GlanceAppWidgetManager$getState$1;->(Landroidx/glance/appwidget/GlanceAppWidgetManager;Lkotlin/coroutines/Continuation;)V HSPLandroidx/glance/appwidget/GlanceAppWidgetManager$getState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/glance/appwidget/GlanceAppWidgetManager$getState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/glance/appwidget/SizeMode; Landroidx/glance/appwidget/SizeMode$Exact; HSPLandroidx/glance/appwidget/SizeMode$Exact;->()V PLandroidx/glance/appwidget/SizeMode$Exact;->()V HSPLandroidx/glance/appwidget/SizeMode$Exact;->()V PLandroidx/glance/appwidget/SizeMode$Exact;->()V Landroidx/glance/session/Api33Impl$$ExternalSyntheticApiModelOutline0; HSPLandroidx/glance/session/Api33Impl$$ExternalSyntheticApiModelOutline0;->m(I)I PLandroidx/glance/session/Api33Impl$$ExternalSyntheticApiModelOutline0;->m(I)I Landroidx/glance/session/SessionManager; Landroidx/glance/session/SessionManagerImpl; HSPLandroidx/glance/session/SessionManagerImpl;->()V PLandroidx/glance/session/SessionManagerImpl;->()V Landroidx/glance/session/SessionManagerKt; HSPLandroidx/glance/session/SessionManagerKt;->()V PLandroidx/glance/session/SessionManagerKt;->()V HSPLandroidx/glance/session/SessionManagerKt;->getGlanceSessionManager()Landroidx/glance/session/SessionManagerImpl; PLandroidx/glance/session/SessionManagerKt;->getGlanceSessionManager()Landroidx/glance/session/SessionManagerImpl; Landroidx/glance/state/GlanceStateDefinition; Landroidx/glance/state/PreferencesGlanceStateDefinition; HSPLandroidx/glance/state/PreferencesGlanceStateDefinition;->()V PLandroidx/glance/state/PreferencesGlanceStateDefinition;->()V HSPLandroidx/glance/state/PreferencesGlanceStateDefinition;->()V PLandroidx/glance/state/PreferencesGlanceStateDefinition;->()V Landroidx/interpolator/view/animation/FastOutSlowInInterpolator; HSPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V HSPLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/FastOutSlowInInterpolator;->()V Landroidx/interpolator/view/animation/LinearOutSlowInInterpolator; HSPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V HSPLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V PLandroidx/interpolator/view/animation/LinearOutSlowInInterpolator;->()V Landroidx/interpolator/view/animation/LookupTableInterpolator; HSPLandroidx/interpolator/view/animation/LookupTableInterpolator;->([F)V PLandroidx/interpolator/view/animation/LookupTableInterpolator;->([F)V HSPLandroidx/interpolator/view/animation/LookupTableInterpolator;->getInterpolation(F)F HPLandroidx/interpolator/view/animation/LookupTableInterpolator;->getInterpolation(F)F Landroidx/lifecycle/DefaultLifecycleObserver; HSPLandroidx/lifecycle/DefaultLifecycleObserver;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/DefaultLifecycleObserver;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/DefaultLifecycleObserver;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/DefaultLifecycleObserver;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/DefaultLifecycleObserver;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/DefaultLifecycleObserver;->onStop(Landroidx/lifecycle/LifecycleOwner;)V Landroidx/lifecycle/DefaultLifecycleObserverAdapter; HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V HPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings; HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;->()V PLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;->()V Landroidx/lifecycle/EmptyActivityLifecycleCallbacks; HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->()V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->()V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V HPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V Landroidx/lifecycle/HasDefaultViewModelProviderFactory; Landroidx/lifecycle/Lifecycle; HSPLandroidx/lifecycle/Lifecycle;->()V HPLandroidx/lifecycle/Lifecycle;->()V HSPLandroidx/lifecycle/Lifecycle;->getInternalScopeRef()Ljava/util/concurrent/atomic/AtomicReference; PLandroidx/lifecycle/Lifecycle;->getInternalScopeRef()Ljava/util/concurrent/atomic/AtomicReference; Landroidx/lifecycle/Lifecycle$Event; HSPLandroidx/lifecycle/Lifecycle$Event;->()V PLandroidx/lifecycle/Lifecycle$Event;->()V HSPLandroidx/lifecycle/Lifecycle$Event;->(Ljava/lang/String;I)V PLandroidx/lifecycle/Lifecycle$Event;->(Ljava/lang/String;I)V HSPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State; HPLandroidx/lifecycle/Lifecycle$Event;->getTargetState()Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event; PLandroidx/lifecycle/Lifecycle$Event;->values()[Landroidx/lifecycle/Lifecycle$Event; Landroidx/lifecycle/Lifecycle$Event$Companion; HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->()V PLandroidx/lifecycle/Lifecycle$Event$Companion;->()V HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->upFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; HPLandroidx/lifecycle/Lifecycle$Event$Companion;->upFrom(Landroidx/lifecycle/Lifecycle$State;)Landroidx/lifecycle/Lifecycle$Event; Landroidx/lifecycle/Lifecycle$Event$WhenMappings; HSPLandroidx/lifecycle/Lifecycle$Event$WhenMappings;->()V PLandroidx/lifecycle/Lifecycle$Event$WhenMappings;->()V Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/Lifecycle$State;->()V PLandroidx/lifecycle/Lifecycle$State;->()V HSPLandroidx/lifecycle/Lifecycle$State;->(Ljava/lang/String;I)V PLandroidx/lifecycle/Lifecycle$State;->(Ljava/lang/String;I)V HSPLandroidx/lifecycle/Lifecycle$State;->isAtLeast(Landroidx/lifecycle/Lifecycle$State;)Z HPLandroidx/lifecycle/Lifecycle$State;->isAtLeast(Landroidx/lifecycle/Lifecycle$State;)Z Landroidx/lifecycle/LifecycleCoroutineScopeImpl; HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->(Landroidx/lifecycle/Lifecycle;Lkotlin/coroutines/CoroutineContext;)V PLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->(Landroidx/lifecycle/Lifecycle;Lkotlin/coroutines/CoroutineContext;)V HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; PLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getLifecycle$lifecycle_common()Landroidx/lifecycle/Lifecycle; PLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->getLifecycle$lifecycle_common()Landroidx/lifecycle/Lifecycle; HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleCoroutineScopeImpl;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1; HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/coroutines/Continuation;)V PLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->(Landroidx/lifecycle/LifecycleCoroutineScopeImpl;Lkotlin/coroutines/Continuation;)V HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/lifecycle/LifecycleCoroutineScopeImpl$register$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/lifecycle/LifecycleDispatcher; HSPLandroidx/lifecycle/LifecycleDispatcher;->()V PLandroidx/lifecycle/LifecycleDispatcher;->()V HSPLandroidx/lifecycle/LifecycleDispatcher;->init(Landroid/content/Context;)V PLandroidx/lifecycle/LifecycleDispatcher;->init(Landroid/content/Context;)V Landroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback; HSPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->()V PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->()V HSPLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/LifecycleDispatcher$DispatcherActivityCallback;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V Landroidx/lifecycle/LifecycleEventObserver; Landroidx/lifecycle/LifecycleObserver; Landroidx/lifecycle/LifecycleOwner; Landroidx/lifecycle/LifecycleRegistry; HSPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V HPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V HPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V HSPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; HPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V HPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V HSPLandroidx/lifecycle/LifecycleRegistry;->getCurrentState()Landroidx/lifecycle/Lifecycle$State; HPLandroidx/lifecycle/LifecycleRegistry;->getCurrentState()Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/LifecycleRegistry;->markState()V HSPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V HPLandroidx/lifecycle/LifecycleRegistry;->moveToState(Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V HPLandroidx/lifecycle/LifecycleRegistry;->removeObserver(Landroidx/lifecycle/LifecycleObserver;)V PLandroidx/lifecycle/LifecycleRegistry;->setCurrentState()V HSPLandroidx/lifecycle/LifecycleRegistry;->sync()V HPLandroidx/lifecycle/LifecycleRegistry;->sync()V Landroidx/lifecycle/LifecycleRegistry$ObserverWithState; HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V HPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->(Landroidx/lifecycle/LifecycleObserver;Landroidx/lifecycle/Lifecycle$State;)V HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->dispatchEvent(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->getState()Landroidx/lifecycle/Lifecycle$State; PLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->getState()Landroidx/lifecycle/Lifecycle$State; Landroidx/lifecycle/Lifecycling; HSPLandroidx/lifecycle/Lifecycling;->()V PLandroidx/lifecycle/Lifecycling;->()V HSPLandroidx/lifecycle/Lifecycling;->lifecycleEventObserver(Ljava/lang/Object;)Landroidx/lifecycle/LifecycleEventObserver; HPLandroidx/lifecycle/Lifecycling;->lifecycleEventObserver(Ljava/lang/Object;)Landroidx/lifecycle/LifecycleEventObserver; Landroidx/lifecycle/LiveData; HSPLandroidx/lifecycle/LiveData;->()V PLandroidx/lifecycle/LiveData;->()V HSPLandroidx/lifecycle/LiveData;->()V PLandroidx/lifecycle/LiveData;->()V HSPLandroidx/lifecycle/LiveData;->assertMainThread(Ljava/lang/String;)V PLandroidx/lifecycle/LiveData;->assertMainThread(Ljava/lang/String;)V HSPLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ObserverWrapper;)V PLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ObserverWrapper;)V HSPLandroidx/lifecycle/LiveData;->postValue(Ljava/lang/Object;)V PLandroidx/lifecycle/LiveData;->postValue(Ljava/lang/Object;)V HSPLandroidx/lifecycle/LiveData;->setValue(Ljava/lang/Object;)V PLandroidx/lifecycle/LiveData;->setValue(Ljava/lang/Object;)V Landroidx/lifecycle/LiveData$1; HSPLandroidx/lifecycle/LiveData$1;->(Landroidx/lifecycle/LiveData;)V PLandroidx/lifecycle/LiveData$1;->(Landroidx/lifecycle/LiveData;)V HSPLandroidx/lifecycle/LiveData$1;->run()V PLandroidx/lifecycle/LiveData$1;->run()V Landroidx/lifecycle/MutableLiveData; HSPLandroidx/lifecycle/MutableLiveData;->()V PLandroidx/lifecycle/MutableLiveData;->()V HSPLandroidx/lifecycle/MutableLiveData;->postValue(Ljava/lang/Object;)V PLandroidx/lifecycle/MutableLiveData;->postValue(Ljava/lang/Object;)V HSPLandroidx/lifecycle/MutableLiveData;->setValue(Ljava/lang/Object;)V PLandroidx/lifecycle/MutableLiveData;->setValue(Ljava/lang/Object;)V Landroidx/lifecycle/ProcessLifecycleInitializer; HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->()V PLandroidx/lifecycle/ProcessLifecycleInitializer;->()V HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLandroidx/lifecycle/ProcessLifecycleInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; HSPLandroidx/lifecycle/ProcessLifecycleInitializer;->dependencies()Ljava/util/List; PLandroidx/lifecycle/ProcessLifecycleInitializer;->dependencies()Ljava/util/List; Landroidx/lifecycle/ProcessLifecycleOwner; PLandroidx/lifecycle/ProcessLifecycleOwner;->$r8$lambda$8RHFmaqBQY2MpEYiTr99NwPTGEU(Landroidx/lifecycle/ProcessLifecycleOwner;)V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->()V PLandroidx/lifecycle/ProcessLifecycleOwner;->()V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->()V PLandroidx/lifecycle/ProcessLifecycleOwner;->()V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->access$getNewInstance$cp()Landroidx/lifecycle/ProcessLifecycleOwner; PLandroidx/lifecycle/ProcessLifecycleOwner;->access$getNewInstance$cp()Landroidx/lifecycle/ProcessLifecycleOwner; PLandroidx/lifecycle/ProcessLifecycleOwner;->activityPaused$lifecycle_process_release()V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed$lifecycle_process_release()V PLandroidx/lifecycle/ProcessLifecycleOwner;->activityResumed$lifecycle_process_release()V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->activityStarted$lifecycle_process_release()V PLandroidx/lifecycle/ProcessLifecycleOwner;->activityStarted$lifecycle_process_release()V PLandroidx/lifecycle/ProcessLifecycleOwner;->activityStopped$lifecycle_process_release()V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->attach$lifecycle_process_release(Landroid/content/Context;)V PLandroidx/lifecycle/ProcessLifecycleOwner;->attach$lifecycle_process_release(Landroid/content/Context;)V HSPLandroidx/lifecycle/ProcessLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLandroidx/lifecycle/ProcessLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle; Landroidx/lifecycle/ProcessLifecycleOwner$$ExternalSyntheticLambda0; HSPLandroidx/lifecycle/ProcessLifecycleOwner$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/ProcessLifecycleOwner$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/ProcessLifecycleOwner$$ExternalSyntheticLambda0;->run()V Landroidx/lifecycle/ProcessLifecycleOwner$Api29Impl; HSPLandroidx/lifecycle/ProcessLifecycleOwner$Api29Impl;->registerActivityLifecycleCallbacks(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V PLandroidx/lifecycle/ProcessLifecycleOwner$Api29Impl;->registerActivityLifecycleCallbacks(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V Landroidx/lifecycle/ProcessLifecycleOwner$attach$1; HSPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V HSPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityPaused(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityPreCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1;->onActivityStopped(Landroid/app/Activity;)V Landroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1; HSPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V HSPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostResumed(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ProcessLifecycleOwner$attach$1$onActivityPreCreated$1;->onActivityPostStarted(Landroid/app/Activity;)V Landroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1; HSPLandroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V PLandroidx/lifecycle/ProcessLifecycleOwner$initializationListener$1;->(Landroidx/lifecycle/ProcessLifecycleOwner;)V Landroidx/lifecycle/ReportFragment; HSPLandroidx/lifecycle/ReportFragment;->()V PLandroidx/lifecycle/ReportFragment;->()V HSPLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/ReportFragment;->dispatch(Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment;->onActivityCreated(Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment;->onDestroy()V PLandroidx/lifecycle/ReportFragment;->onPause()V HSPLandroidx/lifecycle/ReportFragment;->onResume()V PLandroidx/lifecycle/ReportFragment;->onResume()V HSPLandroidx/lifecycle/ReportFragment;->onStart()V PLandroidx/lifecycle/ReportFragment;->onStart()V PLandroidx/lifecycle/ReportFragment;->onStop()V Landroidx/lifecycle/ReportFragment$LifecycleCallbacks; HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->()V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityDestroyed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPaused(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostCreated(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostResumed(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPostStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreDestroyed(Landroid/app/Activity;)V HPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPrePaused(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityPreStopped(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityResumed(Landroid/app/Activity;)V HPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStarted(Landroid/app/Activity;)V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivityStopped(Landroid/app/Activity;)V Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion; HSPLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->()V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion;->()V Landroidx/lifecycle/SavedStateHandleAttacher; HSPLandroidx/lifecycle/SavedStateHandleAttacher;->(Landroidx/lifecycle/SavedStateHandlesProvider;)V PLandroidx/lifecycle/SavedStateHandleAttacher;->(Landroidx/lifecycle/SavedStateHandlesProvider;)V HSPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1; HSPLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;->()V PLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;->()V PLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;->()V Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1; HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->()V PLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->(I)V PLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->(I)V HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Landroid/view/View;)Landroid/view/View; HPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Landroid/view/View;)Landroid/view/View; HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/lifecycle/SavedStateHandlesProvider; HSPLandroidx/lifecycle/SavedStateHandlesProvider;->(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V HPLandroidx/lifecycle/SavedStateHandlesProvider;->(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/ViewModelStoreOwner;)V HSPLandroidx/lifecycle/SavedStateHandlesProvider;->performRestore()V PLandroidx/lifecycle/SavedStateHandlesProvider;->performRestore()V HSPLandroidx/lifecycle/SavedStateHandlesProvider;->saveState()Landroid/os/Bundle; HPLandroidx/lifecycle/SavedStateHandlesProvider;->saveState()Landroid/os/Bundle; Landroidx/lifecycle/SavedStateHandlesProvider$viewModel$2; HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->(Landroidx/lifecycle/ViewModelStoreOwner;)V PLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->(Landroidx/lifecycle/ViewModelStoreOwner;)V HSPLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->invoke()Ljava/lang/Object; PLandroidx/lifecycle/SavedStateHandlesProvider$viewModel$2;->invoke()Ljava/lang/Object; Landroidx/lifecycle/SavedStateHandlesVM; HSPLandroidx/lifecycle/SavedStateHandlesVM;->()V PLandroidx/lifecycle/SavedStateHandlesVM;->()V HSPLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/LinkedHashMap; PLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/LinkedHashMap; Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModel;->()V PLandroidx/lifecycle/ViewModel;->()V HPLandroidx/lifecycle/ViewModel;->clear()V PLandroidx/lifecycle/ViewModel;->onCleared()V Landroidx/lifecycle/ViewModelKt; HSPLandroidx/lifecycle/ViewModelKt;->()V PLandroidx/lifecycle/ViewModelKt;->()V HSPLandroidx/lifecycle/ViewModelKt;->dispatch$lifecycle_runtime_release(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/lifecycle/ViewModelKt;->dispatch$lifecycle_runtime_release(Landroid/app/Activity;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/ViewModelKt;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V HPLandroidx/lifecycle/ViewModelKt;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/lifecycle/ViewModelKt;->get(Landroid/view/View;)Landroidx/lifecycle/LifecycleOwner; PLandroidx/lifecycle/ViewModelKt;->get(Landroid/view/View;)Landroidx/lifecycle/LifecycleOwner; HSPLandroidx/lifecycle/ViewModelKt;->get(Landroid/view/View;)Landroidx/lifecycle/ViewModelStoreOwner; PLandroidx/lifecycle/ViewModelKt;->get(Landroid/view/View;)Landroidx/lifecycle/ViewModelStoreOwner; HSPLandroidx/lifecycle/ViewModelKt;->getLifecycleScope(Landroidx/lifecycle/LifecycleOwner;)Landroidx/lifecycle/LifecycleCoroutineScopeImpl; PLandroidx/lifecycle/ViewModelKt;->getLifecycleScope(Landroidx/lifecycle/LifecycleOwner;)Landroidx/lifecycle/LifecycleCoroutineScopeImpl; HSPLandroidx/lifecycle/ViewModelKt;->getSavedStateHandlesVM(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; HPLandroidx/lifecycle/ViewModelKt;->getSavedStateHandlesVM(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; HSPLandroidx/lifecycle/ViewModelKt;->injectIfNeededIn(Landroid/app/Activity;)V HPLandroidx/lifecycle/ViewModelKt;->injectIfNeededIn(Landroid/app/Activity;)V HSPLandroidx/lifecycle/ViewModelKt;->set(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/ViewModelKt;->set(Landroid/view/View;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/ViewModelKt;->set(Landroid/view/View;Landroidx/lifecycle/ViewModelStoreOwner;)V PLandroidx/lifecycle/ViewModelKt;->set(Landroid/view/View;Landroidx/lifecycle/ViewModelStoreOwner;)V Landroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory; HSPLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->()V PLandroidx/lifecycle/ViewModelProvider$AndroidViewModelFactory;->()V Landroidx/lifecycle/ViewModelProvider$Factory; HSPLandroidx/lifecycle/ViewModelProvider$Factory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; PLandroidx/lifecycle/ViewModelProvider$Factory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; Landroidx/lifecycle/ViewModelProvider$NewInstanceFactory; HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V PLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V Landroidx/lifecycle/ViewModelStore; HSPLandroidx/lifecycle/ViewModelStore;->()V PLandroidx/lifecycle/ViewModelStore;->()V HPLandroidx/lifecycle/ViewModelStore;->clear()V HSPLandroidx/lifecycle/ViewModelStore;->get(Ljava/lang/String;)Landroidx/lifecycle/ViewModel; HPLandroidx/lifecycle/ViewModelStore;->get(Ljava/lang/String;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModelStore;->put(Ljava/lang/String;Landroidx/lifecycle/ViewModel;)V HPLandroidx/lifecycle/ViewModelStore;->put(Ljava/lang/String;Landroidx/lifecycle/ViewModel;)V Landroidx/lifecycle/ViewModelStoreOwner; Landroidx/lifecycle/viewmodel/CreationExtras; HSPLandroidx/lifecycle/viewmodel/CreationExtras;->()V HPLandroidx/lifecycle/viewmodel/CreationExtras;->()V HSPLandroidx/lifecycle/viewmodel/CreationExtras;->getMap$lifecycle_viewmodel_release()Ljava/util/LinkedHashMap; PLandroidx/lifecycle/viewmodel/CreationExtras;->getMap$lifecycle_viewmodel_release()Ljava/util/LinkedHashMap; Landroidx/lifecycle/viewmodel/CreationExtras$Empty; HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V PLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V HSPLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V PLandroidx/lifecycle/viewmodel/CreationExtras$Empty;->()V Landroidx/lifecycle/viewmodel/CreationExtras$Key; Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; HSPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V PLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->([Landroidx/lifecycle/viewmodel/ViewModelInitializer;)V HSPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; HPLandroidx/lifecycle/viewmodel/InitializerViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/MutableCreationExtras;)Landroidx/lifecycle/ViewModel; Landroidx/lifecycle/viewmodel/MutableCreationExtras; HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->()V PLandroidx/lifecycle/viewmodel/MutableCreationExtras;->()V HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Landroidx/lifecycle/viewmodel/CreationExtras;)V HPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->(Landroidx/lifecycle/viewmodel/CreationExtras;)V HSPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->set(Landroidx/lifecycle/viewmodel/CreationExtras$Key;Ljava/lang/Object;)V HPLandroidx/lifecycle/viewmodel/MutableCreationExtras;->set(Landroidx/lifecycle/viewmodel/CreationExtras$Key;Ljava/lang/Object;)V Landroidx/lifecycle/viewmodel/ViewModelInitializer; HSPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->(Ljava/lang/Class;Lkotlin/jvm/functions/Function1;)V HPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->(Ljava/lang/Class;Lkotlin/jvm/functions/Function1;)V HSPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getClazz$lifecycle_viewmodel_release()Ljava/lang/Class; PLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getClazz$lifecycle_viewmodel_release()Ljava/lang/Class; HSPLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getInitializer$lifecycle_viewmodel_release()Lkotlin/jvm/functions/Function1; PLandroidx/lifecycle/viewmodel/ViewModelInitializer;->getInitializer$lifecycle_viewmodel_release()Lkotlin/jvm/functions/Function1; Landroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner; HSPLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner;->()V PLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner;->()V HSPLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner;->provides(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/compose/runtime/ProvidedValue; PLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner;->provides(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/compose/runtime/ProvidedValue; Landroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner$LocalViewModelStoreOwner$1; HSPLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner$LocalViewModelStoreOwner$1;->()V PLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner$LocalViewModelStoreOwner$1;->()V HSPLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner$LocalViewModelStoreOwner$1;->()V PLandroidx/lifecycle/viewmodel/compose/LocalViewModelStoreOwner$LocalViewModelStoreOwner$1;->()V Landroidx/paging/ConflatedEventBus; HSPLandroidx/paging/ConflatedEventBus;->()V PLandroidx/paging/ConflatedEventBus;->()V HSPLandroidx/paging/ConflatedEventBus;->(Landroidx/compose/ui/node/InnerNodeCoordinator;)V PLandroidx/paging/ConflatedEventBus;->(Landroidx/compose/ui/node/InnerNodeCoordinator;)V HSPLandroidx/paging/ConflatedEventBus;->(Ljava/lang/Object;)V PLandroidx/paging/ConflatedEventBus;->(Ljava/lang/Object;)V HSPLandroidx/paging/ConflatedEventBus;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLandroidx/paging/ConflatedEventBus;->(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroidx/paging/ConflatedEventBus;->access$getLookaheadSet$p(Landroidx/paging/ConflatedEventBus;)Landroidx/compose/ui/node/DepthSortedSet; PLandroidx/paging/ConflatedEventBus;->access$getLookaheadSet$p(Landroidx/paging/ConflatedEventBus;)Landroidx/compose/ui/node/DepthSortedSet; HSPLandroidx/paging/ConflatedEventBus;->access$getSet$p(Landroidx/paging/ConflatedEventBus;)Landroidx/compose/ui/node/DepthSortedSet; PLandroidx/paging/ConflatedEventBus;->access$getSet$p(Landroidx/paging/ConflatedEventBus;)Landroidx/compose/ui/node/DepthSortedSet; HSPLandroidx/paging/ConflatedEventBus;->add(ILjava/lang/Object;)V HPLandroidx/paging/ConflatedEventBus;->add(ILjava/lang/Object;)V HSPLandroidx/paging/ConflatedEventBus;->add(Landroidx/compose/ui/node/LayoutNode;Z)V HPLandroidx/paging/ConflatedEventBus;->add(Landroidx/compose/ui/node/LayoutNode;Z)V HSPLandroidx/paging/ConflatedEventBus;->addHitPath-KNwqfcY(JLandroidx/compose/ui/node/HitTestResult;)V HPLandroidx/paging/ConflatedEventBus;->addHitPath-KNwqfcY(JLandroidx/compose/ui/node/HitTestResult;)V HSPLandroidx/paging/ConflatedEventBus;->asList()Ljava/util/List; PLandroidx/paging/ConflatedEventBus;->asList()Ljava/util/List; HSPLandroidx/paging/ConflatedEventBus;->clear()V HPLandroidx/paging/ConflatedEventBus;->clear()V HSPLandroidx/paging/ConflatedEventBus;->contains(Landroidx/work/impl/model/WorkGenerationalId;)Z PLandroidx/paging/ConflatedEventBus;->contains(Landroidx/work/impl/model/WorkGenerationalId;)Z HSPLandroidx/paging/ConflatedEventBus;->dispatchChanges(Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HPLandroidx/paging/ConflatedEventBus;->dispatchChanges(Landroidx/compose/ui/focus/FocusTransactionManager;Z)Z HSPLandroidx/paging/ConflatedEventBus;->get(I)Ljava/lang/Object; HPLandroidx/paging/ConflatedEventBus;->get(I)Ljava/lang/Object; HSPLandroidx/paging/ConflatedEventBus;->getSize()I HPLandroidx/paging/ConflatedEventBus;->getSize()I HSPLandroidx/paging/ConflatedEventBus;->getVector()Landroidx/compose/runtime/collection/MutableVector; PLandroidx/paging/ConflatedEventBus;->getVector()Landroidx/compose/runtime/collection/MutableVector; HSPLandroidx/paging/ConflatedEventBus;->isEmpty()Z HPLandroidx/paging/ConflatedEventBus;->isEmpty()Z HSPLandroidx/paging/ConflatedEventBus;->remove(Landroidx/compose/ui/node/LayoutNode;)V PLandroidx/paging/ConflatedEventBus;->remove(Landroidx/compose/ui/node/LayoutNode;)V HSPLandroidx/paging/ConflatedEventBus;->remove(Landroidx/compose/ui/node/LayoutNode;Z)Z PLandroidx/paging/ConflatedEventBus;->remove(Landroidx/compose/ui/node/LayoutNode;Z)Z HSPLandroidx/paging/ConflatedEventBus;->removeAt(I)Ljava/lang/Object; HPLandroidx/paging/ConflatedEventBus;->removeAt(I)Ljava/lang/Object; HSPLandroidx/paging/ConflatedEventBus;->removeDetachedPointerInputFilters()V PLandroidx/paging/ConflatedEventBus;->removeDetachedPointerInputFilters()V Landroidx/preference/PreferenceManager; HSPLandroidx/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences; PLandroidx/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences; HSPLandroidx/preference/PreferenceManager;->getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String; PLandroidx/preference/PreferenceManager;->getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String; Landroidx/profileinstaller/ProfileInstallReceiver; HSPLandroidx/profileinstaller/ProfileInstallReceiver;->()V PLandroidx/profileinstaller/ProfileInstallReceiver;->()V HSPLandroidx/profileinstaller/ProfileInstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V HPLandroidx/profileinstaller/ProfileInstallReceiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V Landroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics; HSPLandroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics;->(Landroidx/profileinstaller/ProfileInstallReceiver;)V PLandroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics;->(Landroidx/profileinstaller/ProfileInstallReceiver;)V HSPLandroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics;->onResultReceived(ILjava/lang/Object;)V PLandroidx/profileinstaller/ProfileInstallReceiver$ResultDiagnostics;->onResultReceived(ILjava/lang/Object;)V Landroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0; HSPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->(IILjava/lang/Object;Ljava/io/Serializable;)V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->(IILjava/lang/Object;Ljava/io/Serializable;)V HSPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->run()V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda0;->run()V Landroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1; HSPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->(I)V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->(I)V HSPLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->execute(Ljava/lang/Runnable;)V PLandroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;->execute(Ljava/lang/Runnable;)V Landroidx/profileinstaller/ProfileInstaller$1; HSPLandroidx/profileinstaller/ProfileInstaller$1;->(I)V PLandroidx/profileinstaller/ProfileInstaller$1;->(I)V HSPLandroidx/profileinstaller/ProfileInstaller$1;->onResultReceived(ILjava/lang/Object;)V PLandroidx/profileinstaller/ProfileInstaller$1;->onResultReceived(ILjava/lang/Object;)V Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback; Landroidx/profileinstaller/ProfileInstallerInitializer; HSPLandroidx/profileinstaller/ProfileInstallerInitializer;->$r8$lambda$QGpANLTF0YGY0pXfe2eje4OKwkc(Landroidx/profileinstaller/ProfileInstallerInitializer;Landroid/content/Context;)V PLandroidx/profileinstaller/ProfileInstallerInitializer;->$r8$lambda$QGpANLTF0YGY0pXfe2eje4OKwkc(Landroidx/profileinstaller/ProfileInstallerInitializer;Landroid/content/Context;)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer;->()V PLandroidx/profileinstaller/ProfileInstallerInitializer;->()V HSPLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLandroidx/profileinstaller/ProfileInstallerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; HSPLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List; PLandroidx/profileinstaller/ProfileInstallerInitializer;->dependencies()Ljava/util/List; Landroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0; HSPLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->(Landroid/content/Context;I)V PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->(Landroid/content/Context;I)V PLandroidx/profileinstaller/ProfileInstallerInitializer$$ExternalSyntheticLambda0;->run()V Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl; HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V PLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl;->postFrameCallback(Ljava/lang/Runnable;)V Landroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0; HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->(Ljava/lang/Runnable;)V PLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->(Ljava/lang/Runnable;)V HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->doFrame(J)V PLandroidx/profileinstaller/ProfileInstallerInitializer$Choreographer16Impl$$ExternalSyntheticLambda0;->doFrame(J)V Landroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl; HSPLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/profileinstaller/ProfileInstallerInitializer$Handler28Impl;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; PLandroidx/profileinstaller/ProfileVerifier;->()V PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZ)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)V PLandroidx/profileinstaller/ProfileVerifier$CompilationStatus;->(I)V Landroidx/profileinstaller/ProfileVersion; HSPLandroidx/profileinstaller/ProfileVersion;->()V PLandroidx/profileinstaller/ProfileVersion;->()V HSPLandroidx/profileinstaller/ProfileVersion;->noteProfileWrittenFor(Landroid/content/pm/PackageInfo;Ljava/io/File;)V PLandroidx/profileinstaller/ProfileVersion;->noteProfileWrittenFor(Landroid/content/pm/PackageInfo;Ljava/io/File;)V PLandroidx/profileinstaller/ProfileVersion;->writeProfile(Landroid/content/Context;)V PLandroidx/profileinstaller/ProfileVersion;->writeProfile(Landroid/content/Context;Landroidx/profileinstaller/ProfileInstaller$$ExternalSyntheticLambda1;Landroidx/profileinstaller/ProfileInstaller$DiagnosticsCallback;Z)V Landroidx/recyclerview/widget/ListUpdateCallback; Landroidx/room/AutoCloser$Companion; HSPLandroidx/room/AutoCloser$Companion;->(I)V PLandroidx/room/AutoCloser$Companion;->(I)V HSPLandroidx/room/AutoCloser$Companion;->(II)V PLandroidx/room/AutoCloser$Companion;->(II)V HSPLandroidx/room/AutoCloser$Companion;->bitsNeedForSize(I)I HPLandroidx/room/AutoCloser$Companion;->bitsNeedForSize(I)I HSPLandroidx/room/AutoCloser$Companion;->createConstraints-Zbe2FdA$ui_unit_release(IIII)J HPLandroidx/room/AutoCloser$Companion;->createConstraints-Zbe2FdA$ui_unit_release(IIII)J HSPLandroidx/room/AutoCloser$Companion;->fixed-JhjzzOo(II)J HPLandroidx/room/AutoCloser$Companion;->fixed-JhjzzOo(II)J Landroidx/room/AutoClosingRoomOpenHelper; Landroidx/room/DatabaseConfiguration; HSPLandroidx/room/DatabaseConfiguration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/room/RoomDatabase$MigrationContainer;Ljava/util/ArrayList;ZLandroidx/room/RoomDatabase$JournalMode;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;ZZLjava/util/LinkedHashSet;Ljava/util/ArrayList;Ljava/util/ArrayList;)V PLandroidx/room/DatabaseConfiguration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/room/RoomDatabase$MigrationContainer;Ljava/util/ArrayList;ZLandroidx/room/RoomDatabase$JournalMode;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;ZZLjava/util/LinkedHashSet;Ljava/util/ArrayList;Ljava/util/ArrayList;)V Landroidx/room/DelegatingOpenHelper; Landroidx/room/EntityInsertionAdapter; HSPLandroidx/room/EntityInsertionAdapter;->(Landroidx/room/RoomDatabase;I)V PLandroidx/room/EntityInsertionAdapter;->(Landroidx/room/RoomDatabase;I)V HSPLandroidx/room/EntityInsertionAdapter;->insert(Ljava/lang/Object;)V PLandroidx/room/EntityInsertionAdapter;->insert(Ljava/lang/Object;)V Landroidx/room/InvalidationLiveDataContainer; HSPLandroidx/room/InvalidationLiveDataContainer;->(Landroidx/room/RoomDatabase;)V PLandroidx/room/InvalidationLiveDataContainer;->(Landroidx/room/RoomDatabase;)V Landroidx/room/InvalidationTracker; HSPLandroidx/room/InvalidationTracker;->()V PLandroidx/room/InvalidationTracker;->()V HSPLandroidx/room/InvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/HashMap;Ljava/util/HashMap;[Ljava/lang/String;)V PLandroidx/room/InvalidationTracker;->(Landroidx/room/RoomDatabase;Ljava/util/HashMap;Ljava/util/HashMap;[Ljava/lang/String;)V HSPLandroidx/room/InvalidationTracker;->ensureInitialization$room_runtime_release()Z PLandroidx/room/InvalidationTracker;->ensureInitialization$room_runtime_release()Z HSPLandroidx/room/InvalidationTracker;->getDatabase$room_runtime_release()Landroidx/room/RoomDatabase; PLandroidx/room/InvalidationTracker;->getDatabase$room_runtime_release()Landroidx/room/RoomDatabase; HSPLandroidx/room/InvalidationTracker;->getPendingRefresh()Ljava/util/concurrent/atomic/AtomicBoolean; PLandroidx/room/InvalidationTracker;->getPendingRefresh()Ljava/util/concurrent/atomic/AtomicBoolean; HSPLandroidx/room/InvalidationTracker;->internalInit$room_runtime_release(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/InvalidationTracker;->internalInit$room_runtime_release(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/room/InvalidationTracker;->refreshVersionsAsync()V PLandroidx/room/InvalidationTracker;->refreshVersionsAsync()V HSPLandroidx/room/InvalidationTracker;->syncTriggers$room_runtime_release(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/InvalidationTracker;->syncTriggers$room_runtime_release(Landroidx/sqlite/db/SupportSQLiteDatabase;)V Landroidx/room/InvalidationTracker$ObservedTableTracker; HSPLandroidx/room/InvalidationTracker$ObservedTableTracker;->(I)V PLandroidx/room/InvalidationTracker$ObservedTableTracker;->(I)V HSPLandroidx/room/InvalidationTracker$ObservedTableTracker;->getTablesToSync()[I PLandroidx/room/InvalidationTracker$ObservedTableTracker;->getTablesToSync()[I Landroidx/room/InvalidationTracker$refreshRunnable$1; HSPLandroidx/room/InvalidationTracker$refreshRunnable$1;->(Landroidx/room/InvalidationTracker;)V PLandroidx/room/InvalidationTracker$refreshRunnable$1;->(Landroidx/room/InvalidationTracker;)V HSPLandroidx/room/InvalidationTracker$refreshRunnable$1;->checkUpdatedTable()Ljava/util/Set; PLandroidx/room/InvalidationTracker$refreshRunnable$1;->checkUpdatedTable()Ljava/util/Set; HSPLandroidx/room/InvalidationTracker$refreshRunnable$1;->run()V PLandroidx/room/InvalidationTracker$refreshRunnable$1;->run()V Landroidx/room/RoomDatabase; HSPLandroidx/room/RoomDatabase;->()V PLandroidx/room/RoomDatabase;->()V HSPLandroidx/room/RoomDatabase;->assertNotMainThread()V PLandroidx/room/RoomDatabase;->assertNotMainThread()V HSPLandroidx/room/RoomDatabase;->assertNotSuspendingTransaction()V PLandroidx/room/RoomDatabase;->assertNotSuspendingTransaction()V HSPLandroidx/room/RoomDatabase;->beginTransaction()V PLandroidx/room/RoomDatabase;->beginTransaction()V HSPLandroidx/room/RoomDatabase;->endTransaction()V PLandroidx/room/RoomDatabase;->endTransaction()V HSPLandroidx/room/RoomDatabase;->getCloseLock$room_runtime_release()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock; PLandroidx/room/RoomDatabase;->getCloseLock$room_runtime_release()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock; HSPLandroidx/room/RoomDatabase;->getOpenHelper()Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLandroidx/room/RoomDatabase;->getOpenHelper()Landroidx/sqlite/db/SupportSQLiteOpenHelper; HSPLandroidx/room/RoomDatabase;->getQueryExecutor()Ljava/util/concurrent/Executor; PLandroidx/room/RoomDatabase;->getQueryExecutor()Ljava/util/concurrent/Executor; HSPLandroidx/room/RoomDatabase;->init(Landroidx/room/DatabaseConfiguration;)V PLandroidx/room/RoomDatabase;->init(Landroidx/room/DatabaseConfiguration;)V HSPLandroidx/room/RoomDatabase;->internalBeginTransaction()V PLandroidx/room/RoomDatabase;->internalBeginTransaction()V HSPLandroidx/room/RoomDatabase;->internalEndTransaction()V PLandroidx/room/RoomDatabase;->internalEndTransaction()V HSPLandroidx/room/RoomDatabase;->internalInitInvalidationTracker(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/RoomDatabase;->internalInitInvalidationTracker(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/room/RoomDatabase;->isOpen()Z PLandroidx/room/RoomDatabase;->isOpen()Z HSPLandroidx/room/RoomDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/os/CancellationSignal;)Landroid/database/Cursor; PLandroidx/room/RoomDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroid/os/CancellationSignal;)Landroid/database/Cursor; HSPLandroidx/room/RoomDatabase;->runInTransaction(Ljava/util/concurrent/Callable;)Ljava/lang/Object; PLandroidx/room/RoomDatabase;->runInTransaction(Ljava/util/concurrent/Callable;)Ljava/lang/Object; HSPLandroidx/room/RoomDatabase;->setTransactionSuccessful()V PLandroidx/room/RoomDatabase;->setTransactionSuccessful()V HSPLandroidx/room/RoomDatabase;->unwrapOpenHelper(Ljava/lang/Class;Landroidx/sqlite/db/SupportSQLiteOpenHelper;)Ljava/lang/Object; PLandroidx/room/RoomDatabase;->unwrapOpenHelper(Ljava/lang/Class;Landroidx/sqlite/db/SupportSQLiteOpenHelper;)Ljava/lang/Object; Landroidx/room/RoomDatabase$Builder; HSPLandroidx/room/RoomDatabase$Builder;->(Landroid/content/Context;Ljava/lang/String;)V PLandroidx/room/RoomDatabase$Builder;->(Landroid/content/Context;Ljava/lang/String;)V HSPLandroidx/room/RoomDatabase$Builder;->addCallback()V PLandroidx/room/RoomDatabase$Builder;->addCallback()V HSPLandroidx/room/RoomDatabase$Builder;->addMigrations([Landroidx/room/migration/Migration;)V PLandroidx/room/RoomDatabase$Builder;->addMigrations([Landroidx/room/migration/Migration;)V HSPLandroidx/room/RoomDatabase$Builder;->build()Landroidx/room/RoomDatabase; PLandroidx/room/RoomDatabase$Builder;->build()Landroidx/room/RoomDatabase; HSPLandroidx/room/RoomDatabase$Builder;->fallbackToDestructiveMigration()V PLandroidx/room/RoomDatabase$Builder;->fallbackToDestructiveMigration()V HSPLandroidx/room/RoomDatabase$Builder;->openHelperFactory(Landroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;)V PLandroidx/room/RoomDatabase$Builder;->openHelperFactory(Landroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;)V HSPLandroidx/room/RoomDatabase$Builder;->setQueryExecutor(Landroidx/work/impl/utils/SerialExecutorImpl;)V PLandroidx/room/RoomDatabase$Builder;->setQueryExecutor(Landroidx/work/impl/utils/SerialExecutorImpl;)V Landroidx/room/RoomDatabase$Callback; HSPLandroidx/room/RoomDatabase$Callback;->()V PLandroidx/room/RoomDatabase$Callback;->()V Landroidx/room/RoomDatabase$JournalMode; HSPLandroidx/room/RoomDatabase$JournalMode;->()V PLandroidx/room/RoomDatabase$JournalMode;->()V HSPLandroidx/room/RoomDatabase$JournalMode;->(Ljava/lang/String;I)V PLandroidx/room/RoomDatabase$JournalMode;->(Ljava/lang/String;I)V Landroidx/room/RoomDatabase$MigrationContainer; HSPLandroidx/room/RoomDatabase$MigrationContainer;->()V PLandroidx/room/RoomDatabase$MigrationContainer;->()V HSPLandroidx/room/RoomDatabase$MigrationContainer;->addMigrations([Landroidx/room/migration/Migration;)V PLandroidx/room/RoomDatabase$MigrationContainer;->addMigrations([Landroidx/room/migration/Migration;)V HSPLandroidx/room/RoomDatabase$MigrationContainer;->contains(II)Z PLandroidx/room/RoomDatabase$MigrationContainer;->contains(II)Z Landroidx/room/RoomOpenHelper; HSPLandroidx/room/RoomOpenHelper;->(Landroidx/room/DatabaseConfiguration;Landroidx/room/RoomOpenHelper$Delegate;)V PLandroidx/room/RoomOpenHelper;->(Landroidx/room/DatabaseConfiguration;Landroidx/room/RoomOpenHelper$Delegate;)V HSPLandroidx/room/RoomOpenHelper;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/RoomOpenHelper;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/room/RoomOpenHelper;->onCreate(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/RoomOpenHelper;->onCreate(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/room/RoomOpenHelper;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/RoomOpenHelper;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/room/RoomOpenHelper;->updateIdentity(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/room/RoomOpenHelper;->updateIdentity(Landroidx/sqlite/db/SupportSQLiteDatabase;)V Landroidx/room/RoomOpenHelper$Delegate; HSPLandroidx/room/RoomOpenHelper$Delegate;->()V PLandroidx/room/RoomOpenHelper$Delegate;->()V Landroidx/room/RoomSQLiteQuery; HSPLandroidx/room/RoomSQLiteQuery;->()V PLandroidx/room/RoomSQLiteQuery;->()V HSPLandroidx/room/RoomSQLiteQuery;->(I)V PLandroidx/room/RoomSQLiteQuery;->(I)V HSPLandroidx/room/RoomSQLiteQuery;->acquire(ILjava/lang/String;)Landroidx/room/RoomSQLiteQuery; PLandroidx/room/RoomSQLiteQuery;->acquire(ILjava/lang/String;)Landroidx/room/RoomSQLiteQuery; HSPLandroidx/room/RoomSQLiteQuery;->bindLong(IJ)V PLandroidx/room/RoomSQLiteQuery;->bindLong(IJ)V HSPLandroidx/room/RoomSQLiteQuery;->bindString(ILjava/lang/String;)V PLandroidx/room/RoomSQLiteQuery;->bindString(ILjava/lang/String;)V HSPLandroidx/room/RoomSQLiteQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V PLandroidx/room/RoomSQLiteQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V HSPLandroidx/room/RoomSQLiteQuery;->getSql()Ljava/lang/String; PLandroidx/room/RoomSQLiteQuery;->getSql()Ljava/lang/String; HSPLandroidx/room/RoomSQLiteQuery;->init(ILjava/lang/String;)V PLandroidx/room/RoomSQLiteQuery;->init(ILjava/lang/String;)V HSPLandroidx/room/RoomSQLiteQuery;->release()V PLandroidx/room/RoomSQLiteQuery;->release()V Landroidx/room/SQLiteCopyOpenHelper; Landroidx/room/SharedSQLiteStatement; HSPLandroidx/room/SharedSQLiteStatement;->(Landroidx/room/RoomDatabase;)V PLandroidx/room/SharedSQLiteStatement;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/room/SharedSQLiteStatement;->access$createNewStatement(Landroidx/room/SharedSQLiteStatement;)Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/room/SharedSQLiteStatement;->access$createNewStatement(Landroidx/room/SharedSQLiteStatement;)Landroidx/sqlite/db/SupportSQLiteStatement; HSPLandroidx/room/SharedSQLiteStatement;->acquire()Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/room/SharedSQLiteStatement;->acquire()Landroidx/sqlite/db/SupportSQLiteStatement; HSPLandroidx/room/SharedSQLiteStatement;->createNewStatement()Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/room/SharedSQLiteStatement;->createNewStatement()Landroidx/sqlite/db/SupportSQLiteStatement; HSPLandroidx/room/SharedSQLiteStatement;->release(Landroidx/sqlite/db/SupportSQLiteStatement;)V PLandroidx/room/SharedSQLiteStatement;->release(Landroidx/sqlite/db/SupportSQLiteStatement;)V Landroidx/room/SharedSQLiteStatement$stmt$2; HSPLandroidx/room/SharedSQLiteStatement$stmt$2;->(Landroidx/room/SharedSQLiteStatement;)V PLandroidx/room/SharedSQLiteStatement$stmt$2;->(Landroidx/room/SharedSQLiteStatement;)V HSPLandroidx/room/SharedSQLiteStatement$stmt$2;->invoke()Ljava/lang/Object; PLandroidx/room/SharedSQLiteStatement$stmt$2;->invoke()Ljava/lang/Object; Landroidx/room/TransactionExecutor; HSPLandroidx/room/TransactionExecutor;->(Ljava/util/concurrent/Executor;)V PLandroidx/room/TransactionExecutor;->(Ljava/util/concurrent/Executor;)V Landroidx/room/migration/Migration; HSPLandroidx/room/migration/Migration;->(II)V PLandroidx/room/migration/Migration;->(II)V Landroidx/savedstate/Recreator; HSPLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V PLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/savedstate/SavedStateRegistry; HSPLandroidx/savedstate/SavedStateRegistry;->$r8$lambda$AUDDdpkzZrJMhBj0r-_9pI-j6hA(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/savedstate/SavedStateRegistry;->$r8$lambda$AUDDdpkzZrJMhBj0r-_9pI-j6hA(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/savedstate/SavedStateRegistry;->()V PLandroidx/savedstate/SavedStateRegistry;->()V HSPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; HPLandroidx/savedstate/SavedStateRegistry;->consumeRestoredStateForKey(Ljava/lang/String;)Landroid/os/Bundle; HSPLandroidx/savedstate/SavedStateRegistry;->getSavedStateProvider()Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; PLandroidx/savedstate/SavedStateRegistry;->getSavedStateProvider()Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; HSPLandroidx/savedstate/SavedStateRegistry;->performAttach$savedstate_release(Landroidx/lifecycle/Lifecycle;)V PLandroidx/savedstate/SavedStateRegistry;->performAttach$savedstate_release(Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/savedstate/SavedStateRegistry;->performRestore$savedstate_release(Landroid/os/Bundle;)V PLandroidx/savedstate/SavedStateRegistry;->performRestore$savedstate_release(Landroid/os/Bundle;)V HSPLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V HPLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V HSPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V HPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V PLandroidx/savedstate/SavedStateRegistry;->unregisterSavedStateProvider(Ljava/lang/String;)V Landroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0; HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->(Landroidx/savedstate/SavedStateRegistry;)V PLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->(Landroidx/savedstate/SavedStateRegistry;)V HSPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HPLandroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; Landroidx/savedstate/SavedStateRegistryController; HSPLandroidx/savedstate/SavedStateRegistryController;->(Landroidx/savedstate/SavedStateRegistryOwner;)V PLandroidx/savedstate/SavedStateRegistryController;->(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/savedstate/SavedStateRegistryController;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLandroidx/savedstate/SavedStateRegistryController;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; HSPLandroidx/savedstate/SavedStateRegistryController;->performAttach()V PLandroidx/savedstate/SavedStateRegistryController;->performAttach()V HSPLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V PLandroidx/savedstate/SavedStateRegistryController;->performRestore(Landroid/os/Bundle;)V HSPLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V HPLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V Landroidx/savedstate/SavedStateRegistryOwner; Landroidx/savedstate/ViewTreeSavedStateRegistryOwner; HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->get(Landroid/view/View;)Landroidx/savedstate/SavedStateRegistryOwner; PLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->get(Landroid/view/View;)Landroidx/savedstate/SavedStateRegistryOwner; HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V PLandroidx/savedstate/ViewTreeSavedStateRegistryOwner;->set(Landroid/view/View;Landroidx/savedstate/SavedStateRegistryOwner;)V Landroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1; HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->()V PLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->()V HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->(I)V PLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->(I)V HSPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLandroidx/savedstate/ViewTreeSavedStateRegistryOwner$findViewTreeSavedStateRegistryOwner$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Landroidx/sqlite/db/SimpleSQLiteQuery; HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->(Ljava/lang/String;)V PLandroidx/sqlite/db/SimpleSQLiteQuery;->(Ljava/lang/String;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->(Ljava/lang/String;[Ljava/lang/Object;)V PLandroidx/sqlite/db/SimpleSQLiteQuery;->(Ljava/lang/String;[Ljava/lang/Object;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V PLandroidx/sqlite/db/SimpleSQLiteQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V HSPLandroidx/sqlite/db/SimpleSQLiteQuery;->getSql()Ljava/lang/String; PLandroidx/sqlite/db/SimpleSQLiteQuery;->getSql()Ljava/lang/String; Landroidx/sqlite/db/SupportSQLiteDatabase; Landroidx/sqlite/db/SupportSQLiteOpenHelper; Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback; HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->()V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->()V HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->(I)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->(I)V HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;->onConfigure(Landroidx/sqlite/db/SupportSQLiteDatabase;)V Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback$Companion; HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback$Companion;->()V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Callback$Companion;->()V Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration; HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder; HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->(Landroid/content/Context;)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->(Landroid/content/Context;)V HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->allowDataLossOnRecovery()V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->allowDataLossOnRecovery()V HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->build()Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration; PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->build()Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration; HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->callback(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->callback(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->name(Ljava/lang/String;)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->name(Ljava/lang/String;)V HSPLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->noBackupDirectory(Z)V PLandroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration$Builder;->noBackupDirectory(Z)V Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory; Landroidx/sqlite/db/SupportSQLiteProgram; Landroidx/sqlite/db/SupportSQLiteQuery; Landroidx/sqlite/db/SupportSQLiteStatement; Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->()V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->(Landroid/database/sqlite/SQLiteDatabase;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransaction()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransaction()V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->beginTransactionNonExclusive()V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->endTransaction()V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->execSQL(Ljava/lang/String;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->execSQL(Ljava/lang/String;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->inTransaction()Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isDelegate(Landroid/database/sqlite/SQLiteDatabase;)Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isDelegate(Landroid/database/sqlite/SQLiteDatabase;)Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isOpen()Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isOpen()Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isWriteAheadLoggingEnabled()Z PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->isWriteAheadLoggingEnabled()Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Ljava/lang/String;)Landroid/database/Cursor; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->query(Ljava/lang/String;)Landroid/database/Cursor; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->setTransactionSuccessful()V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase;->setTransactionSuccessful()V Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;->newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$$ExternalSyntheticLambda0;->newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->getWrappedDb(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$Companion;->getWrappedDb(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase$query$cursorFactory$1; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$query$cursorFactory$1;->(Landroidx/sqlite/db/SupportSQLiteQuery;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$query$cursorFactory$1;->(Landroidx/sqlite/db/SupportSQLiteQuery;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$query$cursorFactory$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/sqlite/db/framework/FrameworkSQLiteDatabase$query$cursorFactory$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;ZZ)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getAllowDataLossOnRecovery$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Z PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getAllowDataLossOnRecovery$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getCallback$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getCallback$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getContext$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Landroid/content/Context; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getContext$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Landroid/content/Context; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getName$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Ljava/lang/String; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getName$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Ljava/lang/String; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getUseNoBackupDirectory$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Z PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getUseNoBackupDirectory$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getWriteAheadLoggingEnabled$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Z PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->access$getWriteAheadLoggingEnabled$p(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)Z HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->()V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->()V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->getDb()Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->getDb()Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->setDb(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;->setDb(Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase;)V Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Z)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getSupportDatabase(Z)Landroidx/sqlite/db/SupportSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getSupportDatabase(Z)Landroidx/sqlite/db/SupportSQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb(Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWrappedDb(Landroid/database/sqlite/SQLiteDatabase;)Landroidx/sqlite/db/framework/FrameworkSQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWritableOrReadableDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->getWritableOrReadableDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->innerGetDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->innerGetDatabase(Z)Landroid/database/sqlite/SQLiteDatabase; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onCreate(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onCreate(Landroid/database/sqlite/SQLiteDatabase;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper;->onOpen(Landroid/database/sqlite/SQLiteDatabase;)V Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$$ExternalSyntheticLambda0;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$DBRefHolder;)V Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$OpenHelper$CallbackException; Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$lazyDelegate$1; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$lazyDelegate$1;->(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$lazyDelegate$1;->(Landroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$lazyDelegate$1;->invoke()Ljava/lang/Object; PLandroidx/sqlite/db/framework/FrameworkSQLiteOpenHelper$lazyDelegate$1;->invoke()Ljava/lang/Object; Landroidx/sqlite/db/framework/FrameworkSQLiteProgram; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->(Landroid/database/sqlite/SQLiteProgram;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->(Landroid/database/sqlite/SQLiteProgram;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindBlob(I[B)V PLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindBlob(I[B)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindLong(IJ)V PLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindLong(IJ)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindNull(I)V PLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindNull(I)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindString(ILjava/lang/String;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteProgram;->bindString(ILjava/lang/String;)V Landroidx/sqlite/db/framework/FrameworkSQLiteStatement; HSPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->(Landroid/database/sqlite/SQLiteStatement;)V PLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->(Landroid/database/sqlite/SQLiteStatement;)V HSPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->executeInsert()J PLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->executeInsert()J HSPLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->executeUpdateDelete()I PLandroidx/sqlite/db/framework/FrameworkSQLiteStatement;->executeUpdateDelete()I Landroidx/sqlite/util/ProcessLock; HSPLandroidx/sqlite/util/ProcessLock;->()V PLandroidx/sqlite/util/ProcessLock;->()V HSPLandroidx/sqlite/util/ProcessLock;->(Ljava/lang/String;Ljava/io/File;Z)V PLandroidx/sqlite/util/ProcessLock;->(Ljava/lang/String;Ljava/io/File;Z)V HSPLandroidx/sqlite/util/ProcessLock;->lock(Z)V PLandroidx/sqlite/util/ProcessLock;->lock(Z)V HSPLandroidx/sqlite/util/ProcessLock;->unlock()V PLandroidx/sqlite/util/ProcessLock;->unlock()V Landroidx/startup/AppInitializer; HSPLandroidx/startup/AppInitializer;->()V PLandroidx/startup/AppInitializer;->()V HSPLandroidx/startup/AppInitializer;->(Landroid/content/Context;)V PLandroidx/startup/AppInitializer;->(Landroid/content/Context;)V HSPLandroidx/startup/AppInitializer;->discoverAndInitialize(Landroid/os/Bundle;)V PLandroidx/startup/AppInitializer;->discoverAndInitialize(Landroid/os/Bundle;)V HSPLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/HashSet;)Ljava/lang/Object; PLandroidx/startup/AppInitializer;->doInitialize(Ljava/lang/Class;Ljava/util/HashSet;)Ljava/lang/Object; HSPLandroidx/startup/AppInitializer;->getInstance(Landroid/content/Context;)Landroidx/startup/AppInitializer; PLandroidx/startup/AppInitializer;->getInstance(Landroid/content/Context;)Landroidx/startup/AppInitializer; HSPLandroidx/startup/AppInitializer;->initializeComponent()Ljava/lang/Object; PLandroidx/startup/AppInitializer;->initializeComponent()Ljava/lang/Object; HSPLandroidx/startup/AppInitializer;->isEagerlyInitialized()Z PLandroidx/startup/AppInitializer;->isEagerlyInitialized()Z Landroidx/startup/InitializationProvider; HSPLandroidx/startup/InitializationProvider;->()V PLandroidx/startup/InitializationProvider;->()V HSPLandroidx/startup/InitializationProvider;->onCreate()Z PLandroidx/startup/InitializationProvider;->onCreate()Z Landroidx/startup/Initializer; Landroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0; HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m()Z PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m()Z HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroid/app/Application$ActivityLifecycleCallbacks;)V HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;)V PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;Landroidx/lifecycle/ReportFragment$LifecycleCallbacks;)V HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)V PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/Window;)V HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLParameters;[Ljava/lang/String;)V PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLParameters;[Ljava/lang/String;)V HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLSocket;)V PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLSocket;)V HSPLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLSocket;)Z PLandroidx/tracing/Trace$$ExternalSyntheticApiModelOutline0;->m(Ljavax/net/ssl/SSLSocket;)Z Landroidx/vectordrawable/graphics/drawable/VectorDrawableCommon; Landroidx/vectordrawable/graphics/drawable/VectorDrawableCompat; Landroidx/work/BackoffPolicy; HSPLandroidx/work/BackoffPolicy;->()V PLandroidx/work/BackoffPolicy;->()V HSPLandroidx/work/BackoffPolicy;->(Ljava/lang/String;I)V PLandroidx/work/BackoffPolicy;->(Ljava/lang/String;I)V Landroidx/work/Configuration; HSPLandroidx/work/Configuration;->(Lorg/acra/log/AndroidLogDelegate;)V PLandroidx/work/Configuration;->(Lorg/acra/log/AndroidLogDelegate;)V HSPLandroidx/work/Configuration;->createDefaultExecutor(Z)Ljava/util/concurrent/ExecutorService; PLandroidx/work/Configuration;->createDefaultExecutor(Z)Ljava/util/concurrent/ExecutorService; HSPLandroidx/work/Configuration;->getMaxJobSchedulerId()I PLandroidx/work/Configuration;->getMaxJobSchedulerId()I HSPLandroidx/work/Configuration;->getMaxSchedulerLimit()I PLandroidx/work/Configuration;->getMaxSchedulerLimit()I HSPLandroidx/work/Configuration;->getMinimumLoggingLevel()I PLandroidx/work/Configuration;->getMinimumLoggingLevel()I HSPLandroidx/work/Configuration;->getRunnableScheduler()Landroidx/compose/runtime/Stack; PLandroidx/work/Configuration;->getRunnableScheduler()Landroidx/compose/runtime/Stack; HSPLandroidx/work/Configuration;->getTaskExecutor()Ljava/util/concurrent/ExecutorService; PLandroidx/work/Configuration;->getTaskExecutor()Ljava/util/concurrent/ExecutorService; Landroidx/work/Configuration$1; HSPLandroidx/work/Configuration$1;->(Z)V PLandroidx/work/Configuration$1;->(Z)V HSPLandroidx/work/Configuration$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLandroidx/work/Configuration$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; Landroidx/work/Constraints; HSPLandroidx/work/Constraints;->()V PLandroidx/work/Constraints;->()V HSPLandroidx/work/Constraints;->(Landroidx/work/Constraints;)V PLandroidx/work/Constraints;->(Landroidx/work/Constraints;)V HSPLandroidx/work/Constraints;->(Landroidx/work/NetworkType;ZZI)V PLandroidx/work/Constraints;->(Landroidx/work/NetworkType;ZZI)V HSPLandroidx/work/Constraints;->(Landroidx/work/NetworkType;ZZZZJJLjava/util/Set;)V PLandroidx/work/Constraints;->(Landroidx/work/NetworkType;ZZZZJJLjava/util/Set;)V HSPLandroidx/work/Constraints;->getContentTriggerMaxDelayMillis()J PLandroidx/work/Constraints;->getContentTriggerMaxDelayMillis()J HSPLandroidx/work/Constraints;->getContentTriggerUpdateDelayMillis()J PLandroidx/work/Constraints;->getContentTriggerUpdateDelayMillis()J HSPLandroidx/work/Constraints;->getContentUriTriggers()Ljava/util/Set; PLandroidx/work/Constraints;->getContentUriTriggers()Ljava/util/Set; HSPLandroidx/work/Constraints;->getRequiredNetworkType()Landroidx/work/NetworkType; PLandroidx/work/Constraints;->getRequiredNetworkType()Landroidx/work/NetworkType; HSPLandroidx/work/Constraints;->hasContentUriTriggers()Z PLandroidx/work/Constraints;->hasContentUriTriggers()Z HSPLandroidx/work/Constraints;->requiresBatteryNotLow()Z PLandroidx/work/Constraints;->requiresBatteryNotLow()Z HSPLandroidx/work/Constraints;->requiresCharging()Z PLandroidx/work/Constraints;->requiresCharging()Z HSPLandroidx/work/Constraints;->requiresDeviceIdle()Z PLandroidx/work/Constraints;->requiresDeviceIdle()Z HSPLandroidx/work/Constraints;->requiresStorageNotLow()Z PLandroidx/work/Constraints;->requiresStorageNotLow()Z Landroidx/work/CoroutineWorker; Landroidx/work/CoroutineWorker$$ExternalSyntheticLambda0; HSPLandroidx/work/CoroutineWorker$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLandroidx/work/CoroutineWorker$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V HSPLandroidx/work/CoroutineWorker$$ExternalSyntheticLambda0;->run()V PLandroidx/work/CoroutineWorker$$ExternalSyntheticLambda0;->run()V Landroidx/work/Data; HSPLandroidx/work/Data;->()V PLandroidx/work/Data;->()V HSPLandroidx/work/Data;->(Landroidx/work/Data;)V PLandroidx/work/Data;->(Landroidx/work/Data;)V HSPLandroidx/work/Data;->(Ljava/util/HashMap;)V PLandroidx/work/Data;->(Ljava/util/HashMap;)V HSPLandroidx/work/Data;->fromByteArray([B)Landroidx/work/Data; PLandroidx/work/Data;->fromByteArray([B)Landroidx/work/Data; HSPLandroidx/work/Data;->toByteArrayInternal(Landroidx/work/Data;)[B PLandroidx/work/Data;->toByteArrayInternal(Landroidx/work/Data;)[B Landroidx/work/Data$Builder; HSPLandroidx/work/Data$Builder;->()V PLandroidx/work/Data$Builder;->()V HSPLandroidx/work/Data$Builder;->build()Landroidx/work/Data; PLandroidx/work/Data$Builder;->build()Landroidx/work/Data; HSPLandroidx/work/Data$Builder;->put(Ljava/lang/Object;Ljava/lang/String;)V PLandroidx/work/Data$Builder;->put(Ljava/lang/Object;Ljava/lang/String;)V Landroidx/work/InputMergerFactory$1; HSPLandroidx/work/InputMergerFactory$1;->()V PLandroidx/work/InputMergerFactory$1;->()V Landroidx/work/ListenableWorker; Landroidx/work/Logger$LogcatLogger; HSPLandroidx/work/Logger$LogcatLogger;->()V PLandroidx/work/Logger$LogcatLogger;->()V HSPLandroidx/work/Logger$LogcatLogger;->(I)V PLandroidx/work/Logger$LogcatLogger;->(I)V HSPLandroidx/work/Logger$LogcatLogger;->debug(Ljava/lang/String;Ljava/lang/String;)V PLandroidx/work/Logger$LogcatLogger;->debug(Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/work/Logger$LogcatLogger;->get()Landroidx/work/Logger$LogcatLogger; PLandroidx/work/Logger$LogcatLogger;->get()Landroidx/work/Logger$LogcatLogger; HSPLandroidx/work/Logger$LogcatLogger;->setLogger(Landroidx/work/Logger$LogcatLogger;)V PLandroidx/work/Logger$LogcatLogger;->setLogger(Landroidx/work/Logger$LogcatLogger;)V HSPLandroidx/work/Logger$LogcatLogger;->tagWithPrefix(Ljava/lang/String;)Ljava/lang/String; PLandroidx/work/Logger$LogcatLogger;->tagWithPrefix(Ljava/lang/String;)Ljava/lang/String; Landroidx/work/NetworkType; HSPLandroidx/work/NetworkType;->()V PLandroidx/work/NetworkType;->()V HSPLandroidx/work/NetworkType;->(Ljava/lang/String;I)V PLandroidx/work/NetworkType;->(Ljava/lang/String;I)V Landroidx/work/Operation; HSPLandroidx/work/Operation;->()V PLandroidx/work/Operation;->()V Landroidx/work/Operation$State$FAILURE; Landroidx/work/Operation$State$IN_PROGRESS; HSPLandroidx/work/Operation$State$IN_PROGRESS;->()V PLandroidx/work/Operation$State$IN_PROGRESS;->()V Landroidx/work/Operation$State$SUCCESS; HSPLandroidx/work/Operation$State$SUCCESS;->()V PLandroidx/work/Operation$State$SUCCESS;->()V Landroidx/work/OutOfQuotaPolicy; HSPLandroidx/work/OutOfQuotaPolicy;->()V PLandroidx/work/OutOfQuotaPolicy;->()V HSPLandroidx/work/OutOfQuotaPolicy;->(Ljava/lang/String;I)V PLandroidx/work/OutOfQuotaPolicy;->(Ljava/lang/String;I)V Landroidx/work/PeriodicWorkRequest; HSPLandroidx/work/PeriodicWorkRequest;->(Landroidx/work/PeriodicWorkRequest$Builder;)V PLandroidx/work/PeriodicWorkRequest;->(Landroidx/work/PeriodicWorkRequest$Builder;)V Landroidx/work/PeriodicWorkRequest$Builder; HSPLandroidx/work/PeriodicWorkRequest$Builder;->(Ljava/lang/Class;JLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/TimeUnit;)V PLandroidx/work/PeriodicWorkRequest$Builder;->(Ljava/lang/Class;JLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/TimeUnit;)V HSPLandroidx/work/PeriodicWorkRequest$Builder;->buildInternal$work_runtime_release()Landroidx/work/WorkRequest; PLandroidx/work/PeriodicWorkRequest$Builder;->buildInternal$work_runtime_release()Landroidx/work/WorkRequest; HSPLandroidx/work/PeriodicWorkRequest$Builder;->getThisObject$work_runtime_release()Landroidx/work/WorkRequest$Builder; PLandroidx/work/PeriodicWorkRequest$Builder;->getThisObject$work_runtime_release()Landroidx/work/WorkRequest$Builder; Landroidx/work/WorkInfo$State; HSPLandroidx/work/WorkInfo$State;->()V PLandroidx/work/WorkInfo$State;->()V HSPLandroidx/work/WorkInfo$State;->(Ljava/lang/String;I)V PLandroidx/work/WorkInfo$State;->(Ljava/lang/String;I)V Landroidx/work/WorkManager; HSPLandroidx/work/WorkManager;->()V PLandroidx/work/WorkManager;->()V Landroidx/work/WorkManagerInitializer; HSPLandroidx/work/WorkManagerInitializer;->()V PLandroidx/work/WorkManagerInitializer;->()V HSPLandroidx/work/WorkManagerInitializer;->()V PLandroidx/work/WorkManagerInitializer;->()V HSPLandroidx/work/WorkManagerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; PLandroidx/work/WorkManagerInitializer;->create(Landroid/content/Context;)Ljava/lang/Object; HSPLandroidx/work/WorkManagerInitializer;->dependencies()Ljava/util/List; PLandroidx/work/WorkManagerInitializer;->dependencies()Ljava/util/List; Landroidx/work/WorkRequest; HSPLandroidx/work/WorkRequest;->(Ljava/util/UUID;Landroidx/work/impl/model/WorkSpec;Ljava/util/Set;)V PLandroidx/work/WorkRequest;->(Ljava/util/UUID;Landroidx/work/impl/model/WorkSpec;Ljava/util/Set;)V HSPLandroidx/work/WorkRequest;->getStringId()Ljava/lang/String; PLandroidx/work/WorkRequest;->getStringId()Ljava/lang/String; HSPLandroidx/work/WorkRequest;->getTags()Ljava/util/Set; PLandroidx/work/WorkRequest;->getTags()Ljava/util/Set; HSPLandroidx/work/WorkRequest;->getWorkSpec()Landroidx/work/impl/model/WorkSpec; PLandroidx/work/WorkRequest;->getWorkSpec()Landroidx/work/impl/model/WorkSpec; Landroidx/work/WorkRequest$Builder; HSPLandroidx/work/WorkRequest$Builder;->(Ljava/lang/Class;)V PLandroidx/work/WorkRequest$Builder;->(Ljava/lang/Class;)V HSPLandroidx/work/WorkRequest$Builder;->addTag(Ljava/lang/String;)Landroidx/work/WorkRequest$Builder; PLandroidx/work/WorkRequest$Builder;->addTag(Ljava/lang/String;)Landroidx/work/WorkRequest$Builder; HSPLandroidx/work/WorkRequest$Builder;->build()Landroidx/work/WorkRequest; PLandroidx/work/WorkRequest$Builder;->build()Landroidx/work/WorkRequest; HSPLandroidx/work/WorkRequest$Builder;->getBackoffCriteriaSet$work_runtime_release()Z PLandroidx/work/WorkRequest$Builder;->getBackoffCriteriaSet$work_runtime_release()Z HSPLandroidx/work/WorkRequest$Builder;->getId$work_runtime_release()Ljava/util/UUID; PLandroidx/work/WorkRequest$Builder;->getId$work_runtime_release()Ljava/util/UUID; HSPLandroidx/work/WorkRequest$Builder;->getTags$work_runtime_release()Ljava/util/Set; PLandroidx/work/WorkRequest$Builder;->getTags$work_runtime_release()Ljava/util/Set; HSPLandroidx/work/WorkRequest$Builder;->getWorkSpec$work_runtime_release()Landroidx/work/impl/model/WorkSpec; PLandroidx/work/WorkRequest$Builder;->getWorkSpec$work_runtime_release()Landroidx/work/impl/model/WorkSpec; HSPLandroidx/work/WorkRequest$Builder;->setBackoffCriteria(Lj$/time/Duration;)Landroidx/work/WorkRequest$Builder; PLandroidx/work/WorkRequest$Builder;->setBackoffCriteria(Lj$/time/Duration;)Landroidx/work/WorkRequest$Builder; HSPLandroidx/work/WorkRequest$Builder;->setInputData(Landroidx/work/Data;)Landroidx/work/WorkRequest$Builder; PLandroidx/work/WorkRequest$Builder;->setInputData(Landroidx/work/Data;)Landroidx/work/WorkRequest$Builder; Landroidx/work/WorkerFactory; HSPLandroidx/work/WorkerFactory;->()V PLandroidx/work/WorkerFactory;->()V HSPLandroidx/work/WorkerFactory;->()V PLandroidx/work/WorkerFactory;->()V Landroidx/work/WorkerFactory$1; HSPLandroidx/work/WorkerFactory$1;->()V PLandroidx/work/WorkerFactory$1;->()V Landroidx/work/impl/CleanupCallback; HSPLandroidx/work/impl/CleanupCallback;->()V PLandroidx/work/impl/CleanupCallback;->()V HSPLandroidx/work/impl/CleanupCallback;->()V PLandroidx/work/impl/CleanupCallback;->()V Landroidx/work/impl/ExecutionListener; Landroidx/work/impl/Migration_11_12; HSPLandroidx/work/impl/Migration_11_12;->()V PLandroidx/work/impl/Migration_11_12;->()V HSPLandroidx/work/impl/Migration_11_12;->()V PLandroidx/work/impl/Migration_11_12;->()V Landroidx/work/impl/Migration_12_13; HSPLandroidx/work/impl/Migration_12_13;->()V PLandroidx/work/impl/Migration_12_13;->()V HSPLandroidx/work/impl/Migration_12_13;->()V PLandroidx/work/impl/Migration_12_13;->()V Landroidx/work/impl/Migration_15_16; HSPLandroidx/work/impl/Migration_15_16;->()V PLandroidx/work/impl/Migration_15_16;->()V HSPLandroidx/work/impl/Migration_15_16;->()V PLandroidx/work/impl/Migration_15_16;->()V Landroidx/work/impl/Migration_1_2; HSPLandroidx/work/impl/Migration_1_2;->()V PLandroidx/work/impl/Migration_1_2;->()V HSPLandroidx/work/impl/Migration_1_2;->()V PLandroidx/work/impl/Migration_1_2;->()V Landroidx/work/impl/Migration_3_4; HSPLandroidx/work/impl/Migration_3_4;->()V PLandroidx/work/impl/Migration_3_4;->()V HSPLandroidx/work/impl/Migration_3_4;->()V PLandroidx/work/impl/Migration_3_4;->()V Landroidx/work/impl/Migration_4_5; HSPLandroidx/work/impl/Migration_4_5;->()V PLandroidx/work/impl/Migration_4_5;->()V HSPLandroidx/work/impl/Migration_4_5;->()V PLandroidx/work/impl/Migration_4_5;->()V Landroidx/work/impl/Migration_6_7; HSPLandroidx/work/impl/Migration_6_7;->()V PLandroidx/work/impl/Migration_6_7;->()V HSPLandroidx/work/impl/Migration_6_7;->()V PLandroidx/work/impl/Migration_6_7;->()V Landroidx/work/impl/Migration_7_8; HSPLandroidx/work/impl/Migration_7_8;->()V PLandroidx/work/impl/Migration_7_8;->()V HSPLandroidx/work/impl/Migration_7_8;->()V PLandroidx/work/impl/Migration_7_8;->()V Landroidx/work/impl/Migration_8_9; HSPLandroidx/work/impl/Migration_8_9;->()V PLandroidx/work/impl/Migration_8_9;->()V HSPLandroidx/work/impl/Migration_8_9;->()V PLandroidx/work/impl/Migration_8_9;->()V Landroidx/work/impl/OperationImpl; HSPLandroidx/work/impl/OperationImpl;->()V PLandroidx/work/impl/OperationImpl;->()V HSPLandroidx/work/impl/OperationImpl;->markState(Landroidx/work/WorkManager;)V PLandroidx/work/impl/OperationImpl;->markState(Landroidx/work/WorkManager;)V Landroidx/work/impl/Processor; HSPLandroidx/work/impl/Processor;->()V PLandroidx/work/impl/Processor;->()V HSPLandroidx/work/impl/Processor;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;Landroidx/work/impl/WorkDatabase;Ljava/util/List;)V PLandroidx/work/impl/Processor;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;Landroidx/work/impl/WorkDatabase;Ljava/util/List;)V HSPLandroidx/work/impl/Processor;->addExecutionListener(Landroidx/work/impl/ExecutionListener;)V PLandroidx/work/impl/Processor;->addExecutionListener(Landroidx/work/impl/ExecutionListener;)V Landroidx/work/impl/Scheduler; Landroidx/work/impl/Schedulers; HSPLandroidx/work/impl/Schedulers;->()V PLandroidx/work/impl/Schedulers;->()V HSPLandroidx/work/impl/Schedulers;->createBestAvailableBackgroundScheduler(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)Landroidx/work/impl/background/systemjob/SystemJobScheduler; PLandroidx/work/impl/Schedulers;->createBestAvailableBackgroundScheduler(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)Landroidx/work/impl/background/systemjob/SystemJobScheduler; HSPLandroidx/work/impl/Schedulers;->schedule(Landroidx/work/Configuration;Landroidx/work/impl/WorkDatabase;Ljava/util/List;)V PLandroidx/work/impl/Schedulers;->schedule(Landroidx/work/Configuration;Landroidx/work/impl/WorkDatabase;Ljava/util/List;)V Landroidx/work/impl/WorkContinuationImpl; HSPLandroidx/work/impl/WorkContinuationImpl;->()V PLandroidx/work/impl/WorkContinuationImpl;->()V HSPLandroidx/work/impl/WorkContinuationImpl;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;ILjava/util/List;)V PLandroidx/work/impl/WorkContinuationImpl;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;ILjava/util/List;)V HSPLandroidx/work/impl/WorkContinuationImpl;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;ILjava/util/List;I)V PLandroidx/work/impl/WorkContinuationImpl;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;ILjava/util/List;I)V HSPLandroidx/work/impl/WorkContinuationImpl;->getExistingWorkPolicy$enumunboxing$()I PLandroidx/work/impl/WorkContinuationImpl;->getExistingWorkPolicy$enumunboxing$()I HSPLandroidx/work/impl/WorkContinuationImpl;->getName()Ljava/lang/String; PLandroidx/work/impl/WorkContinuationImpl;->getName()Ljava/lang/String; HSPLandroidx/work/impl/WorkContinuationImpl;->getWork()Ljava/util/List; PLandroidx/work/impl/WorkContinuationImpl;->getWork()Ljava/util/List; HSPLandroidx/work/impl/WorkContinuationImpl;->getWorkManagerImpl()Landroidx/work/impl/WorkManagerImpl; PLandroidx/work/impl/WorkContinuationImpl;->getWorkManagerImpl()Landroidx/work/impl/WorkManagerImpl; HSPLandroidx/work/impl/WorkContinuationImpl;->hasCycles()Z PLandroidx/work/impl/WorkContinuationImpl;->hasCycles()Z HSPLandroidx/work/impl/WorkContinuationImpl;->hasCycles(Landroidx/work/impl/WorkContinuationImpl;Ljava/util/HashSet;)Z PLandroidx/work/impl/WorkContinuationImpl;->hasCycles(Landroidx/work/impl/WorkContinuationImpl;Ljava/util/HashSet;)Z HSPLandroidx/work/impl/WorkContinuationImpl;->markEnqueued()V PLandroidx/work/impl/WorkContinuationImpl;->markEnqueued()V HSPLandroidx/work/impl/WorkContinuationImpl;->prerequisitesFor(Landroidx/work/impl/WorkContinuationImpl;)Ljava/util/HashSet; PLandroidx/work/impl/WorkContinuationImpl;->prerequisitesFor(Landroidx/work/impl/WorkContinuationImpl;)Ljava/util/HashSet; Landroidx/work/impl/WorkDatabase; HSPLandroidx/work/impl/WorkDatabase;->()V PLandroidx/work/impl/WorkDatabase;->()V Landroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0; HSPLandroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V PLandroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V HSPLandroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLandroidx/work/impl/WorkDatabase$Companion$$ExternalSyntheticLambda0;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; Landroidx/work/impl/WorkDatabaseKt; HSPLandroidx/work/impl/WorkDatabaseKt;->()V PLandroidx/work/impl/WorkDatabaseKt;->()V HSPLandroidx/work/impl/WorkDatabaseKt;->access$getPRUNE_THRESHOLD_MILLIS$p()J PLandroidx/work/impl/WorkDatabaseKt;->access$getPRUNE_THRESHOLD_MILLIS$p()J Landroidx/work/impl/WorkDatabase_AutoMigration_13_14_Impl; HSPLandroidx/work/impl/WorkDatabase_AutoMigration_13_14_Impl;->()V PLandroidx/work/impl/WorkDatabase_AutoMigration_13_14_Impl;->()V Landroidx/work/impl/WorkDatabase_Impl; HSPLandroidx/work/impl/WorkDatabase_Impl;->()V PLandroidx/work/impl/WorkDatabase_Impl;->()V HSPLandroidx/work/impl/WorkDatabase_Impl;->access$1000(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->access$1000(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->access$300(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->access$300(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->access$400(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->access$400(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->access$500(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->access$500(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->access$602(Landroidx/work/impl/WorkDatabase_Impl;Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/work/impl/WorkDatabase_Impl;->access$602(Landroidx/work/impl/WorkDatabase_Impl;Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/work/impl/WorkDatabase_Impl;->access$700(Landroidx/work/impl/WorkDatabase_Impl;Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/work/impl/WorkDatabase_Impl;->access$700(Landroidx/work/impl/WorkDatabase_Impl;Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/work/impl/WorkDatabase_Impl;->access$800(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->access$800(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->access$900(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->access$900(Landroidx/work/impl/WorkDatabase_Impl;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; PLandroidx/work/impl/WorkDatabase_Impl;->createInvalidationTracker()Landroidx/room/InvalidationTracker; HSPLandroidx/work/impl/WorkDatabase_Impl;->createOpenHelper(Landroidx/room/DatabaseConfiguration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLandroidx/work/impl/WorkDatabase_Impl;->createOpenHelper(Landroidx/room/DatabaseConfiguration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; HSPLandroidx/work/impl/WorkDatabase_Impl;->getAutoMigrations(Ljava/util/LinkedHashMap;)Ljava/util/List; PLandroidx/work/impl/WorkDatabase_Impl;->getAutoMigrations(Ljava/util/LinkedHashMap;)Ljava/util/List; HSPLandroidx/work/impl/WorkDatabase_Impl;->getRequiredAutoMigrationSpecs()Ljava/util/Set; PLandroidx/work/impl/WorkDatabase_Impl;->getRequiredAutoMigrationSpecs()Ljava/util/Set; HSPLandroidx/work/impl/WorkDatabase_Impl;->getRequiredTypeConverters()Ljava/util/Map; PLandroidx/work/impl/WorkDatabase_Impl;->getRequiredTypeConverters()Ljava/util/Map; HSPLandroidx/work/impl/WorkDatabase_Impl;->preferenceDao()Landroidx/work/impl/model/PreferenceDao_Impl; PLandroidx/work/impl/WorkDatabase_Impl;->preferenceDao()Landroidx/work/impl/model/PreferenceDao_Impl; HSPLandroidx/work/impl/WorkDatabase_Impl;->systemIdInfoDao()Landroidx/work/impl/model/SystemIdInfoDao_Impl; PLandroidx/work/impl/WorkDatabase_Impl;->systemIdInfoDao()Landroidx/work/impl/model/SystemIdInfoDao_Impl; HSPLandroidx/work/impl/WorkDatabase_Impl;->workNameDao()Landroidx/work/impl/model/WorkNameDao_Impl; PLandroidx/work/impl/WorkDatabase_Impl;->workNameDao()Landroidx/work/impl/model/WorkNameDao_Impl; HSPLandroidx/work/impl/WorkDatabase_Impl;->workProgressDao()Landroidx/work/impl/model/WorkProgressDao_Impl; PLandroidx/work/impl/WorkDatabase_Impl;->workProgressDao()Landroidx/work/impl/model/WorkProgressDao_Impl; HSPLandroidx/work/impl/WorkDatabase_Impl;->workSpecDao()Landroidx/work/impl/model/WorkSpecDao_Impl; PLandroidx/work/impl/WorkDatabase_Impl;->workSpecDao()Landroidx/work/impl/model/WorkSpecDao_Impl; HSPLandroidx/work/impl/WorkDatabase_Impl;->workTagDao()Landroidx/work/impl/model/WorkTagDao_Impl; PLandroidx/work/impl/WorkDatabase_Impl;->workTagDao()Landroidx/work/impl/model/WorkTagDao_Impl; Landroidx/work/impl/WorkDatabase_Impl$1; HSPLandroidx/work/impl/WorkDatabase_Impl$1;->(Landroidx/work/impl/WorkDatabase_Impl;)V PLandroidx/work/impl/WorkDatabase_Impl$1;->(Landroidx/work/impl/WorkDatabase_Impl;)V HSPLandroidx/work/impl/WorkDatabase_Impl$1;->createAllTables(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/work/impl/WorkDatabase_Impl$1;->createAllTables(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/work/impl/WorkDatabase_Impl$1;->onCreate(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/work/impl/WorkDatabase_Impl$1;->onCreate(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLandroidx/work/impl/WorkDatabase_Impl$1;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLandroidx/work/impl/WorkDatabase_Impl$1;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V Landroidx/work/impl/WorkManagerImpl; HSPLandroidx/work/impl/WorkManagerImpl;->()V PLandroidx/work/impl/WorkManagerImpl;->()V HSPLandroidx/work/impl/WorkManagerImpl;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V PLandroidx/work/impl/WorkManagerImpl;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V HSPLandroidx/work/impl/WorkManagerImpl;->cancelUniqueWork(Ljava/lang/String;)Landroidx/work/impl/OperationImpl; PLandroidx/work/impl/WorkManagerImpl;->cancelUniqueWork(Ljava/lang/String;)Landroidx/work/impl/OperationImpl; HSPLandroidx/work/impl/WorkManagerImpl;->enqueueUniquePeriodicWork(Ljava/lang/String;Landroidx/work/PeriodicWorkRequest;)Landroidx/work/Operation; PLandroidx/work/impl/WorkManagerImpl;->enqueueUniquePeriodicWork(Ljava/lang/String;Landroidx/work/PeriodicWorkRequest;)Landroidx/work/Operation; HSPLandroidx/work/impl/WorkManagerImpl;->getApplicationContext()Landroid/content/Context; PLandroidx/work/impl/WorkManagerImpl;->getApplicationContext()Landroid/content/Context; HSPLandroidx/work/impl/WorkManagerImpl;->getConfiguration()Landroidx/work/Configuration; PLandroidx/work/impl/WorkManagerImpl;->getConfiguration()Landroidx/work/Configuration; HSPLandroidx/work/impl/WorkManagerImpl;->getInstance(Landroid/content/Context;)Landroidx/work/impl/WorkManagerImpl; PLandroidx/work/impl/WorkManagerImpl;->getInstance(Landroid/content/Context;)Landroidx/work/impl/WorkManagerImpl; HSPLandroidx/work/impl/WorkManagerImpl;->getPreferenceUtils()Landroidx/work/impl/utils/IdGenerator; PLandroidx/work/impl/WorkManagerImpl;->getPreferenceUtils()Landroidx/work/impl/utils/IdGenerator; HSPLandroidx/work/impl/WorkManagerImpl;->getProcessor()Landroidx/work/impl/Processor; PLandroidx/work/impl/WorkManagerImpl;->getProcessor()Landroidx/work/impl/Processor; HSPLandroidx/work/impl/WorkManagerImpl;->getSchedulers()Ljava/util/List; PLandroidx/work/impl/WorkManagerImpl;->getSchedulers()Ljava/util/List; HSPLandroidx/work/impl/WorkManagerImpl;->getWorkDatabase()Landroidx/work/impl/WorkDatabase; PLandroidx/work/impl/WorkManagerImpl;->getWorkDatabase()Landroidx/work/impl/WorkDatabase; HSPLandroidx/work/impl/WorkManagerImpl;->initialize(Landroid/content/Context;Landroidx/work/Configuration;)V PLandroidx/work/impl/WorkManagerImpl;->initialize(Landroid/content/Context;Landroidx/work/Configuration;)V HSPLandroidx/work/impl/WorkManagerImpl;->onForceStopRunnableCompleted()V PLandroidx/work/impl/WorkManagerImpl;->onForceStopRunnableCompleted()V Landroidx/work/impl/WorkManagerImpl$Api24Impl; HSPLandroidx/work/impl/WorkManagerImpl$Api24Impl;->isDeviceProtectedStorage(Landroid/content/Context;)Z PLandroidx/work/impl/WorkManagerImpl$Api24Impl;->isDeviceProtectedStorage(Landroid/content/Context;)Z Landroidx/work/impl/WorkMigration9To10; HSPLandroidx/work/impl/WorkMigration9To10;->()V PLandroidx/work/impl/WorkMigration9To10;->()V HSPLandroidx/work/impl/WorkMigration9To10;->(Landroid/content/Context;)V PLandroidx/work/impl/WorkMigration9To10;->(Landroid/content/Context;)V HSPLandroidx/work/impl/WorkMigration9To10;->(Landroid/content/Context;II)V PLandroidx/work/impl/WorkMigration9To10;->(Landroid/content/Context;II)V Landroidx/work/impl/WorkerUpdater; HSPLandroidx/work/impl/WorkerUpdater;->$r8$lambda$7opHgdrAWKd7YI0k0hRwdd6vZCE(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Landroidx/work/impl/OperationImpl;Lkotlin/jvm/functions/Function0;Landroidx/work/WorkRequest;)V PLandroidx/work/impl/WorkerUpdater;->$r8$lambda$7opHgdrAWKd7YI0k0hRwdd6vZCE(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Landroidx/work/impl/OperationImpl;Lkotlin/jvm/functions/Function0;Landroidx/work/WorkRequest;)V HSPLandroidx/work/impl/WorkerUpdater;->migrateDatabase(Landroid/content/Context;)V PLandroidx/work/impl/WorkerUpdater;->migrateDatabase(Landroid/content/Context;)V Landroidx/work/impl/WorkerUpdater$$ExternalSyntheticLambda0; HSPLandroidx/work/impl/WorkerUpdater$$ExternalSyntheticLambda0;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Landroidx/work/impl/OperationImpl;Lkotlin/jvm/functions/Function0;Landroidx/work/WorkRequest;)V PLandroidx/work/impl/WorkerUpdater$$ExternalSyntheticLambda0;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Landroidx/work/impl/OperationImpl;Lkotlin/jvm/functions/Function0;Landroidx/work/WorkRequest;)V HSPLandroidx/work/impl/WorkerUpdater$$ExternalSyntheticLambda0;->run()V PLandroidx/work/impl/WorkerUpdater$$ExternalSyntheticLambda0;->run()V Landroidx/work/impl/WorkerUpdater$enqueueUniquelyNamedPeriodic$enqueueNew$1; HSPLandroidx/work/impl/WorkerUpdater$enqueueUniquelyNamedPeriodic$enqueueNew$1;->(Landroidx/work/WorkRequest;Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Landroidx/work/impl/OperationImpl;)V PLandroidx/work/impl/WorkerUpdater$enqueueUniquelyNamedPeriodic$enqueueNew$1;->(Landroidx/work/WorkRequest;Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Landroidx/work/impl/OperationImpl;)V HSPLandroidx/work/impl/WorkerUpdater$enqueueUniquelyNamedPeriodic$enqueueNew$1;->invoke()Ljava/lang/Object; PLandroidx/work/impl/WorkerUpdater$enqueueUniquelyNamedPeriodic$enqueueNew$1;->invoke()Ljava/lang/Object; Landroidx/work/impl/background/greedy/DelayedWorkTracker; HSPLandroidx/work/impl/background/greedy/DelayedWorkTracker;->()V PLandroidx/work/impl/background/greedy/DelayedWorkTracker;->()V HSPLandroidx/work/impl/background/greedy/DelayedWorkTracker;->(Landroidx/work/impl/background/greedy/GreedyScheduler;Landroidx/compose/runtime/Stack;)V PLandroidx/work/impl/background/greedy/DelayedWorkTracker;->(Landroidx/work/impl/background/greedy/GreedyScheduler;Landroidx/compose/runtime/Stack;)V HSPLandroidx/work/impl/background/greedy/DelayedWorkTracker;->schedule(Landroidx/work/impl/model/WorkSpec;)V PLandroidx/work/impl/background/greedy/DelayedWorkTracker;->schedule(Landroidx/work/impl/model/WorkSpec;)V Landroidx/work/impl/background/greedy/DelayedWorkTracker$1; HSPLandroidx/work/impl/background/greedy/DelayedWorkTracker$1;->(Landroidx/work/impl/background/greedy/DelayedWorkTracker;Landroidx/work/impl/model/WorkSpec;)V PLandroidx/work/impl/background/greedy/DelayedWorkTracker$1;->(Landroidx/work/impl/background/greedy/DelayedWorkTracker;Landroidx/work/impl/model/WorkSpec;)V Landroidx/work/impl/background/greedy/GreedyScheduler; HSPLandroidx/work/impl/background/greedy/GreedyScheduler;->()V PLandroidx/work/impl/background/greedy/GreedyScheduler;->()V HSPLandroidx/work/impl/background/greedy/GreedyScheduler;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/WorkManagerImpl;)V PLandroidx/work/impl/background/greedy/GreedyScheduler;->(Landroid/content/Context;Landroidx/work/Configuration;Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/WorkManagerImpl;)V HSPLandroidx/work/impl/background/greedy/GreedyScheduler;->hasLimitedSchedulingSlots()Z PLandroidx/work/impl/background/greedy/GreedyScheduler;->hasLimitedSchedulingSlots()Z HSPLandroidx/work/impl/background/greedy/GreedyScheduler;->schedule([Landroidx/work/impl/model/WorkSpec;)V PLandroidx/work/impl/background/greedy/GreedyScheduler;->schedule([Landroidx/work/impl/model/WorkSpec;)V Landroidx/work/impl/background/systemalarm/RescheduleReceiver; Landroidx/work/impl/background/systemjob/SystemJobInfoConverter; HSPLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->()V PLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->()V HSPLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->(Landroid/content/Context;)V PLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->(Landroid/content/Context;)V HSPLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->convert(Landroidx/work/impl/model/WorkSpec;I)Landroid/app/job/JobInfo; PLandroidx/work/impl/background/systemjob/SystemJobInfoConverter;->convert(Landroidx/work/impl/model/WorkSpec;I)Landroid/app/job/JobInfo; Landroidx/work/impl/background/systemjob/SystemJobScheduler; HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->()V PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->()V HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)V PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)V HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->getPendingJobs(Landroid/content/Context;Landroid/app/job/JobScheduler;)Ljava/util/ArrayList; PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->getPendingJobs(Landroid/content/Context;Landroid/app/job/JobScheduler;)Ljava/util/ArrayList; HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->hasLimitedSchedulingSlots()Z PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->hasLimitedSchedulingSlots()Z HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->reconcileJobs(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)Z PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->reconcileJobs(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)Z HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->schedule([Landroidx/work/impl/model/WorkSpec;)V PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->schedule([Landroidx/work/impl/model/WorkSpec;)V HSPLandroidx/work/impl/background/systemjob/SystemJobScheduler;->scheduleInternal(Landroidx/work/impl/model/WorkSpec;I)V PLandroidx/work/impl/background/systemjob/SystemJobScheduler;->scheduleInternal(Landroidx/work/impl/model/WorkSpec;I)V Landroidx/work/impl/background/systemjob/SystemJobService; Landroidx/work/impl/constraints/WorkConstraintsCallback; Landroidx/work/impl/constraints/WorkConstraintsTrackerImpl; HSPLandroidx/work/impl/constraints/WorkConstraintsTrackerImpl;->(Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/constraints/WorkConstraintsCallback;)V PLandroidx/work/impl/constraints/WorkConstraintsTrackerImpl;->(Landroidx/work/impl/constraints/trackers/Trackers;Landroidx/work/impl/constraints/WorkConstraintsCallback;)V Landroidx/work/impl/constraints/controllers/BatteryNotLowController; HSPLandroidx/work/impl/constraints/controllers/BatteryNotLowController;->(Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker;)V PLandroidx/work/impl/constraints/controllers/BatteryNotLowController;->(Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker;)V HSPLandroidx/work/impl/constraints/controllers/BatteryNotLowController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;I)V PLandroidx/work/impl/constraints/controllers/BatteryNotLowController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;I)V Landroidx/work/impl/constraints/controllers/ConstraintController; HSPLandroidx/work/impl/constraints/controllers/ConstraintController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V PLandroidx/work/impl/constraints/controllers/ConstraintController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V Landroidx/work/impl/constraints/controllers/NetworkMeteredController; HSPLandroidx/work/impl/constraints/controllers/NetworkMeteredController;->()V PLandroidx/work/impl/constraints/controllers/NetworkMeteredController;->()V HSPLandroidx/work/impl/constraints/controllers/NetworkMeteredController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V PLandroidx/work/impl/constraints/controllers/NetworkMeteredController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V Landroidx/work/impl/constraints/controllers/NetworkNotRoamingController; HSPLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController;->()V PLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController;->()V HSPLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V PLandroidx/work/impl/constraints/controllers/NetworkNotRoamingController;->(Landroidx/work/impl/constraints/trackers/ConstraintTracker;)V Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker; HSPLandroidx/work/impl/constraints/trackers/BatteryNotLowTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;I)V PLandroidx/work/impl/constraints/trackers/BatteryNotLowTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;I)V Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker; HSPLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V PLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broadcastReceiver$1; HSPLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broadcastReceiver$1;->(Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;)V PLandroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker$broadcastReceiver$1;->(Landroidx/work/impl/constraints/trackers/BroadcastReceiverConstraintTracker;)V Landroidx/work/impl/constraints/trackers/ConstraintTracker; HSPLandroidx/work/impl/constraints/trackers/ConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V PLandroidx/work/impl/constraints/trackers/ConstraintTracker;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V HSPLandroidx/work/impl/constraints/trackers/ConstraintTracker;->getAppContext()Landroid/content/Context; PLandroidx/work/impl/constraints/trackers/ConstraintTracker;->getAppContext()Landroid/content/Context; Landroidx/work/impl/constraints/trackers/NetworkStateTracker24; HSPLandroidx/work/impl/constraints/trackers/NetworkStateTracker24;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V PLandroidx/work/impl/constraints/trackers/NetworkStateTracker24;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V Landroidx/work/impl/constraints/trackers/NetworkStateTracker24$networkCallback$1; HSPLandroidx/work/impl/constraints/trackers/NetworkStateTracker24$networkCallback$1;->(Landroidx/work/impl/constraints/trackers/NetworkStateTracker24;)V PLandroidx/work/impl/constraints/trackers/NetworkStateTracker24$networkCallback$1;->(Landroidx/work/impl/constraints/trackers/NetworkStateTracker24;)V Landroidx/work/impl/constraints/trackers/NetworkStateTrackerKt; HSPLandroidx/work/impl/constraints/trackers/NetworkStateTrackerKt;->()V PLandroidx/work/impl/constraints/trackers/NetworkStateTrackerKt;->()V Landroidx/work/impl/constraints/trackers/Trackers; HSPLandroidx/work/impl/constraints/trackers/Trackers;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V PLandroidx/work/impl/constraints/trackers/Trackers;->(Landroid/content/Context;Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V HSPLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryChargingTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; PLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryChargingTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; HSPLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryNotLowTracker()Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker; PLandroidx/work/impl/constraints/trackers/Trackers;->getBatteryNotLowTracker()Landroidx/work/impl/constraints/trackers/BatteryNotLowTracker; HSPLandroidx/work/impl/constraints/trackers/Trackers;->getNetworkStateTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; PLandroidx/work/impl/constraints/trackers/Trackers;->getNetworkStateTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; HSPLandroidx/work/impl/constraints/trackers/Trackers;->getStorageNotLowTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; PLandroidx/work/impl/constraints/trackers/Trackers;->getStorageNotLowTracker()Landroidx/work/impl/constraints/trackers/ConstraintTracker; Landroidx/work/impl/foreground/ForegroundProcessor; Landroidx/work/impl/model/DependencyDao_Impl; Landroidx/work/impl/model/Preference; HSPLandroidx/work/impl/model/Preference;->(Ljava/lang/Long;Ljava/lang/String;)V PLandroidx/work/impl/model/Preference;->(Ljava/lang/Long;Ljava/lang/String;)V HSPLandroidx/work/impl/model/Preference;->getKey()Ljava/lang/String; PLandroidx/work/impl/model/Preference;->getKey()Ljava/lang/String; HSPLandroidx/work/impl/model/Preference;->getValue()Ljava/lang/Long; PLandroidx/work/impl/model/Preference;->getValue()Ljava/lang/Long; Landroidx/work/impl/model/PreferenceDao_Impl; HSPLandroidx/work/impl/model/PreferenceDao_Impl;->(Landroidx/work/impl/WorkDatabase;)V PLandroidx/work/impl/model/PreferenceDao_Impl;->(Landroidx/work/impl/WorkDatabase;)V HSPLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue(Ljava/lang/String;)Ljava/lang/Long; PLandroidx/work/impl/model/PreferenceDao_Impl;->getLongValue(Ljava/lang/String;)Ljava/lang/Long; HSPLandroidx/work/impl/model/PreferenceDao_Impl;->insertPreference(Landroidx/work/impl/model/Preference;)V PLandroidx/work/impl/model/PreferenceDao_Impl;->insertPreference(Landroidx/work/impl/model/Preference;)V Landroidx/work/impl/model/RawWorkInfoDao_Impl; Landroidx/work/impl/model/SystemIdInfo; HSPLandroidx/work/impl/model/SystemIdInfo;->(Ljava/lang/String;II)V PLandroidx/work/impl/model/SystemIdInfo;->(Ljava/lang/String;II)V HSPLandroidx/work/impl/model/SystemIdInfo;->getGeneration()I PLandroidx/work/impl/model/SystemIdInfo;->getGeneration()I Landroidx/work/impl/model/SystemIdInfoDao_Impl; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->(Landroidx/room/RoomDatabase;)V PLandroidx/work/impl/model/SystemIdInfoDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getSystemIdInfo(ILjava/lang/String;)Landroidx/work/impl/model/SystemIdInfo; PLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getSystemIdInfo(ILjava/lang/String;)Landroidx/work/impl/model/SystemIdInfo; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getSystemIdInfo(Landroidx/work/impl/model/WorkGenerationalId;)Landroidx/work/impl/model/SystemIdInfo; PLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getSystemIdInfo(Landroidx/work/impl/model/WorkGenerationalId;)Landroidx/work/impl/model/SystemIdInfo; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds()Ljava/util/ArrayList; PLandroidx/work/impl/model/SystemIdInfoDao_Impl;->getWorkSpecIds()Ljava/util/ArrayList; HSPLandroidx/work/impl/model/SystemIdInfoDao_Impl;->insertSystemIdInfo(Landroidx/work/impl/model/SystemIdInfo;)V PLandroidx/work/impl/model/SystemIdInfoDao_Impl;->insertSystemIdInfo(Landroidx/work/impl/model/SystemIdInfo;)V Landroidx/work/impl/model/WorkGenerationalId; HSPLandroidx/work/impl/model/WorkGenerationalId;->(Ljava/lang/String;I)V PLandroidx/work/impl/model/WorkGenerationalId;->(Ljava/lang/String;I)V HSPLandroidx/work/impl/model/WorkGenerationalId;->getGeneration()I PLandroidx/work/impl/model/WorkGenerationalId;->getGeneration()I HSPLandroidx/work/impl/model/WorkGenerationalId;->getWorkSpecId()Ljava/lang/String; PLandroidx/work/impl/model/WorkGenerationalId;->getWorkSpecId()Ljava/lang/String; HSPLandroidx/work/impl/model/WorkGenerationalId;->hashCode()I PLandroidx/work/impl/model/WorkGenerationalId;->hashCode()I Landroidx/work/impl/model/WorkName; HSPLandroidx/work/impl/model/WorkName;->(Ljava/lang/String;Ljava/lang/String;)V PLandroidx/work/impl/model/WorkName;->(Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/work/impl/model/WorkName;->getName()Ljava/lang/String; PLandroidx/work/impl/model/WorkName;->getName()Ljava/lang/String; HSPLandroidx/work/impl/model/WorkName;->getWorkSpecId()Ljava/lang/String; PLandroidx/work/impl/model/WorkName;->getWorkSpecId()Ljava/lang/String; Landroidx/work/impl/model/WorkNameDao_Impl; HSPLandroidx/work/impl/model/WorkNameDao_Impl;->(Landroidx/room/RoomDatabase;)V PLandroidx/work/impl/model/WorkNameDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/WorkNameDao_Impl;->insert(Landroidx/work/impl/model/WorkName;)V PLandroidx/work/impl/model/WorkNameDao_Impl;->insert(Landroidx/work/impl/model/WorkName;)V Landroidx/work/impl/model/WorkProgressDao_Impl; HSPLandroidx/work/impl/model/WorkProgressDao_Impl;->(Landroidx/room/RoomDatabase;)V PLandroidx/work/impl/model/WorkProgressDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll()V PLandroidx/work/impl/model/WorkProgressDao_Impl;->deleteAll()V Landroidx/work/impl/model/WorkProgressDao_Impl$2; HSPLandroidx/work/impl/model/WorkProgressDao_Impl$2;->(Landroidx/room/RoomDatabase;I)V PLandroidx/work/impl/model/WorkProgressDao_Impl$2;->(Landroidx/room/RoomDatabase;I)V HSPLandroidx/work/impl/model/WorkProgressDao_Impl$2;->createQuery()Ljava/lang/String; PLandroidx/work/impl/model/WorkProgressDao_Impl$2;->createQuery()Ljava/lang/String; Landroidx/work/impl/model/WorkSpec; HSPLandroidx/work/impl/model/WorkSpec;->()V PLandroidx/work/impl/model/WorkSpec;->()V HSPLandroidx/work/impl/model/WorkSpec;->(Ljava/lang/String;Landroidx/work/WorkInfo$State;Ljava/lang/String;Ljava/lang/String;Landroidx/work/Data;Landroidx/work/Data;JJJLandroidx/work/Constraints;ILandroidx/work/BackoffPolicy;JJJJZLandroidx/work/OutOfQuotaPolicy;II)V PLandroidx/work/impl/model/WorkSpec;->(Ljava/lang/String;Landroidx/work/WorkInfo$State;Ljava/lang/String;Ljava/lang/String;Landroidx/work/Data;Landroidx/work/Data;JJJLandroidx/work/Constraints;ILandroidx/work/BackoffPolicy;JJJJZLandroidx/work/OutOfQuotaPolicy;II)V HSPLandroidx/work/impl/model/WorkSpec;->(Ljava/lang/String;Landroidx/work/WorkInfo$State;Ljava/lang/String;Ljava/lang/String;Landroidx/work/Data;Landroidx/work/Data;JJJLandroidx/work/Constraints;ILandroidx/work/BackoffPolicy;JJJJZLandroidx/work/OutOfQuotaPolicy;III)V PLandroidx/work/impl/model/WorkSpec;->(Ljava/lang/String;Landroidx/work/WorkInfo$State;Ljava/lang/String;Ljava/lang/String;Landroidx/work/Data;Landroidx/work/Data;JJJLandroidx/work/Constraints;ILandroidx/work/BackoffPolicy;JJJJZLandroidx/work/OutOfQuotaPolicy;III)V HSPLandroidx/work/impl/model/WorkSpec;->(Ljava/lang/String;Landroidx/work/impl/model/WorkSpec;)V PLandroidx/work/impl/model/WorkSpec;->(Ljava/lang/String;Landroidx/work/impl/model/WorkSpec;)V HSPLandroidx/work/impl/model/WorkSpec;->calculateNextRunTime()J PLandroidx/work/impl/model/WorkSpec;->calculateNextRunTime()J HSPLandroidx/work/impl/model/WorkSpec;->getGeneration()I PLandroidx/work/impl/model/WorkSpec;->getGeneration()I HSPLandroidx/work/impl/model/WorkSpec;->getPeriodCount()I PLandroidx/work/impl/model/WorkSpec;->getPeriodCount()I HSPLandroidx/work/impl/model/WorkSpec;->isPeriodic()Z PLandroidx/work/impl/model/WorkSpec;->isPeriodic()Z HSPLandroidx/work/impl/model/WorkSpec;->setBackoffDelayDuration(J)V PLandroidx/work/impl/model/WorkSpec;->setBackoffDelayDuration(J)V HSPLandroidx/work/impl/model/WorkSpec;->setPeriodic(JJ)V PLandroidx/work/impl/model/WorkSpec;->setPeriodic(JJ)V Landroidx/work/impl/model/WorkSpec$IdAndState; Landroidx/work/impl/model/WorkSpecDao_Impl; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->(Landroidx/room/RoomDatabase;)V PLandroidx/work/impl/model/WorkSpecDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling()Ljava/util/ArrayList; PLandroidx/work/impl/model/WorkSpecDao_Impl;->getAllEligibleWorkSpecsForScheduling()Ljava/util/ArrayList; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling(I)Ljava/util/ArrayList; PLandroidx/work/impl/model/WorkSpecDao_Impl;->getEligibleWorkForScheduling(I)Ljava/util/ArrayList; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork()Ljava/util/ArrayList; PLandroidx/work/impl/model/WorkSpecDao_Impl;->getRunningWork()Ljava/util/ArrayList; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName(Ljava/lang/String;)Ljava/util/ArrayList; PLandroidx/work/impl/model/WorkSpecDao_Impl;->getUnfinishedWorkWithName(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkSpec(Ljava/lang/String;)Landroidx/work/impl/model/WorkSpec; PLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkSpec(Ljava/lang/String;)Landroidx/work/impl/model/WorkSpec; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkSpecIdAndStatesForName(Ljava/lang/String;)Ljava/util/ArrayList; PLandroidx/work/impl/model/WorkSpecDao_Impl;->getWorkSpecIdAndStatesForName(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->insertWorkSpec(Landroidx/work/impl/model/WorkSpec;)V PLandroidx/work/impl/model/WorkSpecDao_Impl;->insertWorkSpec(Landroidx/work/impl/model/WorkSpec;)V HSPLandroidx/work/impl/model/WorkSpecDao_Impl;->markWorkSpecScheduled(JLjava/lang/String;)V PLandroidx/work/impl/model/WorkSpecDao_Impl;->markWorkSpecScheduled(JLjava/lang/String;)V Landroidx/work/impl/model/WorkSpecDao_Impl$2; HSPLandroidx/work/impl/model/WorkSpecDao_Impl$2;->(Landroidx/room/RoomDatabase;)V PLandroidx/work/impl/model/WorkSpecDao_Impl$2;->(Landroidx/room/RoomDatabase;)V Landroidx/work/impl/model/WorkSpecDao_Impl$3; HSPLandroidx/work/impl/model/WorkSpecDao_Impl$3;->(Landroidx/room/RoomDatabase;I)V PLandroidx/work/impl/model/WorkSpecDao_Impl$3;->(Landroidx/room/RoomDatabase;I)V HSPLandroidx/work/impl/model/WorkSpecDao_Impl$3;->createQuery()Ljava/lang/String; PLandroidx/work/impl/model/WorkSpecDao_Impl$3;->createQuery()Ljava/lang/String; Landroidx/work/impl/model/WorkTag; HSPLandroidx/work/impl/model/WorkTag;->(Ljava/lang/String;Ljava/lang/String;)V PLandroidx/work/impl/model/WorkTag;->(Ljava/lang/String;Ljava/lang/String;)V HSPLandroidx/work/impl/model/WorkTag;->getTag()Ljava/lang/String; PLandroidx/work/impl/model/WorkTag;->getTag()Ljava/lang/String; HSPLandroidx/work/impl/model/WorkTag;->getWorkSpecId()Ljava/lang/String; PLandroidx/work/impl/model/WorkTag;->getWorkSpecId()Ljava/lang/String; Landroidx/work/impl/model/WorkTagDao_Impl; HSPLandroidx/work/impl/model/WorkTagDao_Impl;->(Landroidx/room/RoomDatabase;)V PLandroidx/work/impl/model/WorkTagDao_Impl;->(Landroidx/room/RoomDatabase;)V HSPLandroidx/work/impl/model/WorkTagDao_Impl;->insert(Landroidx/work/impl/model/WorkTag;)V PLandroidx/work/impl/model/WorkTagDao_Impl;->insert(Landroidx/work/impl/model/WorkTag;)V HSPLandroidx/work/impl/model/WorkTagDao_Impl;->insertTags(Ljava/lang/String;Ljava/util/Set;)V PLandroidx/work/impl/model/WorkTagDao_Impl;->insertTags(Ljava/lang/String;Ljava/util/Set;)V Landroidx/work/impl/model/WorkTagDao_Impl$1; HSPLandroidx/work/impl/model/WorkTagDao_Impl$1;->(Ljava/lang/Object;Landroidx/room/RoomDatabase;I)V PLandroidx/work/impl/model/WorkTagDao_Impl$1;->(Ljava/lang/Object;Landroidx/room/RoomDatabase;I)V HSPLandroidx/work/impl/model/WorkTagDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V PLandroidx/work/impl/model/WorkTagDao_Impl$1;->bind(Landroidx/sqlite/db/SupportSQLiteStatement;Ljava/lang/Object;)V HSPLandroidx/work/impl/model/WorkTagDao_Impl$1;->createQuery()Ljava/lang/String; PLandroidx/work/impl/model/WorkTagDao_Impl$1;->createQuery()Ljava/lang/String; Landroidx/work/impl/model/WorkTagDao_Impl$2; HSPLandroidx/work/impl/model/WorkTagDao_Impl$2;->(Ljava/lang/Object;Landroidx/room/RoomDatabase;I)V PLandroidx/work/impl/model/WorkTagDao_Impl$2;->(Ljava/lang/Object;Landroidx/room/RoomDatabase;I)V Landroidx/work/impl/utils/Api28Impl; HSPLandroidx/work/impl/utils/Api28Impl;->()V PLandroidx/work/impl/utils/Api28Impl;->()V HSPLandroidx/work/impl/utils/Api28Impl;->()V PLandroidx/work/impl/utils/Api28Impl;->()V HSPLandroidx/work/impl/utils/Api28Impl;->getProcessName()Ljava/lang/String; PLandroidx/work/impl/utils/Api28Impl;->getProcessName()Ljava/lang/String; Landroidx/work/impl/utils/CancelWorkRunnable$3; HSPLandroidx/work/impl/utils/CancelWorkRunnable$3;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Z)V PLandroidx/work/impl/utils/CancelWorkRunnable$3;->(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;Z)V HSPLandroidx/work/impl/utils/CancelWorkRunnable$3;->runInternal()V PLandroidx/work/impl/utils/CancelWorkRunnable$3;->runInternal()V Landroidx/work/impl/utils/DurationApi26Impl; HSPLandroidx/work/impl/utils/DurationApi26Impl;->toMillisCompat(Lj$/time/Duration;)J PLandroidx/work/impl/utils/DurationApi26Impl;->toMillisCompat(Lj$/time/Duration;)J Landroidx/work/impl/utils/EnqueueRunnable; HSPLandroidx/work/impl/utils/EnqueueRunnable;->()V PLandroidx/work/impl/utils/EnqueueRunnable;->()V HSPLandroidx/work/impl/utils/EnqueueRunnable;->(Landroidx/work/impl/WorkContinuationImpl;Landroidx/work/impl/OperationImpl;)V PLandroidx/work/impl/utils/EnqueueRunnable;->(Landroidx/work/impl/WorkContinuationImpl;Landroidx/work/impl/OperationImpl;)V HSPLandroidx/work/impl/utils/EnqueueRunnable;->processContinuation(Landroidx/work/impl/WorkContinuationImpl;)Z PLandroidx/work/impl/utils/EnqueueRunnable;->processContinuation(Landroidx/work/impl/WorkContinuationImpl;)Z HSPLandroidx/work/impl/utils/EnqueueRunnable;->run()V PLandroidx/work/impl/utils/EnqueueRunnable;->run()V Landroidx/work/impl/utils/ForceStopRunnable; HSPLandroidx/work/impl/utils/ForceStopRunnable;->()V PLandroidx/work/impl/utils/ForceStopRunnable;->()V HSPLandroidx/work/impl/utils/ForceStopRunnable;->(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)V PLandroidx/work/impl/utils/ForceStopRunnable;->(Landroid/content/Context;Landroidx/work/impl/WorkManagerImpl;)V HSPLandroidx/work/impl/utils/ForceStopRunnable;->forceStopRunnable()V PLandroidx/work/impl/utils/ForceStopRunnable;->forceStopRunnable()V HSPLandroidx/work/impl/utils/ForceStopRunnable;->multiProcessChecks()Z PLandroidx/work/impl/utils/ForceStopRunnable;->multiProcessChecks()Z HSPLandroidx/work/impl/utils/ForceStopRunnable;->run()V PLandroidx/work/impl/utils/ForceStopRunnable;->run()V Landroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0; HSPLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m()Landroid/util/CloseGuard; PLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m()Landroid/util/CloseGuard; HSPLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m()V PLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m()V HSPLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;)Ljava/util/List; PLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/ActivityManager;)Ljava/util/List; HSPLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/InstallSourceInfo;)Ljava/lang/String; PLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/InstallSourceInfo;)Ljava/lang/String; HSPLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/pm/InstallSourceInfo; PLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/pm/InstallSourceInfo; HSPLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/util/CloseGuard;Ljava/lang/String;)V PLandroidx/work/impl/utils/ForceStopRunnable$$ExternalSyntheticApiModelOutline0;->m(Landroid/util/CloseGuard;Ljava/lang/String;)V Landroidx/work/impl/utils/ForceStopRunnable$BroadcastReceiver; Landroidx/work/impl/utils/IdGenerator; HSPLandroidx/work/impl/utils/IdGenerator;->$r8$lambda$LyUC9fmKDw6AhARQq6V7VCdkafU(Landroidx/work/impl/utils/IdGenerator;II)Ljava/lang/Integer; PLandroidx/work/impl/utils/IdGenerator;->$r8$lambda$LyUC9fmKDw6AhARQq6V7VCdkafU(Landroidx/work/impl/utils/IdGenerator;II)Ljava/lang/Integer; HSPLandroidx/work/impl/utils/IdGenerator;->(Landroidx/work/impl/WorkDatabase;I)V PLandroidx/work/impl/utils/IdGenerator;->(Landroidx/work/impl/WorkDatabase;I)V HSPLandroidx/work/impl/utils/IdGenerator;->getNeedsReschedule()Z PLandroidx/work/impl/utils/IdGenerator;->getNeedsReschedule()Z HSPLandroidx/work/impl/utils/IdGenerator;->nextJobSchedulerIdWithRange(I)I PLandroidx/work/impl/utils/IdGenerator;->nextJobSchedulerIdWithRange(I)I Landroidx/work/impl/utils/IdGenerator$$ExternalSyntheticLambda1; HSPLandroidx/work/impl/utils/IdGenerator$$ExternalSyntheticLambda1;->(Landroidx/work/impl/utils/IdGenerator;I)V PLandroidx/work/impl/utils/IdGenerator$$ExternalSyntheticLambda1;->(Landroidx/work/impl/utils/IdGenerator;I)V HSPLandroidx/work/impl/utils/IdGenerator$$ExternalSyntheticLambda1;->call()Ljava/lang/Object; PLandroidx/work/impl/utils/IdGenerator$$ExternalSyntheticLambda1;->call()Ljava/lang/Object; Landroidx/work/impl/utils/LiveDataUtils$1$1; HSPLandroidx/work/impl/utils/LiveDataUtils$1$1;->(Landroidx/work/impl/utils/SerialExecutorImpl;Ljava/lang/Runnable;)V PLandroidx/work/impl/utils/LiveDataUtils$1$1;->(Landroidx/work/impl/utils/SerialExecutorImpl;Ljava/lang/Runnable;)V HSPLandroidx/work/impl/utils/LiveDataUtils$1$1;->run()V PLandroidx/work/impl/utils/LiveDataUtils$1$1;->run()V Landroidx/work/impl/utils/PackageManagerHelper; HSPLandroidx/work/impl/utils/PackageManagerHelper;->()V PLandroidx/work/impl/utils/PackageManagerHelper;->()V HSPLandroidx/work/impl/utils/PackageManagerHelper;->setComponentEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V PLandroidx/work/impl/utils/PackageManagerHelper;->setComponentEnabled(Landroid/content/Context;Ljava/lang/Class;Z)V Landroidx/work/impl/utils/ProcessUtils; HSPLandroidx/work/impl/utils/ProcessUtils;->()V PLandroidx/work/impl/utils/ProcessUtils;->()V HSPLandroidx/work/impl/utils/ProcessUtils;->isDefaultProcess(Landroid/content/Context;Landroidx/work/Configuration;)Z PLandroidx/work/impl/utils/ProcessUtils;->isDefaultProcess(Landroid/content/Context;Landroidx/work/Configuration;)Z Landroidx/work/impl/utils/RawQueries; HSPLandroidx/work/impl/utils/RawQueries;->access$nextId(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;)I PLandroidx/work/impl/utils/RawQueries;->access$nextId(Landroidx/work/impl/WorkDatabase;Ljava/lang/String;)I Landroidx/work/impl/utils/SerialExecutorImpl; HSPLandroidx/work/impl/utils/SerialExecutorImpl;->(Ljava/util/concurrent/ExecutorService;)V PLandroidx/work/impl/utils/SerialExecutorImpl;->(Ljava/util/concurrent/ExecutorService;)V HSPLandroidx/work/impl/utils/SerialExecutorImpl;->execute(Ljava/lang/Runnable;)V PLandroidx/work/impl/utils/SerialExecutorImpl;->execute(Ljava/lang/Runnable;)V HSPLandroidx/work/impl/utils/SerialExecutorImpl;->scheduleNext()V PLandroidx/work/impl/utils/SerialExecutorImpl;->scheduleNext()V Landroidx/work/impl/utils/StatusRunnable; HSPLandroidx/work/impl/utils/StatusRunnable;->(I)V PLandroidx/work/impl/utils/StatusRunnable;->(I)V HSPLandroidx/work/impl/utils/StatusRunnable;->forName(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;)Landroidx/work/impl/utils/StatusRunnable; PLandroidx/work/impl/utils/StatusRunnable;->forName(Landroidx/work/impl/WorkManagerImpl;Ljava/lang/String;)Landroidx/work/impl/utils/StatusRunnable; HSPLandroidx/work/impl/utils/StatusRunnable;->getOperation()Landroidx/work/impl/OperationImpl; PLandroidx/work/impl/utils/StatusRunnable;->getOperation()Landroidx/work/impl/OperationImpl; HSPLandroidx/work/impl/utils/StatusRunnable;->run()V PLandroidx/work/impl/utils/StatusRunnable;->run()V Landroidx/work/impl/utils/futures/AbstractFuture; HSPLandroidx/work/impl/utils/futures/AbstractFuture;->()V PLandroidx/work/impl/utils/futures/AbstractFuture;->()V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->()V PLandroidx/work/impl/utils/futures/AbstractFuture;->()V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->complete(Landroidx/work/impl/utils/futures/AbstractFuture;)V PLandroidx/work/impl/utils/futures/AbstractFuture;->complete(Landroidx/work/impl/utils/futures/AbstractFuture;)V HSPLandroidx/work/impl/utils/futures/AbstractFuture;->set(Ljava/lang/Object;)Z PLandroidx/work/impl/utils/futures/AbstractFuture;->set(Ljava/lang/Object;)Z Landroidx/work/impl/utils/futures/AbstractFuture$AtomicHelper; HSPLandroidx/work/impl/utils/futures/AbstractFuture$AtomicHelper;->()V PLandroidx/work/impl/utils/futures/AbstractFuture$AtomicHelper;->()V Landroidx/work/impl/utils/futures/AbstractFuture$Listener; HSPLandroidx/work/impl/utils/futures/AbstractFuture$Listener;->()V PLandroidx/work/impl/utils/futures/AbstractFuture$Listener;->()V HSPLandroidx/work/impl/utils/futures/AbstractFuture$Listener;->(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V PLandroidx/work/impl/utils/futures/AbstractFuture$Listener;->(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)V Landroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper; HSPLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V PLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;)V HSPLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->casListeners(Landroidx/work/impl/utils/futures/AbstractFuture;Landroidx/work/impl/utils/futures/AbstractFuture$Listener;Landroidx/work/impl/utils/futures/AbstractFuture$Listener;)Z PLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->casListeners(Landroidx/work/impl/utils/futures/AbstractFuture;Landroidx/work/impl/utils/futures/AbstractFuture$Listener;Landroidx/work/impl/utils/futures/AbstractFuture$Listener;)Z HSPLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->casValue(Landroidx/work/impl/utils/futures/AbstractFuture;Ljava/lang/Object;Ljava/lang/Object;)Z PLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->casValue(Landroidx/work/impl/utils/futures/AbstractFuture;Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->casWaiters(Landroidx/work/impl/utils/futures/AbstractFuture;Landroidx/work/impl/utils/futures/AbstractFuture$Waiter;Landroidx/work/impl/utils/futures/AbstractFuture$Waiter;)Z PLandroidx/work/impl/utils/futures/AbstractFuture$SafeAtomicHelper;->casWaiters(Landroidx/work/impl/utils/futures/AbstractFuture;Landroidx/work/impl/utils/futures/AbstractFuture$Waiter;Landroidx/work/impl/utils/futures/AbstractFuture$Waiter;)Z Landroidx/work/impl/utils/futures/AbstractFuture$Waiter; HSPLandroidx/work/impl/utils/futures/AbstractFuture$Waiter;->()V PLandroidx/work/impl/utils/futures/AbstractFuture$Waiter;->()V HSPLandroidx/work/impl/utils/futures/AbstractFuture$Waiter;->(I)V PLandroidx/work/impl/utils/futures/AbstractFuture$Waiter;->(I)V Landroidx/work/impl/utils/futures/SettableFuture; HSPLandroidx/work/impl/utils/futures/SettableFuture;->()V PLandroidx/work/impl/utils/futures/SettableFuture;->()V HSPLandroidx/work/impl/utils/futures/SettableFuture;->create()Landroidx/work/impl/utils/futures/SettableFuture; PLandroidx/work/impl/utils/futures/SettableFuture;->create()Landroidx/work/impl/utils/futures/SettableFuture; HSPLandroidx/work/impl/utils/futures/SettableFuture;->set(Ljava/lang/Object;)Z PLandroidx/work/impl/utils/futures/SettableFuture;->set(Ljava/lang/Object;)Z Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor; HSPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->(Ljava/util/concurrent/ExecutorService;)V PLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->(Ljava/util/concurrent/ExecutorService;)V HSPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->executeOnTaskThread(Ljava/lang/Runnable;)V PLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->executeOnTaskThread(Ljava/lang/Runnable;)V HSPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getSerialTaskExecutor$1()Landroidx/work/impl/utils/SerialExecutorImpl; PLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;->getSerialTaskExecutor$1()Landroidx/work/impl/utils/SerialExecutorImpl; Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor$1; HSPLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor$1;->(Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V PLandroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor$1;->(Landroidx/work/impl/utils/taskexecutor/WorkManagerTaskExecutor;)V Lapp/cash/sqldelight/ColumnAdapter; Lapp/cash/sqldelight/ExecutableQuery; HSPLapp/cash/sqldelight/ExecutableQuery;->(Lkotlin/jvm/functions/Function1;)V PLapp/cash/sqldelight/ExecutableQuery;->(Lkotlin/jvm/functions/Function1;)V HSPLapp/cash/sqldelight/ExecutableQuery;->getMapper()Lkotlin/jvm/functions/Function1; PLapp/cash/sqldelight/ExecutableQuery;->getMapper()Lkotlin/jvm/functions/Function1; Lapp/cash/sqldelight/Query; HSPLapp/cash/sqldelight/Query;->(Lkotlin/jvm/functions/Function1;)V PLapp/cash/sqldelight/Query;->(Lkotlin/jvm/functions/Function1;)V Lapp/cash/sqldelight/Query$Listener; Lapp/cash/sqldelight/QueryKt; HSPLapp/cash/sqldelight/QueryKt;->Query(I[Ljava/lang/String;Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/Query; PLapp/cash/sqldelight/QueryKt;->Query(I[Ljava/lang/String;Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/Query; Lapp/cash/sqldelight/SimpleQuery; HSPLapp/cash/sqldelight/SimpleQuery;->(I[Ljava/lang/String;Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V PLapp/cash/sqldelight/SimpleQuery;->(I[Ljava/lang/String;Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V HSPLapp/cash/sqldelight/SimpleQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V PLapp/cash/sqldelight/SimpleQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V HSPLapp/cash/sqldelight/SimpleQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; PLapp/cash/sqldelight/SimpleQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; Lapp/cash/sqldelight/Transacter; Lapp/cash/sqldelight/TransacterImpl; HSPLapp/cash/sqldelight/TransacterImpl;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLapp/cash/sqldelight/TransacterImpl;->(Lapp/cash/sqldelight/db/SqlDriver;)V HSPLapp/cash/sqldelight/TransacterImpl;->getDriver()Lapp/cash/sqldelight/db/SqlDriver; PLapp/cash/sqldelight/TransacterImpl;->getDriver()Lapp/cash/sqldelight/db/SqlDriver; Lapp/cash/sqldelight/async/coroutines/QueryExtensionsKt; HSPLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt;->awaitAsList(Lapp/cash/sqldelight/Query;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt;->awaitAsList(Lapp/cash/sqldelight/Query;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2; HSPLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2;->(Lapp/cash/sqldelight/Query;I)V PLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2;->(Lapp/cash/sqldelight/Query;I)V HSPLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2;->invoke(Lapp/cash/sqldelight/db/SqlCursor;)Lapp/cash/sqldelight/db/QueryResult; PLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2;->invoke(Lapp/cash/sqldelight/db/SqlCursor;)Lapp/cash/sqldelight/db/QueryResult; HSPLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/async/coroutines/QueryExtensionsKt$awaitAsList$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/coroutines/FlowQuery; HSPLapp/cash/sqldelight/coroutines/FlowQuery;->toFlow(Lapp/cash/sqldelight/Query;)Lkotlinx/coroutines/flow/Flow; PLapp/cash/sqldelight/coroutines/FlowQuery;->toFlow(Lapp/cash/sqldelight/Query;)Lkotlinx/coroutines/flow/Flow; Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1; HSPLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->(Lapp/cash/sqldelight/Query;Lkotlin/coroutines/Continuation;)V PLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->(Lapp/cash/sqldelight/Query;Lkotlin/coroutines/Continuation;)V HSPLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0; HSPLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/Channel;)V PLapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/Channel;)V Lapp/cash/sqldelight/coroutines/FlowQuery$mapToList$$inlined$map$1$2$1; HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$$inlined$map$1$2$1;->(Lapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$$inlined$map$1$2$1;->(Lapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1; HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->(Lapp/cash/sqldelight/Query;Lkotlin/coroutines/Continuation;)V PLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->(Lapp/cash/sqldelight/Query;Lkotlin/coroutines/Continuation;)V HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$mapToList$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1; HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineDispatcher;I)V PLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineDispatcher;I)V HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2; HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;I)V PLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;I)V HSPLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lapp/cash/sqldelight/db/AfterVersion; Lapp/cash/sqldelight/db/QueryResult; HSPLapp/cash/sqldelight/db/QueryResult;->()V PLapp/cash/sqldelight/db/QueryResult;->()V Lapp/cash/sqldelight/db/QueryResult$AsyncValue; Lapp/cash/sqldelight/db/QueryResult$Companion; HSPLapp/cash/sqldelight/db/QueryResult$Companion;->()V PLapp/cash/sqldelight/db/QueryResult$Companion;->()V HSPLapp/cash/sqldelight/db/QueryResult$Companion;->()V PLapp/cash/sqldelight/db/QueryResult$Companion;->()V Lapp/cash/sqldelight/db/QueryResult$Value; HSPLapp/cash/sqldelight/db/QueryResult$Value;->(Ljava/lang/Object;)V PLapp/cash/sqldelight/db/QueryResult$Value;->(Ljava/lang/Object;)V HSPLapp/cash/sqldelight/db/QueryResult$Value;->await(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLapp/cash/sqldelight/db/QueryResult$Value;->await(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLapp/cash/sqldelight/db/QueryResult$Value;->box-impl(Ljava/lang/Object;)Lapp/cash/sqldelight/db/QueryResult$Value; PLapp/cash/sqldelight/db/QueryResult$Value;->box-impl(Ljava/lang/Object;)Lapp/cash/sqldelight/db/QueryResult$Value; HSPLapp/cash/sqldelight/db/QueryResult$Value;->getValue()Ljava/lang/Object; PLapp/cash/sqldelight/db/QueryResult$Value;->getValue()Ljava/lang/Object; Lapp/cash/sqldelight/db/SqlCursor; Lapp/cash/sqldelight/db/SqlDriver; Lapp/cash/sqldelight/db/SqlPreparedStatement; Lapp/cash/sqldelight/db/SqlSchema; Lapp/cash/sqldelight/driver/android/AndroidCursor; HSPLapp/cash/sqldelight/driver/android/AndroidCursor;->(Landroid/database/Cursor;)V PLapp/cash/sqldelight/driver/android/AndroidCursor;->(Landroid/database/Cursor;)V HSPLapp/cash/sqldelight/driver/android/AndroidCursor;->getLong(I)Ljava/lang/Long; PLapp/cash/sqldelight/driver/android/AndroidCursor;->getLong(I)Ljava/lang/Long; HSPLapp/cash/sqldelight/driver/android/AndroidCursor;->getString(I)Ljava/lang/String; PLapp/cash/sqldelight/driver/android/AndroidCursor;->getString(I)Ljava/lang/String; HSPLapp/cash/sqldelight/driver/android/AndroidCursor;->next()Lapp/cash/sqldelight/db/QueryResult$Value; PLapp/cash/sqldelight/driver/android/AndroidCursor;->next()Lapp/cash/sqldelight/db/QueryResult$Value; Lapp/cash/sqldelight/driver/android/AndroidPreparedStatement; HSPLapp/cash/sqldelight/driver/android/AndroidPreparedStatement;->(Landroidx/sqlite/db/SupportSQLiteStatement;)V PLapp/cash/sqldelight/driver/android/AndroidPreparedStatement;->(Landroidx/sqlite/db/SupportSQLiteStatement;)V HSPLapp/cash/sqldelight/driver/android/AndroidPreparedStatement;->close()V PLapp/cash/sqldelight/driver/android/AndroidPreparedStatement;->close()V HSPLapp/cash/sqldelight/driver/android/AndroidPreparedStatement;->execute()J PLapp/cash/sqldelight/driver/android/AndroidPreparedStatement;->execute()J Lapp/cash/sqldelight/driver/android/AndroidQuery; HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->(Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteDatabase;I)V PLapp/cash/sqldelight/driver/android/AndroidQuery;->(Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteDatabase;I)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->bindBoolean(ILjava/lang/Boolean;)V PLapp/cash/sqldelight/driver/android/AndroidQuery;->bindBoolean(ILjava/lang/Boolean;)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->bindLong(ILjava/lang/Long;)V PLapp/cash/sqldelight/driver/android/AndroidQuery;->bindLong(ILjava/lang/Long;)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->bindString(ILjava/lang/String;)V PLapp/cash/sqldelight/driver/android/AndroidQuery;->bindString(ILjava/lang/String;)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V PLapp/cash/sqldelight/driver/android/AndroidQuery;->bindTo(Landroidx/sqlite/db/SupportSQLiteProgram;)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->executeQuery(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidQuery;->executeQuery(Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLapp/cash/sqldelight/driver/android/AndroidQuery;->getSql()Ljava/lang/String; PLapp/cash/sqldelight/driver/android/AndroidQuery;->getSql()Ljava/lang/String; Lapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1; HSPLapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1;->(IILjava/lang/Object;)V PLapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1;->(IILjava/lang/Object;)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1;->invoke(Landroidx/sqlite/db/SupportSQLiteProgram;)V PLapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1;->invoke(Landroidx/sqlite/db/SupportSQLiteProgram;)V HSPLapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidQuery$bindLong$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper;Landroidx/sqlite/db/SupportSQLiteDatabase;I)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper;Landroidx/sqlite/db/SupportSQLiteDatabase;I)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->(Ltachiyomi/data/data/DatabaseImpl$Schema;Landroid/app/Application;Lio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;Leu/kanade/tachiyomi/AppModule$registerInjectables$1$1;)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->(Ltachiyomi/data/data/DatabaseImpl$Schema;Landroid/app/Application;Lio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;Leu/kanade/tachiyomi/AppModule$registerInjectables$1$1;)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->access$getDatabase(Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;)Landroidx/sqlite/db/SupportSQLiteDatabase; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->access$getDatabase(Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;)Landroidx/sqlite/db/SupportSQLiteDatabase; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->access$getOpenHelper$p(Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->access$getOpenHelper$p(Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->addListener([Ljava/lang/String;Lapp/cash/sqldelight/Query$Listener;)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->addListener([Ljava/lang/String;Lapp/cash/sqldelight/Query$Listener;)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->execute(Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->execute(Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->execute-zeHU3Mk(Ljava/lang/Integer;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->execute-zeHU3Mk(Ljava/lang/Integer;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->executeQuery(Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver;->executeQuery(Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver$Callback; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$Callback;->(Ltachiyomi/data/data/DatabaseImpl$Schema;[Lapp/cash/sqldelight/db/AfterVersion;)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$Callback;->(Ltachiyomi/data/data/DatabaseImpl$Schema;[Lapp/cash/sqldelight/db/AfterVersion;)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$Callback;->onCreate(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$Callback;->onCreate(Landroidx/sqlite/db/SupportSQLiteDatabase;)V Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$1; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$1;->(Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;Ljava/lang/Object;I)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$1;->(Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;Ljava/lang/Object;I)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$1;->invoke()Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$1;->invoke()Ljava/lang/Object; Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2;->()V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2;->()V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2;->()V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2;->()V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$execute$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$1; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$1;->(Ljava/lang/String;Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;I)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$1;->(Ljava/lang/String;Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;I)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$1;->invoke()Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$1;->invoke()Ljava/lang/Object; Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$2; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$2;->(Lkotlin/jvm/functions/Function1;)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$2;->(Lkotlin/jvm/functions/Function1;)V HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$executeQuery$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver$statements$1; HSPLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$statements$1;->(I)V PLapp/cash/sqldelight/driver/android/AndroidSqliteDriver$statements$1;->(I)V Lapp/cash/sqldelight/driver/android/AndroidStatement; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->()V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->()V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->()V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->()V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->ProvideBeforeScreenContent(ILandroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function4;)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->ProvideBeforeScreenContent(ILandroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function4;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$LifecycleDisposableEffect(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$LifecycleDisposableEffect(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$getHooks(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroidx/compose/runtime/Composer;)Ljava/util/List; HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$getHooks(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroidx/compose/runtime/Composer;)Ljava/util/List; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$onStart(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$onStart(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$onStop(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$onStop(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$performSave(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$performSave(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$registerLifecycleListener(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->access$registerLifecycleListener(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getDefaultViewModelCreationExtras()Landroidx/lifecycle/viewmodel/CreationExtras; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getLifecycle()Landroidx/lifecycle/Lifecycle; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getSavedStateRegistry()Landroidx/savedstate/SavedStateRegistry; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->getViewModelStore()Landroidx/lifecycle/ViewModelStore; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;->onDispose(Lcafe/adriel/voyager/core/screen/Screen;)V Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion;->get(Lcafe/adriel/voyager/core/screen/Screen;)Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion;->get(Lcafe/adriel/voyager/core/screen/Screen;)Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1;->()V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1;->()V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1;->()V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1;->()V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$Companion$get$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1$invoke$$inlined$onDispose$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1$invoke$$inlined$onDispose$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1$invoke$$inlined$onDispose$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1$invoke$$inlined$onDispose$1;->dispose()V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1$invoke$$inlined$onDispose$1;->dispose()V Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2;->(IILjava/lang/Object;)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2;->(IILjava/lang/Object;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2;->invoke(Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1;->()V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1;->()V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1;->()V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1;->()V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1;->invoke()Ljava/lang/Object; HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$LifecycleDisposableEffect$savedState$1;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$ProvideBeforeScreenContent$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$ProvideBeforeScreenContent$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Lkotlin/jvm/functions/Function2;I)V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$ProvideBeforeScreenContent$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Lkotlin/jvm/functions/Function2;I)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$ProvideBeforeScreenContent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$ProvideBeforeScreenContent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$1;->(Landroidx/lifecycle/Lifecycle;Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$observer$1;)V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$1;->(Landroidx/lifecycle/Lifecycle;Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$observer$1;)V HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$1;->invoke()Ljava/lang/Object; PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$1;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$observer$1; HSPLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$observer$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$observer$1;->(Lcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner;Landroid/os/Bundle;)V PLcafe/adriel/voyager/androidx/AndroidScreenLifecycleOwner$registerLifecycleListener$observer$1;->onStop(Landroidx/lifecycle/LifecycleOwner;)V Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; HSPLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->()V PLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->()V HSPLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->entrySet()Ljava/util/Set; PLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->entrySet()Ljava/util/Set; HSPLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/core/concurrent/ThreadSafeMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/concurrent/ThreadSafeSet; HSPLcafe/adriel/voyager/core/concurrent/ThreadSafeSet;->()V PLcafe/adriel/voyager/core/concurrent/ThreadSafeSet;->()V HSPLcafe/adriel/voyager/core/concurrent/ThreadSafeSet;->add(Ljava/lang/Object;)Z HPLcafe/adriel/voyager/core/concurrent/ThreadSafeSet;->add(Ljava/lang/Object;)Z PLcafe/adriel/voyager/core/concurrent/ThreadSafeSet;->iterator()Ljava/util/Iterator; PLcafe/adriel/voyager/core/concurrent/ThreadSafeSet;->remove(Ljava/lang/Object;)Z Lcafe/adriel/voyager/core/lifecycle/ConfigurationChecker; HSPLcafe/adriel/voyager/core/lifecycle/ConfigurationChecker;->(Landroid/app/Activity;)V PLcafe/adriel/voyager/core/lifecycle/ConfigurationChecker;->(Landroid/app/Activity;)V PLcafe/adriel/voyager/core/lifecycle/ConfigurationChecker;->isChangingConfigurations()Z Lcafe/adriel/voyager/core/lifecycle/DefaultNavigatorScreenLifecycleProvider; HSPLcafe/adriel/voyager/core/lifecycle/DefaultNavigatorScreenLifecycleProvider;->()V PLcafe/adriel/voyager/core/lifecycle/DefaultNavigatorScreenLifecycleProvider;->()V Lcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner; HSPLcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner;->()V PLcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner;->()V HSPLcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner;->()V PLcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner;->()V HSPLcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner;->ProvideBeforeScreenContent(ILandroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function4;)V HPLcafe/adriel/voyager/core/lifecycle/DefaultScreenLifecycleOwner;->ProvideBeforeScreenContent(ILandroidx/compose/runtime/Composer;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function4;)V Lcafe/adriel/voyager/core/lifecycle/DisposableEffectIgnoringConfigurationImpl; HSPLcafe/adriel/voyager/core/lifecycle/DisposableEffectIgnoringConfigurationImpl;->(Lcafe/adriel/voyager/core/lifecycle/ConfigurationChecker;Lkotlin/jvm/functions/Function1;)V PLcafe/adriel/voyager/core/lifecycle/DisposableEffectIgnoringConfigurationImpl;->(Lcafe/adriel/voyager/core/lifecycle/ConfigurationChecker;Lkotlin/jvm/functions/Function1;)V PLcafe/adriel/voyager/core/lifecycle/DisposableEffectIgnoringConfigurationImpl;->onForgotten()V HSPLcafe/adriel/voyager/core/lifecycle/DisposableEffectIgnoringConfigurationImpl;->onRemembered()V PLcafe/adriel/voyager/core/lifecycle/DisposableEffectIgnoringConfigurationImpl;->onRemembered()V Lcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$MultipleProvideBeforeScreenContent$1; HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$MultipleProvideBeforeScreenContent$1;->(Ljava/util/List;)V PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$MultipleProvideBeforeScreenContent$1;->(Ljava/util/List;)V HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$MultipleProvideBeforeScreenContent$1;->invoke()Ljava/lang/Object; PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$MultipleProvideBeforeScreenContent$1;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$1; HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$1;->(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function4;)V PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$1;->(ILandroidx/compose/runtime/internal/ComposableLambdaImpl;Lkotlin/jvm/functions/Function4;)V Lcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$2; HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$2;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$2;->(Landroidx/compose/runtime/internal/ComposableLambdaImpl;)V HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$3; HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$3;->(Lkotlin/jvm/functions/Function4;I)V PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$3;->(Lkotlin/jvm/functions/Function4;I)V HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$4; HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$4;->(Lkotlin/jvm/functions/Function2;I)V PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$4;->(Lkotlin/jvm/functions/Function2;I)V HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5; HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5;->(Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;II)V PLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5;->(Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;II)V HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5;->invoke(Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5;->invoke(Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/core/lifecycle/MultipleScreenLifecycleOwnerUtilKt$RecursiveProvideBeforeScreenContent$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt; HSPLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt;->()V PLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt;->()V HSPLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt;->getLocalNavigatorScreenLifecycleProvider()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt;->getLocalNavigatorScreenLifecycleProvider()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Lcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1; HSPLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1;->()V PLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1;->()V HSPLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1;->()V PLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1;->()V HSPLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1;->invoke()Ljava/lang/Object; PLcafe/adriel/voyager/core/lifecycle/NavigatorScreenLifecycleKt$LocalNavigatorScreenLifecycleProvider$1;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt; HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->()V PLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->()V HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->DisposableEffectIgnoringConfiguration(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V PLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->DisposableEffectIgnoringConfiguration(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;)V HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->MultipleProvideBeforeScreenContent(Ljava/util/List;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->MultipleProvideBeforeScreenContent(Ljava/util/List;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->RecursiveProvideBeforeScreenContent(Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->RecursiveProvideBeforeScreenContent(Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->access$RecursiveProvideBeforeScreenContent(Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->access$RecursiveProvideBeforeScreenContent(Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->access$getInternalDisposableEffectScope$p()Landroidx/compose/runtime/DisposableEffectScope; PLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->access$getInternalDisposableEffectScope$p()Landroidx/compose/runtime/DisposableEffectScope; HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->getConfigurationChecker(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/core/lifecycle/ConfigurationChecker; PLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleKt;->getConfigurationChecker(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/core/lifecycle/ConfigurationChecker; Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner; Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleStore; HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleStore;->()V PLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleStore;->()V HSPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleStore;->register(Lcafe/adriel/voyager/core/screen/Screen;Lkotlin/reflect/KType;Lkotlin/jvm/functions/Function1;)Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner; HPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleStore;->register(Lcafe/adriel/voyager/core/screen/Screen;Lkotlin/reflect/KType;Lkotlin/jvm/functions/Function1;)Lcafe/adriel/voyager/core/lifecycle/ScreenLifecycleOwner; HPLcafe/adriel/voyager/core/lifecycle/ScreenLifecycleStore;->remove(Lcafe/adriel/voyager/core/screen/Screen;)V Lcafe/adriel/voyager/core/model/ScreenModel; Lcafe/adriel/voyager/core/model/ScreenModelKt; HSPLcafe/adriel/voyager/core/model/ScreenModelKt;->getCoroutineScope(Lcafe/adriel/voyager/core/model/ScreenModel;)Lkotlinx/coroutines/CoroutineScope; PLcafe/adriel/voyager/core/model/ScreenModelKt;->getCoroutineScope(Lcafe/adriel/voyager/core/model/ScreenModel;)Lkotlinx/coroutines/CoroutineScope; Lcafe/adriel/voyager/core/model/ScreenModelStore; HSPLcafe/adriel/voyager/core/model/ScreenModelStore;->()V PLcafe/adriel/voyager/core/model/ScreenModelStore;->()V HSPLcafe/adriel/voyager/core/model/ScreenModelStore;->getDependencies()Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; PLcafe/adriel/voyager/core/model/ScreenModelStore;->getDependencies()Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; HSPLcafe/adriel/voyager/core/model/ScreenModelStore;->getDependencyKey(Lcafe/adriel/voyager/core/model/ScreenModel;Ljava/lang/String;)Ljava/lang/String; HPLcafe/adriel/voyager/core/model/ScreenModelStore;->getDependencyKey(Lcafe/adriel/voyager/core/model/ScreenModel;Ljava/lang/String;)Ljava/lang/String; HSPLcafe/adriel/voyager/core/model/ScreenModelStore;->getLastScreenModelKey()Lkotlinx/coroutines/flow/MutableStateFlow; PLcafe/adriel/voyager/core/model/ScreenModelStore;->getLastScreenModelKey()Lkotlinx/coroutines/flow/MutableStateFlow; HSPLcafe/adriel/voyager/core/model/ScreenModelStore;->getScreenModels()Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; PLcafe/adriel/voyager/core/model/ScreenModelStore;->getScreenModels()Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; PLcafe/adriel/voyager/core/model/ScreenModelStore;->onEach(Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap;Lcafe/adriel/voyager/core/screen/Screen;Lkotlin/jvm/functions/Function1;)V PLcafe/adriel/voyager/core/model/ScreenModelStore;->remove(Lcafe/adriel/voyager/core/screen/Screen;)V PLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$1;->(Lcafe/adriel/voyager/core/screen/Screen;)V HPLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2; HSPLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2;->()V PLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2;->()V HSPLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2;->(I)V PLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2;->(I)V HSPLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/core/model/ScreenModelStore$onEach$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/core/model/StateScreenModel; HSPLcafe/adriel/voyager/core/model/StateScreenModel;->(Ljava/lang/Object;)V PLcafe/adriel/voyager/core/model/StateScreenModel;->(Ljava/lang/Object;)V HSPLcafe/adriel/voyager/core/model/StateScreenModel;->getMutableState()Lkotlinx/coroutines/flow/MutableStateFlow; PLcafe/adriel/voyager/core/model/StateScreenModel;->getMutableState()Lkotlinx/coroutines/flow/MutableStateFlow; HSPLcafe/adriel/voyager/core/model/StateScreenModel;->getState()Lkotlinx/coroutines/flow/StateFlow; PLcafe/adriel/voyager/core/model/StateScreenModel;->getState()Lkotlinx/coroutines/flow/StateFlow; Lcafe/adriel/voyager/core/screen/Screen; Lcafe/adriel/voyager/core/stack/SnapshotStateStack; HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->(Ljava/util/List;)V HPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->(Ljava/util/List;)V PLcafe/adriel/voyager/core/stack/SnapshotStateStack;->clearEvent()V HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getCanPop()Z HPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getCanPop()Z HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getItems()Ljava/util/List; HPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getItems()Ljava/util/List; HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getLastEvent()Lcafe/adriel/voyager/core/stack/StackEvent; HPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getLastEvent()Lcafe/adriel/voyager/core/stack/StackEvent; HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getLastItemOrNull()Ljava/lang/Object; HPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getLastItemOrNull()Ljava/lang/Object; HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getStateStack()Landroidx/compose/runtime/snapshots/SnapshotStateList; PLcafe/adriel/voyager/core/stack/SnapshotStateStack;->getStateStack()Landroidx/compose/runtime/snapshots/SnapshotStateList; PLcafe/adriel/voyager/core/stack/SnapshotStateStack;->push(Ljava/lang/Object;)V HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->replaceAll(Ljava/lang/Object;)V PLcafe/adriel/voyager/core/stack/SnapshotStateStack;->replaceAll(Ljava/lang/Object;)V HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack;->setLastEvent(Lcafe/adriel/voyager/core/stack/StackEvent;)V PLcafe/adriel/voyager/core/stack/SnapshotStateStack;->setLastEvent(Lcafe/adriel/voyager/core/stack/StackEvent;)V Lcafe/adriel/voyager/core/stack/SnapshotStateStack$canPop$2; HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack$canPop$2;->(Lcafe/adriel/voyager/core/stack/SnapshotStateStack;)V PLcafe/adriel/voyager/core/stack/SnapshotStateStack$canPop$2;->(Lcafe/adriel/voyager/core/stack/SnapshotStateStack;)V HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack$canPop$2;->invoke()Ljava/lang/Object; HPLcafe/adriel/voyager/core/stack/SnapshotStateStack$canPop$2;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/core/stack/SnapshotStateStack$size$2; HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack$size$2;->(Lcafe/adriel/voyager/core/stack/SnapshotStateStack;I)V HPLcafe/adriel/voyager/core/stack/SnapshotStateStack$size$2;->(Lcafe/adriel/voyager/core/stack/SnapshotStateStack;I)V HSPLcafe/adriel/voyager/core/stack/SnapshotStateStack$size$2;->invoke()Ljava/lang/Object; HPLcafe/adriel/voyager/core/stack/SnapshotStateStack$size$2;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/core/stack/StackEvent; HSPLcafe/adriel/voyager/core/stack/StackEvent;->()V PLcafe/adriel/voyager/core/stack/StackEvent;->()V HSPLcafe/adriel/voyager/core/stack/StackEvent;->(Ljava/lang/String;I)V PLcafe/adriel/voyager/core/stack/StackEvent;->(Ljava/lang/String;I)V Lcafe/adriel/voyager/navigator/Navigator; HSPLcafe/adriel/voyager/navigator/Navigator;->(Ljava/util/List;Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)V HPLcafe/adriel/voyager/navigator/Navigator;->(Ljava/util/List;Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)V HSPLcafe/adriel/voyager/navigator/Navigator;->access$getStateHolder$p(Lcafe/adriel/voyager/navigator/Navigator;)Landroidx/compose/runtime/saveable/SaveableStateHolder; PLcafe/adriel/voyager/navigator/Navigator;->access$getStateHolder$p(Lcafe/adriel/voyager/navigator/Navigator;)Landroidx/compose/runtime/saveable/SaveableStateHolder; HSPLcafe/adriel/voyager/navigator/Navigator;->access$saveableState$provideSaveableState(Ljava/lang/String;Lcafe/adriel/voyager/navigator/Navigator;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/navigator/Navigator;->access$saveableState$provideSaveableState(Ljava/lang/String;Lcafe/adriel/voyager/navigator/Navigator;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V PLcafe/adriel/voyager/navigator/Navigator;->clearEvent()V PLcafe/adriel/voyager/navigator/Navigator;->dispose(Lcafe/adriel/voyager/core/screen/Screen;)V HSPLcafe/adriel/voyager/navigator/Navigator;->getCanPop()Z PLcafe/adriel/voyager/navigator/Navigator;->getCanPop()Z HSPLcafe/adriel/voyager/navigator/Navigator;->getDisposeBehavior()Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior; PLcafe/adriel/voyager/navigator/Navigator;->getDisposeBehavior()Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior; HSPLcafe/adriel/voyager/navigator/Navigator;->getItems()Ljava/util/List; PLcafe/adriel/voyager/navigator/Navigator;->getItems()Ljava/util/List; HSPLcafe/adriel/voyager/navigator/Navigator;->getLastEvent()Lcafe/adriel/voyager/core/stack/StackEvent; PLcafe/adriel/voyager/navigator/Navigator;->getLastEvent()Lcafe/adriel/voyager/core/stack/StackEvent; HSPLcafe/adriel/voyager/navigator/Navigator;->getLastItem()Lcafe/adriel/voyager/core/screen/Screen; HPLcafe/adriel/voyager/navigator/Navigator;->getLastItem()Lcafe/adriel/voyager/core/screen/Screen; HSPLcafe/adriel/voyager/navigator/Navigator;->getLastItemOrNull()Lcafe/adriel/voyager/core/screen/Screen; PLcafe/adriel/voyager/navigator/Navigator;->getLastItemOrNull()Lcafe/adriel/voyager/core/screen/Screen; HSPLcafe/adriel/voyager/navigator/Navigator;->getParent()Lcafe/adriel/voyager/navigator/Navigator; PLcafe/adriel/voyager/navigator/Navigator;->getParent()Lcafe/adriel/voyager/navigator/Navigator; PLcafe/adriel/voyager/navigator/Navigator;->push(Lcafe/adriel/voyager/core/screen/Screen;)V HSPLcafe/adriel/voyager/navigator/Navigator;->replaceAll(Lcafe/adriel/voyager/core/screen/Screen;)V PLcafe/adriel/voyager/navigator/Navigator;->replaceAll(Lcafe/adriel/voyager/core/screen/Screen;)V HSPLcafe/adriel/voyager/navigator/Navigator;->saveableState(Ljava/lang/String;Lcafe/adriel/voyager/core/screen/Screen;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLcafe/adriel/voyager/navigator/Navigator;->saveableState(Ljava/lang/String;Lcafe/adriel/voyager/core/screen/Screen;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V PLcafe/adriel/voyager/navigator/Navigator$dispose$1;->(Lcafe/adriel/voyager/core/screen/Screen;)V HPLcafe/adriel/voyager/navigator/Navigator$dispose$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/Navigator$last$2; HSPLcafe/adriel/voyager/navigator/Navigator$last$2;->(Lcafe/adriel/voyager/navigator/Navigator;I)V PLcafe/adriel/voyager/navigator/Navigator$last$2;->(Lcafe/adriel/voyager/navigator/Navigator;I)V HSPLcafe/adriel/voyager/navigator/Navigator$last$2;->invoke()Lcafe/adriel/voyager/core/screen/Screen; PLcafe/adriel/voyager/navigator/Navigator$last$2;->invoke()Lcafe/adriel/voyager/core/screen/Screen; HSPLcafe/adriel/voyager/navigator/Navigator$last$2;->invoke()Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/Navigator$last$2;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/navigator/Navigator$saveableState$1; HSPLcafe/adriel/voyager/navigator/Navigator$saveableState$1;->(Ljava/lang/String;Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/Navigator$saveableState$1;->(Ljava/lang/String;Lcafe/adriel/voyager/navigator/Navigator;)V HSPLcafe/adriel/voyager/navigator/Navigator$saveableState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/Navigator$saveableState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/Navigator$saveableState$2; HSPLcafe/adriel/voyager/navigator/Navigator$saveableState$2;->(Lcafe/adriel/voyager/navigator/Navigator;Ljava/lang/String;Lkotlin/jvm/functions/Function2;I)V PLcafe/adriel/voyager/navigator/Navigator$saveableState$2;->(Lcafe/adriel/voyager/navigator/Navigator;Ljava/lang/String;Lkotlin/jvm/functions/Function2;I)V HSPLcafe/adriel/voyager/navigator/Navigator$saveableState$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/Navigator$saveableState$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/Navigator$saveableState$3; Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior; HSPLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->(ZZ)V PLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->(ZZ)V PLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->equals(Ljava/lang/Object;)Z HSPLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->getDisposeNestedNavigators()Z PLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->getDisposeNestedNavigators()Z HSPLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->getDisposeSteps()Z PLcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;->getDisposeSteps()Z Lcafe/adriel/voyager/navigator/NavigatorKt; HSPLcafe/adriel/voyager/navigator/NavigatorKt;->()V PLcafe/adriel/voyager/navigator/NavigatorKt;->()V HSPLcafe/adriel/voyager/navigator/NavigatorKt;->Navigator(Lcafe/adriel/voyager/core/screen/Screen;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLcafe/adriel/voyager/navigator/NavigatorKt;->Navigator(Lcafe/adriel/voyager/core/screen/Screen;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLcafe/adriel/voyager/navigator/NavigatorKt;->Navigator(Ljava/util/List;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLcafe/adriel/voyager/navigator/NavigatorKt;->Navigator(Ljava/util/List;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLcafe/adriel/voyager/navigator/NavigatorKt;->compositionUniqueId(Landroidx/compose/runtime/Composer;)Ljava/lang/String; HPLcafe/adriel/voyager/navigator/NavigatorKt;->compositionUniqueId(Landroidx/compose/runtime/Composer;)Ljava/lang/String; HSPLcafe/adriel/voyager/navigator/NavigatorKt;->getCurrentOrThrow(Landroidx/compose/runtime/StaticProvidableCompositionLocal;Landroidx/compose/runtime/Composer;)Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/NavigatorKt;->getCurrentOrThrow(Landroidx/compose/runtime/StaticProvidableCompositionLocal;Landroidx/compose/runtime/Composer;)Ljava/lang/Object; HSPLcafe/adriel/voyager/navigator/NavigatorKt;->getLocalNavigator()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLcafe/adriel/voyager/navigator/NavigatorKt;->getLocalNavigator()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Lcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1; HSPLcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1;->()V PLcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1;->()V HSPLcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1;->(I)V PLcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1;->(I)V HSPLcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1;->invoke()Ljava/lang/Object; PLcafe/adriel/voyager/navigator/NavigatorKt$LocalNavigator$1;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/navigator/NavigatorKt$Navigator$1; HSPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$1;->()V PLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$1;->()V HSPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$1;->()V PLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$1;->()V Lcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6; HSPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6;->(Ljava/util/List;Ljava/lang/String;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V PLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6;->(Ljava/util/List;Ljava/lang/String;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;ILkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)V HSPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6$1; HSPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6$1;->(Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function3;)V PLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6$1;->(Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function3;)V HSPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/NavigatorKt$Navigator$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/NavigatorSaver; Lcafe/adriel/voyager/navigator/NavigatorSaverKt; HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt;->()V PLcafe/adriel/voyager/navigator/NavigatorSaverKt;->()V HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt;->getLocalNavigatorSaver()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLcafe/adriel/voyager/navigator/NavigatorSaverKt;->getLocalNavigatorSaver()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Lcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1; HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1;->()V PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1;->()V HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1;->()V PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1;->()V HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1;->saver(Ljava/util/List;Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1;->saver(Ljava/util/List;Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)Landroidx/compose/runtime/saveable/SaverKt$Saver$1; Lcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1; HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1;->()V PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1;->()V HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1;->()V PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1;->()V HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$2; HSPLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$2;->(Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/NavigatorSaverKt$defaultNavigatorSaver$1$saver$2;->(Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)V Lcafe/adriel/voyager/navigator/internal/ActualsKt; HSPLcafe/adriel/voyager/navigator/internal/ActualsKt;->BackHandler(ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/navigator/internal/ActualsKt;->BackHandler(ZLkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/navigator/internal/ActualsKt;->NavigatorBackHandler(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/navigator/internal/ActualsKt;->NavigatorBackHandler(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V Lcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$1;->(Lkotlin/jvm/functions/Function1;Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$1;->(Lkotlin/jvm/functions/Function1;Lcafe/adriel/voyager/navigator/Navigator;)V Lcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$2; HSPLcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$2;->(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;I)V PLcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$2;->(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;I)V PLcafe/adriel/voyager/navigator/internal/NavigatorBackHandlerKt$NavigatorBackHandler$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt; HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->()V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->()V HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->NavigatorDisposableEffect(Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->NavigatorDisposableEffect(Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->StepDisposableEffect(Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V HPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->StepDisposableEffect(Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt;->access$getDisposableEvents$p()Ljava/util/Set; Lcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1$invoke$$inlined$onDispose$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1$invoke$$inlined$onDispose$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1$invoke$$inlined$onDispose$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$NavigatorDisposableEffect$1$invoke$$inlined$onDispose$1;->dispose()V Lcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1;->(Lcafe/adriel/voyager/navigator/Navigator;Ljava/util/List;)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1;->(Lcafe/adriel/voyager/navigator/Navigator;Ljava/util/List;)V HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1$invoke$$inlined$onDispose$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1$invoke$$inlined$onDispose$1;->(Lcafe/adriel/voyager/navigator/Navigator;Ljava/util/List;)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1$invoke$$inlined$onDispose$1;->(Lcafe/adriel/voyager/navigator/Navigator;Ljava/util/List;)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1$invoke$$inlined$onDispose$1;->dispose()V HPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$1$invoke$$inlined$onDispose$1;->dispose()V Lcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$2; HSPLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$2;->(Lcafe/adriel/voyager/navigator/Navigator;II)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$2;->(Lcafe/adriel/voyager/navigator/Navigator;II)V PLcafe/adriel/voyager/navigator/internal/NavigatorDisposableKt$StepDisposableEffect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt; HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt;->()V PLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt;->()V HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt;->getLocalNavigatorStateHolder()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt;->getLocalNavigatorStateHolder()Landroidx/compose/runtime/StaticProvidableCompositionLocal; HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt;->rememberNavigator(Ljava/util/List;Ljava/lang/String;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)Lcafe/adriel/voyager/navigator/Navigator; HPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt;->rememberNavigator(Ljava/util/List;Ljava/lang/String;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)Lcafe/adriel/voyager/navigator/Navigator; Lcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$LocalNavigatorStateHolder$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$LocalNavigatorStateHolder$1;->()V PLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$LocalNavigatorStateHolder$1;->()V HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$LocalNavigatorStateHolder$1;->()V PLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$LocalNavigatorStateHolder$1;->()V Lcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$rememberNavigator$1; HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$rememberNavigator$1;->(Ljava/util/List;Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$rememberNavigator$1;->(Ljava/util/List;Ljava/lang/String;Landroidx/compose/runtime/saveable/SaveableStateHolder;Lcafe/adriel/voyager/navigator/NavigatorDisposeBehavior;Lcafe/adriel/voyager/navigator/Navigator;)V HSPLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$rememberNavigator$1;->invoke()Ljava/lang/Object; PLcafe/adriel/voyager/navigator/internal/NavigatorSaverInternalKt$rememberNavigator$1;->invoke()Ljava/lang/Object; Lcafe/adriel/voyager/navigator/tab/Tab; Lcafe/adriel/voyager/navigator/tab/TabNavigator; HSPLcafe/adriel/voyager/navigator/tab/TabNavigator;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLcafe/adriel/voyager/navigator/tab/TabNavigator;->(Lcafe/adriel/voyager/navigator/Navigator;)V HSPLcafe/adriel/voyager/navigator/tab/TabNavigator;->getCurrent()Lcafe/adriel/voyager/navigator/tab/Tab; HPLcafe/adriel/voyager/navigator/tab/TabNavigator;->getCurrent()Lcafe/adriel/voyager/navigator/tab/Tab; HSPLcafe/adriel/voyager/navigator/tab/TabNavigator;->saveableState(Ljava/lang/String;Lcafe/adriel/voyager/navigator/tab/Tab;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLcafe/adriel/voyager/navigator/tab/TabNavigator;->saveableState(Ljava/lang/String;Lcafe/adriel/voyager/navigator/tab/Tab;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLcafe/adriel/voyager/navigator/tab/TabNavigator;->setCurrent(Leu/kanade/presentation/util/Tab;)V PLcafe/adriel/voyager/navigator/tab/TabNavigator;->setCurrent(Leu/kanade/presentation/util/Tab;)V Lcafe/adriel/voyager/navigator/tab/TabNavigatorKt; HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt;->()V PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt;->()V HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt;->TabNavigator(Lcafe/adriel/voyager/navigator/tab/Tab;ZLkotlin/jvm/functions/Function3;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt;->TabNavigator(Lcafe/adriel/voyager/navigator/tab/Tab;ZLkotlin/jvm/functions/Function3;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt;->getLocalTabNavigator()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt;->getLocalTabNavigator()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Lcafe/adriel/voyager/navigator/tab/TabNavigatorKt$LocalTabNavigator$1; HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$LocalTabNavigator$1;->()V PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$LocalTabNavigator$1;->()V HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$LocalTabNavigator$1;->()V PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$LocalTabNavigator$1;->()V Lcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1; HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1;->(Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function3;)V PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1;->(Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function3;)V HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1$1; HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1$1;->(Lkotlin/jvm/functions/Function3;Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1$1;->(Lkotlin/jvm/functions/Function3;Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V HSPLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLcafe/adriel/voyager/navigator/tab/TabNavigatorKt$TabNavigator$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lcafe/adriel/voyager/navigator/tab/TabOptions; HSPLcafe/adriel/voyager/navigator/tab/TabOptions;->(SLjava/lang/String;Landroidx/compose/ui/graphics/vector/VectorPainter;)V HPLcafe/adriel/voyager/navigator/tab/TabOptions;->(SLjava/lang/String;Landroidx/compose/ui/graphics/vector/VectorPainter;)V HSPLcafe/adriel/voyager/navigator/tab/TabOptions;->getIcon()Landroidx/compose/ui/graphics/painter/Painter; PLcafe/adriel/voyager/navigator/tab/TabOptions;->getIcon()Landroidx/compose/ui/graphics/painter/Painter; HSPLcafe/adriel/voyager/navigator/tab/TabOptions;->getTitle()Ljava/lang/String; PLcafe/adriel/voyager/navigator/tab/TabOptions;->getTitle()Ljava/lang/String; Lcoil/EventListener$Factory$$ExternalSyntheticLambda0; HSPLcoil/EventListener$Factory$$ExternalSyntheticLambda0;->(I)V PLcoil/EventListener$Factory$$ExternalSyntheticLambda0;->(I)V HSPLcoil/EventListener$Factory$$ExternalSyntheticLambda0;->invoke(D)D PLcoil/EventListener$Factory$$ExternalSyntheticLambda0;->invoke(D)D Lcoil/ImageLoaderFactory; Lcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0; HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m$1()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/String; PLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m()Ljava/lang/String; HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/DisplayCutout; PLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/DisplayCutout; HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; PLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V HPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V HSPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V HPLcoil/decode/ImageDecoderDecoder$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V Lcoil/network/NetworkObserver; Lcoil/request/RequestService; HSPLcoil/request/RequestService;->()V HPLcoil/request/RequestService;->()V HSPLcoil/request/RequestService;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V PLcoil/request/RequestService;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V HSPLcoil/request/RequestService;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V HPLcoil/request/RequestService;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V HSPLcoil/request/RequestService;->(Ljava/lang/Runnable;)V PLcoil/request/RequestService;->(Ljava/lang/Runnable;)V HSPLcoil/request/RequestService;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLcoil/request/RequestService;->get(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HSPLcoil/request/RequestService;->get(Ljava/lang/Class;Ljava/lang/String;)Landroidx/lifecycle/ViewModel; HPLcoil/request/RequestService;->get(Ljava/lang/Class;Ljava/lang/String;)Landroidx/lifecycle/ViewModel; HSPLcoil/request/RequestService;->parsePathString(Ljava/lang/String;)V HPLcoil/request/RequestService;->parsePathString(Ljava/lang/String;)V HSPLcoil/request/RequestService;->toNodes()Ljava/util/List; PLcoil/request/RequestService;->toNodes()Ljava/util/List; Lcoil/size/-Sizes; HSPLcoil/size/-Sizes;->bind(Landroidx/sqlite/db/SupportSQLiteProgram;[Ljava/lang/Object;)V PLcoil/size/-Sizes;->bind(Landroidx/sqlite/db/SupportSQLiteProgram;[Ljava/lang/Object;)V HSPLcoil/size/-Sizes;->execute$default(Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/Integer;Ljava/lang/String;)V PLcoil/size/-Sizes;->execute$default(Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/Integer;Ljava/lang/String;)V HSPLcoil/size/-Sizes;->generationalId(Landroidx/work/impl/model/WorkSpec;)Landroidx/work/impl/model/WorkGenerationalId; PLcoil/size/-Sizes;->generationalId(Landroidx/work/impl/model/WorkSpec;)Landroidx/work/impl/model/WorkGenerationalId; HSPLcoil/size/-Sizes;->getColumnIndex(Landroid/database/Cursor;Ljava/lang/String;)I PLcoil/size/-Sizes;->getColumnIndex(Landroid/database/Cursor;Ljava/lang/String;)I HSPLcoil/size/-Sizes;->getColumnIndexOrThrow(Landroid/database/Cursor;Ljava/lang/String;)I PLcoil/size/-Sizes;->getColumnIndexOrThrow(Landroid/database/Cursor;Ljava/lang/String;)I HSPLcoil/size/-Sizes;->getKey(Lcafe/adriel/voyager/core/screen/Screen;)Ljava/lang/String; HPLcoil/size/-Sizes;->getKey(Lcafe/adriel/voyager/core/screen/Screen;)Ljava/lang/String; HSPLcoil/size/-Sizes;->getMultiplatformName(Lkotlin/reflect/KClass;)Ljava/lang/String; HPLcoil/size/-Sizes;->getMultiplatformName(Lkotlin/reflect/KClass;)Ljava/lang/String; HSPLcoil/size/-Sizes;->query(Landroidx/room/RoomDatabase;Landroidx/sqlite/db/SupportSQLiteQuery;Z)Landroid/database/Cursor; PLcoil/size/-Sizes;->query(Landroidx/room/RoomDatabase;Landroidx/sqlite/db/SupportSQLiteQuery;Z)Landroid/database/Cursor; Lcoil/size/Scale$EnumUnboxingLocalUtility; HSPLcoil/size/Scale$EnumUnboxingLocalUtility;->m(Ljava/lang/String;J)Ljava/lang/String; PLcoil/size/Scale$EnumUnboxingLocalUtility;->m(Ljava/lang/String;J)Ljava/lang/String; Lcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0; HSPLcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/job/JobInfo$Builder;Z)V PLcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0;->m$1(Landroid/app/job/JobInfo$Builder;Z)V HSPLcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; PLcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0;->m()Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction; HSPLcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/job/JobInfo$Builder;Z)V PLcom/github/junrar/Archive$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/job/JobInfo$Builder;Z)V Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController; HSPLcom/google/accompanist/systemuicontroller/AndroidSystemUiController;->(Landroid/view/View;Landroid/view/Window;)V PLcom/google/accompanist/systemuicontroller/AndroidSystemUiController;->(Landroid/view/View;Landroid/view/Window;)V HSPLcom/google/accompanist/systemuicontroller/AndroidSystemUiController;->setNavigationBarColor-Iv8Zu3U(JZLkotlin/jvm/functions/Function1;)V PLcom/google/accompanist/systemuicontroller/AndroidSystemUiController;->setNavigationBarColor-Iv8Zu3U(JZLkotlin/jvm/functions/Function1;)V HSPLcom/google/accompanist/systemuicontroller/AndroidSystemUiController;->setStatusBarColor-ek8zF_U(JZLkotlin/jvm/functions/Function1;)V PLcom/google/accompanist/systemuicontroller/AndroidSystemUiController;->setStatusBarColor-ek8zF_U(JZLkotlin/jvm/functions/Function1;)V Lcom/google/accompanist/systemuicontroller/SystemUiControllerKt; HSPLcom/google/accompanist/systemuicontroller/SystemUiControllerKt;->()V PLcom/google/accompanist/systemuicontroller/SystemUiControllerKt;->()V Lcom/google/accompanist/themeadapter/core/FontFamilyWithWeight; HSPLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->(Landroidx/compose/ui/text/font/FontFamily;)V PLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->(Landroidx/compose/ui/text/font/FontFamily;)V HSPLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;)V HPLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->(Landroidx/compose/ui/text/font/FontFamily;Landroidx/compose/ui/text/font/FontWeight;)V HSPLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; PLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->getFontFamily()Landroidx/compose/ui/text/font/FontFamily; HSPLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->getWeight()Landroidx/compose/ui/text/font/FontWeight; PLcom/google/accompanist/themeadapter/core/FontFamilyWithWeight;->getWeight()Landroidx/compose/ui/text/font/FontWeight; Lcom/google/accompanist/themeadapter/core/R$styleable; HSPLcom/google/accompanist/themeadapter/core/R$styleable;->()V PLcom/google/accompanist/themeadapter/core/R$styleable;->()V Lcom/google/accompanist/themeadapter/core/ResourceUtilsKt; HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->()V PLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->()V HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseColor-mxwnekA$default(Landroid/content/res/TypedArray;I)J HPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseColor-mxwnekA$default(Landroid/content/res/TypedArray;I)J HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseCornerSize(Landroid/content/res/TypedArray;I)Landroidx/compose/foundation/shape/CornerSize; HPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseCornerSize(Landroid/content/res/TypedArray;I)Landroidx/compose/foundation/shape/CornerSize; HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseFontFamily(Landroid/content/res/TypedArray;I)Lcom/google/accompanist/themeadapter/core/FontFamilyWithWeight; HPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseFontFamily(Landroid/content/res/TypedArray;I)Lcom/google/accompanist/themeadapter/core/FontFamilyWithWeight; HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseShapeAppearance(Landroid/content/Context;ILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/shape/CornerBasedShape;)Landroidx/compose/foundation/shape/CornerBasedShape; HPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseShapeAppearance(Landroid/content/Context;ILandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/foundation/shape/CornerBasedShape;)Landroidx/compose/foundation/shape/CornerBasedShape; HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseTextAppearance(Landroid/content/Context;ILandroidx/compose/ui/unit/Density;ZLandroidx/compose/ui/text/font/FontFamily;)Landroidx/compose/ui/text/TextStyle; HPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseTextAppearance(Landroid/content/Context;ILandroidx/compose/ui/unit/Density;ZLandroidx/compose/ui/text/font/FontFamily;)Landroidx/compose/ui/text/TextStyle; HSPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseTextUnit-lGoEivg(Landroid/content/res/TypedArray;ILandroidx/compose/ui/unit/Density;J)J HPLcom/google/accompanist/themeadapter/core/ResourceUtilsKt;->parseTextUnit-lGoEivg(Landroid/content/res/TypedArray;ILandroidx/compose/ui/unit/Density;J)J Lcom/google/accompanist/themeadapter/material3/Mdc3Theme; HSPLcom/google/accompanist/themeadapter/material3/Mdc3Theme;->()V PLcom/google/accompanist/themeadapter/material3/Mdc3Theme;->()V HSPLcom/google/accompanist/themeadapter/material3/Mdc3Theme;->createMdc3Theme$default(Landroid/content/Context;Landroidx/compose/ui/unit/LayoutDirection;)Lcom/google/accompanist/themeadapter/material3/Theme3Parameters; HPLcom/google/accompanist/themeadapter/material3/Mdc3Theme;->createMdc3Theme$default(Landroid/content/Context;Landroidx/compose/ui/unit/LayoutDirection;)Lcom/google/accompanist/themeadapter/material3/Theme3Parameters; Lcom/google/accompanist/themeadapter/material3/R$styleable; HSPLcom/google/accompanist/themeadapter/material3/R$styleable;->()V PLcom/google/accompanist/themeadapter/material3/R$styleable;->()V Lcom/google/accompanist/themeadapter/material3/Theme3Parameters; HSPLcom/google/accompanist/themeadapter/material3/Theme3Parameters;->(Landroidx/compose/material3/ColorScheme;Landroidx/compose/material3/Typography;Landroidx/compose/material3/Shapes;)V PLcom/google/accompanist/themeadapter/material3/Theme3Parameters;->(Landroidx/compose/material3/ColorScheme;Landroidx/compose/material3/Typography;Landroidx/compose/material3/Shapes;)V HSPLcom/google/accompanist/themeadapter/material3/Theme3Parameters;->component1()Landroidx/compose/material3/ColorScheme; PLcom/google/accompanist/themeadapter/material3/Theme3Parameters;->component1()Landroidx/compose/material3/ColorScheme; HSPLcom/google/accompanist/themeadapter/material3/Theme3Parameters;->component2()Landroidx/compose/material3/Typography; PLcom/google/accompanist/themeadapter/material3/Theme3Parameters;->component2()Landroidx/compose/material3/Typography; Lcom/google/android/material/color/DynamicColors; HSPLcom/google/android/material/color/DynamicColors;->()V PLcom/google/android/material/color/DynamicColors;->()V HSPLcom/google/android/material/color/DynamicColors;->isDynamicColorAvailable()Z PLcom/google/android/material/color/DynamicColors;->isDynamicColorAvailable()Z Lcom/google/android/material/color/DynamicColors$1; HSPLcom/google/android/material/color/DynamicColors$1;->()V PLcom/google/android/material/color/DynamicColors$1;->()V Lcom/google/android/material/color/DynamicColors$2; HSPLcom/google/android/material/color/DynamicColors$2;->()V PLcom/google/android/material/color/DynamicColors$2;->()V Lcom/google/android/material/color/DynamicColors$DeviceSupportCondition; Lcom/google/android/material/theme/MaterialComponentsViewInflater; HSPLcom/google/android/material/theme/MaterialComponentsViewInflater;->()V PLcom/google/android/material/theme/MaterialComponentsViewInflater;->()V Lcom/google/common/util/concurrent/ListenableFuture; Lcom/hippo/unifile/RawFile; HSPLcom/hippo/unifile/RawFile;->(Ljava/io/File;)V PLcom/hippo/unifile/RawFile;->(Ljava/io/File;)V HSPLcom/hippo/unifile/RawFile;->exists()Z PLcom/hippo/unifile/RawFile;->exists()Z Lcom/hippo/unifile/UniFile; HSPLcom/hippo/unifile/UniFile;->()V PLcom/hippo/unifile/UniFile;->()V HSPLcom/hippo/unifile/UniFile;->fromUri(Landroid/content/Context;Landroid/net/Uri;)Lcom/hippo/unifile/UniFile; PLcom/hippo/unifile/UniFile;->fromUri(Landroid/content/Context;Landroid/net/Uri;)Lcom/hippo/unifile/UniFile; Lcom/jakewharton/disklrucache/DiskLruCache; HSPLcom/jakewharton/disklrucache/DiskLruCache;->()V PLcom/jakewharton/disklrucache/DiskLruCache;->()V HSPLcom/jakewharton/disklrucache/DiskLruCache;->(Ljava/io/File;)V PLcom/jakewharton/disklrucache/DiskLruCache;->(Ljava/io/File;)V HSPLcom/jakewharton/disklrucache/DiskLruCache;->getDirectory()Ljava/io/File; PLcom/jakewharton/disklrucache/DiskLruCache;->getDirectory()Ljava/io/File; HSPLcom/jakewharton/disklrucache/DiskLruCache;->open(Ljava/io/File;)Lcom/jakewharton/disklrucache/DiskLruCache; PLcom/jakewharton/disklrucache/DiskLruCache;->open(Ljava/io/File;)Lcom/jakewharton/disklrucache/DiskLruCache; HSPLcom/jakewharton/disklrucache/DiskLruCache;->rebuildJournal()V PLcom/jakewharton/disklrucache/DiskLruCache;->rebuildJournal()V HSPLcom/jakewharton/disklrucache/DiskLruCache;->renameTo(Ljava/io/File;Ljava/io/File;Z)V PLcom/jakewharton/disklrucache/DiskLruCache;->renameTo(Ljava/io/File;Ljava/io/File;Z)V Lcom/jakewharton/disklrucache/DiskLruCache$1; HSPLcom/jakewharton/disklrucache/DiskLruCache$1;->(Lcom/jakewharton/disklrucache/DiskLruCache;)V PLcom/jakewharton/disklrucache/DiskLruCache$1;->(Lcom/jakewharton/disklrucache/DiskLruCache;)V Lcom/jakewharton/disklrucache/DiskLruCache$2; HSPLcom/jakewharton/disklrucache/DiskLruCache$2;->()V PLcom/jakewharton/disklrucache/DiskLruCache$2;->()V Lcom/jakewharton/disklrucache/Util; HSPLcom/jakewharton/disklrucache/Util;->()V PLcom/jakewharton/disklrucache/Util;->()V Lcom/mikepenz/aboutlibraries/entity/Library; Leu/kanade/core/preference/PreferenceMutableState; HSPLeu/kanade/core/preference/PreferenceMutableState;->(Ltachiyomi/core/preference/Preference;Lkotlinx/coroutines/CoroutineScope;)V PLeu/kanade/core/preference/PreferenceMutableState;->(Ltachiyomi/core/preference/Preference;Lkotlinx/coroutines/CoroutineScope;)V HSPLeu/kanade/core/preference/PreferenceMutableState;->access$getState$p(Leu/kanade/core/preference/PreferenceMutableState;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; PLeu/kanade/core/preference/PreferenceMutableState;->access$getState$p(Leu/kanade/core/preference/PreferenceMutableState;)Landroidx/compose/runtime/ParcelableSnapshotMutableState; HSPLeu/kanade/core/preference/PreferenceMutableState;->getValue()Ljava/lang/Object; PLeu/kanade/core/preference/PreferenceMutableState;->getValue()Ljava/lang/Object; Leu/kanade/core/preference/PreferenceMutableState$1; HSPLeu/kanade/core/preference/PreferenceMutableState$1;->(Leu/kanade/core/preference/PreferenceMutableState;Lkotlin/coroutines/Continuation;)V PLeu/kanade/core/preference/PreferenceMutableState$1;->(Leu/kanade/core/preference/PreferenceMutableState;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/core/preference/PreferenceMutableState$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/core/preference/PreferenceMutableState$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/core/preference/PreferenceMutableState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/core/preference/PreferenceMutableState$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/core/preference/PreferenceMutableState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/core/preference/PreferenceMutableState$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/core/preference/PreferenceMutableStateKt; HSPLeu/kanade/core/preference/PreferenceMutableStateKt;->asState(Ltachiyomi/core/preference/Preference;Lkotlinx/coroutines/CoroutineScope;)Leu/kanade/core/preference/PreferenceMutableState; PLeu/kanade/core/preference/PreferenceMutableStateKt;->asState(Ltachiyomi/core/preference/Preference;Lkotlinx/coroutines/CoroutineScope;)Leu/kanade/core/preference/PreferenceMutableState; Leu/kanade/core/util/CollectionUtilsKt; HSPLeu/kanade/core/util/CollectionUtilsKt;->insertSeparators(Ljava/util/ArrayList;Lkotlin/jvm/functions/Function2;)Ljava/util/List; PLeu/kanade/core/util/CollectionUtilsKt;->insertSeparators(Ljava/util/ArrayList;Lkotlin/jvm/functions/Function2;)Ljava/util/List; Leu/kanade/domain/DomainModule; HSPLeu/kanade/domain/DomainModule;->()V PLeu/kanade/domain/DomainModule;->()V HSPLeu/kanade/domain/DomainModule;->registerInjectables(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule;->registerInjectables(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule;->registerWith(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule;->registerWith(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$10; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$10;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$10;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$11; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$11;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$11;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$12; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$12;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$12;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$13; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$13;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$13;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$14; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$14;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$14;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$15; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$15;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$15;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$16; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$16;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$16;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$17; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$17;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$17;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$18; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$18;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$18;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$19; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$19;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$19;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$20; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$20;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$20;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$21; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$21;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$21;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$22; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$22;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$22;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$23; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$23;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$23;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$24; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$24;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$24;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$25; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$25;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$25;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$26; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$26;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$26;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$27; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$27;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$27;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$28; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$28;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$28;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$29; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$29;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$29;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$3; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$3;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$3;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$30; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$30;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$30;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$31; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$31;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$31;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$32; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$32;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$32;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$33; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$33;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$33;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$34; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$34;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$34;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$35; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$35;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$35;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$36; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$36;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$36;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$37; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$37;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$37;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$38; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$38;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$38;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$39; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$39;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$39;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$4; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$4;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$4;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$40; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$40;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$40;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$41; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$41;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$41;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$42; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$42;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$42;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$43; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$43;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$43;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$44; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$44;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$44;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$45; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$45;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$45;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$46; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$46;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$46;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$47; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$47;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$47;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$48; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$48;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$48;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$49; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$49;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$49;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$5; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$5;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$5;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$50; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$50;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$50;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$51; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$51;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$51;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$52; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$52;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$52;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$53; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$53;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$53;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$54; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$54;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$54;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$6; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$6;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$6;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$7; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$7;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$7;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$8; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$8;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$8;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$9; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$9;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addFactory$9;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$3; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$3;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$3;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$4; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$4;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$4;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$5; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$5;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$5;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$6; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$6;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$6;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$7; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$7;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$7;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$8; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$8;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$8;->()V Leu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$9; HSPLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$9;->()V PLeu/kanade/domain/DomainModule$registerInjectables$$inlined$addSingletonFactory$9;->()V Leu/kanade/domain/DomainModule$registerInjectables$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$1;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$1;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$1;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$1;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$1$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$1$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$1$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$10; HSPLeu/kanade/domain/DomainModule$registerInjectables$10;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$10;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$11; HSPLeu/kanade/domain/DomainModule$registerInjectables$11;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$11;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$11;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$11;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$11$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$11$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$11$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$12; HSPLeu/kanade/domain/DomainModule$registerInjectables$12;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$12;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$13; HSPLeu/kanade/domain/DomainModule$registerInjectables$13;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$13;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$14; HSPLeu/kanade/domain/DomainModule$registerInjectables$14;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$14;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$14;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$14;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$14$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$14$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$14$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$15; HSPLeu/kanade/domain/DomainModule$registerInjectables$15;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$15;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$16; HSPLeu/kanade/domain/DomainModule$registerInjectables$16;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$16;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$16;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$16;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$16$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$16$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$16$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$17; HSPLeu/kanade/domain/DomainModule$registerInjectables$17;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$17;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$17;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$17;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$3; HSPLeu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$3;->()V PLeu/kanade/domain/DomainModule$registerInjectables$17$invoke$$inlined$get$3;->()V Leu/kanade/domain/DomainModule$registerInjectables$18; HSPLeu/kanade/domain/DomainModule$registerInjectables$18;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$18;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$19; HSPLeu/kanade/domain/DomainModule$registerInjectables$19;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$19;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$2;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$2;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$2;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$2;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$2$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$2$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$2$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$20; HSPLeu/kanade/domain/DomainModule$registerInjectables$20;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$20;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$20;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$20;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$20$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$20$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$20$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$21; HSPLeu/kanade/domain/DomainModule$registerInjectables$21;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$21;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$22; HSPLeu/kanade/domain/DomainModule$registerInjectables$22;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$22;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$23; HSPLeu/kanade/domain/DomainModule$registerInjectables$23;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$23;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$24; HSPLeu/kanade/domain/DomainModule$registerInjectables$24;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$24;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$24;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$24;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$24$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$24$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$24$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$24$invoke$$inlined$get$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$24$invoke$$inlined$get$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$24$invoke$$inlined$get$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$25; HSPLeu/kanade/domain/DomainModule$registerInjectables$25;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$25;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$25;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$25;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$25$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$25$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$25$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$26; HSPLeu/kanade/domain/DomainModule$registerInjectables$26;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$26;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$27; HSPLeu/kanade/domain/DomainModule$registerInjectables$27;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$27;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$28; HSPLeu/kanade/domain/DomainModule$registerInjectables$28;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$28;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$28;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$28;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$28$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$28$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$28$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$29; HSPLeu/kanade/domain/DomainModule$registerInjectables$29;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$29;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$3; HSPLeu/kanade/domain/DomainModule$registerInjectables$3;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$3;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$30; HSPLeu/kanade/domain/DomainModule$registerInjectables$30;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$30;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$31; HSPLeu/kanade/domain/DomainModule$registerInjectables$31;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$31;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$31;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$31;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$31$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$31$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$31$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$32; HSPLeu/kanade/domain/DomainModule$registerInjectables$32;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$32;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$33; HSPLeu/kanade/domain/DomainModule$registerInjectables$33;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$33;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$34; HSPLeu/kanade/domain/DomainModule$registerInjectables$34;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$34;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$34;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$34;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$34$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$34$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$34$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$35; HSPLeu/kanade/domain/DomainModule$registerInjectables$35;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$35;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$35;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$35;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$35$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$35$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$35$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$36; HSPLeu/kanade/domain/DomainModule$registerInjectables$36;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$36;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$36;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$36;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$36$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$36$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$36$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$37; HSPLeu/kanade/domain/DomainModule$registerInjectables$37;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$37;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$37;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$37;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$37$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$37$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$37$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$38; HSPLeu/kanade/domain/DomainModule$registerInjectables$38;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$38;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$38;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$38;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$3; HSPLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$3;->()V PLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$3;->()V Leu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$4; HSPLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$4;->()V PLeu/kanade/domain/DomainModule$registerInjectables$38$invoke$$inlined$get$4;->()V Leu/kanade/domain/DomainModule$registerInjectables$39; HSPLeu/kanade/domain/DomainModule$registerInjectables$39;->()V PLeu/kanade/domain/DomainModule$registerInjectables$39;->()V HSPLeu/kanade/domain/DomainModule$registerInjectables$39;->()V PLeu/kanade/domain/DomainModule$registerInjectables$39;->()V Leu/kanade/domain/DomainModule$registerInjectables$4; HSPLeu/kanade/domain/DomainModule$registerInjectables$4;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$4;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$4;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$4;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$4$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$4$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$4$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$40; HSPLeu/kanade/domain/DomainModule$registerInjectables$40;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$40;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$41; HSPLeu/kanade/domain/DomainModule$registerInjectables$41;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$41;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$42; HSPLeu/kanade/domain/DomainModule$registerInjectables$42;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$42;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$42;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$42;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$42$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$42$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$42$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$43; HSPLeu/kanade/domain/DomainModule$registerInjectables$43;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$43;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$43;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$43;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$43$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$43$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$43$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$44; HSPLeu/kanade/domain/DomainModule$registerInjectables$44;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$44;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$45; HSPLeu/kanade/domain/DomainModule$registerInjectables$45;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$45;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$45;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$45;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$45$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$45$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$45$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$46; HSPLeu/kanade/domain/DomainModule$registerInjectables$46;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$46;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$47; HSPLeu/kanade/domain/DomainModule$registerInjectables$47;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$47;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$47;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$47;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$47$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$47$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$47$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$47$invoke$$inlined$get$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$47$invoke$$inlined$get$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$47$invoke$$inlined$get$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$48; HSPLeu/kanade/domain/DomainModule$registerInjectables$48;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$48;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$49; HSPLeu/kanade/domain/DomainModule$registerInjectables$49;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$49;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$5; HSPLeu/kanade/domain/DomainModule$registerInjectables$5;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$5;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$5;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$5;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$5$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$5$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$5$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$5$invoke$$inlined$get$2; HSPLeu/kanade/domain/DomainModule$registerInjectables$5$invoke$$inlined$get$2;->()V PLeu/kanade/domain/DomainModule$registerInjectables$5$invoke$$inlined$get$2;->()V Leu/kanade/domain/DomainModule$registerInjectables$50; HSPLeu/kanade/domain/DomainModule$registerInjectables$50;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$50;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$51; HSPLeu/kanade/domain/DomainModule$registerInjectables$51;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$51;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$51;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$51;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$51$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$51$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$51$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$52; HSPLeu/kanade/domain/DomainModule$registerInjectables$52;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$52;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$52;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$52;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$52$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$52$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$52$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$53; HSPLeu/kanade/domain/DomainModule$registerInjectables$53;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$53;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$54; HSPLeu/kanade/domain/DomainModule$registerInjectables$54;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$54;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/domain/DomainModule$registerInjectables$54;->invoke()Ljava/lang/Object; PLeu/kanade/domain/DomainModule$registerInjectables$54;->invoke()Ljava/lang/Object; Leu/kanade/domain/DomainModule$registerInjectables$54$invoke$$inlined$get$1; HSPLeu/kanade/domain/DomainModule$registerInjectables$54$invoke$$inlined$get$1;->()V PLeu/kanade/domain/DomainModule$registerInjectables$54$invoke$$inlined$get$1;->()V Leu/kanade/domain/DomainModule$registerInjectables$55; HSPLeu/kanade/domain/DomainModule$registerInjectables$55;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$55;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$56; HSPLeu/kanade/domain/DomainModule$registerInjectables$56;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$56;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$57; HSPLeu/kanade/domain/DomainModule$registerInjectables$57;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$57;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$58; HSPLeu/kanade/domain/DomainModule$registerInjectables$58;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$58;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$59; HSPLeu/kanade/domain/DomainModule$registerInjectables$59;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$59;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$6; HSPLeu/kanade/domain/DomainModule$registerInjectables$6;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$6;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$60; HSPLeu/kanade/domain/DomainModule$registerInjectables$60;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$60;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$61; HSPLeu/kanade/domain/DomainModule$registerInjectables$61;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$61;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$62; HSPLeu/kanade/domain/DomainModule$registerInjectables$62;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$62;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$63; HSPLeu/kanade/domain/DomainModule$registerInjectables$63;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$63;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$7; HSPLeu/kanade/domain/DomainModule$registerInjectables$7;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$7;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$8; HSPLeu/kanade/domain/DomainModule$registerInjectables$8;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$8;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/DomainModule$registerInjectables$9; HSPLeu/kanade/domain/DomainModule$registerInjectables$9;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/domain/DomainModule$registerInjectables$9;->(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/domain/base/BasePreferences; HSPLeu/kanade/domain/base/BasePreferences;->(Landroid/app/Application;Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/domain/base/BasePreferences;->(Landroid/app/Application;Ltachiyomi/core/preference/PreferenceStore;)V HSPLeu/kanade/domain/base/BasePreferences;->downloadedOnly()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/base/BasePreferences;->downloadedOnly()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/base/BasePreferences;->incognitoMode()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/base/BasePreferences;->incognitoMode()Ltachiyomi/core/preference/Preference; Leu/kanade/domain/chapter/interactor/SetReadStatus; HSPLeu/kanade/domain/chapter/interactor/SetReadStatus;->(Ltachiyomi/domain/download/service/DownloadPreferences;Leu/kanade/domain/download/interactor/DeleteDownload;Ltachiyomi/domain/manga/repository/MangaRepository;Ltachiyomi/domain/chapter/repository/ChapterRepository;)V PLeu/kanade/domain/chapter/interactor/SetReadStatus;->(Ltachiyomi/domain/download/service/DownloadPreferences;Leu/kanade/domain/download/interactor/DeleteDownload;Ltachiyomi/domain/manga/repository/MangaRepository;Ltachiyomi/domain/chapter/repository/ChapterRepository;)V Leu/kanade/domain/chapter/interactor/SetReadStatus$mapper$1; HSPLeu/kanade/domain/chapter/interactor/SetReadStatus$mapper$1;->()V PLeu/kanade/domain/chapter/interactor/SetReadStatus$mapper$1;->()V HSPLeu/kanade/domain/chapter/interactor/SetReadStatus$mapper$1;->()V PLeu/kanade/domain/chapter/interactor/SetReadStatus$mapper$1;->()V Leu/kanade/domain/chapter/interactor/SyncChaptersWithSource; Leu/kanade/domain/chapter/interactor/SyncChaptersWithTrackServiceTwoWay; Leu/kanade/domain/download/interactor/DeleteDownload; HSPLeu/kanade/domain/download/interactor/DeleteDownload;->(Ltachiyomi/domain/source/service/SourceManager;Leu/kanade/tachiyomi/data/download/DownloadManager;)V PLeu/kanade/domain/download/interactor/DeleteDownload;->(Ltachiyomi/domain/source/service/SourceManager;Leu/kanade/tachiyomi/data/download/DownloadManager;)V Leu/kanade/domain/extension/interactor/GetExtensionLanguages; Leu/kanade/domain/extension/interactor/GetExtensionSources; Leu/kanade/domain/extension/interactor/GetExtensionsByType; Leu/kanade/domain/manga/interactor/SetMangaViewerFlags; Leu/kanade/domain/manga/interactor/UpdateManga; HSPLeu/kanade/domain/manga/interactor/UpdateManga;->(Ltachiyomi/domain/manga/repository/MangaRepository;Ltachiyomi/domain/manga/interactor/SetFetchInterval;)V PLeu/kanade/domain/manga/interactor/UpdateManga;->(Ltachiyomi/domain/manga/repository/MangaRepository;Ltachiyomi/domain/manga/interactor/SetFetchInterval;)V Leu/kanade/domain/source/interactor/GetEnabledSources; Leu/kanade/domain/source/interactor/GetLanguagesWithSources; Leu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount; Leu/kanade/domain/source/interactor/SetMigrateSorting; Leu/kanade/domain/source/interactor/ToggleLanguage; Leu/kanade/domain/source/interactor/ToggleSource; Leu/kanade/domain/source/interactor/ToggleSourcePin; Leu/kanade/domain/source/service/SourcePreferences; HSPLeu/kanade/domain/source/service/SourcePreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/domain/source/service/SourcePreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V HSPLeu/kanade/domain/source/service/SourcePreferences;->enabledLanguages()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/source/service/SourcePreferences;->enabledLanguages()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/source/service/SourcePreferences;->extensionUpdatesCount()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/source/service/SourcePreferences;->extensionUpdatesCount()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/source/service/SourcePreferences;->trustedSignatures()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/source/service/SourcePreferences;->trustedSignatures()Ltachiyomi/core/preference/Preference; Leu/kanade/domain/track/interactor/TrackChapter; Leu/kanade/domain/track/service/TrackPreferences; HSPLeu/kanade/domain/track/service/TrackPreferences;->()V PLeu/kanade/domain/track/service/TrackPreferences;->()V HSPLeu/kanade/domain/track/service/TrackPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/domain/track/service/TrackPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V HSPLeu/kanade/domain/track/service/TrackPreferences;->anilistScoreType()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/track/service/TrackPreferences;->anilistScoreType()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/track/service/TrackPreferences;->trackUsername(Leu/kanade/tachiyomi/data/track/Tracker;)Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/track/service/TrackPreferences;->trackUsername(Leu/kanade/tachiyomi/data/track/Tracker;)Ltachiyomi/core/preference/Preference; Leu/kanade/domain/track/service/TrackPreferences$Companion; HSPLeu/kanade/domain/track/service/TrackPreferences$Companion;->()V PLeu/kanade/domain/track/service/TrackPreferences$Companion;->()V HSPLeu/kanade/domain/track/service/TrackPreferences$Companion;->(I)V PLeu/kanade/domain/track/service/TrackPreferences$Companion;->(I)V Leu/kanade/domain/track/store/DelayedTrackingStore; Leu/kanade/domain/ui/UiPreferences; HSPLeu/kanade/domain/ui/UiPreferences;->()V PLeu/kanade/domain/ui/UiPreferences;->()V HSPLeu/kanade/domain/ui/UiPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/domain/ui/UiPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V HSPLeu/kanade/domain/ui/UiPreferences;->appTheme()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/ui/UiPreferences;->appTheme()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/ui/UiPreferences;->tabletUiMode()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/ui/UiPreferences;->tabletUiMode()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/ui/UiPreferences;->themeDarkAmoled()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/ui/UiPreferences;->themeDarkAmoled()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/domain/ui/UiPreferences;->themeMode()Ltachiyomi/core/preference/Preference; PLeu/kanade/domain/ui/UiPreferences;->themeMode()Ltachiyomi/core/preference/Preference; Leu/kanade/domain/ui/UiPreferences$Companion; HSPLeu/kanade/domain/ui/UiPreferences$Companion;->()V PLeu/kanade/domain/ui/UiPreferences$Companion;->()V HSPLeu/kanade/domain/ui/UiPreferences$Companion;->(I)V PLeu/kanade/domain/ui/UiPreferences$Companion;->(I)V Leu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$1; HSPLeu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$1;->()V PLeu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$1;->()V HSPLeu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$1;->()V PLeu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$1;->()V Leu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$2; HSPLeu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$2;->(Leu/kanade/domain/ui/model/AppTheme;)V PLeu/kanade/domain/ui/UiPreferences$appTheme$$inlined$getEnum$2;->(Leu/kanade/domain/ui/model/AppTheme;)V Leu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$1; HSPLeu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$1;->()V PLeu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$1;->()V HSPLeu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$1;->()V PLeu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$1;->()V Leu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$2; HSPLeu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$2;->()V PLeu/kanade/domain/ui/UiPreferences$tabletUiMode$$inlined$getEnum$2;->()V Leu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$1; HSPLeu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$1;->()V PLeu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$1;->()V HSPLeu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$1;->()V PLeu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$1;->()V Leu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$2; HSPLeu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$2;->(Leu/kanade/domain/ui/model/ThemeMode;)V PLeu/kanade/domain/ui/UiPreferences$themeMode$$inlined$getEnum$2;->(Leu/kanade/domain/ui/model/ThemeMode;)V Leu/kanade/domain/ui/model/AppTheme; HSPLeu/kanade/domain/ui/model/AppTheme;->()V PLeu/kanade/domain/ui/model/AppTheme;->()V HSPLeu/kanade/domain/ui/model/AppTheme;->(Ljava/lang/String;ILjava/lang/Integer;)V PLeu/kanade/domain/ui/model/AppTheme;->(Ljava/lang/String;ILjava/lang/Integer;)V Leu/kanade/domain/ui/model/TabletUiMode; HSPLeu/kanade/domain/ui/model/TabletUiMode;->()V PLeu/kanade/domain/ui/model/TabletUiMode;->()V HSPLeu/kanade/domain/ui/model/TabletUiMode;->(Ljava/lang/String;II)V PLeu/kanade/domain/ui/model/TabletUiMode;->(Ljava/lang/String;II)V Leu/kanade/domain/ui/model/ThemeMode; HSPLeu/kanade/domain/ui/model/ThemeMode;->()V PLeu/kanade/domain/ui/model/ThemeMode;->()V HSPLeu/kanade/domain/ui/model/ThemeMode;->(Ljava/lang/String;I)V PLeu/kanade/domain/ui/model/ThemeMode;->(Ljava/lang/String;I)V Leu/kanade/domain/ui/model/ThemeModeKt; HSPLeu/kanade/domain/ui/model/ThemeModeKt;->setAppCompatDelegateThemeMode(Leu/kanade/domain/ui/model/ThemeMode;)V PLeu/kanade/domain/ui/model/ThemeModeKt;->setAppCompatDelegateThemeMode(Leu/kanade/domain/ui/model/ThemeMode;)V Leu/kanade/presentation/components/AppBar$Action; HSPLeu/kanade/presentation/components/AppBar$Action;->(Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function0;ZI)V HPLeu/kanade/presentation/components/AppBar$Action;->(Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function0;ZI)V HSPLeu/kanade/presentation/components/AppBar$Action;->getEnabled()Z PLeu/kanade/presentation/components/AppBar$Action;->getEnabled()Z HSPLeu/kanade/presentation/components/AppBar$Action;->getIcon()Landroidx/compose/ui/graphics/vector/ImageVector; PLeu/kanade/presentation/components/AppBar$Action;->getIcon()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLeu/kanade/presentation/components/AppBar$Action;->getIconTint-QN2ZGVo()Landroidx/compose/ui/graphics/Color; PLeu/kanade/presentation/components/AppBar$Action;->getIconTint-QN2ZGVo()Landroidx/compose/ui/graphics/Color; HSPLeu/kanade/presentation/components/AppBar$Action;->getOnClick()Lkotlin/jvm/functions/Function0; PLeu/kanade/presentation/components/AppBar$Action;->getOnClick()Lkotlin/jvm/functions/Function0; HSPLeu/kanade/presentation/components/AppBar$Action;->getTitle()Ljava/lang/String; PLeu/kanade/presentation/components/AppBar$Action;->getTitle()Ljava/lang/String; Leu/kanade/presentation/components/AppBar$AppBarAction; Leu/kanade/presentation/components/AppBar$OverflowAction; HSPLeu/kanade/presentation/components/AppBar$OverflowAction;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V HPLeu/kanade/presentation/components/AppBar$OverflowAction;->(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V Leu/kanade/presentation/components/AppBarKt; HSPLeu/kanade/presentation/components/AppBarKt;->AppBar(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/components/AppBarKt;->AppBar(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/components/AppBarKt;->AppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ZLkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/components/AppBarKt;->AppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ZLkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/components/AppBarKt;->AppBarActions(Ljava/util/List;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/components/AppBarKt;->AppBarActions(Ljava/util/List;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/presentation/components/AppBarKt;->AppBarTitle(Ljava/lang/String;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/components/AppBarKt;->AppBarTitle(Ljava/lang/String;Ljava/lang/String;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/components/AppBarKt;->SearchToolbar(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;III)V HPLeu/kanade/presentation/components/AppBarKt;->SearchToolbar(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;III)V PLeu/kanade/presentation/components/AppBarKt;->UpIcon(Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/components/AppBarKt;->UpIcon(Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/components/AppBarKt;->access$AppBar$lambda$1(Landroidx/compose/runtime/State;)Z PLeu/kanade/presentation/components/AppBarKt;->access$AppBar$lambda$1(Landroidx/compose/runtime/State;)Z Leu/kanade/presentation/components/AppBarKt$AppBar$2; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$2;->(ILjava/lang/String;Ljava/lang/String;ILandroidx/compose/runtime/State;)V PLeu/kanade/presentation/components/AppBarKt$AppBar$2;->(ILjava/lang/String;Ljava/lang/String;ILandroidx/compose/runtime/State;)V HSPLeu/kanade/presentation/components/AppBarKt$AppBar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$AppBar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBar$3; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$3;->(Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function3;Landroidx/compose/runtime/State;)V PLeu/kanade/presentation/components/AppBarKt$AppBar$3;->(Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function3;Landroidx/compose/runtime/State;)V HSPLeu/kanade/presentation/components/AppBarKt$AppBar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$AppBar$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBar$4; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$4;->(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V PLeu/kanade/presentation/components/AppBarKt$AppBar$4;->(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V Leu/kanade/presentation/components/AppBarKt$AppBar$5; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$5;->()V PLeu/kanade/presentation/components/AppBarKt$AppBar$5;->()V HSPLeu/kanade/presentation/components/AppBarKt$AppBar$5;->()V PLeu/kanade/presentation/components/AppBarKt$AppBar$5;->()V Leu/kanade/presentation/components/AppBarKt$AppBar$6$1; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$6$1;->(ZLkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;)V PLeu/kanade/presentation/components/AppBarKt$AppBar$6$1;->(ZLkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;)V HSPLeu/kanade/presentation/components/AppBarKt$AppBar$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$AppBar$6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBar$7; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$7;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ZLkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V PLeu/kanade/presentation/components/AppBarKt$AppBar$7;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function3;ZLkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V Leu/kanade/presentation/components/AppBarKt$AppBar$isActionMode$2$1; HSPLeu/kanade/presentation/components/AppBarKt$AppBar$isActionMode$2$1;->(I)V PLeu/kanade/presentation/components/AppBarKt$AppBar$isActionMode$2$1;->(I)V HSPLeu/kanade/presentation/components/AppBarKt$AppBar$isActionMode$2$1;->invoke()Ljava/lang/Object; PLeu/kanade/presentation/components/AppBarKt$AppBar$isActionMode$2$1;->invoke()Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBarActions$1$1; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$1;->(Leu/kanade/presentation/components/AppBar$Action;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$1;->(Leu/kanade/presentation/components/AppBar$Action;)V Leu/kanade/presentation/components/AppBarKt$AppBarActions$1$2; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2;->(Leu/kanade/presentation/components/AppBar$Action;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2;->(Leu/kanade/presentation/components/AppBar$Action;)V HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBarActions$1$2$1; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2$1;->(Leu/kanade/presentation/components/AppBar$Action;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2$1;->(Leu/kanade/presentation/components/AppBar$Action;)V HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$AppBarActions$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBarActions$2; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$2;->(Landroidx/compose/runtime/MutableState;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$2;->(Landroidx/compose/runtime/MutableState;)V HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$AppBarActions$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$AppBarActions$2$1$1; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$2$1$1;->(Landroidx/compose/runtime/MutableState;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$2$1$1;->(Landroidx/compose/runtime/MutableState;)V Leu/kanade/presentation/components/AppBarKt$AppBarActions$3$1; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$3$1;->(Landroidx/compose/runtime/MutableState;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$3$1;->(Landroidx/compose/runtime/MutableState;)V Leu/kanade/presentation/components/AppBarKt$AppBarActions$4; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$4;->(Landroidx/compose/runtime/MutableState;Ljava/util/ArrayList;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$4;->(Landroidx/compose/runtime/MutableState;Ljava/util/ArrayList;)V Leu/kanade/presentation/components/AppBarKt$AppBarActions$5; HSPLeu/kanade/presentation/components/AppBarKt$AppBarActions$5;->(ILjava/util/List;)V PLeu/kanade/presentation/components/AppBarKt$AppBarActions$5;->(ILjava/util/List;)V Leu/kanade/presentation/components/AppBarKt$SearchToolbar$1; HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$1;->()V PLeu/kanade/presentation/components/AppBarKt$SearchToolbar$1;->()V HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$1;->()V PLeu/kanade/presentation/components/AppBarKt$SearchToolbar$1;->()V Leu/kanade/presentation/components/AppBarKt$SearchToolbar$2$1; HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$2$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/components/AppBarKt$SearchToolbar$2$1;->(Lkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/components/AppBarKt$SearchToolbar$4; HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$4;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILandroidx/compose/ui/focus/FocusRequester;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/interaction/MutableInteractionSource;ILkotlin/jvm/functions/Function1;Ljava/lang/String;)V HPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$4;->(Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILandroidx/compose/ui/focus/FocusRequester;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/interaction/MutableInteractionSource;ILkotlin/jvm/functions/Function1;Ljava/lang/String;)V HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$SearchToolbar$5; HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5;->(Lkotlin/jvm/functions/Function1;IZLjava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/ui/focus/FocusRequester;)V HPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5;->(Lkotlin/jvm/functions/Function1;IZLjava/lang/String;Lkotlin/jvm/functions/Function3;Landroidx/compose/ui/focus/FocusRequester;)V HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$SearchToolbar$5$1; HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5$1;->(Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/AppBarKt$SearchToolbar$5$onClick$1$1; HSPLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5$onClick$1$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/components/AppBarKt$SearchToolbar$5$onClick$1$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/components/AppBarKt$UpIcon$1;->(Landroidx/compose/ui/graphics/vector/ImageVector;II)V Leu/kanade/presentation/components/BannersKt; HSPLeu/kanade/presentation/components/BannersKt;->AppStateBanners(ZZZLandroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/components/BannersKt;->AppStateBanners(ZZZLandroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1;->(ZILandroidx/compose/foundation/layout/AndroidWindowInsets;ZIZ)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1;->(ZILandroidx/compose/foundation/layout/AndroidWindowInsets;ZIZ)V HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$1;->(Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;II)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$1;->(Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;II)V HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1;->(IIIZ)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1;->(IIIZ)V HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1$1;->(II)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$downloadedOnlyPlaceable$1$1;->(II)V Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1;->(IIIIZ)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1;->(IIIIZ)V HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1$1;->(III)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$incognitoPlaceable$1$1;->(III)V Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1;->(ZILandroidx/compose/foundation/layout/WindowInsets;)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1;->(ZILandroidx/compose/foundation/layout/WindowInsets;)V HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1$1; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1$1;->(Landroidx/compose/foundation/layout/WindowInsets;)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$1$1$indexingPlaceable$1$1;->(Landroidx/compose/foundation/layout/WindowInsets;)V Leu/kanade/presentation/components/BannersKt$AppStateBanners$2; HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$2;->(ZZZLandroidx/compose/ui/Modifier;II)V PLeu/kanade/presentation/components/BannersKt$AppStateBanners$2;->(ZZZLandroidx/compose/ui/Modifier;II)V HSPLeu/kanade/presentation/components/BannersKt$AppStateBanners$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/components/BannersKt$AppStateBanners$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/ComposableSingletons$AppBarKt; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-1$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-1$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-1$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-1$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-1$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-10$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-11$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-11$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-11$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-11$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-11$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-12$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-12$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-12$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-12$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-12$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-2$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-2$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-2$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-2$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-2$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-3$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-3$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-3$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-3$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-3$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-4$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-4$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-4$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-4$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-4$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-5$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-5$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-5$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-5$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-5$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-6$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-7$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-7$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-7$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-7$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-7$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-8$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-8$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-8$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-8$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-8$1;->()V Leu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-9$1; HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-9$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-9$1;->()V HSPLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-9$1;->()V PLeu/kanade/presentation/components/ComposableSingletons$AppBarKt$lambda-9$1;->()V Leu/kanade/presentation/components/DropdownMenuKt; HSPLeu/kanade/presentation/components/DropdownMenuKt;->DropdownMenu-ILWXrKs(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/components/DropdownMenuKt;->DropdownMenu-ILWXrKs(ZLkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/window/PopupProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt; HSPLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt;->()V PLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt;->()V HSPLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt;->()V PLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt;->()V Leu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1; HSPLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1;->()V PLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1;->()V HSPLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1;->()V PLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1;->()V HSPLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/history/ComposableSingletons$HistoryScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/history/HistoryScreenKt; HSPLeu/kanade/presentation/history/HistoryScreenKt;->HistoryScreen(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Landroidx/compose/material3/SnackbarHostState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/history/HistoryScreenKt;->HistoryScreen(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Landroidx/compose/material3/SnackbarHostState;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V Leu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1; HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)V HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)V HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1; HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1;->(ILkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1;->(ILkotlin/jvm/functions/Function1;)V HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1$1$1; HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1$1$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$1$1$1$1;->(Lkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$2; HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$2;->(Landroidx/compose/material3/SnackbarHostState;I)V HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$2;->(Landroidx/compose/material3/SnackbarHostState;I)V HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$3; HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$3;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$3;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V HSPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/history/HistoryScreenKt$HistoryScreen$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/library/components/LibraryToolbarKt; HSPLeu/kanade/presentation/library/components/LibraryToolbarKt;->LibraryRegularToolbar(Leu/kanade/presentation/library/components/LibraryToolbarTitle;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/library/components/LibraryToolbarKt;->LibraryRegularToolbar(Leu/kanade/presentation/library/components/LibraryToolbarTitle;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/presentation/library/components/LibraryToolbarKt;->LibraryToolbar(ZILeu/kanade/presentation/library/components/LibraryToolbarTitle;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/library/components/LibraryToolbarKt;->LibraryToolbar(ZILeu/kanade/presentation/library/components/LibraryToolbarTitle;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$1; HSPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$1;->(Leu/kanade/presentation/library/components/LibraryToolbarTitle;F)V PLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$1;->(Leu/kanade/presentation/library/components/LibraryToolbarTitle;F)V HSPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$2; HSPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$2;->(ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$2;->(ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$3; HSPLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$3;->(Leu/kanade/presentation/library/components/LibraryToolbarTitle;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;I)V PLeu/kanade/presentation/library/components/LibraryToolbarKt$LibraryRegularToolbar$3;->(Leu/kanade/presentation/library/components/LibraryToolbarTitle;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;I)V Leu/kanade/presentation/library/components/LibraryToolbarTitle; HSPLeu/kanade/presentation/library/components/LibraryToolbarTitle;->(Ljava/lang/String;Ljava/lang/Integer;)V PLeu/kanade/presentation/library/components/LibraryToolbarTitle;->(Ljava/lang/String;Ljava/lang/Integer;)V HSPLeu/kanade/presentation/library/components/LibraryToolbarTitle;->equals(Ljava/lang/Object;)Z PLeu/kanade/presentation/library/components/LibraryToolbarTitle;->equals(Ljava/lang/Object;)Z HSPLeu/kanade/presentation/library/components/LibraryToolbarTitle;->getNumberOfManga()Ljava/lang/Integer; PLeu/kanade/presentation/library/components/LibraryToolbarTitle;->getNumberOfManga()Ljava/lang/Integer; HSPLeu/kanade/presentation/library/components/LibraryToolbarTitle;->getText()Ljava/lang/String; PLeu/kanade/presentation/library/components/LibraryToolbarTitle;->getText()Ljava/lang/String; Leu/kanade/presentation/manga/components/MangaBottomActionMenuKt; HSPLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt;->LibraryBottomActionMenu(ZLandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt;->LibraryBottomActionMenu(ZLandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt;->MangaBottomActionMenu(ZLandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt;->MangaBottomActionMenu(ZLandroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/manga/components/MangaBottomActionMenuKt$LibraryBottomActionMenu$1; HSPLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt$LibraryBottomActionMenu$1;->(Landroidx/compose/ui/Modifier;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt$LibraryBottomActionMenu$1;->(Landroidx/compose/ui/Modifier;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V Leu/kanade/presentation/manga/components/MangaBottomActionMenuKt$MangaBottomActionMenu$1; HSPLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt$MangaBottomActionMenu$1;->(Landroidx/compose/ui/Modifier;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/manga/components/MangaBottomActionMenuKt$MangaBottomActionMenu$1;->(Landroidx/compose/ui/Modifier;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V Leu/kanade/presentation/more/ComposableSingletons$MoreScreenKt; HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt;->()V Leu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1; HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1; HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1; HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1;->()V PLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1;->()V HSPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/ComposableSingletons$MoreScreenKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/LogoHeaderKt; HSPLeu/kanade/presentation/more/LogoHeaderKt;->LogoHeader(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/more/LogoHeaderKt;->LogoHeader(Landroidx/compose/runtime/Composer;I)V Leu/kanade/presentation/more/LogoHeaderKt$LogoHeader$2; HSPLeu/kanade/presentation/more/LogoHeaderKt$LogoHeader$2;->(I)V PLeu/kanade/presentation/more/LogoHeaderKt$LogoHeader$2;->(I)V Leu/kanade/presentation/more/MoreScreenKt; HSPLeu/kanade/presentation/more/MoreScreenKt;->MoreScreen(Lkotlin/jvm/functions/Function0;ZLkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/more/MoreScreenKt;->MoreScreen(Lkotlin/jvm/functions/Function0;ZLkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function1;ZLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$1; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$1;->(ZLandroidx/compose/ui/platform/UriHandler;)V HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$1;->(ZLandroidx/compose/ui/platform/UriHandler;)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2;->(ZLkotlin/jvm/functions/Function1;IZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Landroidx/compose/ui/platform/UriHandler;)V HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2;->(ZLkotlin/jvm/functions/Function1;IZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Landroidx/compose/ui/platform/UriHandler;)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1;->(ZLkotlin/jvm/functions/Function1;IZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Landroidx/compose/ui/platform/UriHandler;)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1;->(ZLkotlin/jvm/functions/Function1;IZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Landroidx/compose/ui/platform/UriHandler;)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$1; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$1;->(ILkotlin/jvm/functions/Function1;Z)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$1;->(ILkotlin/jvm/functions/Function1;Z)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$2; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$2;->(ILkotlin/jvm/functions/Function1;Z)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$2;->(ILkotlin/jvm/functions/Function1;Z)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$3; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$3;->(ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$3;->(ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$4; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$4;->(Lkotlin/jvm/functions/Function0;I)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$4;->(Lkotlin/jvm/functions/Function0;I)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$5; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$5;->(Lkotlin/jvm/functions/Function0;I)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$5;->(Lkotlin/jvm/functions/Function0;I)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$6; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$6;->(Lkotlin/jvm/functions/Function0;I)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$6;->(Lkotlin/jvm/functions/Function0;I)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$6;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$7; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$7;->(Lkotlin/jvm/functions/Function0;I)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$7;->(Lkotlin/jvm/functions/Function0;I)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$7;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$7;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$8; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$8;->(Lkotlin/jvm/functions/Function0;I)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$8;->(Lkotlin/jvm/functions/Function0;I)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$8;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$8;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9;->(Landroidx/compose/ui/platform/UriHandler;)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9;->(Landroidx/compose/ui/platform/UriHandler;)V HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9$1; HSPLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9$1;->(Landroidx/compose/ui/platform/UriHandler;)V PLeu/kanade/presentation/more/MoreScreenKt$MoreScreen$2$1$9$1;->(Landroidx/compose/ui/platform/UriHandler;)V Leu/kanade/presentation/more/settings/PreferenceItemKt; HSPLeu/kanade/presentation/more/settings/PreferenceItemKt;->()V PLeu/kanade/presentation/more/settings/PreferenceItemKt;->()V HSPLeu/kanade/presentation/more/settings/PreferenceItemKt;->getLocalPreferenceHighlighted()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLeu/kanade/presentation/more/settings/PreferenceItemKt;->getLocalPreferenceHighlighted()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; HSPLeu/kanade/presentation/more/settings/PreferenceItemKt;->getLocalPreferenceMinHeight()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; PLeu/kanade/presentation/more/settings/PreferenceItemKt;->getLocalPreferenceMinHeight()Landroidx/compose/runtime/DynamicProvidableCompositionLocal; Leu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1; HSPLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1;->()V PLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1;->()V HSPLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1;->()V PLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1;->()V HSPLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1;->invoke()Ljava/lang/Object; PLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceHighlighted$1;->invoke()Ljava/lang/Object; Leu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1; HSPLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1;->()V PLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1;->()V HSPLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1;->()V PLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1;->()V HSPLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1;->invoke()Ljava/lang/Object; PLeu/kanade/presentation/more/settings/PreferenceItemKt$LocalPreferenceMinHeight$1;->invoke()Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt;->()V PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt;->()V PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-1$1;->()V PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-1$1;->()V PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-2$1;->()V PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-2$1;->()V PLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/ComposableSingletons$SettingsMainScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsBackupScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsBackupScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsBrowseScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsBrowseScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsDownloadScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsDownloadScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsLibraryScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsLibraryScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen;->Content(Landroidx/compose/runtime/Composer;I)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen;->Content(ZLandroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen;->Content(ZLandroidx/compose/runtime/Composer;I)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen;->access$getItems$p()Ljava/util/List; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2;->(Lkotlin/jvm/functions/Function0;Lcafe/adriel/voyager/navigator/Navigator;Z)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$1$1$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$2;->(Lcafe/adriel/voyager/navigator/Navigator;Z)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$2$2$1;->(Lcafe/adriel/voyager/navigator/Navigator;Z)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3;->(ZLcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/material3/TopAppBarState;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1;->(Ljava/lang/Integer;ZLcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$1;->()V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$1;->()V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$2$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Leu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;Lcafe/adriel/voyager/navigator/Navigator;Z)V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$2$1$1;->(Lcafe/adriel/voyager/navigator/Navigator;Leu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;Z)V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$2$1$1;->(Lcafe/adriel/voyager/navigator/Navigator;Leu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;Z)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$invoke$$inlined$itemsIndexed$default$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$invoke$$inlined$itemsIndexed$default$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$invoke$$inlined$itemsIndexed$default$2;->(Ljava/util/List;)V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$invoke$$inlined$itemsIndexed$default$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$invoke$$inlined$itemsIndexed$default$3;->(Ljava/util/List;Ljava/lang/Integer;ZLcafe/adriel/voyager/navigator/Navigator;)V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$3$1$invoke$$inlined$itemsIndexed$default$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Content$4;->(Leu/kanade/presentation/more/settings/screen/SettingsMainScreen;ZI)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;->(IILandroidx/compose/ui/graphics/vector/ImageVector;Leu/kanade/presentation/more/settings/screen/SearchableSettings;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;->(IILkotlin/jvm/functions/Function2;Landroidx/compose/ui/graphics/vector/ImageVector;Lcafe/adriel/voyager/core/screen/Screen;)V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;->getFormatSubtitle()Lkotlin/jvm/functions/Function2; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;->getIcon()Landroidx/compose/ui/graphics/vector/ImageVector; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;->getTitleRes()I HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item;->hashCode()I PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item$1;->(I)V HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$Item$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$items$1;->()V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$items$1;->()V PLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$items$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/screen/SettingsMainScreen$items$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/more/settings/screen/SettingsReaderScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsReaderScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsSecurityScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsSecurityScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsTrackingScreen;->()V PLeu/kanade/presentation/more/settings/screen/SettingsTrackingScreen;->()V PLeu/kanade/presentation/more/settings/screen/about/AboutScreen;->()V PLeu/kanade/presentation/more/settings/screen/about/AboutScreen;->()V PLeu/kanade/presentation/more/settings/screen/about/AboutScreen;->getVersionName(Z)Ljava/lang/String; Leu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt; HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->()V PLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->()V HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->BasePreferenceWidget(Landroidx/compose/ui/Modifier;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->BasePreferenceWidget(Landroidx/compose/ui/Modifier;Ljava/lang/String;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->getPrefsHorizontalPadding()F PLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->getPrefsHorizontalPadding()F HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->getTrailingWidgetBuffer()F PLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt;->getTrailingWidgetBuffer()F Leu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$BasePreferenceWidget$1$1; HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$BasePreferenceWidget$1$1;->(Lkotlin/jvm/functions/Function0;)V HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$BasePreferenceWidget$1$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$BasePreferenceWidget$1$1;->invoke()Ljava/lang/Object; Leu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$BasePreferenceWidget$3; Leu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1; HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1;->(Z)V HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1;->(Z)V HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1; HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1;->(ZLandroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1;->(ZLandroidx/compose/runtime/MutableState;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/widget/BasePreferenceWidgetKt$highlightBackground$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt; HSPLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt;->SwitchPreferenceWidget(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt;->SwitchPreferenceWidget(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$1; HSPLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$1;->(IZ)V PLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$1;->(IZ)V HSPLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$2$1; HSPLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$2$1;->(ZLkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/more/settings/widget/SwitchPreferenceWidgetKt$SwitchPreferenceWidget$2$1;->(ZLkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt; HSPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt;->TextPreferenceWidget-3f6hBDE(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;JLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt;->TextPreferenceWidget-3f6hBDE(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;JLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V Leu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$1; HSPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$1;->(Ljava/lang/String;I)V PLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$1;->(Ljava/lang/String;I)V HSPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$2; HSPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$2;->(IJLandroidx/compose/ui/graphics/vector/ImageVector;)V PLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$2;->(IJLandroidx/compose/ui/graphics/vector/ImageVector;)V HSPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$3; HSPLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$3;->(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;JLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;II)V PLeu/kanade/presentation/more/settings/widget/TextPreferenceWidgetKt$TextPreferenceWidget$3;->(Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;JLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function0;II)V Leu/kanade/presentation/theme/TachiyomiThemeKt; HSPLeu/kanade/presentation/theme/TachiyomiThemeKt;->TachiyomiTheme(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V PLeu/kanade/presentation/theme/TachiyomiThemeKt;->TachiyomiTheme(Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V Leu/kanade/presentation/updates/UpdatesScreenKt; HSPLeu/kanade/presentation/updates/UpdatesScreenKt;->UpdateScreen(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Landroidx/compose/material3/SnackbarHostState;JLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/updates/UpdatesScreenKt;->UpdateScreen(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Landroidx/compose/material3/SnackbarHostState;JLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt;->access$UpdatesAppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/updates/UpdatesScreenKt;->access$UpdatesAppBar(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;Landroidx/compose/runtime/Composer;II)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt;->access$UpdatesBottomBar(Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/updates/UpdatesScreenKt;->access$UpdatesBottomBar(Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$1$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$1$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$1$1;->(Lkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2;->(Lkotlin/jvm/functions/Function0;ILeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2;->(Lkotlin/jvm/functions/Function0;ILeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$1$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$1$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$1$1;->(Lkotlin/jvm/functions/Function0;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$2$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$2$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$2$1;->(Lkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$3$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$3$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$3$1;->(Lkotlin/jvm/functions/Function0;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$4$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$4$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$2$4$1;->(Lkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$3; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$3;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;II)V HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$3;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;II)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$4; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$4;->(Landroidx/compose/material3/SnackbarHostState;I)V HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$4;->(Landroidx/compose/material3/SnackbarHostState;I)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$5; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$5;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Lkotlin/jvm/functions/Function0;JLandroid/content/Context;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$5;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Lkotlin/jvm/functions/Function0;JLandroid/content/Context;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdateScreen$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$1;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$1;->(Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$2; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$2;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$2;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$3; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$3;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesAppBar$3;->(Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/material3/TopAppBarScrollBehavior;II)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$1; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$1;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$11; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$11;->(Ljava/util/List;Lkotlin/jvm/functions/Function1;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$11;->(Ljava/util/List;Lkotlin/jvm/functions/Function1;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$3; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$3;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$3;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$5; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$5;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$5;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$7; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$7;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$7;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V Leu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$9; HSPLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$9;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/presentation/updates/UpdatesScreenKt$UpdatesBottomBar$9;->(Ljava/util/List;Lkotlin/jvm/functions/Function2;)V Leu/kanade/presentation/util/ComposableSingletons$NavigatorKt; HSPLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt;->()V PLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt;->()V HSPLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt;->()V PLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt;->()V Leu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1; HSPLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1;->()V PLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1;->()V HSPLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1;->()V PLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1;->()V HSPLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/util/ComposableSingletons$NavigatorKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/util/NavigatorKt; HSPLeu/kanade/presentation/util/NavigatorKt;->()V PLeu/kanade/presentation/util/NavigatorKt;->()V HSPLeu/kanade/presentation/util/NavigatorKt;->DefaultNavigatorScreenTransition(Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/presentation/util/NavigatorKt;->DefaultNavigatorScreenTransition(Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/presentation/util/NavigatorKt;->ScreenTransition(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V HPLeu/kanade/presentation/util/NavigatorKt;->ScreenTransition(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V PLeu/kanade/presentation/util/NavigatorKt;->getLocalBackPress()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Leu/kanade/presentation/util/NavigatorKt$DefaultNavigatorScreenTransition$1; HSPLeu/kanade/presentation/util/NavigatorKt$DefaultNavigatorScreenTransition$1;->(Lcafe/adriel/voyager/navigator/Navigator;I)V PLeu/kanade/presentation/util/NavigatorKt$DefaultNavigatorScreenTransition$1;->(Lcafe/adriel/voyager/navigator/Navigator;I)V HSPLeu/kanade/presentation/util/NavigatorKt$DefaultNavigatorScreenTransition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/util/NavigatorKt$DefaultNavigatorScreenTransition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/util/NavigatorKt$LocalBackPress$1; HSPLeu/kanade/presentation/util/NavigatorKt$LocalBackPress$1;->()V PLeu/kanade/presentation/util/NavigatorKt$LocalBackPress$1;->()V HSPLeu/kanade/presentation/util/NavigatorKt$LocalBackPress$1;->()V PLeu/kanade/presentation/util/NavigatorKt$LocalBackPress$1;->()V Leu/kanade/presentation/util/NavigatorKt$ScreenTransition$1; HSPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1;->(Lcafe/adriel/voyager/navigator/Navigator;ILkotlin/jvm/functions/Function4;)V PLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1;->(Lcafe/adriel/voyager/navigator/Navigator;ILkotlin/jvm/functions/Function4;)V HSPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/util/NavigatorKt$ScreenTransition$1$1; HSPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1$1;->(Lkotlin/jvm/functions/Function4;Landroidx/compose/animation/AnimatedContentScope;Lcafe/adriel/voyager/core/screen/Screen;I)V HPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1$1;->(Lkotlin/jvm/functions/Function4;Landroidx/compose/animation/AnimatedContentScope;Lcafe/adriel/voyager/core/screen/Screen;I)V HSPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/util/NavigatorKt$ScreenTransition$2; HSPLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$2;->(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function4;II)V PLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$2;->(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function4;II)V PLeu/kanade/presentation/util/NavigatorKt$ScreenTransition$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/presentation/util/Screen; HSPLeu/kanade/presentation/util/Screen;->()V HPLeu/kanade/presentation/util/Screen;->()V HSPLeu/kanade/presentation/util/Screen;->getKey()Ljava/lang/String; HPLeu/kanade/presentation/util/Screen;->getKey()Ljava/lang/String; Leu/kanade/presentation/util/Tab; Leu/kanade/presentation/util/WindowSizeKt; HSPLeu/kanade/presentation/util/WindowSizeKt;->isTabletUi(Landroidx/compose/runtime/Composer;)Z HPLeu/kanade/presentation/util/WindowSizeKt;->isTabletUi(Landroidx/compose/runtime/Composer;)Z Leu/kanade/tachiyomi/App; HSPLeu/kanade/tachiyomi/App;->()V PLeu/kanade/tachiyomi/App;->()V HSPLeu/kanade/tachiyomi/App;->access$getDisableIncognitoReceiver$p(Leu/kanade/tachiyomi/App;)Leu/kanade/tachiyomi/App$DisableIncognitoReceiver; PLeu/kanade/tachiyomi/App;->access$getDisableIncognitoReceiver$p(Leu/kanade/tachiyomi/App;)Leu/kanade/tachiyomi/App$DisableIncognitoReceiver; HSPLeu/kanade/tachiyomi/App;->getPackageName()Ljava/lang/String; HPLeu/kanade/tachiyomi/App;->getPackageName()Ljava/lang/String; HSPLeu/kanade/tachiyomi/App;->onCreate()V PLeu/kanade/tachiyomi/App;->onCreate()V HSPLeu/kanade/tachiyomi/App;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLeu/kanade/tachiyomi/App;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLeu/kanade/tachiyomi/App;->onStop(Landroidx/lifecycle/LifecycleOwner;)V Leu/kanade/tachiyomi/App$DisableIncognitoReceiver; HSPLeu/kanade/tachiyomi/App$DisableIncognitoReceiver;->(Leu/kanade/tachiyomi/App;)V PLeu/kanade/tachiyomi/App$DisableIncognitoReceiver;->(Leu/kanade/tachiyomi/App;)V HSPLeu/kanade/tachiyomi/App$DisableIncognitoReceiver;->unregister()V PLeu/kanade/tachiyomi/App$DisableIncognitoReceiver;->unregister()V Leu/kanade/tachiyomi/App$onCreate$$inlined$get$1; HSPLeu/kanade/tachiyomi/App$onCreate$$inlined$get$1;->()V PLeu/kanade/tachiyomi/App$onCreate$$inlined$get$1;->()V Leu/kanade/tachiyomi/App$onCreate$$inlined$get$2; HSPLeu/kanade/tachiyomi/App$onCreate$$inlined$get$2;->()V PLeu/kanade/tachiyomi/App$onCreate$$inlined$get$2;->()V Leu/kanade/tachiyomi/App$onCreate$$inlined$get$3; HSPLeu/kanade/tachiyomi/App$onCreate$$inlined$get$3;->()V PLeu/kanade/tachiyomi/App$onCreate$$inlined$get$3;->()V Leu/kanade/tachiyomi/App$onCreate$1; HSPLeu/kanade/tachiyomi/App$onCreate$1;->(Leu/kanade/tachiyomi/App;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/App$onCreate$1;->(Leu/kanade/tachiyomi/App;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/App$onCreate$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/App$onCreate$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/App$onCreate$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/App$onCreate$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/App$onCreate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/App$onCreate$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/App$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/App$special$$inlined$injectLazy$1$1; HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1$1;->()V PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$1$1;->()V Leu/kanade/tachiyomi/App$special$$inlined$injectLazy$2; HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/App$special$$inlined$injectLazy$2$1; HSPLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2$1;->()V PLeu/kanade/tachiyomi/App$special$$inlined$injectLazy$2$1;->()V Leu/kanade/tachiyomi/AppModule; HSPLeu/kanade/tachiyomi/AppModule;->$r8$lambda$0RHLTm-bvsDpST_-bhuVCJga1ss(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule;->$r8$lambda$0RHLTm-bvsDpST_-bhuVCJga1ss(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/AppModule;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/AppModule;->getApp()Landroid/app/Application; PLeu/kanade/tachiyomi/AppModule;->getApp()Landroid/app/Application; HSPLeu/kanade/tachiyomi/AppModule;->registerInjectables(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule;->registerInjectables(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule;->registerWith(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule;->registerWith(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingleton$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingleton$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingleton$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$10; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$10;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$10;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$11; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$11;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$11;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$12; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$12;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$12;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$13; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$13;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$13;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$14; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$14;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$14;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$15; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$15;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$15;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$16; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$16;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$16;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$17; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$17;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$17;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$18; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$18;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$18;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$19; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$19;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$19;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$2; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$2;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$2;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$3; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$3;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$3;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$4; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$4;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$4;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$5; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$5;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$5;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$6; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$6;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$6;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$7; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$7;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$7;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$8; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$8;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$8;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$9; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$9;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$$inlined$addSingletonFactory$9;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$1;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$1;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$1$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$1$1;->(Ltachiyomi/data/data/DatabaseImpl$Schema;[Lapp/cash/sqldelight/db/AfterVersion;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$1$1;->(Ltachiyomi/data/data/DatabaseImpl$Schema;[Lapp/cash/sqldelight/db/AfterVersion;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$1$1;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$1$1;->onOpen(Landroidx/sqlite/db/SupportSQLiteDatabase;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$1$1;->setPragma(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$1$1;->setPragma(Landroidx/sqlite/db/SupportSQLiteDatabase;Ljava/lang/String;)V Leu/kanade/tachiyomi/AppModule$registerInjectables$10; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$10;->(Leu/kanade/tachiyomi/AppModule;Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$10;->(Leu/kanade/tachiyomi/AppModule;Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$10;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$10;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$10$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$10$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$10$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$10$invoke$$inlined$get$2; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$10$invoke$$inlined$get$2;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$10$invoke$$inlined$get$2;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$11; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$11;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$11;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$11;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$11;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$12; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$12;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$12;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$12;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$12;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$13; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$13;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$13;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$13;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$13;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$14; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$14;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$14;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$14;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$14;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$15; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$15;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$15;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$15;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$15;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$16; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$16;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$16;->(Leu/kanade/tachiyomi/AppModule;)V Leu/kanade/tachiyomi/AppModule$registerInjectables$17; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$17;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$17;->(Leu/kanade/tachiyomi/AppModule;)V Leu/kanade/tachiyomi/AppModule$registerInjectables$18; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$18;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$18;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$18;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$18;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$19; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$19;->(Leu/kanade/tachiyomi/AppModule;Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$19;->(Leu/kanade/tachiyomi/AppModule;Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$19;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$19;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$19$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$19$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$19$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$2; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$2;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$2;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$2$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$2$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$2$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$3; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$3;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$3;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$3;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$3;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$3$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$3$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$3$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$3$invoke$$inlined$get$2; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$3$invoke$$inlined$get$2;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$3$invoke$$inlined$get$2;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$4; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$4;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$4;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$4;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$4;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$4;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$4;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$4$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$4$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$4$1;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$4$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$4$1;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$5; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$5;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$5;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$5;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$5;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$5;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$5;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$5$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$5$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$5$1;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$5$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$5$1;->()V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$5$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$5$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$6; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$6;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$6;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$6;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$6;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$7; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$7;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$7;->(Leu/kanade/tachiyomi/AppModule;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$7;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$7;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$8; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$8;->(Leu/kanade/tachiyomi/AppModule;Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$8;->(Leu/kanade/tachiyomi/AppModule;Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$8;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/AppModule$registerInjectables$8;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/AppModule$registerInjectables$8$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$8$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$8$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$9; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$9;->(Leu/kanade/tachiyomi/AppModule;)V PLeu/kanade/tachiyomi/AppModule$registerInjectables$9;->(Leu/kanade/tachiyomi/AppModule;)V Leu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$1; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$1;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$1;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$2; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$2;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$2;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$3; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$3;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$3;->()V Leu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$4; HSPLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$4;->()V PLeu/kanade/tachiyomi/AppModule$registerInjectables$lambda$0$$inlined$get$4;->()V Leu/kanade/tachiyomi/Migrations; HSPLeu/kanade/tachiyomi/Migrations;->()V PLeu/kanade/tachiyomi/Migrations;->()V HSPLeu/kanade/tachiyomi/Migrations;->()V PLeu/kanade/tachiyomi/Migrations;->()V Leu/kanade/tachiyomi/PreferenceModule; HSPLeu/kanade/tachiyomi/PreferenceModule;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/PreferenceModule;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/PreferenceModule;->getApplication()Landroid/app/Application; PLeu/kanade/tachiyomi/PreferenceModule;->getApplication()Landroid/app/Application; HSPLeu/kanade/tachiyomi/PreferenceModule;->registerInjectables(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule;->registerInjectables(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule;->registerWith(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule;->registerWith(Luy/kohesive/injekt/api/InjektRegistrar;)V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$10; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$10;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$10;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$11; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$11;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$11;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$12; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$12;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$12;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$13; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$13;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$13;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$2; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$2;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$2;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$3; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$3;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$3;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$4; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$4;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$4;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$5; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$5;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$5;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$6; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$6;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$6;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$7; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$7;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$7;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$8; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$8;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$8;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$9; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$9;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$$inlined$addSingletonFactory$9;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$1;->(Leu/kanade/tachiyomi/PreferenceModule;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$1;->(Leu/kanade/tachiyomi/PreferenceModule;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$10; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$10;->(Leu/kanade/tachiyomi/PreferenceModule;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$10;->(Leu/kanade/tachiyomi/PreferenceModule;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$10;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$10;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$11; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$11$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$11$invoke$$inlined$get$2; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11$invoke$$inlined$get$2;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$11$invoke$$inlined$get$2;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$12; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$12;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$12;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$12;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$12;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$12$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$12$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$12$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$13; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$13;->(Leu/kanade/tachiyomi/PreferenceModule;Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$13;->(Leu/kanade/tachiyomi/PreferenceModule;Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$13;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$13;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$13$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$13$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$13$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$2; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$2;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$2;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$2$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$2$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$2$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$3; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$3;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$3;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$3;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$3;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$3$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$3$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$3$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$4; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$4;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$4;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$4;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$4;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$4$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$4$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$4$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$5; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$5;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$5;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$5;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$5;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$5$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$5$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$5$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$6; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$6;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$6;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$6;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$6;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$6$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$6$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$6$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$7; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$7;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$7;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$7;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$7;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$7$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$7$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$7$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$8; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$8;->(Leu/kanade/tachiyomi/PreferenceModule;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$8;->(Leu/kanade/tachiyomi/PreferenceModule;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$8;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$8;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$9; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$9$invoke$$inlined$get$1; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9$invoke$$inlined$get$1;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9$invoke$$inlined$get$1;->()V Leu/kanade/tachiyomi/PreferenceModule$registerInjectables$9$invoke$$inlined$get$2; HSPLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9$invoke$$inlined$get$2;->()V PLeu/kanade/tachiyomi/PreferenceModule$registerInjectables$9$invoke$$inlined$get$2;->()V Leu/kanade/tachiyomi/core/security/SecurityPreferences; HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/tachiyomi/core/security/SecurityPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences;->secureScreen()Ltachiyomi/core/preference/Preference; PLeu/kanade/tachiyomi/core/security/SecurityPreferences;->secureScreen()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences;->useAuthenticator()Ltachiyomi/core/preference/Preference; PLeu/kanade/tachiyomi/core/security/SecurityPreferences;->useAuthenticator()Ltachiyomi/core/preference/Preference; Leu/kanade/tachiyomi/core/security/SecurityPreferences$SecureScreenMode; HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences$SecureScreenMode;->()V PLeu/kanade/tachiyomi/core/security/SecurityPreferences$SecureScreenMode;->()V HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences$SecureScreenMode;->(Ljava/lang/String;II)V PLeu/kanade/tachiyomi/core/security/SecurityPreferences$SecureScreenMode;->(Ljava/lang/String;II)V Leu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$1; HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$1;->()V PLeu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$1;->()V HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$1;->()V PLeu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$1;->()V Leu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$2; HSPLeu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$2;->()V PLeu/kanade/tachiyomi/core/security/SecurityPreferences$secureScreen$$inlined$getEnum$2;->()V Leu/kanade/tachiyomi/crash/CrashActivity; Leu/kanade/tachiyomi/crash/GlobalExceptionHandler; HSPLeu/kanade/tachiyomi/crash/GlobalExceptionHandler;->()V PLeu/kanade/tachiyomi/crash/GlobalExceptionHandler;->()V HSPLeu/kanade/tachiyomi/crash/GlobalExceptionHandler;->(Landroid/content/Context;Ljava/lang/Thread$UncaughtExceptionHandler;)V PLeu/kanade/tachiyomi/crash/GlobalExceptionHandler;->(Landroid/content/Context;Ljava/lang/Thread$UncaughtExceptionHandler;)V Leu/kanade/tachiyomi/crash/GlobalExceptionHandler$Companion; HSPLeu/kanade/tachiyomi/crash/GlobalExceptionHandler$Companion;->()V PLeu/kanade/tachiyomi/crash/GlobalExceptionHandler$Companion;->()V HSPLeu/kanade/tachiyomi/crash/GlobalExceptionHandler$Companion;->(I)V PLeu/kanade/tachiyomi/crash/GlobalExceptionHandler$Companion;->(I)V Leu/kanade/tachiyomi/data/backup/BackupCreateJob; HSPLeu/kanade/tachiyomi/data/backup/BackupCreateJob;->()V PLeu/kanade/tachiyomi/data/backup/BackupCreateJob;->()V Leu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion; HSPLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion;->()V PLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion;->()V HSPLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion;->(I)V PLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion;->(I)V HSPLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion;->setupTask(Landroid/content/Context;Ljava/lang/Integer;)V PLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion;->setupTask(Landroid/content/Context;Ljava/lang/Integer;)V Leu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion$setupTask$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion$setupTask$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/backup/BackupCreateJob$Companion$setupTask$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/cache/ChapterCache; HSPLeu/kanade/tachiyomi/data/cache/ChapterCache;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/cache/ChapterCache;->(Landroid/app/Application;)V Leu/kanade/tachiyomi/data/cache/ChapterCache$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/cache/ChapterCache$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/cache/ChapterCache$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/cache/ChapterCache$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/cache/ChapterCache$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/cache/CoverCache; HSPLeu/kanade/tachiyomi/data/cache/CoverCache;->()V PLeu/kanade/tachiyomi/data/cache/CoverCache;->()V HSPLeu/kanade/tachiyomi/data/cache/CoverCache;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/cache/CoverCache;->(Landroid/app/Application;)V Leu/kanade/tachiyomi/data/cache/CoverCache$Companion; HSPLeu/kanade/tachiyomi/data/cache/CoverCache$Companion;->()V PLeu/kanade/tachiyomi/data/cache/CoverCache$Companion;->()V HSPLeu/kanade/tachiyomi/data/cache/CoverCache$Companion;->(I)V PLeu/kanade/tachiyomi/data/cache/CoverCache$Companion;->(I)V Leu/kanade/tachiyomi/data/download/DownloadCache; HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/download/DownloadCache;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->access$getDirectoryFromPreference(Leu/kanade/tachiyomi/data/download/DownloadCache;)Lcom/hippo/unifile/UniFile; PLeu/kanade/tachiyomi/data/download/DownloadCache;->access$getDirectoryFromPreference(Leu/kanade/tachiyomi/data/download/DownloadCache;)Lcom/hippo/unifile/UniFile; HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->access$getDiskCacheFile(Leu/kanade/tachiyomi/data/download/DownloadCache;)Ljava/io/File; PLeu/kanade/tachiyomi/data/download/DownloadCache;->access$getDiskCacheFile(Leu/kanade/tachiyomi/data/download/DownloadCache;)Ljava/io/File; HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->access$getRootDownloadsDirLock$p(Leu/kanade/tachiyomi/data/download/DownloadCache;)Lkotlinx/coroutines/sync/Mutex; PLeu/kanade/tachiyomi/data/download/DownloadCache;->access$getRootDownloadsDirLock$p(Leu/kanade/tachiyomi/data/download/DownloadCache;)Lkotlinx/coroutines/sync/Mutex; HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->access$setRootDownloadsDir$p(Leu/kanade/tachiyomi/data/download/DownloadCache;Leu/kanade/tachiyomi/data/download/RootDirectory;)V PLeu/kanade/tachiyomi/data/download/DownloadCache;->access$setRootDownloadsDir$p(Leu/kanade/tachiyomi/data/download/DownloadCache;Leu/kanade/tachiyomi/data/download/RootDirectory;)V HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->getChanges()Lkotlinx/coroutines/flow/SharedFlow; PLeu/kanade/tachiyomi/data/download/DownloadCache;->getChanges()Lkotlinx/coroutines/flow/SharedFlow; HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->invalidateCache()V PLeu/kanade/tachiyomi/data/download/DownloadCache;->invalidateCache()V HSPLeu/kanade/tachiyomi/data/download/DownloadCache;->isInitializing()Lkotlinx/coroutines/flow/StateFlow; PLeu/kanade/tachiyomi/data/download/DownloadCache;->isInitializing()Lkotlinx/coroutines/flow/StateFlow; Leu/kanade/tachiyomi/data/download/DownloadCache$1; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$1;->(Leu/kanade/tachiyomi/data/download/DownloadCache;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadCache$1;->(Leu/kanade/tachiyomi/data/download/DownloadCache;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadCache$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/DownloadCache$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadCache$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadCache$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadCache$2; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$2;->(Leu/kanade/tachiyomi/data/download/DownloadCache;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadCache$2;->(Leu/kanade/tachiyomi/data/download/DownloadCache;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadCache$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/DownloadCache$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadCache$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadCache$changes$1; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadCache$changes$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/data/download/DownloadCache$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/data/download/DownloadManager; HSPLeu/kanade/tachiyomi/data/download/DownloadManager;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/download/DownloadManager;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/data/download/DownloadManager;->getQueueState()Lkotlinx/coroutines/flow/StateFlow; PLeu/kanade/tachiyomi/data/download/DownloadManager;->getQueueState()Lkotlinx/coroutines/flow/StateFlow; HSPLeu/kanade/tachiyomi/data/download/DownloadManager;->progressFlow()Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1; PLeu/kanade/tachiyomi/data/download/DownloadManager;->progressFlow()Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1; HSPLeu/kanade/tachiyomi/data/download/DownloadManager;->statusFlow()Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1; PLeu/kanade/tachiyomi/data/download/DownloadManager;->statusFlow()Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1; Leu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$$inlined$flatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->(Leu/kanade/tachiyomi/data/download/DownloadManager;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->(Leu/kanade/tachiyomi/data/download/DownloadManager;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$progressFlow$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$5; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$5;->()V PLeu/kanade/tachiyomi/data/download/DownloadManager$special$$inlined$get$5;->()V Leu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$$inlined$flatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->(Leu/kanade/tachiyomi/data/download/DownloadManager;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->(Leu/kanade/tachiyomi/data/download/DownloadManager;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadManager$statusFlow$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadPendingDeleter; HSPLeu/kanade/tachiyomi/data/download/DownloadPendingDeleter;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/download/DownloadPendingDeleter;->(Landroid/app/Application;)V Leu/kanade/tachiyomi/data/download/DownloadPendingDeleter$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/download/DownloadPendingDeleter$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/download/DownloadPendingDeleter$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/download/DownloadProvider; HSPLeu/kanade/tachiyomi/data/download/DownloadProvider;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/download/DownloadProvider;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/data/download/DownloadProvider;->access$getContext$p(Leu/kanade/tachiyomi/data/download/DownloadProvider;)Landroid/content/Context; PLeu/kanade/tachiyomi/data/download/DownloadProvider;->access$getContext$p(Leu/kanade/tachiyomi/data/download/DownloadProvider;)Landroid/content/Context; HSPLeu/kanade/tachiyomi/data/download/DownloadProvider;->access$setDownloadsDir$p(Leu/kanade/tachiyomi/data/download/DownloadProvider;Lcom/hippo/unifile/UniFile;)V PLeu/kanade/tachiyomi/data/download/DownloadProvider;->access$setDownloadsDir$p(Leu/kanade/tachiyomi/data/download/DownloadProvider;Lcom/hippo/unifile/UniFile;)V Leu/kanade/tachiyomi/data/download/DownloadProvider$1; HSPLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->(Leu/kanade/tachiyomi/data/download/DownloadProvider;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->(Leu/kanade/tachiyomi/data/download/DownloadProvider;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/DownloadProvider$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/DownloadProvider$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/download/DownloadProvider$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/download/DownloadProvider$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/download/DownloadService; HSPLeu/kanade/tachiyomi/data/download/DownloadService;->()V PLeu/kanade/tachiyomi/data/download/DownloadService;->()V HSPLeu/kanade/tachiyomi/data/download/DownloadService;->access$isRunning$cp()Lkotlinx/coroutines/flow/StateFlow; PLeu/kanade/tachiyomi/data/download/DownloadService;->access$isRunning$cp()Lkotlinx/coroutines/flow/StateFlow; Leu/kanade/tachiyomi/data/download/DownloadService$Companion; HSPLeu/kanade/tachiyomi/data/download/DownloadService$Companion;->()V PLeu/kanade/tachiyomi/data/download/DownloadService$Companion;->()V HSPLeu/kanade/tachiyomi/data/download/DownloadService$Companion;->(I)V PLeu/kanade/tachiyomi/data/download/DownloadService$Companion;->(I)V Leu/kanade/tachiyomi/data/download/DownloadStore; HSPLeu/kanade/tachiyomi/data/download/DownloadStore;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/download/DownloadStore;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/data/download/DownloadStore;->addAll(Ljava/util/List;)V PLeu/kanade/tachiyomi/data/download/DownloadStore;->addAll(Ljava/util/List;)V HSPLeu/kanade/tachiyomi/data/download/DownloadStore;->clear()V PLeu/kanade/tachiyomi/data/download/DownloadStore;->clear()V HSPLeu/kanade/tachiyomi/data/download/DownloadStore;->restore()Ljava/util/ArrayList; PLeu/kanade/tachiyomi/data/download/DownloadStore;->restore()Ljava/util/ArrayList; Leu/kanade/tachiyomi/data/download/DownloadStore$restore$$inlined$sortedBy$1; HSPLeu/kanade/tachiyomi/data/download/DownloadStore$restore$$inlined$sortedBy$1;->()V PLeu/kanade/tachiyomi/data/download/DownloadStore$restore$$inlined$sortedBy$1;->()V Leu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/data/download/DownloadStore$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/data/download/Downloader; HSPLeu/kanade/tachiyomi/data/download/Downloader;->()V PLeu/kanade/tachiyomi/data/download/Downloader;->()V HSPLeu/kanade/tachiyomi/data/download/Downloader;->(Landroid/app/Application;Leu/kanade/tachiyomi/data/download/DownloadProvider;Leu/kanade/tachiyomi/data/download/DownloadCache;)V PLeu/kanade/tachiyomi/data/download/Downloader;->(Landroid/app/Application;Leu/kanade/tachiyomi/data/download/DownloadProvider;Leu/kanade/tachiyomi/data/download/DownloadCache;)V HSPLeu/kanade/tachiyomi/data/download/Downloader;->access$addAllToQueue(Leu/kanade/tachiyomi/data/download/Downloader;Ljava/util/List;)V PLeu/kanade/tachiyomi/data/download/Downloader;->access$addAllToQueue(Leu/kanade/tachiyomi/data/download/Downloader;Ljava/util/List;)V HSPLeu/kanade/tachiyomi/data/download/Downloader;->access$getStore$p(Leu/kanade/tachiyomi/data/download/Downloader;)Leu/kanade/tachiyomi/data/download/DownloadStore; PLeu/kanade/tachiyomi/data/download/Downloader;->access$getStore$p(Leu/kanade/tachiyomi/data/download/Downloader;)Leu/kanade/tachiyomi/data/download/DownloadStore; HSPLeu/kanade/tachiyomi/data/download/Downloader;->addAllToQueue(Ljava/util/List;)V PLeu/kanade/tachiyomi/data/download/Downloader;->addAllToQueue(Ljava/util/List;)V HSPLeu/kanade/tachiyomi/data/download/Downloader;->getQueueState()Lkotlinx/coroutines/flow/StateFlow; PLeu/kanade/tachiyomi/data/download/Downloader;->getQueueState()Lkotlinx/coroutines/flow/StateFlow; Leu/kanade/tachiyomi/data/download/Downloader$1; HSPLeu/kanade/tachiyomi/data/download/Downloader$1;->(Leu/kanade/tachiyomi/data/download/Downloader;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/Downloader$1;->(Leu/kanade/tachiyomi/data/download/Downloader;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/Downloader$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/Downloader$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/Downloader$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/Downloader$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/data/download/Downloader$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/Downloader$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/Downloader$1$chapters$1; HSPLeu/kanade/tachiyomi/data/download/Downloader$1$chapters$1;->(Leu/kanade/tachiyomi/data/download/Downloader;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/data/download/Downloader$1$chapters$1;->(Leu/kanade/tachiyomi/data/download/Downloader;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/data/download/Downloader$1$chapters$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/data/download/Downloader$1$chapters$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/data/download/Downloader$1$chapters$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/download/Downloader$1$chapters$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/download/Downloader$Companion; HSPLeu/kanade/tachiyomi/data/download/Downloader$Companion;->()V PLeu/kanade/tachiyomi/data/download/Downloader$Companion;->()V HSPLeu/kanade/tachiyomi/data/download/Downloader$Companion;->(I)V PLeu/kanade/tachiyomi/data/download/Downloader$Companion;->(I)V Leu/kanade/tachiyomi/data/download/Downloader$notifier$2; HSPLeu/kanade/tachiyomi/data/download/Downloader$notifier$2;->(Leu/kanade/tachiyomi/data/download/Downloader;)V PLeu/kanade/tachiyomi/data/download/Downloader$notifier$2;->(Leu/kanade/tachiyomi/data/download/Downloader;)V Leu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$5; HSPLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$5;->()V PLeu/kanade/tachiyomi/data/download/Downloader$special$$inlined$get$5;->()V Leu/kanade/tachiyomi/data/download/RootDirectory; HSPLeu/kanade/tachiyomi/data/download/RootDirectory;->()V PLeu/kanade/tachiyomi/data/download/RootDirectory;->()V HSPLeu/kanade/tachiyomi/data/download/RootDirectory;->(Lcom/hippo/unifile/UniFile;)V PLeu/kanade/tachiyomi/data/download/RootDirectory;->(Lcom/hippo/unifile/UniFile;)V Leu/kanade/tachiyomi/data/download/RootDirectory$Companion; HSPLeu/kanade/tachiyomi/data/download/RootDirectory$Companion;->()V PLeu/kanade/tachiyomi/data/download/RootDirectory$Companion;->()V HSPLeu/kanade/tachiyomi/data/download/RootDirectory$Companion;->(I)V PLeu/kanade/tachiyomi/data/download/RootDirectory$Companion;->(I)V Leu/kanade/tachiyomi/data/download/SourceDirectory$$serializer; HSPLeu/kanade/tachiyomi/data/download/SourceDirectory$$serializer;->()V PLeu/kanade/tachiyomi/data/download/SourceDirectory$$serializer;->()V HSPLeu/kanade/tachiyomi/data/download/SourceDirectory$$serializer;->()V PLeu/kanade/tachiyomi/data/download/SourceDirectory$$serializer;->()V HSPLeu/kanade/tachiyomi/data/download/SourceDirectory$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLeu/kanade/tachiyomi/data/download/SourceDirectory$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Leu/kanade/tachiyomi/data/library/LibraryUpdateJob; HSPLeu/kanade/tachiyomi/data/library/LibraryUpdateJob;->()V PLeu/kanade/tachiyomi/data/library/LibraryUpdateJob;->()V Leu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion; HSPLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion;->()V PLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion;->()V HSPLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion;->(I)V PLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion;->(I)V HSPLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion;->setupTask(Landroid/content/Context;Ljava/lang/Integer;)V PLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion;->setupTask(Landroid/content/Context;Ljava/lang/Integer;)V Leu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion$setupTask$$inlined$get$1; HSPLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion$setupTask$$inlined$get$1;->()V PLeu/kanade/tachiyomi/data/library/LibraryUpdateJob$Companion$setupTask$$inlined$get$1;->()V Leu/kanade/tachiyomi/data/notification/Notifications; HSPLeu/kanade/tachiyomi/data/notification/Notifications;->()V PLeu/kanade/tachiyomi/data/notification/Notifications;->()V HSPLeu/kanade/tachiyomi/data/notification/Notifications;->()V PLeu/kanade/tachiyomi/data/notification/Notifications;->()V HSPLeu/kanade/tachiyomi/data/notification/Notifications;->createChannels(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications;->createChannels(Landroid/content/Context;)V Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$10; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$10;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$10;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$10;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$10;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$11; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$11;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$11;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$11;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$11;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$12; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$12;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$12;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$13; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$13;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$13;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$14; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$14;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$14;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$14;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$14;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$15; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$15;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$15;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$16; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$16;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$16;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$16;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$16;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$17; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$17;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$17;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$17;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$17;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$2; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$2;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$2;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$3; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$3;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$3;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$4; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$4;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$4;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$5; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$5;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$5;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$6; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$6;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$6;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$6;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$7; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$7;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$7;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$7;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$8; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$8;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$8;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/notification/Notifications$createChannels$9; HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$9;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$9;->(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/data/notification/Notifications$createChannels$9;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/data/saver/ImageSaver; Leu/kanade/tachiyomi/data/track/DeletableTrackService; Leu/kanade/tachiyomi/data/track/EnhancedTrackService; Leu/kanade/tachiyomi/data/track/TrackerManager; HSPLeu/kanade/tachiyomi/data/track/TrackerManager;->()V PLeu/kanade/tachiyomi/data/track/TrackerManager;->()V HSPLeu/kanade/tachiyomi/data/track/TrackerManager;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/track/TrackerManager;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/data/track/TrackerManager;->getServices()Ljava/util/List; PLeu/kanade/tachiyomi/data/track/TrackerManager;->getServices()Ljava/util/List; Leu/kanade/tachiyomi/data/track/TrackManager$Companion; HSPLeu/kanade/tachiyomi/data/track/TrackManager$Companion;->()V PLeu/kanade/tachiyomi/data/track/TrackManager$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/TrackManager$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/TrackManager$Companion;->(I)V Leu/kanade/tachiyomi/data/track/Tracker; HSPLeu/kanade/tachiyomi/data/track/Tracker;->(J)V PLeu/kanade/tachiyomi/data/track/Tracker;->(J)V HSPLeu/kanade/tachiyomi/data/track/Tracker;->getId()J PLeu/kanade/tachiyomi/data/track/Tracker;->getId()J HSPLeu/kanade/tachiyomi/data/track/Tracker;->getNetworkService()Leu/kanade/tachiyomi/network/NetworkHelper; PLeu/kanade/tachiyomi/data/track/Tracker;->getNetworkService()Leu/kanade/tachiyomi/network/NetworkHelper; HSPLeu/kanade/tachiyomi/data/track/Tracker;->getTrackPreferences()Leu/kanade/domain/track/service/TrackPreferences; PLeu/kanade/tachiyomi/data/track/Tracker;->getTrackPreferences()Leu/kanade/domain/track/service/TrackPreferences; HSPLeu/kanade/tachiyomi/data/track/Tracker;->getUsername()Ljava/lang/String; PLeu/kanade/tachiyomi/data/track/Tracker;->getUsername()Ljava/lang/String; HSPLeu/kanade/tachiyomi/data/track/Tracker;->isLogged()Z PLeu/kanade/tachiyomi/data/track/Tracker;->isLogged()Z Leu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2; HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2$1; HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2$1;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$2$1;->()V Leu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3; HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3;->()V HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3;->()V HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3$1; HSPLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3$1;->()V PLeu/kanade/tachiyomi/data/track/TrackService$special$$inlined$injectLazy$3$1;->()V Leu/kanade/tachiyomi/data/track/anilist/Anilist; HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist;->()V PLeu/kanade/tachiyomi/data/track/anilist/Anilist;->()V HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist;->()V PLeu/kanade/tachiyomi/data/track/anilist/Anilist;->()V Leu/kanade/tachiyomi/data/track/anilist/Anilist$Companion; HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist$Companion;->()V PLeu/kanade/tachiyomi/data/track/anilist/Anilist$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/anilist/Anilist$Companion;->(I)V Leu/kanade/tachiyomi/data/track/anilist/Anilist$api$2; HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist$api$2;->(Leu/kanade/tachiyomi/data/track/anilist/Anilist;)V PLeu/kanade/tachiyomi/data/track/anilist/Anilist$api$2;->(Leu/kanade/tachiyomi/data/track/anilist/Anilist;)V Leu/kanade/tachiyomi/data/track/anilist/Anilist$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist$interceptor$2;->(Leu/kanade/tachiyomi/data/track/anilist/Anilist;)V PLeu/kanade/tachiyomi/data/track/anilist/Anilist$interceptor$2;->(Leu/kanade/tachiyomi/data/track/anilist/Anilist;)V Leu/kanade/tachiyomi/data/track/anilist/Anilist$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/anilist/Anilist$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/track/anilist/Anilist$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/anilist/Anilist$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/track/bangumi/Bangumi; HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi;->()V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi;->()V HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi;->()V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi;->()V Leu/kanade/tachiyomi/data/track/bangumi/Bangumi$Companion; HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$Companion;->()V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$Companion;->(I)V Leu/kanade/tachiyomi/data/track/bangumi/Bangumi$api$2; HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$api$2;->(Leu/kanade/tachiyomi/data/track/bangumi/Bangumi;)V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$api$2;->(Leu/kanade/tachiyomi/data/track/bangumi/Bangumi;)V Leu/kanade/tachiyomi/data/track/bangumi/Bangumi$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$interceptor$2;->(Leu/kanade/tachiyomi/data/track/bangumi/Bangumi;)V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$interceptor$2;->(Leu/kanade/tachiyomi/data/track/bangumi/Bangumi;)V Leu/kanade/tachiyomi/data/track/bangumi/Bangumi$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/bangumi/Bangumi$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/track/kavita/Kavita; HSPLeu/kanade/tachiyomi/data/track/kavita/Kavita;->()V PLeu/kanade/tachiyomi/data/track/kavita/Kavita;->()V HSPLeu/kanade/tachiyomi/data/track/kavita/Kavita;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/track/kavita/Kavita;->(Landroid/app/Application;)V Leu/kanade/tachiyomi/data/track/kavita/Kavita$Companion; HSPLeu/kanade/tachiyomi/data/track/kavita/Kavita$Companion;->()V PLeu/kanade/tachiyomi/data/track/kavita/Kavita$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/kavita/Kavita$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/kavita/Kavita$Companion;->(I)V Leu/kanade/tachiyomi/data/track/kavita/Kavita$api$2; HSPLeu/kanade/tachiyomi/data/track/kavita/Kavita$api$2;->(Leu/kanade/tachiyomi/data/track/kavita/Kavita;)V PLeu/kanade/tachiyomi/data/track/kavita/Kavita$api$2;->(Leu/kanade/tachiyomi/data/track/kavita/Kavita;)V Leu/kanade/tachiyomi/data/track/kavita/Kavita$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/kavita/Kavita$interceptor$2;->(Leu/kanade/tachiyomi/data/track/kavita/Kavita;)V PLeu/kanade/tachiyomi/data/track/kavita/Kavita$interceptor$2;->(Leu/kanade/tachiyomi/data/track/kavita/Kavita;)V Leu/kanade/tachiyomi/data/track/kitsu/Kitsu; HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu;->()V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu;->()V HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu;->()V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu;->()V Leu/kanade/tachiyomi/data/track/kitsu/Kitsu$Companion; HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$Companion;->()V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$Companion;->(I)V Leu/kanade/tachiyomi/data/track/kitsu/Kitsu$api$2; HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$api$2;->(Leu/kanade/tachiyomi/data/track/kitsu/Kitsu;)V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$api$2;->(Leu/kanade/tachiyomi/data/track/kitsu/Kitsu;)V Leu/kanade/tachiyomi/data/track/kitsu/Kitsu$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$interceptor$2;->(Leu/kanade/tachiyomi/data/track/kitsu/Kitsu;)V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$interceptor$2;->(Leu/kanade/tachiyomi/data/track/kitsu/Kitsu;)V Leu/kanade/tachiyomi/data/track/kitsu/Kitsu$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/kitsu/Kitsu$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/track/komga/Komga; HSPLeu/kanade/tachiyomi/data/track/komga/Komga;->()V PLeu/kanade/tachiyomi/data/track/komga/Komga;->()V HSPLeu/kanade/tachiyomi/data/track/komga/Komga;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/data/track/komga/Komga;->(Landroid/app/Application;)V Leu/kanade/tachiyomi/data/track/komga/Komga$Companion; HSPLeu/kanade/tachiyomi/data/track/komga/Komga$Companion;->()V PLeu/kanade/tachiyomi/data/track/komga/Komga$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/komga/Komga$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/komga/Komga$Companion;->(I)V Leu/kanade/tachiyomi/data/track/komga/Komga$api$2; HSPLeu/kanade/tachiyomi/data/track/komga/Komga$api$2;->(Leu/kanade/tachiyomi/data/track/komga/Komga;)V PLeu/kanade/tachiyomi/data/track/komga/Komga$api$2;->(Leu/kanade/tachiyomi/data/track/komga/Komga;)V Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates; HSPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;->()V PLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;->()V HSPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;->()V HPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;->()V Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$Companion; HSPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$Companion;->()V PLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$Companion;->(I)V Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$api$2; HSPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$api$2;->(Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;)V PLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$api$2;->(Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;)V Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$interceptor$2;->(Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;)V PLeu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates$interceptor$2;->(Leu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates;)V Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList; HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;->()V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;->()V HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;->()V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;->()V Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$Companion; HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$Companion;->()V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$Companion;->(I)V Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$api$2; HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$api$2;->(Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;)V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$api$2;->(Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;)V Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$interceptor$2;->(Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;)V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$interceptor$2;->(Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList;)V Leu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/track/shikimori/Shikimori; HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori;->()V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori;->()V HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori;->()V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori;->()V Leu/kanade/tachiyomi/data/track/shikimori/Shikimori$Companion; HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$Companion;->()V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$Companion;->(I)V Leu/kanade/tachiyomi/data/track/shikimori/Shikimori$api$2; HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$api$2;->(Leu/kanade/tachiyomi/data/track/shikimori/Shikimori;)V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$api$2;->(Leu/kanade/tachiyomi/data/track/shikimori/Shikimori;)V Leu/kanade/tachiyomi/data/track/shikimori/Shikimori$interceptor$2; HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$interceptor$2;->(Leu/kanade/tachiyomi/data/track/shikimori/Shikimori;)V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$interceptor$2;->(Leu/kanade/tachiyomi/data/track/shikimori/Shikimori;)V Leu/kanade/tachiyomi/data/track/shikimori/Shikimori$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/data/track/shikimori/Shikimori$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/data/track/suwayomi/Suwayomi; HSPLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi;->()V PLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi;->()V HSPLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi;->()V PLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi;->()V Leu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$Companion; HSPLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$Companion;->()V PLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$Companion;->()V HSPLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$Companion;->(I)V PLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$Companion;->(I)V Leu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$api$2; HSPLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$api$2;->()V PLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$api$2;->()V HSPLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$api$2;->()V PLeu/kanade/tachiyomi/data/track/suwayomi/Suwayomi$api$2;->()V Leu/kanade/tachiyomi/extension/ExtensionManager; HSPLeu/kanade/tachiyomi/extension/ExtensionManager;->(Landroid/app/Application;)V PLeu/kanade/tachiyomi/extension/ExtensionManager;->(Landroid/app/Application;)V HSPLeu/kanade/tachiyomi/extension/ExtensionManager;->getInstalledExtensionsFlow()Lkotlinx/coroutines/flow/StateFlow; PLeu/kanade/tachiyomi/extension/ExtensionManager;->getInstalledExtensionsFlow()Lkotlinx/coroutines/flow/StateFlow; Leu/kanade/tachiyomi/extension/ExtensionManager$InstallationListener; HSPLeu/kanade/tachiyomi/extension/ExtensionManager$InstallationListener;->(Leu/kanade/tachiyomi/extension/ExtensionManager;)V PLeu/kanade/tachiyomi/extension/ExtensionManager$InstallationListener;->(Leu/kanade/tachiyomi/extension/ExtensionManager;)V Leu/kanade/tachiyomi/extension/ExtensionManager$installer$2; HSPLeu/kanade/tachiyomi/extension/ExtensionManager$installer$2;->(Leu/kanade/tachiyomi/extension/ExtensionManager;)V PLeu/kanade/tachiyomi/extension/ExtensionManager$installer$2;->(Leu/kanade/tachiyomi/extension/ExtensionManager;)V Leu/kanade/tachiyomi/extension/ExtensionManager$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/extension/ExtensionManager$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/extension/ExtensionManager$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getJson(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Lkotlinx/serialization/json/Json; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getJson(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Lkotlinx/serialization/json/Json; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getNetworkService(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Leu/kanade/tachiyomi/network/NetworkHelper; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getNetworkService(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Leu/kanade/tachiyomi/network/NetworkHelper; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getPreferenceStore(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Ltachiyomi/core/preference/PreferenceStore; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getPreferenceStore(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Ltachiyomi/core/preference/PreferenceStore; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getRequiresFallbackSource$p(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Z PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$getRequiresFallbackSource$p(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)Z HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$toExtensions(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;Ljava/util/List;)Ljava/util/ArrayList; HPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->access$toExtensions(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;Ljava/util/List;)Ljava/util/ArrayList; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->checkForUpdates(Landroid/content/Context;Lkotlin/coroutines/Continuation;Z)Ljava/io/Serializable; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->checkForUpdates(Landroid/content/Context;Lkotlin/coroutines/Continuation;Z)Ljava/io/Serializable; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->findExtensions(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi;->findExtensions(Lkotlin/coroutines/jvm/internal/ContinuationImpl;)Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$checkForUpdates$1; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$checkForUpdates$1;->(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$checkForUpdates$1;->(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$checkForUpdates$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$checkForUpdates$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2;->(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2;->(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$findExtensions$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$lastExtCheck$2; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$lastExtCheck$2;->(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$lastExtCheck$2;->(Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi;)V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$lastExtCheck$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$lastExtCheck$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1$1; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$1$1;->()V Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2$1; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$2$1;->()V Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$3; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$3;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$3;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$3;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$3;->()V Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4$1; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApi$special$$inlined$injectLazy$4$1;->()V Leu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt;->access$getExtensionSourceMapper$p()Lkotlin/jvm/functions/Function1; PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt;->access$getExtensionSourceMapper$p()Lkotlin/jvm/functions/Function1; Leu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1; HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/extension/api/ExtensionGithubApiKt$extensionSourceMapper$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/extension/api/ExtensionJsonObject; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;IIILjava/util/List;)V HPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;IIILjava/util/List;)V HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->access$get$childSerializers$cp()[Lkotlinx/serialization/KSerializer; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->access$get$childSerializers$cp()[Lkotlinx/serialization/KSerializer; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getApk()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getApk()Ljava/lang/String; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getCode()J PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getCode()J HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getHasChangelog()I PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getHasChangelog()I HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getHasReadme()I PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getHasReadme()I HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getLang()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getLang()Ljava/lang/String; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getName()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getName()Ljava/lang/String; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getNsfw()I PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getNsfw()I HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getPkg()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getPkg()Ljava/lang/String; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getSources()Ljava/util/List; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getSources()Ljava/util/List; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getVersion()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject;->getVersion()Ljava/lang/String; Leu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Leu/kanade/tachiyomi/extension/api/ExtensionJsonObject; HPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Leu/kanade/tachiyomi/extension/api/ExtensionJsonObject; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Leu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion; HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion;->(I)V PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion;->(I)V HSPLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion;->serializer()Lkotlinx/serialization/KSerializer; PLeu/kanade/tachiyomi/extension/api/ExtensionJsonObject$Companion;->serializer()Lkotlinx/serialization/KSerializer; Leu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->(IJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->(IJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getBaseUrl()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getBaseUrl()Ljava/lang/String; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getId()J PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getId()J HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getLang()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getLang()Ljava/lang/String; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getName()Ljava/lang/String; PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject;->getName()Ljava/lang/String; Leu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->childSerializers()[Lkotlinx/serialization/KSerializer; PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->childSerializers()[Lkotlinx/serialization/KSerializer; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Leu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject; HPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Leu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->typeParametersSerializers()[Lkotlinx/serialization/KSerializer; PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$$serializer;->typeParametersSerializers()[Lkotlinx/serialization/KSerializer; Leu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$Companion; HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$Companion;->()V PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$Companion;->()V HSPLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$Companion;->(I)V PLeu/kanade/tachiyomi/extension/api/ExtensionSourceJsonObject$Companion;->(I)V Leu/kanade/tachiyomi/extension/model/Extension; HSPLeu/kanade/tachiyomi/extension/model/Extension;->()V PLeu/kanade/tachiyomi/extension/model/Extension;->()V HSPLeu/kanade/tachiyomi/extension/model/Extension;->(I)V PLeu/kanade/tachiyomi/extension/model/Extension;->(I)V Leu/kanade/tachiyomi/extension/model/Extension$Available; HSPLeu/kanade/tachiyomi/extension/model/Extension$Available;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JDLjava/lang/String;ZZZLjava/util/List;Ljava/lang/String;Ljava/lang/String;)V HPLeu/kanade/tachiyomi/extension/model/Extension$Available;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JDLjava/lang/String;ZZZLjava/util/List;Ljava/lang/String;Ljava/lang/String;)V Leu/kanade/tachiyomi/extension/model/Extension$Available$Source; HSPLeu/kanade/tachiyomi/extension/model/Extension$Available$Source;->(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HPLeu/kanade/tachiyomi/extension/model/Extension$Available$Source;->(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V Leu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver; HSPLeu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver;->(Leu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver$Listener;)V PLeu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver;->(Leu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver$Listener;)V Leu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver$Listener; Leu/kanade/tachiyomi/extension/util/ExtensionLoader; HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->()V HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->()V HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->isPackageAnExtension(Landroid/content/pm/PackageInfo;)Z PLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->isPackageAnExtension(Landroid/content/pm/PackageInfo;)Z HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->loadExtensions(Landroid/content/Context;)Ljava/util/List; PLeu/kanade/tachiyomi/extension/util/ExtensionLoader;->loadExtensions(Landroid/content/Context;)Ljava/util/List; Leu/kanade/tachiyomi/extension/util/ExtensionLoader$loadNsfwSource$2; HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader$loadNsfwSource$2;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader$loadNsfwSource$2;->()V HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader$loadNsfwSource$2;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader$loadNsfwSource$2;->()V Leu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1$1; HSPLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1$1;->()V PLeu/kanade/tachiyomi/extension/util/ExtensionLoader$special$$inlined$injectLazy$1$1;->()V Leu/kanade/tachiyomi/network/AndroidCookieJar; HSPLeu/kanade/tachiyomi/network/AndroidCookieJar;->()V PLeu/kanade/tachiyomi/network/AndroidCookieJar;->()V HSPLeu/kanade/tachiyomi/network/AndroidCookieJar;->get(Lokhttp3/HttpUrl;)Ljava/util/List; PLeu/kanade/tachiyomi/network/AndroidCookieJar;->get(Lokhttp3/HttpUrl;)Ljava/util/List; HSPLeu/kanade/tachiyomi/network/AndroidCookieJar;->loadForRequest(Lokhttp3/HttpUrl;)Ljava/util/List; PLeu/kanade/tachiyomi/network/AndroidCookieJar;->loadForRequest(Lokhttp3/HttpUrl;)Ljava/util/List; Leu/kanade/tachiyomi/network/JavaScriptEngine; Leu/kanade/tachiyomi/network/NetworkHelper; HSPLeu/kanade/tachiyomi/network/NetworkHelper;->(Landroid/content/Context;Leu/kanade/tachiyomi/network/NetworkPreferences;)V PLeu/kanade/tachiyomi/network/NetworkHelper;->(Landroid/content/Context;Leu/kanade/tachiyomi/network/NetworkPreferences;)V HSPLeu/kanade/tachiyomi/network/NetworkHelper;->defaultUserAgentProvider()Ljava/lang/String; PLeu/kanade/tachiyomi/network/NetworkHelper;->defaultUserAgentProvider()Ljava/lang/String; HSPLeu/kanade/tachiyomi/network/NetworkHelper;->getClient()Lokhttp3/OkHttpClient; PLeu/kanade/tachiyomi/network/NetworkHelper;->getClient()Lokhttp3/OkHttpClient; Leu/kanade/tachiyomi/network/NetworkHelper$client$1$1; HSPLeu/kanade/tachiyomi/network/NetworkHelper$client$1$1;->(Ljava/lang/Object;)V PLeu/kanade/tachiyomi/network/NetworkHelper$client$1$1;->(Ljava/lang/Object;)V Leu/kanade/tachiyomi/network/NetworkHelper$client$1$builder$1; HSPLeu/kanade/tachiyomi/network/NetworkHelper$client$1$builder$1;->(Ljava/lang/Object;)V PLeu/kanade/tachiyomi/network/NetworkHelper$client$1$builder$1;->(Ljava/lang/Object;)V HSPLeu/kanade/tachiyomi/network/NetworkHelper$client$1$builder$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/network/NetworkHelper$client$1$builder$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/network/NetworkPreferences; HSPLeu/kanade/tachiyomi/network/NetworkPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/tachiyomi/network/NetworkPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V HSPLeu/kanade/tachiyomi/network/NetworkPreferences;->defaultUserAgent()Ltachiyomi/core/preference/Preference; PLeu/kanade/tachiyomi/network/NetworkPreferences;->defaultUserAgent()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/tachiyomi/network/NetworkPreferences;->dohProvider()Ltachiyomi/core/preference/Preference; PLeu/kanade/tachiyomi/network/NetworkPreferences;->dohProvider()Ltachiyomi/core/preference/Preference; HSPLeu/kanade/tachiyomi/network/NetworkPreferences;->verboseLogging()Ltachiyomi/core/preference/Preference; PLeu/kanade/tachiyomi/network/NetworkPreferences;->verboseLogging()Ltachiyomi/core/preference/Preference; Leu/kanade/tachiyomi/network/OkHttpExtensionsKt; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->()V PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->()V HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->await(Lokhttp3/Call;[Ljava/lang/StackTraceElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->await(Lokhttp3/Call;[Ljava/lang/StackTraceElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->awaitSuccess(Lokhttp3/Call;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->awaitSuccess(Lokhttp3/Call;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->decodeFromJsonResponse(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/DeserializationStrategy;Lokhttp3/Response;)Ljava/lang/Object; PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt;->decodeFromJsonResponse(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/DeserializationStrategy;Lokhttp3/Response;)Ljava/lang/Object; Leu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$1; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$1;->(Lokhttp3/Call;)V PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$1;->(Lokhttp3/Call;)V Leu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;[Ljava/lang/StackTraceElement;)V PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;[Ljava/lang/StackTraceElement;)V HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1;->onResponse(Lokhttp3/Call;Lokhttp3/Response;)V PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1;->onResponse(Lokhttp3/Call;Lokhttp3/Response;)V Leu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1$onResponse$1; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1$onResponse$1;->(Lokhttp3/Response;)V PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$await$2$callback$1$onResponse$1;->(Lokhttp3/Response;)V Leu/kanade/tachiyomi/network/OkHttpExtensionsKt$awaitSuccess$1; HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$awaitSuccess$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$awaitSuccess$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$awaitSuccess$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/network/OkHttpExtensionsKt$awaitSuccess$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/network/RequestsKt; HSPLeu/kanade/tachiyomi/network/RequestsKt;->()V PLeu/kanade/tachiyomi/network/RequestsKt;->()V HSPLeu/kanade/tachiyomi/network/RequestsKt;->GET$default(Ljava/lang/String;Lokhttp3/Headers;Lokhttp3/CacheControl;ILjava/lang/Object;)Lokhttp3/Request; PLeu/kanade/tachiyomi/network/RequestsKt;->GET$default(Ljava/lang/String;Lokhttp3/Headers;Lokhttp3/CacheControl;ILjava/lang/Object;)Lokhttp3/Request; HSPLeu/kanade/tachiyomi/network/RequestsKt;->GET(Ljava/lang/String;Lokhttp3/Headers;Lokhttp3/CacheControl;)Lokhttp3/Request; PLeu/kanade/tachiyomi/network/RequestsKt;->GET(Ljava/lang/String;Lokhttp3/Headers;Lokhttp3/CacheControl;)Lokhttp3/Request; HSPLeu/kanade/tachiyomi/network/RequestsKt;->GET(Lokhttp3/HttpUrl;Lokhttp3/Headers;Lokhttp3/CacheControl;)Lokhttp3/Request; PLeu/kanade/tachiyomi/network/RequestsKt;->GET(Lokhttp3/HttpUrl;Lokhttp3/Headers;Lokhttp3/CacheControl;)Lokhttp3/Request; Leu/kanade/tachiyomi/network/interceptor/CloudflareBypassException; Leu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor; HSPLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor;->(Landroid/content/Context;Leu/kanade/tachiyomi/network/AndroidCookieJar;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor;->(Landroid/content/Context;Leu/kanade/tachiyomi/network/AndroidCookieJar;Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor;->shouldIntercept(Lokhttp3/Response;)Z PLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor;->shouldIntercept(Lokhttp3/Response;)Z Leu/kanade/tachiyomi/network/interceptor/CloudflareInterceptorKt; HSPLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptorKt;->()V PLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptorKt;->()V HSPLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptorKt;->access$getERROR_CODES$p()Ljava/util/List; PLeu/kanade/tachiyomi/network/interceptor/CloudflareInterceptorKt;->access$getERROR_CODES$p()Ljava/util/List; Leu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor; HSPLeu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor;->()V PLeu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor;->()V HSPLeu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLeu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Leu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor; HSPLeu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor;->(Lkotlin/jvm/functions/Function0;)V PLeu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor;->(Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLeu/kanade/tachiyomi/network/interceptor/UserAgentInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Leu/kanade/tachiyomi/network/interceptor/WebViewInterceptor; HSPLeu/kanade/tachiyomi/network/interceptor/WebViewInterceptor;->(Landroid/content/Context;Lkotlin/jvm/functions/Function0;)V PLeu/kanade/tachiyomi/network/interceptor/WebViewInterceptor;->(Landroid/content/Context;Lkotlin/jvm/functions/Function0;)V HSPLeu/kanade/tachiyomi/network/interceptor/WebViewInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLeu/kanade/tachiyomi/network/interceptor/WebViewInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Leu/kanade/tachiyomi/network/interceptor/WebViewInterceptor$initWebView$2; HSPLeu/kanade/tachiyomi/network/interceptor/WebViewInterceptor$initWebView$2;->(Leu/kanade/tachiyomi/network/interceptor/WebViewInterceptor;)V PLeu/kanade/tachiyomi/network/interceptor/WebViewInterceptor$initWebView$2;->(Leu/kanade/tachiyomi/network/interceptor/WebViewInterceptor;)V Leu/kanade/tachiyomi/source/AndroidSourceManager; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager;->(Landroid/app/Application;Leu/kanade/tachiyomi/extension/ExtensionManager;Ltachiyomi/domain/source/repository/StubSourceRepository;)V PLeu/kanade/tachiyomi/source/AndroidSourceManager;->(Landroid/app/Application;Leu/kanade/tachiyomi/extension/ExtensionManager;Ltachiyomi/domain/source/repository/StubSourceRepository;)V HSPLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getContext$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Landroid/content/Context; PLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getContext$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Landroid/content/Context; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getExtensionManager$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Leu/kanade/tachiyomi/extension/ExtensionManager; PLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getExtensionManager$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Leu/kanade/tachiyomi/extension/ExtensionManager; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getSourceRepository$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Ltachiyomi/domain/source/repository/StubSourceRepository; PLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getSourceRepository$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Ltachiyomi/domain/source/repository/StubSourceRepository; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getSourcesMapFlow$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Lkotlinx/coroutines/flow/MutableStateFlow; PLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getSourcesMapFlow$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getStubSourcesMap$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Ljava/util/concurrent/ConcurrentHashMap; PLeu/kanade/tachiyomi/source/AndroidSourceManager;->access$getStubSourcesMap$p(Leu/kanade/tachiyomi/source/AndroidSourceManager;)Ljava/util/concurrent/ConcurrentHashMap; Leu/kanade/tachiyomi/source/AndroidSourceManager$1; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/source/AndroidSourceManager$1;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/source/AndroidSourceManager$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/source/AndroidSourceManager$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/source/AndroidSourceManager$1$1; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/source/AndroidSourceManager$1$1$invokeSuspend$$inlined$get$1; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1$invokeSuspend$$inlined$get$1;->()V PLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1$invokeSuspend$$inlined$get$1;->()V Leu/kanade/tachiyomi/source/AndroidSourceManager$1$1$invokeSuspend$$inlined$get$2; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1$invokeSuspend$$inlined$get$2;->()V PLeu/kanade/tachiyomi/source/AndroidSourceManager$1$1$invokeSuspend$$inlined$get$2;->()V Leu/kanade/tachiyomi/source/AndroidSourceManager$2; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/source/AndroidSourceManager$2;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/source/AndroidSourceManager$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/source/AndroidSourceManager$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/source/AndroidSourceManager$2$1; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->(Leu/kanade/tachiyomi/source/AndroidSourceManager;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/source/AndroidSourceManager$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$injectLazy$1;->()V Leu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$map$1; HSPLeu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$map$1;->(Lkotlinx/coroutines/flow/MutableStateFlow;)V PLeu/kanade/tachiyomi/source/AndroidSourceManager$special$$inlined$map$1;->(Lkotlinx/coroutines/flow/MutableStateFlow;)V Leu/kanade/tachiyomi/source/CatalogueSource; Leu/kanade/tachiyomi/source/Source; Leu/kanade/tachiyomi/source/UnmeteredSource; Leu/kanade/tachiyomi/source/model/Filter; HSPLeu/kanade/tachiyomi/source/model/Filter;->(Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLeu/kanade/tachiyomi/source/model/Filter;->(Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/internal/DefaultConstructorMarker;)V Leu/kanade/tachiyomi/source/model/Filter$Sort; HSPLeu/kanade/tachiyomi/source/model/Filter$Sort;->(Ljava/lang/String;[Ljava/lang/String;Leu/kanade/tachiyomi/source/model/Filter$Sort$Selection;)V PLeu/kanade/tachiyomi/source/model/Filter$Sort;->(Ljava/lang/String;[Ljava/lang/String;Leu/kanade/tachiyomi/source/model/Filter$Sort$Selection;)V Leu/kanade/tachiyomi/source/model/Filter$Sort$Selection; HSPLeu/kanade/tachiyomi/source/model/Filter$Sort$Selection;->(IZ)V PLeu/kanade/tachiyomi/source/model/Filter$Sort$Selection;->(IZ)V Leu/kanade/tachiyomi/source/model/FilterList; HSPLeu/kanade/tachiyomi/source/model/FilterList;->(Ljava/util/List;)V PLeu/kanade/tachiyomi/source/model/FilterList;->(Ljava/util/List;)V HSPLeu/kanade/tachiyomi/source/model/FilterList;->([Leu/kanade/tachiyomi/source/model/Filter;)V PLeu/kanade/tachiyomi/source/model/FilterList;->([Leu/kanade/tachiyomi/source/model/Filter;)V Leu/kanade/tachiyomi/ui/base/activity/BaseActivity; HSPLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->()V PLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->()V HSPLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->attachBaseContext(Landroid/content/Context;)V PLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->attachBaseContext(Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->onCreate(Landroid/os/Bundle;)V PLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->onCreate(Landroid/os/Bundle;)V HSPLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->registerSecureActivity(Landroidx/appcompat/app/AppCompatActivity;)V PLeu/kanade/tachiyomi/ui/base/activity/BaseActivity;->registerSecureActivity(Landroidx/appcompat/app/AppCompatActivity;)V Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate;->()V Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->onApplicationStart()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->onApplicationStart()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion;->onApplicationStopped()V Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion$onApplicationStart$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion$onApplicationStart$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion$onApplicationStart$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate$Companion$onApplicationStopped$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->onResume(Landroidx/lifecycle/LifecycleOwner;)V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->registerSecureActivity(Landroidx/appcompat/app/AppCompatActivity;)V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl;->registerSecureActivity(Landroidx/appcompat/app/AppCompatActivity;)V Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$2; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$2;->(Landroid/view/Window;)V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$2;->(Landroid/view/Window;)V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$setSecureScreen$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1$1; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$1$1;->()V Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2$1; HSPLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegateImpl$special$$inlined$injectLazy$2$1;->()V Leu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate; HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate;->()V PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate;->()V Leu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion; HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion;->()V PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion;->()V PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion;->getThemeResIds(Leu/kanade/domain/ui/model/AppTheme;Z)Ljava/util/ArrayList; PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate$Companion;->getThemeResIds(Leu/kanade/domain/ui/model/AppTheme;Z)Ljava/util/ArrayList; Leu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl; HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl;->()V PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl;->()V HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl;->applyAppTheme(Landroid/app/Activity;)V PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl;->applyAppTheme(Landroid/app/Activity;)V Leu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl$applyAppTheme$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl$applyAppTheme$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/base/delegate/ThemingDelegateImpl$applyAppTheme$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/browse/BrowseTab; HSPLeu/kanade/tachiyomi/ui/browse/BrowseTab;->(Z)V PLeu/kanade/tachiyomi/ui/browse/BrowseTab;->(Z)V HSPLeu/kanade/tachiyomi/ui/browse/BrowseTab;->equals(Ljava/lang/Object;)Z PLeu/kanade/tachiyomi/ui/browse/BrowseTab;->equals(Ljava/lang/Object;)Z HSPLeu/kanade/tachiyomi/ui/browse/BrowseTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; HPLeu/kanade/tachiyomi/ui/browse/BrowseTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->(I)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->(I)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->access$getGetHistory$p(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)Ltachiyomi/domain/history/interactor/GetHistory; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->access$getGetHistory$p(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)Ltachiyomi/domain/history/interactor/GetHistory; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->access$getMutableState(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->access$getMutableState(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->getEvents()Lkotlinx/coroutines/flow/Flow; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel;->getEvents()Lkotlinx/coroutines/flow/Flow; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$2$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$2$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$2$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$3; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$3;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$3;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$3;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$3;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$flatMapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1;->(Lkotlinx/coroutines/flow/StateFlow;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1;->(Lkotlinx/coroutines/flow/StateFlow;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$1$invokeSuspend$lambda$2$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog$Delete; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog$DeleteAll; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->(Ljava/lang/String;Ljava/util/List;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog;)V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->(Ljava/lang/String;Ljava/util/List;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->copy$default(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Ljava/lang/String;Ljava/util/List;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog;I)Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->copy$default(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;Ljava/lang/String;Ljava/util/List;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog;I)Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$State; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->equals(Ljava/lang/Object;)Z HPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->equals(Ljava/lang/Object;)Z HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->getDialog()Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->getDialog()Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$Dialog; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->getList()Ljava/util/List; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->getList()Ljava/util/List; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->getSearchQuery()Ljava/lang/String; PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$State;->getSearchQuery()Ljava/lang/String; Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/ui/history/HistoryScreenModel$toHistoryUiModels$2; HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$toHistoryUiModels$2;->()V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$toHistoryUiModels$2;->()V HSPLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$toHistoryUiModels$2;->()V PLeu/kanade/tachiyomi/ui/history/HistoryScreenModel$toHistoryUiModels$2;->()V Leu/kanade/tachiyomi/ui/history/HistoryTab; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab;->()V PLeu/kanade/tachiyomi/ui/history/HistoryTab;->()V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab;->()V PLeu/kanade/tachiyomi/ui/history/HistoryTab;->()V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab;->Content(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/history/HistoryTab;->Content(Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab;->access$getResumeLastChapterReadEvent$p()Lkotlinx/coroutines/channels/Channel; PLeu/kanade/tachiyomi/ui/history/HistoryTab;->access$getResumeLastChapterReadEvent$p()Lkotlinx/coroutines/channels/Channel; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab;->getKey()Ljava/lang/String; HPLeu/kanade/tachiyomi/ui/history/HistoryTab;->getKey()Ljava/lang/String; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; HPLeu/kanade/tachiyomi/ui/history/HistoryTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$10; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$10;->(Leu/kanade/tachiyomi/ui/history/HistoryTab;I)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$10;->(Leu/kanade/tachiyomi/ui/history/HistoryTab;I)V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$10;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$10;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$2; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$2;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$2;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$3; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$3;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$3;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$4; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$4;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$4;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$7; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$7;->(Landroid/content/Context;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$7;->(Landroid/content/Context;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$7;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$7;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$7;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$7;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$8; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$8$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$8$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$9; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$9$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9$1;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$9$1;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/history/HistoryTab$Content$onDismissRequest$1; HSPLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$onDismissRequest$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V PLeu/kanade/tachiyomi/ui/history/HistoryTab$Content$onDismissRequest$1;->(Leu/kanade/tachiyomi/ui/history/HistoryScreenModel;)V Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt;->()V Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->(Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->(Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-3$1$bottomNavVisible$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-4$1; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-4$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-4$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-4$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-4$1;->()V Leu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1; HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1;->()V PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1;->()V HSPLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/ComposableSingletons$HomeScreenKt$lambda-5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->()V PLeu/kanade/tachiyomi/ui/home/HomeScreen;->()V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->()V PLeu/kanade/tachiyomi/ui/home/HomeScreen;->()V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->Content(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/home/HomeScreen;->Content(Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$NavigationBarItem(Leu/kanade/tachiyomi/ui/home/HomeScreen;Landroidx/compose/foundation/layout/RowScope;Leu/kanade/presentation/util/Tab;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$NavigationBarItem(Leu/kanade/tachiyomi/ui/home/HomeScreen;Landroidx/compose/foundation/layout/RowScope;Leu/kanade/presentation/util/Tab;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$NavigationIconItem(Leu/kanade/tachiyomi/ui/home/HomeScreen;Leu/kanade/presentation/util/Tab;Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$NavigationIconItem(Leu/kanade/tachiyomi/ui/home/HomeScreen;Leu/kanade/presentation/util/Tab;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getLibrarySearchEvent$p()Lkotlinx/coroutines/channels/Channel; PLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getLibrarySearchEvent$p()Lkotlinx/coroutines/channels/Channel; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getOpenTabEvent$p()Lkotlinx/coroutines/channels/Channel; PLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getOpenTabEvent$p()Lkotlinx/coroutines/channels/Channel; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getShowBottomNavEvent$p()Lkotlinx/coroutines/channels/Channel; PLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getShowBottomNavEvent$p()Lkotlinx/coroutines/channels/Channel; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getTabs$p()Ljava/util/List; PLeu/kanade/tachiyomi/ui/home/HomeScreen;->access$getTabs$p()Ljava/util/List; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen;->showBottomNav(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen;->showBottomNav(ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1;->()V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1;->()V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1;->()V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1;->()V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2$1;->(Lcafe/adriel/voyager/navigator/tab/Tab;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2$1;->(Lcafe/adriel/voyager/navigator/tab/Tab;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$1$1$1$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2;->(Lkotlin/jvm/functions/Function0;Lcafe/adriel/voyager/navigator/tab/TabNavigator;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2;->(Lkotlin/jvm/functions/Function0;Lcafe/adriel/voyager/navigator/tab/TabNavigator;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$1$1;->(Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$2$2$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$goToLibraryTab$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$goToLibraryTab$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$Content$1$goToLibraryTab$1;->(Lcafe/adriel/voyager/navigator/tab/TabNavigator;)V Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$1;->(ZLcafe/adriel/voyager/navigator/tab/TabNavigator;Leu/kanade/presentation/util/Tab;Lkotlinx/coroutines/CoroutineScope;Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$1;->(ZLcafe/adriel/voyager/navigator/tab/TabNavigator;Leu/kanade/presentation/util/Tab;Lkotlinx/coroutines/CoroutineScope;Lcafe/adriel/voyager/navigator/Navigator;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$2;->(Leu/kanade/presentation/util/Tab;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$2;->(Leu/kanade/presentation/util/Tab;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$3; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$3;->(Leu/kanade/presentation/util/Tab;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$3;->(Leu/kanade/presentation/util/Tab;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$4; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$4;->(Leu/kanade/tachiyomi/ui/home/HomeScreen;Landroidx/compose/foundation/layout/RowScope;Leu/kanade/presentation/util/Tab;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$4;->(Leu/kanade/tachiyomi/ui/home/HomeScreen;Landroidx/compose/foundation/layout/RowScope;Leu/kanade/presentation/util/Tab;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationBarItem$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1;->(Leu/kanade/presentation/util/Tab;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1;->(Leu/kanade/presentation/util/Tab;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->(Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->(Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$invokeSuspend$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$invokeSuspend$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$2$invokeSuspend$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->(Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->(Landroidx/compose/runtime/ProduceStateScope;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$invokeSuspend$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$invokeSuspend$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$1$count$4$invokeSuspend$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$2; HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$2;->(Leu/kanade/presentation/util/Tab;I)V PLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$2;->(Leu/kanade/presentation/util/Tab;I)V HSPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/home/HomeScreen$NavigationIconItem$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->(I)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->(I)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$applyFilters(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$applyFilters(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/io/Serializable; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getDownloadCache$p(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadCache; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getDownloadCache$p(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadCache; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getGetTracksPerManga$p(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Ltachiyomi/domain/track/interactor/GetTracksPerManga; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getGetTracksPerManga$p(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Ltachiyomi/domain/track/interactor/GetTracksPerManga; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getLibraryFlow(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getLibraryFlow(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getMutableState(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getMutableState(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getTrackingFilterFlow(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Lkotlinx/coroutines/flow/Flow; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->access$getTrackingFilterFlow(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)Lkotlinx/coroutines/flow/Flow; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->getActiveCategoryIndex()I PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->getActiveCategoryIndex()I HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->getLibraryItemPreferencesFlow()Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->getLibraryItemPreferencesFlow()Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->getTrackingFilterFlow()Lkotlinx/coroutines/flow/Flow; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel;->getTrackingFilterFlow()Lkotlinx/coroutines/flow/Flow; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1;->(Lkotlinx/coroutines/flow/StateFlow;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1;->(Lkotlinx/coroutines/flow/StateFlow;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$1$invokeSuspend$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$2;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$2;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$4; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$4;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$4;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$5; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$5;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog$ChangeCategory; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog$DeleteManga; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog$SettingsSheet; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->(ZZZZLtachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->(ZZZZLtachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;Ltachiyomi/core/preference/TriState;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterBookmarked()Ltachiyomi/core/preference/TriState; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterBookmarked()Ltachiyomi/core/preference/TriState; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterCompleted()Ltachiyomi/core/preference/TriState; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterCompleted()Ltachiyomi/core/preference/TriState; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterDownloaded()Ltachiyomi/core/preference/TriState; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterDownloaded()Ltachiyomi/core/preference/TriState; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterStarted()Ltachiyomi/core/preference/TriState; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterStarted()Ltachiyomi/core/preference/TriState; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterUnread()Ltachiyomi/core/preference/TriState; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getFilterUnread()Ltachiyomi/core/preference/TriState; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getGlobalFilterDownloaded()Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$ItemPreferences;->getGlobalFilterDownloaded()Z Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->(I)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->(I)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->(ZLjava/util/Map;Ljava/lang/String;Ljava/util/List;ZZZZLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->(ZLjava/util/Map;Ljava/lang/String;Ljava/util/List;ZZZZLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->access$getLibraryCount(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;)I PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->access$getLibraryCount(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;)I HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->copy$default(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;Ljava/util/Map;Ljava/lang/String;Ljava/util/List;ZZZZLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog;I)Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->copy$default(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;Ljava/util/Map;Ljava/lang/String;Ljava/util/List;ZZZZLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog;I)Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->equals(Ljava/lang/Object;)Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->equals(Ljava/lang/Object;)Z HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getCategories()Ljava/util/List; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getCategories()Ljava/util/List; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getDialog()Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getDialog()Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$Dialog; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getHasActiveFilters()Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getHasActiveFilters()Z HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getLibrary()Ljava/util/Map; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getLibrary()Ljava/util/Map; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getSearchQuery()Ljava/lang/String; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getSearchQuery()Ljava/lang/String; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getSelection()Ljava/util/List; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getSelection()Ljava/util/List; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getSelectionMode()Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getSelectionMode()Z HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getShowCategoryTabs()Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getShowCategoryTabs()Z HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getToolbarTitle(ILjava/lang/String;Ljava/lang/String;)Leu/kanade/presentation/library/components/LibraryToolbarTitle; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->getToolbarTitle(ILjava/lang/String;Ljava/lang/String;)Leu/kanade/presentation/library/components/LibraryToolbarTitle; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->isLibraryEmpty()Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->isLibraryEmpty()Z HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->isLoading()Z PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;->isLoading()Z Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$isLibraryEmpty$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$isLibraryEmpty$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$isLibraryEmpty$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$isLibraryEmpty$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$isLibraryEmpty$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$libraryCount$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$libraryCount$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$libraryCount$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$libraryCount$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$State$libraryCount$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFn$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFn$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFn$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnBookmarked$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnBookmarked$1;->(Ltachiyomi/core/preference/TriState;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnBookmarked$1;->(Ltachiyomi/core/preference/TriState;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnCompleted$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnCompleted$1;->(Ltachiyomi/core/preference/TriState;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnCompleted$1;->(Ltachiyomi/core/preference/TriState;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnDownloaded$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnDownloaded$1;->(Ltachiyomi/core/preference/TriState;Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnDownloaded$1;->(Ltachiyomi/core/preference/TriState;Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnStarted$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnStarted$1;->(Ltachiyomi/core/preference/TriState;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnStarted$1;->(Ltachiyomi/core/preference/TriState;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnTracking$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnTracking$1;->(ZZLjava/util/Map;Ljava/util/ArrayList;Ljava/util/ArrayList;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnTracking$1;->(ZZLjava/util/Map;Ljava/util/ArrayList;Ljava/util/ArrayList;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnUnread$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnUnread$1;->(Ltachiyomi/core/preference/TriState;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applyFilters$filterFnUnread$1;->(Ltachiyomi/core/preference/TriState;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$lambda$7$$inlined$thenComparator$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$lambda$7$$inlined$thenComparator$1;->(Ljava/util/Comparator;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$lambda$7$$inlined$thenComparator$1;->(Ljava/util/Comparator;Lkotlin/jvm/functions/Function2;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$sortAlphabetically$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$sortAlphabetically$1;->(Ljava/text/Collator;Ljava/util/Locale;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$sortAlphabetically$1;->(Ljava/text/Collator;Ljava/util/Locale;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$sortFn$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$sortFn$1;->(Ljava/util/Map;Lkotlin/jvm/functions/Function2;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$applySort$sortFn$1;->(Ljava/util/Map;Lkotlin/jvm/functions/Function2;)V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryFlow$libraryMangasFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1;->([Lkotlinx/coroutines/flow/Flow;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1;->([Lkotlinx/coroutines/flow/Flow;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$2;->([Lkotlinx/coroutines/flow/Flow;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$2;->([Lkotlinx/coroutines/flow/Flow;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$getLibraryItemPreferencesFlow$$inlined$combine$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$10; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$10;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$10;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$11; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$11;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$11;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$12; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$12;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$12;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$13; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$13;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$13;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$14; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$14;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$14;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$15; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$15;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$15;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$5; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$5;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$5;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$6; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$6;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$6;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$7; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$7;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$7;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$8; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$8;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$8;->()V Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$9; HSPLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$9;->()V PLeu/kanade/tachiyomi/ui/library/LibraryScreenModel$special$$inlined$get$9;->()V Leu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel; HSPLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel;->(I)V PLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel;->(I)V Leu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$5; HSPLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$5;->()V PLeu/kanade/tachiyomi/ui/library/LibrarySettingsScreenModel$special$$inlined$get$5;->()V Leu/kanade/tachiyomi/ui/library/LibraryTab; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->()V PLeu/kanade/tachiyomi/ui/library/LibraryTab;->()V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->()V PLeu/kanade/tachiyomi/ui/library/LibraryTab;->()V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->Content(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/library/LibraryTab;->Content(Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->access$Content$lambda$2(Landroidx/compose/runtime/State;)Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State; HPLeu/kanade/tachiyomi/ui/library/LibraryTab;->access$Content$lambda$2(Landroidx/compose/runtime/State;)Leu/kanade/tachiyomi/ui/library/LibraryScreenModel$State; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->access$getQueryEvent$p()Lkotlinx/coroutines/channels/Channel; PLeu/kanade/tachiyomi/ui/library/LibraryTab;->access$getQueryEvent$p()Lkotlinx/coroutines/channels/Channel; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->access$getRequestSettingsSheetEvent$p()Lkotlinx/coroutines/channels/Channel; PLeu/kanade/tachiyomi/ui/library/LibraryTab;->access$getRequestSettingsSheetEvent$p()Lkotlinx/coroutines/channels/Channel; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->getKey()Ljava/lang/String; HPLeu/kanade/tachiyomi/ui/library/LibraryTab;->getKey()Ljava/lang/String; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; HPLeu/kanade/tachiyomi/ui/library/LibraryTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;Lkotlinx/coroutines/CoroutineScope;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/material3/SnackbarHostState;Landroid/content/Context;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;Lkotlinx/coroutines/CoroutineScope;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/material3/SnackbarHostState;Landroid/content/Context;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$4; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$4;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$4;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$5; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$5;->(Lkotlin/jvm/functions/Function1;Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Landroidx/compose/runtime/State;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$5;->(Lkotlin/jvm/functions/Function1;Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Landroidx/compose/runtime/State;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$6$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$6$1;->(Lkotlin/jvm/functions/Function1;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$6$1;->(Lkotlin/jvm/functions/Function1;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$7; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$7;->(Lkotlinx/coroutines/CoroutineScope;Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/material3/SnackbarHostState;Landroid/content/Context;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$7;->(Lkotlinx/coroutines/CoroutineScope;Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/material3/SnackbarHostState;Landroid/content/Context;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$8; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$8;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$1$8;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$10; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$10;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Landroidx/compose/runtime/MutableState;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$10;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Landroidx/compose/runtime/MutableState;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1;->(Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1;->(Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$11$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$12; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$12;->(Landroid/content/Context;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$12;->(Landroid/content/Context;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$12;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$12;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$12;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$12;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$13; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$1$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$13$2$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$14; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$14;->(Leu/kanade/tachiyomi/ui/library/LibraryTab;I)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$14;->(Leu/kanade/tachiyomi/ui/library/LibraryTab;I)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$14;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$14;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Landroidx/compose/runtime/MutableState;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Landroidx/compose/runtime/MutableState;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$2; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$2;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$3;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$4; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$4;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$4;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$6; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$6;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$2$6;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$3; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$3;->(Landroidx/compose/material3/SnackbarHostState;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$3;->(Landroidx/compose/material3/SnackbarHostState;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$4; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$4;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;Lcafe/adriel/voyager/navigator/Navigator;Lkotlinx/coroutines/CoroutineScope;Landroid/content/Context;Landroidx/compose/material3/SnackbarHostState;Landroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$4;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/MutableState;Lcafe/adriel/voyager/navigator/Navigator;Lkotlinx/coroutines/CoroutineScope;Landroid/content/Context;Landroidx/compose/material3/SnackbarHostState;Landroidx/compose/ui/hapticfeedback/PlatformHapticFeedback;)V HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$4;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$4$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$4$1;->(Landroidx/compose/ui/platform/UriHandler;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$4$1;->(Landroidx/compose/ui/platform/UriHandler;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$onClickRefresh$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$onClickRefresh$1;->(Landroid/content/Context;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/SnackbarHostState;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$onClickRefresh$1;->(Landroid/content/Context;Lkotlinx/coroutines/CoroutineScope;Landroidx/compose/material3/SnackbarHostState;)V Leu/kanade/tachiyomi/ui/library/LibraryTab$Content$onDismissRequest$1; HSPLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$onDismissRequest$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V PLeu/kanade/tachiyomi/ui/library/LibraryTab$Content$onDismissRequest$1;->(Leu/kanade/tachiyomi/ui/library/LibraryScreenModel;)V Leu/kanade/tachiyomi/ui/main/MainActivity; HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->access$CheckForUpdates(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroidx/compose/runtime/Composer;I)V PLeu/kanade/tachiyomi/ui/main/MainActivity;->access$CheckForUpdates(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->access$HandleOnNewIntent(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroid/content/Context;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V PLeu/kanade/tachiyomi/ui/main/MainActivity;->access$HandleOnNewIntent(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroid/content/Context;Lcafe/adriel/voyager/navigator/Navigator;Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->access$getDownloadCache(Leu/kanade/tachiyomi/ui/main/MainActivity;)Leu/kanade/tachiyomi/data/download/DownloadCache; PLeu/kanade/tachiyomi/ui/main/MainActivity;->access$getDownloadCache(Leu/kanade/tachiyomi/ui/main/MainActivity;)Leu/kanade/tachiyomi/data/download/DownloadCache; HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->access$getPreferences(Leu/kanade/tachiyomi/ui/main/MainActivity;)Leu/kanade/domain/base/BasePreferences; PLeu/kanade/tachiyomi/ui/main/MainActivity;->access$getPreferences(Leu/kanade/tachiyomi/ui/main/MainActivity;)Leu/kanade/domain/base/BasePreferences; HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->access$handleIntentAction(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroid/content/Intent;Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/main/MainActivity;->access$handleIntentAction(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroid/content/Intent;Lcafe/adriel/voyager/navigator/Navigator;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->access$setNavigator$p(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/main/MainActivity;->access$setNavigator$p(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->getReady()Z PLeu/kanade/tachiyomi/ui/main/MainActivity;->getReady()Z HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->onCreate(Landroid/os/Bundle;)V HPLeu/kanade/tachiyomi/ui/main/MainActivity;->onCreate(Landroid/os/Bundle;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity;->setReady()V PLeu/kanade/tachiyomi/ui/main/MainActivity;->setReady()V Leu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1;->(Landroid/content/Context;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1;->(Landroid/content/Context;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$CheckForUpdates$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$Companion; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$Companion;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$Companion;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$Companion;->(I)V PLeu/kanade/tachiyomi/ui/main/MainActivity$Companion;->(I)V Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1;->(Landroid/content/Context;Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/ProducerScope;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/ProducerScope;)V Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$1;->(Landroidx/activity/ComponentActivity;Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$1;->(Landroidx/activity/ComponentActivity;Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$$ExternalSyntheticLambda0;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$1$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$2;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$HandleOnNewIntent$1$2;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$2;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$2;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$3; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$3;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$3;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$4; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$4;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$4;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$5; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$5;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$5;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$6; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$6;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$get$6;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;ZZ)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;ZZ)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;ZZ)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;ZZ)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;ZZ)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;ZZ)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$$inlined$setComposeContent$default$1$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1;->(Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController;JLkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1;->(Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController;JLkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1$1;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$1$1$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2;->(Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController;Landroid/content/Context;JZLkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2;->(Lcom/google/accompanist/systemuicontroller/AndroidSystemUiController;Landroid/content/Context;JZLkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2$1;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$2$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroid/content/Context;ZLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Landroid/content/Context;ZLandroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;Landroidx/compose/runtime/MutableState;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;ZLkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;ZLkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$2;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$2;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;Landroidx/compose/runtime/State;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$3; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$3;->(Lcafe/adriel/voyager/navigator/Navigator;I)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$3;->(Lcafe/adriel/voyager/navigator/Navigator;I)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4;->(Leu/kanade/tachiyomi/ui/main/MainActivity;Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$2;->(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$2;->(Lcafe/adriel/voyager/navigator/Navigator;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1;->(Lkotlinx/coroutines/flow/Flow;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1;->(Lkotlinx/coroutines/flow/Flow;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$1$3$4$invokeSuspend$$inlined$filter$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V Leu/kanade/tachiyomi/ui/main/MainActivity$onCreate$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$2;->(JLeu/kanade/tachiyomi/ui/main/MainActivity;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$2;->(JLeu/kanade/tachiyomi/ui/main/MainActivity;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$2;->shouldKeepOnScreen()Z HPLeu/kanade/tachiyomi/ui/main/MainActivity$onCreate$2;->shouldKeepOnScreen()Z Leu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1;->(Landroid/view/View;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1;->(Landroid/view/View;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1;->onSplashScreenExit(Landroidx/core/splashscreen/SplashScreenViewProvider;)V HPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1;->onSplashScreenExit(Landroidx/core/splashscreen/SplashScreenViewProvider;)V Leu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$$ExternalSyntheticLambda0; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V PLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$$ExternalSyntheticLambda0;->(Ljava/lang/Object;I)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V HPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V Leu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1;->(Landroidx/core/splashscreen/SplashScreenViewProvider;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1;->(Landroidx/core/splashscreen/SplashScreenViewProvider;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1;->onAnimationEnd(Landroid/animation/Animator;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1;->onAnimationEnd(Landroid/animation/Animator;)V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1;->onAnimationStart(Landroid/animation/Animator;)V PLeu/kanade/tachiyomi/ui/main/MainActivity$setSplashScreenExitAnimation$1$onSplashScreenExit$lambda$4$$inlined$doOnEnd$1;->onAnimationStart(Landroid/animation/Animator;)V Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$1$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$2$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$3$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$4$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5$1; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5$1;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$5$1;->()V Leu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$6; HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$6;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$6;->()V HSPLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$6;->()V PLeu/kanade/tachiyomi/ui/main/MainActivity$special$$inlined$injectLazy$6;->()V Leu/kanade/tachiyomi/ui/more/DownloadQueueState; Leu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped; HSPLeu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped;->()V PLeu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped;->()V HSPLeu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped;->()V PLeu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped;->()V HSPLeu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped;->equals(Ljava/lang/Object;)Z PLeu/kanade/tachiyomi/ui/more/DownloadQueueState$Stopped;->equals(Ljava/lang/Object;)Z Leu/kanade/tachiyomi/ui/more/MoreScreenModel; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->(I)V PLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->(I)V HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->access$getDownloadManager$p(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadManager; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->access$getDownloadManager$p(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadManager; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->access$get_state$p(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->access$get_state$p(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->getDownloadQueueState()Lkotlinx/coroutines/flow/StateFlow; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->getDownloadQueueState()Lkotlinx/coroutines/flow/StateFlow; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->getDownloadedOnly()Z PLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->getDownloadedOnly()Z HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->getIncognitoMode()Z PLeu/kanade/tachiyomi/ui/more/MoreScreenModel;->getIncognitoMode()Z Leu/kanade/tachiyomi/ui/more/MoreScreenModel$1; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/more/MoreScreenModel$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/more/MoreScreenModel$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/ui/more/MoreScreenModel$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/ui/more/MoreScreenModel$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/ui/more/MoreTab; HSPLeu/kanade/tachiyomi/ui/more/MoreTab;->()V PLeu/kanade/tachiyomi/ui/more/MoreTab;->()V HSPLeu/kanade/tachiyomi/ui/more/MoreTab;->()V PLeu/kanade/tachiyomi/ui/more/MoreTab;->()V HSPLeu/kanade/tachiyomi/ui/more/MoreTab;->Content(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/more/MoreTab;->Content(Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/more/MoreTab;->getKey()Ljava/lang/String; HPLeu/kanade/tachiyomi/ui/more/MoreTab;->getKey()Ljava/lang/String; HSPLeu/kanade/tachiyomi/ui/more/MoreTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; HPLeu/kanade/tachiyomi/ui/more/MoreTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; Leu/kanade/tachiyomi/ui/more/MoreTab$Content$1$1; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$1$1;->(Landroidx/compose/runtime/MutableState;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$1$1;->(Landroidx/compose/runtime/MutableState;)V HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$1$1;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$1$1;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/more/MoreTab$Content$10; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$10;->(Leu/kanade/tachiyomi/ui/more/MoreTab;I)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$10;->(Leu/kanade/tachiyomi/ui/more/MoreTab;I)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$2; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$2;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$2;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$3; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$3;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$3;->(Leu/kanade/tachiyomi/ui/more/MoreScreenModel;)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$4; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$4;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$4;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$5; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$5;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$5;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$6; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$6;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$6;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$7; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$7;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$7;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/more/MoreTab$Content$8; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$8;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$8;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$8;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/ui/more/MoreTab$Content$9; HSPLeu/kanade/tachiyomi/ui/more/MoreTab$Content$9;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/more/MoreTab$Content$9;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences; HSPLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences;->()V PLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences;->()V HSPLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V Leu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences$Companion; HSPLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences$Companion;->()V PLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences$Companion;->()V HSPLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences$Companion;->(I)V PLeu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences$Companion;->(I)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen;->()V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen;->(ZZ)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen;->Content(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/setting/SettingsScreen;->Content(Landroidx/compose/runtime/Composer;I)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Companion;->()V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Companion;->(I)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1$1;->(Lcafe/adriel/voyager/navigator/Navigator;I)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$1$pop$1;->(Lcafe/adriel/voyager/navigator/Navigator;Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/setting/SettingsScreen$Content$3;->(Leu/kanade/tachiyomi/ui/setting/SettingsScreen;I)V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->(I)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->(I)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getDownloadCache$p(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadCache; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getDownloadCache$p(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadCache; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getDownloadManager$p(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadManager; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getDownloadManager$p(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Leu/kanade/tachiyomi/data/download/DownloadManager; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getGetUpdates$p(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Ltachiyomi/domain/updates/interactor/GetUpdates; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getGetUpdates$p(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Ltachiyomi/domain/updates/interactor/GetUpdates; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getMutableState(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$getMutableState(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$toUpdateItems(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Ljava/util/List;)Ljava/util/ArrayList; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->access$toUpdateItems(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Ljava/util/List;)Ljava/util/ArrayList; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->getEvents()Lkotlinx/coroutines/flow/Flow; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->getEvents()Lkotlinx/coroutines/flow/Flow; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->getLastUpdated()J PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->getLastUpdated()J HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->getSnackbarHostState()Landroidx/compose/material3/SnackbarHostState; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->getSnackbarHostState()Landroidx/compose/material3/SnackbarHostState; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->resetNewUpdatesCount()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;->resetNewUpdatesCount()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1;->(Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$2; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$1$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2$1;->(Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2$1;->(Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2$2; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$2$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog; Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog$DeleteConfirmation; Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->(I)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->(I)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->(ZLjava/util/List;Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->(ZLjava/util/List;Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->copy$default(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Ljava/util/List;Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog$DeleteConfirmation;I)Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->copy$default(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;Ljava/util/List;Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog$DeleteConfirmation;I)Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->equals(Ljava/lang/Object;)Z HPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->equals(Ljava/lang/Object;)Z HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getDialog()Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getDialog()Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$Dialog; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getItems()Ljava/util/List; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getItems()Ljava/util/List; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getSelected()Ljava/util/ArrayList; PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getSelected()Ljava/util/ArrayList; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getSelectionMode()Z PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->getSelectionMode()Z HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->isLoading()Z PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$State;->isLoading()Z Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$1;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$1;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$2; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$2;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$2;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$3; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$3;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$3;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$4; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$4;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$4;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$5; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$5;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$5;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$6; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$6;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$6;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$7; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$7;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$7;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$8; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$8;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$8;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$9; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$9;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesScreenModel$special$$inlined$get$9;->()V Leu/kanade/tachiyomi/ui/updates/UpdatesTab; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->()V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->()V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->()V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->Content(Landroidx/compose/runtime/Composer;I)V HPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->Content(Landroidx/compose/runtime/Composer;I)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->getKey()Ljava/lang/String; HPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->getKey()Ljava/lang/String; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; HPLeu/kanade/tachiyomi/ui/updates/UpdatesTab;->getOptions(Landroidx/compose/runtime/Composer;)Lcafe/adriel/voyager/navigator/tab/TabOptions; Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$1;->(Lcafe/adriel/voyager/navigator/Navigator;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$10; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$10;->(Landroid/content/Context;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$10;->(Landroid/content/Context;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$12$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;Landroid/content/Context;Lkotlin/coroutines/Continuation;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1;->(Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1;->(Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$13$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14;->(Landroid/content/Context;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14;->(Landroid/content/Context;Landroidx/compose/runtime/State;Lkotlin/coroutines/Continuation;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$14;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15$invoke$$inlined$onDispose$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15$invoke$$inlined$onDispose$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15$invoke$$inlined$onDispose$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15$invoke$$inlined$onDispose$1;->dispose()V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$15$invoke$$inlined$onDispose$1;->dispose()V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$16; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$16;->(Leu/kanade/tachiyomi/ui/updates/UpdatesTab;I)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$16;->(Leu/kanade/tachiyomi/ui/updates/UpdatesTab;I)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$2; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$2;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$3; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$3;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$3;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$4; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$4;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$4;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$5; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$5;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$5;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$6; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$6;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$6;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$7; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$7;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$7;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$8; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$8;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$8;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$9; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$9;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$9;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$onDismissDialog$1; HSPLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$onDismissDialog$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V PLeu/kanade/tachiyomi/ui/updates/UpdatesTab$Content$onDismissDialog$1;->(Leu/kanade/tachiyomi/ui/updates/UpdatesScreenModel;)V Leu/kanade/tachiyomi/util/storage/DiskUtil; HSPLeu/kanade/tachiyomi/util/storage/DiskUtil;->()V PLeu/kanade/tachiyomi/util/storage/DiskUtil;->()V HSPLeu/kanade/tachiyomi/util/storage/DiskUtil;->()V PLeu/kanade/tachiyomi/util/storage/DiskUtil;->()V HSPLeu/kanade/tachiyomi/util/storage/DiskUtil;->createNoMediaFile(Lcom/hippo/unifile/UniFile;Landroid/content/Context;)V PLeu/kanade/tachiyomi/util/storage/DiskUtil;->createNoMediaFile(Lcom/hippo/unifile/UniFile;Landroid/content/Context;)V Leu/kanade/tachiyomi/util/system/ContextExtensionsKt; HSPLeu/kanade/tachiyomi/util/system/ContextExtensionsKt;->isInstalledFromFDroid(Landroid/content/Context;)Z HPLeu/kanade/tachiyomi/util/system/ContextExtensionsKt;->isInstalledFromFDroid(Landroid/content/Context;)Z Leu/kanade/tachiyomi/util/system/DensityExtensionsKt; HSPLeu/kanade/tachiyomi/util/system/DensityExtensionsKt;->getDpToPx(I)I PLeu/kanade/tachiyomi/util/system/DensityExtensionsKt;->getDpToPx(I)I Leu/kanade/tachiyomi/util/system/DeviceUtil; HSPLeu/kanade/tachiyomi/util/system/DeviceUtil;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil;->isSamsung()Z PLeu/kanade/tachiyomi/util/system/DeviceUtil;->isSamsung()Z Leu/kanade/tachiyomi/util/system/DeviceUtil$isMiui$2; HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$isMiui$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$isMiui$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$isMiui$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$isMiui$2;->()V Leu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2; HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/util/system/DeviceUtil$isSamsung$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/util/system/DeviceUtil$miuiMajorVersion$2; HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$miuiMajorVersion$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$miuiMajorVersion$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$miuiMajorVersion$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$miuiMajorVersion$2;->()V Leu/kanade/tachiyomi/util/system/DeviceUtil$oneUiVersion$2; HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$oneUiVersion$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$oneUiVersion$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtil$oneUiVersion$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtil$oneUiVersion$2;->()V Leu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt; HSPLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt;->isDynamicColorAvailable(Leu/kanade/tachiyomi/util/system/DeviceUtil;)Z PLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt;->isDynamicColorAvailable(Leu/kanade/tachiyomi/util/system/DeviceUtil;)Z Leu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2; HSPLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2;->()V PLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2;->()V HSPLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2;->invoke()Ljava/lang/Object; PLeu/kanade/tachiyomi/util/system/DeviceUtilExtensionsKt$isDynamicColorAvailable$2;->invoke()Ljava/lang/Object; Leu/kanade/tachiyomi/util/system/DisplayExtensionsKt; HSPLeu/kanade/tachiyomi/util/system/DisplayExtensionsKt;->prepareTabletUiContext(Landroid/content/Context;)Landroid/content/Context; PLeu/kanade/tachiyomi/util/system/DisplayExtensionsKt;->prepareTabletUiContext(Landroid/content/Context;)Landroid/content/Context; Leu/kanade/tachiyomi/util/system/DisplayExtensionsKt$prepareTabletUiContext$$inlined$get$1; HSPLeu/kanade/tachiyomi/util/system/DisplayExtensionsKt$prepareTabletUiContext$$inlined$get$1;->()V PLeu/kanade/tachiyomi/util/system/DisplayExtensionsKt$prepareTabletUiContext$$inlined$get$1;->()V Leu/kanade/tachiyomi/util/system/InternalResourceHelper; HSPLeu/kanade/tachiyomi/util/system/InternalResourceHelper;->()V PLeu/kanade/tachiyomi/util/system/InternalResourceHelper;->()V HSPLeu/kanade/tachiyomi/util/system/InternalResourceHelper;->()V PLeu/kanade/tachiyomi/util/system/InternalResourceHelper;->()V Leu/kanade/tachiyomi/util/system/LocaleHelper; HSPLeu/kanade/tachiyomi/util/system/LocaleHelper;->()V PLeu/kanade/tachiyomi/util/system/LocaleHelper;->()V HSPLeu/kanade/tachiyomi/util/system/LocaleHelper;->()V PLeu/kanade/tachiyomi/util/system/LocaleHelper;->()V Leu/kanade/tachiyomi/util/system/LocaleHelper$comparator$1; HSPLeu/kanade/tachiyomi/util/system/LocaleHelper$comparator$1;->()V PLeu/kanade/tachiyomi/util/system/LocaleHelper$comparator$1;->()V HSPLeu/kanade/tachiyomi/util/system/LocaleHelper$comparator$1;->()V PLeu/kanade/tachiyomi/util/system/LocaleHelper$comparator$1;->()V Leu/kanade/tachiyomi/util/system/NotificationExtensionsKt; HSPLeu/kanade/tachiyomi/util/system/NotificationExtensionsKt;->buildNotificationChannel(Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Landroidx/core/app/NotificationChannelCompat; PLeu/kanade/tachiyomi/util/system/NotificationExtensionsKt;->buildNotificationChannel(Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Landroidx/core/app/NotificationChannelCompat; HSPLeu/kanade/tachiyomi/util/system/NotificationExtensionsKt;->buildNotificationChannelGroup(Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Landroidx/core/app/NotificationChannelGroupCompat; PLeu/kanade/tachiyomi/util/system/NotificationExtensionsKt;->buildNotificationChannelGroup(Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Landroidx/core/app/NotificationChannelGroupCompat; HSPLeu/kanade/tachiyomi/util/system/NotificationExtensionsKt;->cancelNotification(Landroid/content/Context;I)V PLeu/kanade/tachiyomi/util/system/NotificationExtensionsKt;->cancelNotification(Landroid/content/Context;I)V Leu/kanade/tachiyomi/util/system/WorkManagerExtensionsKt; HSPLeu/kanade/tachiyomi/util/system/WorkManagerExtensionsKt;->getWorkManager(Landroid/content/Context;)Landroidx/work/impl/WorkManagerImpl; PLeu/kanade/tachiyomi/util/system/WorkManagerExtensionsKt;->getWorkManager(Landroid/content/Context;)Landroidx/work/impl/WorkManagerImpl; Leu/kanade/tachiyomi/util/view/WindowExtensionsKt; Lio/requery/android/database/AbstractCursor; HSPLio/requery/android/database/AbstractCursor;->()V PLio/requery/android/database/AbstractCursor;->()V HSPLio/requery/android/database/AbstractCursor;->checkPosition()V PLio/requery/android/database/AbstractCursor;->checkPosition()V HSPLio/requery/android/database/AbstractCursor;->close()V PLio/requery/android/database/AbstractCursor;->close()V HSPLio/requery/android/database/AbstractCursor;->finalize()V PLio/requery/android/database/AbstractCursor;->finalize()V HSPLio/requery/android/database/AbstractCursor;->moveToFirst()Z PLio/requery/android/database/AbstractCursor;->moveToFirst()Z HSPLio/requery/android/database/AbstractCursor;->moveToNext()Z PLio/requery/android/database/AbstractCursor;->moveToNext()Z HSPLio/requery/android/database/AbstractCursor;->moveToPosition(I)Z PLio/requery/android/database/AbstractCursor;->moveToPosition(I)Z HSPLio/requery/android/database/AbstractCursor;->onDeactivateOrClose()V PLio/requery/android/database/AbstractCursor;->onDeactivateOrClose()V Lio/requery/android/database/AbstractWindowedCursor; HSPLio/requery/android/database/AbstractWindowedCursor;->()V PLio/requery/android/database/AbstractWindowedCursor;->()V HSPLio/requery/android/database/AbstractWindowedCursor;->checkPosition()V PLio/requery/android/database/AbstractWindowedCursor;->checkPosition()V HSPLio/requery/android/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V PLio/requery/android/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V HSPLio/requery/android/database/AbstractWindowedCursor;->closeWindow()V PLio/requery/android/database/AbstractWindowedCursor;->closeWindow()V HSPLio/requery/android/database/AbstractWindowedCursor;->getLong(I)J PLio/requery/android/database/AbstractWindowedCursor;->getLong(I)J HSPLio/requery/android/database/AbstractWindowedCursor;->getString(I)Ljava/lang/String; PLio/requery/android/database/AbstractWindowedCursor;->getString(I)Ljava/lang/String; HSPLio/requery/android/database/AbstractWindowedCursor;->isNull(I)Z PLio/requery/android/database/AbstractWindowedCursor;->isNull(I)Z HSPLio/requery/android/database/AbstractWindowedCursor;->onDeactivateOrClose()V PLio/requery/android/database/AbstractWindowedCursor;->onDeactivateOrClose()V Lio/requery/android/database/CursorWindow; HSPLio/requery/android/database/CursorWindow;->(Ljava/lang/String;)V PLio/requery/android/database/CursorWindow;->(Ljava/lang/String;)V HSPLio/requery/android/database/CursorWindow;->(Ljava/lang/String;I)V PLio/requery/android/database/CursorWindow;->(Ljava/lang/String;I)V HSPLio/requery/android/database/CursorWindow;->dispose()V PLio/requery/android/database/CursorWindow;->dispose()V HSPLio/requery/android/database/CursorWindow;->finalize()V PLio/requery/android/database/CursorWindow;->finalize()V HSPLio/requery/android/database/CursorWindow;->getLong(II)J PLio/requery/android/database/CursorWindow;->getLong(II)J HSPLio/requery/android/database/CursorWindow;->getNumRows()I PLio/requery/android/database/CursorWindow;->getNumRows()I HSPLio/requery/android/database/CursorWindow;->getStartPosition()I PLio/requery/android/database/CursorWindow;->getStartPosition()I HSPLio/requery/android/database/CursorWindow;->getString(II)Ljava/lang/String; PLio/requery/android/database/CursorWindow;->getString(II)Ljava/lang/String; HSPLio/requery/android/database/CursorWindow;->getType(II)I PLio/requery/android/database/CursorWindow;->getType(II)I HSPLio/requery/android/database/CursorWindow;->onAllReferencesReleased()V PLio/requery/android/database/CursorWindow;->onAllReferencesReleased()V HSPLio/requery/android/database/CursorWindow;->setStartPosition(I)V PLio/requery/android/database/CursorWindow;->setStartPosition(I)V Lio/requery/android/database/DatabaseErrorHandler; Lio/requery/android/database/sqlite/CloseGuard; HSPLio/requery/android/database/sqlite/CloseGuard;->()V PLio/requery/android/database/sqlite/CloseGuard;->()V HSPLio/requery/android/database/sqlite/CloseGuard;->()V PLio/requery/android/database/sqlite/CloseGuard;->()V HSPLio/requery/android/database/sqlite/CloseGuard;->get()Lio/requery/android/database/sqlite/CloseGuard; PLio/requery/android/database/sqlite/CloseGuard;->get()Lio/requery/android/database/sqlite/CloseGuard; HSPLio/requery/android/database/sqlite/CloseGuard;->open(Ljava/lang/String;)V PLio/requery/android/database/sqlite/CloseGuard;->open(Ljava/lang/String;)V Lio/requery/android/database/sqlite/CloseGuard$DefaultReporter; HSPLio/requery/android/database/sqlite/CloseGuard$DefaultReporter;->()V PLio/requery/android/database/sqlite/CloseGuard$DefaultReporter;->()V HSPLio/requery/android/database/sqlite/CloseGuard$DefaultReporter;->(I)V PLio/requery/android/database/sqlite/CloseGuard$DefaultReporter;->(I)V Lio/requery/android/database/sqlite/CloseGuard$Reporter; Lio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory; HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;->()V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;->()V HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;->(Ljava/lang/Iterable;)V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;->(Ljava/lang/Iterable;)V HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory;->create(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Configuration;)Landroidx/sqlite/db/SupportSQLiteOpenHelper; Lio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackDatabaseErrorHandler; HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackDatabaseErrorHandler;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackDatabaseErrorHandler;->(Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V Lio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper; HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Ljava/lang/Iterable;)V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;Ljava/lang/Iterable;)V HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->createConfiguration(Ljava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration; PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->createConfiguration(Ljava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration; HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->onConfigure(Lio/requery/android/database/sqlite/SQLiteDatabase;)V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->onConfigure(Lio/requery/android/database/sqlite/SQLiteDatabase;)V HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->onCreate(Lio/requery/android/database/sqlite/SQLiteDatabase;)V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->onCreate(Lio/requery/android/database/sqlite/SQLiteDatabase;)V HSPLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->onOpen(Lio/requery/android/database/sqlite/SQLiteDatabase;)V PLio/requery/android/database/sqlite/RequerySQLiteOpenHelperFactory$CallbackSQLiteOpenHelper;->onOpen(Lio/requery/android/database/sqlite/SQLiteDatabase;)V Lio/requery/android/database/sqlite/SQLiteClosable; HSPLio/requery/android/database/sqlite/SQLiteClosable;->()V PLio/requery/android/database/sqlite/SQLiteClosable;->()V HSPLio/requery/android/database/sqlite/SQLiteClosable;->acquireReference()V PLio/requery/android/database/sqlite/SQLiteClosable;->acquireReference()V HSPLio/requery/android/database/sqlite/SQLiteClosable;->close()V PLio/requery/android/database/sqlite/SQLiteClosable;->close()V HSPLio/requery/android/database/sqlite/SQLiteClosable;->releaseReference()V PLio/requery/android/database/sqlite/SQLiteClosable;->releaseReference()V Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnection;->()V PLio/requery/android/database/sqlite/SQLiteConnection;->()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->(Lio/requery/android/database/sqlite/SQLiteConnectionPool;Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;IZ)V PLio/requery/android/database/sqlite/SQLiteConnection;->(Lio/requery/android/database/sqlite/SQLiteConnectionPool;Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;IZ)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->acquirePreparedStatement(Ljava/lang/String;)Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement; PLio/requery/android/database/sqlite/SQLiteConnection;->acquirePreparedStatement(Ljava/lang/String;)Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement; HSPLio/requery/android/database/sqlite/SQLiteConnection;->applyBlockGuardPolicy(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V PLio/requery/android/database/sqlite/SQLiteConnection;->applyBlockGuardPolicy(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->attachCancellationSignal(Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteConnection;->attachCancellationSignal(Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->bindArguments(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;[Ljava/lang/Object;)V PLio/requery/android/database/sqlite/SQLiteConnection;->bindArguments(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;[Ljava/lang/Object;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->canonicalizeSyncMode(Ljava/lang/String;)Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteConnection;->canonicalizeSyncMode(Ljava/lang/String;)Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteConnection;->detachCancellationSignal(Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteConnection;->detachCancellationSignal(Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)I PLio/requery/android/database/sqlite/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)I HSPLio/requery/android/database/sqlite/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Lio/requery/android/database/CursorWindow;IIZLandroidx/core/os/CancellationSignal;)I PLio/requery/android/database/sqlite/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Lio/requery/android/database/CursorWindow;IIZLandroidx/core/os/CancellationSignal;)I HSPLio/requery/android/database/sqlite/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)J PLio/requery/android/database/sqlite/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)J HSPLio/requery/android/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteConnection;->finalizePreparedStatement(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V PLio/requery/android/database/sqlite/SQLiteConnection;->finalizePreparedStatement(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->getTypeOfObject(Ljava/lang/Object;)I PLio/requery/android/database/sqlite/SQLiteConnection;->getTypeOfObject(Ljava/lang/Object;)I HSPLio/requery/android/database/sqlite/SQLiteConnection;->hasCodec()Z PLio/requery/android/database/sqlite/SQLiteConnection;->hasCodec()Z HSPLio/requery/android/database/sqlite/SQLiteConnection;->isCacheable(I)Z PLio/requery/android/database/sqlite/SQLiteConnection;->isCacheable(I)Z HSPLio/requery/android/database/sqlite/SQLiteConnection;->isPrimaryConnection()Z PLio/requery/android/database/sqlite/SQLiteConnection;->isPrimaryConnection()Z HSPLio/requery/android/database/sqlite/SQLiteConnection;->obtainPreparedStatement(Ljava/lang/String;JIIZ)Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement; PLio/requery/android/database/sqlite/SQLiteConnection;->obtainPreparedStatement(Ljava/lang/String;JIIZ)Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement; HSPLio/requery/android/database/sqlite/SQLiteConnection;->open()V PLio/requery/android/database/sqlite/SQLiteConnection;->open()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->open(Lio/requery/android/database/sqlite/SQLiteConnectionPool;Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;IZ)Lio/requery/android/database/sqlite/SQLiteConnection; PLio/requery/android/database/sqlite/SQLiteConnection;->open(Lio/requery/android/database/sqlite/SQLiteConnectionPool;Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;IZ)Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnection;->prepare(Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteStatementInfo;)V PLio/requery/android/database/sqlite/SQLiteConnection;->prepare(Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteStatementInfo;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->recyclePreparedStatement(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V PLio/requery/android/database/sqlite/SQLiteConnection;->recyclePreparedStatement(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->releasePreparedStatement(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V PLio/requery/android/database/sqlite/SQLiteConnection;->releasePreparedStatement(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setAutoCheckpointInterval()V PLio/requery/android/database/sqlite/SQLiteConnection;->setAutoCheckpointInterval()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setForeignKeyModeFromConfiguration()V PLio/requery/android/database/sqlite/SQLiteConnection;->setForeignKeyModeFromConfiguration()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setJournalMode(Ljava/lang/String;)V PLio/requery/android/database/sqlite/SQLiteConnection;->setJournalMode(Ljava/lang/String;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setJournalSizeLimit()V PLio/requery/android/database/sqlite/SQLiteConnection;->setJournalSizeLimit()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setLocaleFromConfiguration()V PLio/requery/android/database/sqlite/SQLiteConnection;->setLocaleFromConfiguration()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setOnlyAllowReadOnlyOperations(Z)V PLio/requery/android/database/sqlite/SQLiteConnection;->setOnlyAllowReadOnlyOperations(Z)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setPageSize()V PLio/requery/android/database/sqlite/SQLiteConnection;->setPageSize()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setSyncMode(Ljava/lang/String;)V PLio/requery/android/database/sqlite/SQLiteConnection;->setSyncMode(Ljava/lang/String;)V HSPLio/requery/android/database/sqlite/SQLiteConnection;->setWalModeFromConfiguration()V PLio/requery/android/database/sqlite/SQLiteConnection;->setWalModeFromConfiguration()V HSPLio/requery/android/database/sqlite/SQLiteConnection;->throwIfStatementForbidden(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V PLio/requery/android/database/sqlite/SQLiteConnection;->throwIfStatementForbidden(Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;)V Lio/requery/android/database/sqlite/SQLiteConnection$Operation; HSPLio/requery/android/database/sqlite/SQLiteConnection$Operation;->()V PLio/requery/android/database/sqlite/SQLiteConnection$Operation;->()V HSPLio/requery/android/database/sqlite/SQLiteConnection$Operation;->()V PLio/requery/android/database/sqlite/SQLiteConnection$Operation;->()V HSPLio/requery/android/database/sqlite/SQLiteConnection$Operation;->(I)V PLio/requery/android/database/sqlite/SQLiteConnection$Operation;->(I)V Lio/requery/android/database/sqlite/SQLiteConnection$OperationLog; HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->()V PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->()V HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->(I)V PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->(I)V HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->beginOperation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->beginOperation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->endOperation(I)V PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->endOperation(I)V HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLog(I)Z PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLog(I)Z HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLogLocked(I)Z PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLogLocked(I)Z HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->getOperationLocked(I)Lio/requery/android/database/sqlite/SQLiteConnection$Operation; PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->getOperationLocked(I)Lio/requery/android/database/sqlite/SQLiteConnection$Operation; HSPLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->newOperationCookieLocked(I)I PLio/requery/android/database/sqlite/SQLiteConnection$OperationLog;->newOperationCookieLocked(I)I Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement; HSPLio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;->()V PLio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;->()V HSPLio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;->(I)V PLio/requery/android/database/sqlite/SQLiteConnection$PreparedStatement;->(I)V Lio/requery/android/database/sqlite/SQLiteConnection$PreparedStatementCache; HSPLio/requery/android/database/sqlite/SQLiteConnection$PreparedStatementCache;->(Lio/requery/android/database/sqlite/SQLiteConnection;I)V PLio/requery/android/database/sqlite/SQLiteConnection$PreparedStatementCache;->(Lio/requery/android/database/sqlite/SQLiteConnection;I)V Lio/requery/android/database/sqlite/SQLiteConnectionPool; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->acquireConnection(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;)Lio/requery/android/database/sqlite/SQLiteConnection; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->acquireConnection(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;)Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->finishAcquireConnectionLocked(Lio/requery/android/database/sqlite/SQLiteConnection;I)V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->finishAcquireConnectionLocked(Lio/requery/android/database/sqlite/SQLiteConnection;I)V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->getPriority(I)I PLio/requery/android/database/sqlite/SQLiteConnectionPool;->getPriority(I)I HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->obtainConnectionWaiterLocked(Ljava/lang/Thread;JIZLjava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->obtainConnectionWaiterLocked(Ljava/lang/Thread;JIZLjava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->open()V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->open()V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->open(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)Lio/requery/android/database/sqlite/SQLiteConnectionPool; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->open(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)Lio/requery/android/database/sqlite/SQLiteConnectionPool; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->openConnectionLocked(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;Z)Lio/requery/android/database/sqlite/SQLiteConnection; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->openConnectionLocked(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;Z)Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->recycleConnectionLocked(Lio/requery/android/database/sqlite/SQLiteConnection;Lio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;)Z PLio/requery/android/database/sqlite/SQLiteConnectionPool;->recycleConnectionLocked(Lio/requery/android/database/sqlite/SQLiteConnection;Lio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;)Z HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->recycleConnectionWaiterLocked(Lio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;)V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->recycleConnectionWaiterLocked(Lio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;)V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->releaseConnection(Lio/requery/android/database/sqlite/SQLiteConnection;)V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->releaseConnection(Lio/requery/android/database/sqlite/SQLiteConnection;)V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->throwIfClosedLocked()V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->throwIfClosedLocked()V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteConnection; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Lio/requery/android/database/sqlite/SQLiteConnection; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;)Lio/requery/android/database/sqlite/SQLiteConnection; PLio/requery/android/database/sqlite/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;)Lio/requery/android/database/sqlite/SQLiteConnection; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool;->wakeConnectionWaitersLocked()V PLio/requery/android/database/sqlite/SQLiteConnectionPool;->wakeConnectionWaitersLocked()V Lio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;->$values()[Lio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus; PLio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;->$values()[Lio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;->()V PLio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;->()V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;->(Ljava/lang/String;I)V PLio/requery/android/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;->(Ljava/lang/String;I)V Lio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter; HSPLio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;->()V PLio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;->()V HSPLio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;->(I)V PLio/requery/android/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;->(I)V Lio/requery/android/database/sqlite/SQLiteCursor; HSPLio/requery/android/database/sqlite/SQLiteCursor;->(Lio/requery/android/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteQuery;)V PLio/requery/android/database/sqlite/SQLiteCursor;->(Lio/requery/android/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteQuery;)V HSPLio/requery/android/database/sqlite/SQLiteCursor;->close()V PLio/requery/android/database/sqlite/SQLiteCursor;->close()V HSPLio/requery/android/database/sqlite/SQLiteCursor;->cursorPickFillWindowStartPosition(II)I PLio/requery/android/database/sqlite/SQLiteCursor;->cursorPickFillWindowStartPosition(II)I HSPLio/requery/android/database/sqlite/SQLiteCursor;->fillWindow(I)V PLio/requery/android/database/sqlite/SQLiteCursor;->fillWindow(I)V HSPLio/requery/android/database/sqlite/SQLiteCursor;->finalize()V PLio/requery/android/database/sqlite/SQLiteCursor;->finalize()V HSPLio/requery/android/database/sqlite/SQLiteCursor;->getCount()I PLio/requery/android/database/sqlite/SQLiteCursor;->getCount()I HSPLio/requery/android/database/sqlite/SQLiteCursor;->getDatabase()Lio/requery/android/database/sqlite/SQLiteDatabase; PLio/requery/android/database/sqlite/SQLiteCursor;->getDatabase()Lio/requery/android/database/sqlite/SQLiteDatabase; HSPLio/requery/android/database/sqlite/SQLiteCursor;->onMove(II)Z PLio/requery/android/database/sqlite/SQLiteCursor;->onMove(II)Z Lio/requery/android/database/sqlite/SQLiteCursorDriver; Lio/requery/android/database/sqlite/SQLiteCustomFunction; Lio/requery/android/database/sqlite/SQLiteDatabase; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->-$$Nest$fgetmCursorFactory(Lio/requery/android/database/sqlite/SQLiteDatabase;)Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory; PLio/requery/android/database/sqlite/SQLiteDatabase;->-$$Nest$fgetmCursorFactory(Lio/requery/android/database/sqlite/SQLiteDatabase;)Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->()V PLio/requery/android/database/sqlite/SQLiteDatabase;->()V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;Lio/requery/android/database/DatabaseErrorHandler;)V PLio/requery/android/database/sqlite/SQLiteDatabase;->(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;Lio/requery/android/database/DatabaseErrorHandler;)V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->beginTransaction()V PLio/requery/android/database/sqlite/SQLiteDatabase;->beginTransaction()V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;I)V PLio/requery/android/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;I)V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; PLio/requery/android/database/sqlite/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Landroidx/sqlite/db/SupportSQLiteStatement; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Lio/requery/android/database/sqlite/SQLiteStatement; PLio/requery/android/database/sqlite/SQLiteDatabase;->compileStatement(Ljava/lang/String;)Lio/requery/android/database/sqlite/SQLiteStatement; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->createSession()Lio/requery/android/database/sqlite/SQLiteSession; PLio/requery/android/database/sqlite/SQLiteDatabase;->createSession()Lio/requery/android/database/sqlite/SQLiteSession; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->endTransaction()V PLio/requery/android/database/sqlite/SQLiteDatabase;->endTransaction()V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->ensureFile(Ljava/lang/String;)V PLio/requery/android/database/sqlite/SQLiteDatabase;->ensureFile(Ljava/lang/String;)V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->execSQL(Ljava/lang/String;)V PLio/requery/android/database/sqlite/SQLiteDatabase;->execSQL(Ljava/lang/String;)V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->executeSql(Ljava/lang/String;[Ljava/lang/Object;)I PLio/requery/android/database/sqlite/SQLiteDatabase;->executeSql(Ljava/lang/String;[Ljava/lang/Object;)I HSPLio/requery/android/database/sqlite/SQLiteDatabase;->getPath()Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteDatabase;->getPath()Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I PLio/requery/android/database/sqlite/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I HSPLio/requery/android/database/sqlite/SQLiteDatabase;->getThreadSession()Lio/requery/android/database/sqlite/SQLiteSession; PLio/requery/android/database/sqlite/SQLiteDatabase;->getThreadSession()Lio/requery/android/database/sqlite/SQLiteSession; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->getVersion()I PLio/requery/android/database/sqlite/SQLiteDatabase;->getVersion()I HSPLio/requery/android/database/sqlite/SQLiteDatabase;->hasCodec()Z PLio/requery/android/database/sqlite/SQLiteDatabase;->hasCodec()Z HSPLio/requery/android/database/sqlite/SQLiteDatabase;->isMainThread()Z PLio/requery/android/database/sqlite/SQLiteDatabase;->isMainThread()Z HSPLio/requery/android/database/sqlite/SQLiteDatabase;->isReadOnly()Z PLio/requery/android/database/sqlite/SQLiteDatabase;->isReadOnly()Z HSPLio/requery/android/database/sqlite/SQLiteDatabase;->isReadOnlyLocked()Z PLio/requery/android/database/sqlite/SQLiteDatabase;->isReadOnlyLocked()Z HSPLio/requery/android/database/sqlite/SQLiteDatabase;->longForQuery(Lio/requery/android/database/sqlite/SQLiteStatement;[Ljava/lang/String;)J PLio/requery/android/database/sqlite/SQLiteDatabase;->longForQuery(Lio/requery/android/database/sqlite/SQLiteStatement;[Ljava/lang/String;)J HSPLio/requery/android/database/sqlite/SQLiteDatabase;->longForQuery(Ljava/lang/String;[Ljava/lang/String;)J PLio/requery/android/database/sqlite/SQLiteDatabase;->longForQuery(Ljava/lang/String;[Ljava/lang/String;)J HSPLio/requery/android/database/sqlite/SQLiteDatabase;->open()V PLio/requery/android/database/sqlite/SQLiteDatabase;->open()V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->openDatabase(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;Lio/requery/android/database/DatabaseErrorHandler;)Lio/requery/android/database/sqlite/SQLiteDatabase; PLio/requery/android/database/sqlite/SQLiteDatabase;->openDatabase(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;Lio/requery/android/database/DatabaseErrorHandler;)Lio/requery/android/database/sqlite/SQLiteDatabase; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->openInner()V PLio/requery/android/database/sqlite/SQLiteDatabase;->openInner()V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; PLio/requery/android/database/sqlite/SQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;)Landroid/database/Cursor; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroidx/core/os/CancellationSignal;)Landroid/database/Cursor; PLio/requery/android/database/sqlite/SQLiteDatabase;->query(Landroidx/sqlite/db/SupportSQLiteQuery;Landroidx/core/os/CancellationSignal;)Landroid/database/Cursor; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;)Landroid/database/Cursor; PLio/requery/android/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;)Landroid/database/Cursor; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Landroidx/core/os/CancellationSignal;)Landroid/database/Cursor; PLio/requery/android/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Landroidx/core/os/CancellationSignal;)Landroid/database/Cursor; HSPLio/requery/android/database/sqlite/SQLiteDatabase;->setTransactionSuccessful()V PLio/requery/android/database/sqlite/SQLiteDatabase;->setTransactionSuccessful()V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->setVersion(I)V PLio/requery/android/database/sqlite/SQLiteDatabase;->setVersion(I)V HSPLio/requery/android/database/sqlite/SQLiteDatabase;->throwIfNotOpenLocked()V PLio/requery/android/database/sqlite/SQLiteDatabase;->throwIfNotOpenLocked()V Lio/requery/android/database/sqlite/SQLiteDatabase$1; HSPLio/requery/android/database/sqlite/SQLiteDatabase$1;->(Lio/requery/android/database/sqlite/SQLiteDatabase;)V PLio/requery/android/database/sqlite/SQLiteDatabase$1;->(Lio/requery/android/database/sqlite/SQLiteDatabase;)V HSPLio/requery/android/database/sqlite/SQLiteDatabase$1;->initialValue()Lio/requery/android/database/sqlite/SQLiteSession; PLio/requery/android/database/sqlite/SQLiteDatabase$1;->initialValue()Lio/requery/android/database/sqlite/SQLiteSession; HSPLio/requery/android/database/sqlite/SQLiteDatabase$1;->initialValue()Ljava/lang/Object; PLio/requery/android/database/sqlite/SQLiteDatabase$1;->initialValue()Ljava/lang/Object; Lio/requery/android/database/sqlite/SQLiteDatabase$4; HSPLio/requery/android/database/sqlite/SQLiteDatabase$4;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Landroidx/sqlite/db/SupportSQLiteQuery;)V PLio/requery/android/database/sqlite/SQLiteDatabase$4;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Landroidx/sqlite/db/SupportSQLiteQuery;)V HSPLio/requery/android/database/sqlite/SQLiteDatabase$4;->newCursor(Lio/requery/android/database/sqlite/SQLiteDatabase;Lio/requery/android/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; PLio/requery/android/database/sqlite/SQLiteDatabase$4;->newCursor(Lio/requery/android/database/sqlite/SQLiteDatabase;Lio/requery/android/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteQuery;)Landroid/database/Cursor; Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory; Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration; HSPLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->()V PLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->()V HSPLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)V PLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)V HSPLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->(Ljava/lang/String;I)V PLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->(Ljava/lang/String;I)V HSPLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->isInMemoryDb()Z PLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->isInMemoryDb()Z HSPLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->stripPathForLogs(Ljava/lang/String;)Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->stripPathForLogs(Ljava/lang/String;)Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->updateParametersFrom(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)V PLio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;->updateParametersFrom(Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration;)V Lio/requery/android/database/sqlite/SQLiteDebug; HSPLio/requery/android/database/sqlite/SQLiteDebug;->()V PLio/requery/android/database/sqlite/SQLiteDebug;->()V Lio/requery/android/database/sqlite/SQLiteDebug$PagerStats; Lio/requery/android/database/sqlite/SQLiteDirectCursorDriver; HSPLio/requery/android/database/sqlite/SQLiteDirectCursorDriver;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteDirectCursorDriver;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteDirectCursorDriver;->cursorClosed()V PLio/requery/android/database/sqlite/SQLiteDirectCursorDriver;->cursorClosed()V HSPLio/requery/android/database/sqlite/SQLiteDirectCursorDriver;->query(Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/Object;)Landroid/database/Cursor; PLio/requery/android/database/sqlite/SQLiteDirectCursorDriver;->query(Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/Object;)Landroid/database/Cursor; Lio/requery/android/database/sqlite/SQLiteFunction; Lio/requery/android/database/sqlite/SQLiteGlobal; HSPLio/requery/android/database/sqlite/SQLiteGlobal;->()V PLio/requery/android/database/sqlite/SQLiteGlobal;->()V HSPLio/requery/android/database/sqlite/SQLiteGlobal;->getDefaultJournalMode()Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteGlobal;->getDefaultJournalMode()Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteGlobal;->getDefaultPageSize()I PLio/requery/android/database/sqlite/SQLiteGlobal;->getDefaultPageSize()I HSPLio/requery/android/database/sqlite/SQLiteGlobal;->getDefaultSyncMode()Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteGlobal;->getDefaultSyncMode()Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteGlobal;->getJournalSizeLimit()I PLio/requery/android/database/sqlite/SQLiteGlobal;->getJournalSizeLimit()I HSPLio/requery/android/database/sqlite/SQLiteGlobal;->getWALAutoCheckpoint()I PLio/requery/android/database/sqlite/SQLiteGlobal;->getWALAutoCheckpoint()I Lio/requery/android/database/sqlite/SQLiteOpenHelper; HSPLio/requery/android/database/sqlite/SQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;ILio/requery/android/database/DatabaseErrorHandler;)V PLio/requery/android/database/sqlite/SQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Lio/requery/android/database/sqlite/SQLiteDatabase$CursorFactory;ILio/requery/android/database/DatabaseErrorHandler;)V HSPLio/requery/android/database/sqlite/SQLiteOpenHelper;->createConfiguration(Ljava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration; PLio/requery/android/database/sqlite/SQLiteOpenHelper;->createConfiguration(Ljava/lang/String;I)Lio/requery/android/database/sqlite/SQLiteDatabaseConfiguration; HSPLio/requery/android/database/sqlite/SQLiteOpenHelper;->getDatabaseLocked(Z)Lio/requery/android/database/sqlite/SQLiteDatabase; PLio/requery/android/database/sqlite/SQLiteOpenHelper;->getDatabaseLocked(Z)Lio/requery/android/database/sqlite/SQLiteDatabase; HSPLio/requery/android/database/sqlite/SQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; PLio/requery/android/database/sqlite/SQLiteOpenHelper;->getWritableDatabase()Landroidx/sqlite/db/SupportSQLiteDatabase; HSPLio/requery/android/database/sqlite/SQLiteOpenHelper;->getWritableDatabase()Lio/requery/android/database/sqlite/SQLiteDatabase; PLio/requery/android/database/sqlite/SQLiteOpenHelper;->getWritableDatabase()Lio/requery/android/database/sqlite/SQLiteDatabase; Lio/requery/android/database/sqlite/SQLiteProgram; HSPLio/requery/android/database/sqlite/SQLiteProgram;->()V PLio/requery/android/database/sqlite/SQLiteProgram;->()V HSPLio/requery/android/database/sqlite/SQLiteProgram;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteProgram;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteProgram;->bind(ILjava/lang/Object;)V PLio/requery/android/database/sqlite/SQLiteProgram;->bind(ILjava/lang/Object;)V HSPLio/requery/android/database/sqlite/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V PLio/requery/android/database/sqlite/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V HSPLio/requery/android/database/sqlite/SQLiteProgram;->bindLong(IJ)V PLio/requery/android/database/sqlite/SQLiteProgram;->bindLong(IJ)V HSPLio/requery/android/database/sqlite/SQLiteProgram;->bindString(ILjava/lang/String;)V PLio/requery/android/database/sqlite/SQLiteProgram;->bindString(ILjava/lang/String;)V HSPLio/requery/android/database/sqlite/SQLiteProgram;->clearBindings()V PLio/requery/android/database/sqlite/SQLiteProgram;->clearBindings()V HSPLio/requery/android/database/sqlite/SQLiteProgram;->getBindArgs()[Ljava/lang/Object; PLio/requery/android/database/sqlite/SQLiteProgram;->getBindArgs()[Ljava/lang/Object; HSPLio/requery/android/database/sqlite/SQLiteProgram;->getColumnNames()[Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteProgram;->getColumnNames()[Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteProgram;->getConnectionFlags()I PLio/requery/android/database/sqlite/SQLiteProgram;->getConnectionFlags()I HSPLio/requery/android/database/sqlite/SQLiteProgram;->getDatabase()Lio/requery/android/database/sqlite/SQLiteDatabase; PLio/requery/android/database/sqlite/SQLiteProgram;->getDatabase()Lio/requery/android/database/sqlite/SQLiteDatabase; HSPLio/requery/android/database/sqlite/SQLiteProgram;->getSession()Lio/requery/android/database/sqlite/SQLiteSession; PLio/requery/android/database/sqlite/SQLiteProgram;->getSession()Lio/requery/android/database/sqlite/SQLiteSession; HSPLio/requery/android/database/sqlite/SQLiteProgram;->getSql()Ljava/lang/String; PLio/requery/android/database/sqlite/SQLiteProgram;->getSql()Ljava/lang/String; HSPLio/requery/android/database/sqlite/SQLiteProgram;->onAllReferencesReleased()V PLio/requery/android/database/sqlite/SQLiteProgram;->onAllReferencesReleased()V Lio/requery/android/database/sqlite/SQLiteQuery; HSPLio/requery/android/database/sqlite/SQLiteQuery;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteQuery;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteQuery;->fillWindow(Lio/requery/android/database/CursorWindow;IIZ)I PLio/requery/android/database/sqlite/SQLiteQuery;->fillWindow(Lio/requery/android/database/CursorWindow;IIZ)I Lio/requery/android/database/sqlite/SQLiteSession; HSPLio/requery/android/database/sqlite/SQLiteSession;->(Lio/requery/android/database/sqlite/SQLiteConnectionPool;)V PLio/requery/android/database/sqlite/SQLiteSession;->(Lio/requery/android/database/sqlite/SQLiteConnectionPool;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->acquireConnection(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteSession;->acquireConnection(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->beginTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteSession;->beginTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->beginTransactionUnchecked(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteSession;->beginTransactionUnchecked(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->endTransaction(Landroidx/core/os/CancellationSignal;)V PLio/requery/android/database/sqlite/SQLiteSession;->endTransaction(Landroidx/core/os/CancellationSignal;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->endTransactionUnchecked(Landroidx/core/os/CancellationSignal;Z)V PLio/requery/android/database/sqlite/SQLiteSession;->endTransactionUnchecked(Landroidx/core/os/CancellationSignal;Z)V HSPLio/requery/android/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroidx/core/os/CancellationSignal;)I PLio/requery/android/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroidx/core/os/CancellationSignal;)I HSPLio/requery/android/database/sqlite/SQLiteSession;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Lio/requery/android/database/CursorWindow;IIZILandroidx/core/os/CancellationSignal;)I PLio/requery/android/database/sqlite/SQLiteSession;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Lio/requery/android/database/CursorWindow;IIZILandroidx/core/os/CancellationSignal;)I HSPLio/requery/android/database/sqlite/SQLiteSession;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;ILandroidx/core/os/CancellationSignal;)J PLio/requery/android/database/sqlite/SQLiteSession;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;ILandroidx/core/os/CancellationSignal;)J HSPLio/requery/android/database/sqlite/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroidx/core/os/CancellationSignal;)Z PLio/requery/android/database/sqlite/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroidx/core/os/CancellationSignal;)Z HSPLio/requery/android/database/sqlite/SQLiteSession;->obtainTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;)Lio/requery/android/database/sqlite/SQLiteSession$Transaction; PLio/requery/android/database/sqlite/SQLiteSession;->obtainTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;)Lio/requery/android/database/sqlite/SQLiteSession$Transaction; HSPLio/requery/android/database/sqlite/SQLiteSession;->prepare(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;Lio/requery/android/database/sqlite/SQLiteStatementInfo;)V PLio/requery/android/database/sqlite/SQLiteSession;->prepare(Ljava/lang/String;ILandroidx/core/os/CancellationSignal;Lio/requery/android/database/sqlite/SQLiteStatementInfo;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->recycleTransaction(Lio/requery/android/database/sqlite/SQLiteSession$Transaction;)V PLio/requery/android/database/sqlite/SQLiteSession;->recycleTransaction(Lio/requery/android/database/sqlite/SQLiteSession$Transaction;)V HSPLio/requery/android/database/sqlite/SQLiteSession;->releaseConnection()V PLio/requery/android/database/sqlite/SQLiteSession;->releaseConnection()V HSPLio/requery/android/database/sqlite/SQLiteSession;->setTransactionSuccessful()V PLio/requery/android/database/sqlite/SQLiteSession;->setTransactionSuccessful()V HSPLio/requery/android/database/sqlite/SQLiteSession;->throwIfNoTransaction()V PLio/requery/android/database/sqlite/SQLiteSession;->throwIfNoTransaction()V HSPLio/requery/android/database/sqlite/SQLiteSession;->throwIfTransactionMarkedSuccessful()V PLio/requery/android/database/sqlite/SQLiteSession;->throwIfTransactionMarkedSuccessful()V Lio/requery/android/database/sqlite/SQLiteSession$Transaction; HSPLio/requery/android/database/sqlite/SQLiteSession$Transaction;->()V PLio/requery/android/database/sqlite/SQLiteSession$Transaction;->()V HSPLio/requery/android/database/sqlite/SQLiteSession$Transaction;->(I)V PLio/requery/android/database/sqlite/SQLiteSession$Transaction;->(I)V Lio/requery/android/database/sqlite/SQLiteStatement; HSPLio/requery/android/database/sqlite/SQLiteStatement;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V PLio/requery/android/database/sqlite/SQLiteStatement;->(Lio/requery/android/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V HSPLio/requery/android/database/sqlite/SQLiteStatement;->executeUpdateDelete()I PLio/requery/android/database/sqlite/SQLiteStatement;->executeUpdateDelete()I HSPLio/requery/android/database/sqlite/SQLiteStatement;->simpleQueryForLong()J PLio/requery/android/database/sqlite/SQLiteStatement;->simpleQueryForLong()J Lio/requery/android/database/sqlite/SQLiteStatementInfo; HSPLio/requery/android/database/sqlite/SQLiteStatementInfo;->()V PLio/requery/android/database/sqlite/SQLiteStatementInfo;->()V Lio/requery/android/database/sqlite/SQLiteStatementType; HSPLio/requery/android/database/sqlite/SQLiteStatementType;->getSqlStatementType(Ljava/lang/String;)I HPLio/requery/android/database/sqlite/SQLiteStatementType;->getSqlStatementType(Ljava/lang/String;)I HSPLio/requery/android/database/sqlite/SQLiteStatementType;->stripLeadingSqlComments(Ljava/lang/String;)Ljava/lang/String; HPLio/requery/android/database/sqlite/SQLiteStatementType;->stripLeadingSqlComments(Ljava/lang/String;)Ljava/lang/String; Lj$/time/Duration; HSPLj$/time/Duration;->()V PLj$/time/Duration;->()V HSPLj$/time/Duration;->(JI)V PLj$/time/Duration;->(JI)V HSPLj$/time/Duration;->l(JI)Lj$/time/Duration; PLj$/time/Duration;->l(JI)Lj$/time/Duration; HSPLj$/time/Duration;->ofSeconds(JJ)Lj$/time/Duration; PLj$/time/Duration;->ofSeconds(JJ)Lj$/time/Duration; HSPLj$/time/Duration;->toMillis()J PLj$/time/Duration;->toMillis()J Lj$/util/DesugarTimeZone; HSPLj$/util/DesugarTimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone; PLj$/util/DesugarTimeZone;->getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone; Lkotlin/ExceptionsKt; Lkotlin/ExceptionsKt__ExceptionsKt; Lkotlin/Function; Lkotlin/InitializedLazyImpl; HSPLkotlin/InitializedLazyImpl;->(Ljava/lang/Object;)V PLkotlin/InitializedLazyImpl;->(Ljava/lang/Object;)V Lkotlin/KotlinNothingValueException; Lkotlin/KotlinVersion; HSPLkotlin/KotlinVersion;->()V PLkotlin/KotlinVersion;->()V HSPLkotlin/KotlinVersion;->(III)V PLkotlin/KotlinVersion;->(III)V HSPLkotlin/KotlinVersion;->compareTo(Lkotlin/KotlinVersion;)I PLkotlin/KotlinVersion;->compareTo(Lkotlin/KotlinVersion;)I Lkotlin/KotlinVersion$Companion; HSPLkotlin/KotlinVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/KotlinVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/KotlinVersionCurrentValue; HSPLkotlin/KotlinVersionCurrentValue;->()V PLkotlin/KotlinVersionCurrentValue;->()V HSPLkotlin/KotlinVersionCurrentValue;->()V PLkotlin/KotlinVersionCurrentValue;->()V HSPLkotlin/KotlinVersionCurrentValue;->get()Lkotlin/KotlinVersion; PLkotlin/KotlinVersionCurrentValue;->get()Lkotlin/KotlinVersion; Lkotlin/Lazy; Lkotlin/LazyKt; Lkotlin/LazyKt__LazyJVMKt; HSPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; HPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; HSPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; HPLkotlin/LazyKt__LazyJVMKt;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; Lkotlin/LazyKt__LazyJVMKt$WhenMappings; HSPLkotlin/LazyKt__LazyJVMKt$WhenMappings;->()V PLkotlin/LazyKt__LazyJVMKt$WhenMappings;->()V Lkotlin/LazyKt__LazyKt; Lkotlin/LazyThreadSafetyMode; HSPLkotlin/LazyThreadSafetyMode;->()V PLkotlin/LazyThreadSafetyMode;->()V HSPLkotlin/LazyThreadSafetyMode;->(Ljava/lang/String;I)V PLkotlin/LazyThreadSafetyMode;->(Ljava/lang/String;I)V HSPLkotlin/LazyThreadSafetyMode;->values()[Lkotlin/LazyThreadSafetyMode; PLkotlin/LazyThreadSafetyMode;->values()[Lkotlin/LazyThreadSafetyMode; Lkotlin/NoWhenBranchMatchedException; Lkotlin/Pair; HSPLkotlin/Pair;->(Ljava/lang/Object;Ljava/lang/Object;)V HPLkotlin/Pair;->(Ljava/lang/Object;Ljava/lang/Object;)V HSPLkotlin/Pair;->component1()Ljava/lang/Object; PLkotlin/Pair;->component1()Ljava/lang/Object; HSPLkotlin/Pair;->component2()Ljava/lang/Object; PLkotlin/Pair;->component2()Ljava/lang/Object; HSPLkotlin/Pair;->getFirst()Ljava/lang/Object; PLkotlin/Pair;->getFirst()Ljava/lang/Object; HSPLkotlin/Pair;->getSecond()Ljava/lang/Object; PLkotlin/Pair;->getSecond()Ljava/lang/Object; Lkotlin/Result; HSPLkotlin/Result;->()V PLkotlin/Result;->()V HSPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; HPLkotlin/Result;->exceptionOrNull-impl(Ljava/lang/Object;)Ljava/lang/Throwable; Lkotlin/Result$Companion; HSPLkotlin/Result$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/Result$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/Result$Failure; HSPLkotlin/Result$Failure;->(Ljava/lang/Throwable;)V PLkotlin/Result$Failure;->(Ljava/lang/Throwable;)V Lkotlin/ResultKt; HSPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Ljava/lang/Object; HPLkotlin/ResultKt;->createFailure(Ljava/lang/Throwable;)Ljava/lang/Object; HSPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V HPLkotlin/ResultKt;->throwOnFailure(Ljava/lang/Object;)V Lkotlin/SafePublicationLazyImpl; HSPLkotlin/SafePublicationLazyImpl;->()V PLkotlin/SafePublicationLazyImpl;->()V HSPLkotlin/SafePublicationLazyImpl;->(Lkotlin/jvm/functions/Function0;)V HPLkotlin/SafePublicationLazyImpl;->(Lkotlin/jvm/functions/Function0;)V HSPLkotlin/SafePublicationLazyImpl;->getValue()Ljava/lang/Object; HPLkotlin/SafePublicationLazyImpl;->getValue()Ljava/lang/Object; Lkotlin/SafePublicationLazyImpl$Companion; HSPLkotlin/SafePublicationLazyImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/SafePublicationLazyImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/SynchronizedLazyImpl; HSPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)V HPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)V HSPLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/SynchronizedLazyImpl;->(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; HPLkotlin/SynchronizedLazyImpl;->getValue()Ljava/lang/Object; HSPLkotlin/SynchronizedLazyImpl;->isInitialized()Z PLkotlin/SynchronizedLazyImpl;->isInitialized()Z Lkotlin/UByte; HSPLkotlin/UByte;->()V PLkotlin/UByte;->()V Lkotlin/UByte$Companion; HSPLkotlin/UByte$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/UByte$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/UByteArray; Lkotlin/UInt; HSPLkotlin/UInt;->()V PLkotlin/UInt;->()V Lkotlin/UInt$Companion; HSPLkotlin/UInt$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/UInt$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/UIntArray; Lkotlin/ULong; HSPLkotlin/ULong;->()V PLkotlin/ULong;->()V HSPLkotlin/ULong;->equals-impl0(JJ)Z HPLkotlin/ULong;->equals-impl0(JJ)Z Lkotlin/ULong$Companion; HSPLkotlin/ULong$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/ULong$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/ULongArray; Lkotlin/UNINITIALIZED_VALUE; HSPLkotlin/UNINITIALIZED_VALUE;->()V PLkotlin/UNINITIALIZED_VALUE;->()V HSPLkotlin/UNINITIALIZED_VALUE;->()V PLkotlin/UNINITIALIZED_VALUE;->()V Lkotlin/UShort; HSPLkotlin/UShort;->()V PLkotlin/UShort;->()V Lkotlin/UShort$Companion; HSPLkotlin/UShort$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/UShort$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/UShortArray; Lkotlin/UninitializedPropertyAccessException; Lkotlin/Unit; HSPLkotlin/Unit;->()V PLkotlin/Unit;->()V HSPLkotlin/Unit;->()V PLkotlin/Unit;->()V Lkotlin/UnsafeLazyImpl; HSPLkotlin/UnsafeLazyImpl;->(Lkotlin/jvm/functions/Function0;)V PLkotlin/UnsafeLazyImpl;->(Lkotlin/jvm/functions/Function0;)V Lkotlin/UnsignedKt; HSPLkotlin/UnsignedKt;->ulongToDouble(J)D PLkotlin/UnsignedKt;->ulongToDouble(J)D Lkotlin/collections/AbstractCollection; HSPLkotlin/collections/AbstractCollection;->()V HPLkotlin/collections/AbstractCollection;->()V HSPLkotlin/collections/AbstractCollection;->isEmpty()Z PLkotlin/collections/AbstractCollection;->isEmpty()Z HSPLkotlin/collections/AbstractCollection;->size()I HPLkotlin/collections/AbstractCollection;->size()I Lkotlin/collections/AbstractList; HSPLkotlin/collections/AbstractList;->()V PLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->()V PLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->equals(Ljava/lang/Object;)Z HPLkotlin/collections/AbstractList;->equals(Ljava/lang/Object;)Z Lkotlin/collections/AbstractList$Companion; HSPLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/collections/AbstractList$Companion;->checkBoundsIndexes$kotlin_stdlib(III)V HPLkotlin/collections/AbstractList$Companion;->checkBoundsIndexes$kotlin_stdlib(III)V HSPLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V PLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V HSPLkotlin/collections/AbstractList$Companion;->orderedEquals$kotlin_stdlib(Ljava/util/Collection;Ljava/util/Collection;)Z HPLkotlin/collections/AbstractList$Companion;->orderedEquals$kotlin_stdlib(Ljava/util/Collection;Ljava/util/Collection;)Z Lkotlin/collections/AbstractMap; HSPLkotlin/collections/AbstractMap;->()V PLkotlin/collections/AbstractMap;->()V HSPLkotlin/collections/AbstractMap;->()V HPLkotlin/collections/AbstractMap;->()V HSPLkotlin/collections/AbstractMap;->containsEntry$kotlin_stdlib(Ljava/util/Map$Entry;)Z HPLkotlin/collections/AbstractMap;->containsEntry$kotlin_stdlib(Ljava/util/Map$Entry;)Z HSPLkotlin/collections/AbstractMap;->entrySet()Ljava/util/Set; PLkotlin/collections/AbstractMap;->entrySet()Ljava/util/Set; HSPLkotlin/collections/AbstractMap;->equals(Ljava/lang/Object;)Z HPLkotlin/collections/AbstractMap;->equals(Ljava/lang/Object;)Z HSPLkotlin/collections/AbstractMap;->size()I HPLkotlin/collections/AbstractMap;->size()I Lkotlin/collections/AbstractMap$Companion; HSPLkotlin/collections/AbstractMap$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/AbstractMap$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/collections/AbstractMutableList; HSPLkotlin/collections/AbstractMutableList;->()V HPLkotlin/collections/AbstractMutableList;->()V HSPLkotlin/collections/AbstractMutableList;->size()I HPLkotlin/collections/AbstractMutableList;->size()I Lkotlin/collections/AbstractMutableMap; HSPLkotlin/collections/AbstractMutableMap;->()V HPLkotlin/collections/AbstractMutableMap;->()V HSPLkotlin/collections/AbstractMutableMap;->size()I PLkotlin/collections/AbstractMutableMap;->size()I Lkotlin/collections/AbstractMutableSet; HSPLkotlin/collections/AbstractMutableSet;->()V PLkotlin/collections/AbstractMutableSet;->()V Lkotlin/collections/AbstractSet; HSPLkotlin/collections/AbstractSet;->()V PLkotlin/collections/AbstractSet;->()V HSPLkotlin/collections/AbstractSet;->()V PLkotlin/collections/AbstractSet;->()V HSPLkotlin/collections/AbstractSet;->equals(Ljava/lang/Object;)Z PLkotlin/collections/AbstractSet;->equals(Ljava/lang/Object;)Z Lkotlin/collections/AbstractSet$Companion; HSPLkotlin/collections/AbstractSet$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/AbstractSet$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/collections/AbstractSet$Companion;->setEquals$kotlin_stdlib(Ljava/util/Set;Ljava/util/Set;)Z PLkotlin/collections/AbstractSet$Companion;->setEquals$kotlin_stdlib(Ljava/util/Set;Ljava/util/Set;)Z Lkotlin/collections/ArrayAsCollection; HSPLkotlin/collections/ArrayAsCollection;->([Ljava/lang/Object;Z)V PLkotlin/collections/ArrayAsCollection;->([Ljava/lang/Object;Z)V HSPLkotlin/collections/ArrayAsCollection;->toArray()[Ljava/lang/Object; HPLkotlin/collections/ArrayAsCollection;->toArray()[Ljava/lang/Object; Lkotlin/collections/ArrayDeque; HSPLkotlin/collections/ArrayDeque;->()V PLkotlin/collections/ArrayDeque;->()V HSPLkotlin/collections/ArrayDeque;->()V HPLkotlin/collections/ArrayDeque;->()V HSPLkotlin/collections/ArrayDeque;->addFirst(Ljava/lang/Object;)V PLkotlin/collections/ArrayDeque;->addFirst(Ljava/lang/Object;)V HSPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V HPLkotlin/collections/ArrayDeque;->addLast(Ljava/lang/Object;)V HSPLkotlin/collections/ArrayDeque;->ensureCapacity(I)V HPLkotlin/collections/ArrayDeque;->ensureCapacity(I)V HSPLkotlin/collections/ArrayDeque;->first()Ljava/lang/Object; HPLkotlin/collections/ArrayDeque;->first()Ljava/lang/Object; HSPLkotlin/collections/ArrayDeque;->get(I)Ljava/lang/Object; HPLkotlin/collections/ArrayDeque;->get(I)Ljava/lang/Object; HSPLkotlin/collections/ArrayDeque;->getSize()I HPLkotlin/collections/ArrayDeque;->getSize()I HSPLkotlin/collections/ArrayDeque;->incremented(I)I HPLkotlin/collections/ArrayDeque;->incremented(I)I HSPLkotlin/collections/ArrayDeque;->indexOf(Ljava/lang/Object;)I HPLkotlin/collections/ArrayDeque;->indexOf(Ljava/lang/Object;)I HSPLkotlin/collections/ArrayDeque;->isEmpty()Z HPLkotlin/collections/ArrayDeque;->isEmpty()Z HSPLkotlin/collections/ArrayDeque;->positiveMod(I)I HPLkotlin/collections/ArrayDeque;->positiveMod(I)I HSPLkotlin/collections/ArrayDeque;->remove(Ljava/lang/Object;)Z PLkotlin/collections/ArrayDeque;->remove(Ljava/lang/Object;)Z HSPLkotlin/collections/ArrayDeque;->removeAt(I)Ljava/lang/Object; HPLkotlin/collections/ArrayDeque;->removeAt(I)Ljava/lang/Object; HSPLkotlin/collections/ArrayDeque;->removeFirst()Ljava/lang/Object; HPLkotlin/collections/ArrayDeque;->removeFirst()Ljava/lang/Object; HSPLkotlin/collections/ArrayDeque;->removeFirstOrNull()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->removeFirstOrNull()Ljava/lang/Object; HSPLkotlin/collections/ArrayDeque;->removeLast()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->removeLast()Ljava/lang/Object; HSPLkotlin/collections/ArrayDeque;->removeLastOrNull()Ljava/lang/Object; PLkotlin/collections/ArrayDeque;->removeLastOrNull()Ljava/lang/Object; Lkotlin/collections/ArrayDeque$Companion; HSPLkotlin/collections/ArrayDeque$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/ArrayDeque$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/collections/ArrayDeque$Companion;->newCapacity$kotlin_stdlib(II)I PLkotlin/collections/ArrayDeque$Companion;->newCapacity$kotlin_stdlib(II)I Lkotlin/collections/ArraysKt; HSPLkotlin/collections/ArraysKt;->copyInto$default([B[BIII)V PLkotlin/collections/ArraysKt;->copyInto$default([B[BIII)V HSPLkotlin/collections/ArraysKt;->copyInto$default([F[F)V PLkotlin/collections/ArraysKt;->copyInto$default([F[F)V HSPLkotlin/collections/ArraysKt;->copyInto$default([I[III)V PLkotlin/collections/ArraysKt;->copyInto$default([I[III)V HSPLkotlin/collections/ArraysKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;II)[Ljava/lang/Object; PLkotlin/collections/ArraysKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;II)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt;->copyInto([C[CIII)V PLkotlin/collections/ArraysKt;->copyInto([C[CIII)V HSPLkotlin/collections/ArraysKt;->copyInto([I[IIII)V HPLkotlin/collections/ArraysKt;->copyInto([I[IIII)V HSPLkotlin/collections/ArraysKt;->fill$default([II)V PLkotlin/collections/ArraysKt;->fill$default([II)V HSPLkotlin/collections/ArraysKt;->fill$default([Ljava/lang/Object;Lkotlinx/coroutines/internal/Symbol;)V HPLkotlin/collections/ArraysKt;->fill$default([Ljava/lang/Object;Lkotlinx/coroutines/internal/Symbol;)V HSPLkotlin/collections/ArraysKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;I)V PLkotlin/collections/ArraysKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;I)V Lkotlin/collections/ArraysKt__ArraysJVMKt; HSPLkotlin/collections/ArraysKt__ArraysJVMKt;->copyOfRangeToIndexCheck(II)V PLkotlin/collections/ArraysKt__ArraysJVMKt;->copyOfRangeToIndexCheck(II)V Lkotlin/collections/ArraysKt__ArraysKt; Lkotlin/collections/ArraysKt___ArraysJvmKt; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->asList([Ljava/lang/Object;)Ljava/util/List; HPLkotlin/collections/ArraysKt___ArraysJvmKt;->asList([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([B[BIIIILjava/lang/Object;)[B PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([B[BIIIILjava/lang/Object;)[B HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([F[FIIIILjava/lang/Object;)[F PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([F[FIIIILjava/lang/Object;)[F HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([I[IIIIILjava/lang/Object;)[I PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([I[IIIIILjava/lang/Object;)[I HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object; HPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([B[BIII)[B HPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([B[BIII)[B HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([C[CIII)[C PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([C[CIII)[C HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([F[FIII)[F PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([F[FIII)[F HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([I[IIII)[I HPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([I[IIII)[I HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object; HPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([Ljava/lang/Object;[Ljava/lang/Object;III)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyOfRange([BII)[B PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyOfRange([BII)[B HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object; PLkotlin/collections/ArraysKt___ArraysJvmKt;->copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([IIIIILjava/lang/Object;)V PLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([IIIIILjava/lang/Object;)V HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([Ljava/lang/Object;Ljava/lang/Object;IIILjava/lang/Object;)V HPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill$default([Ljava/lang/Object;Ljava/lang/Object;IIILjava/lang/Object;)V HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([IIII)V PLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([IIII)V HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([Ljava/lang/Object;Ljava/lang/Object;II)V HPLkotlin/collections/ArraysKt___ArraysJvmKt;->fill([Ljava/lang/Object;Ljava/lang/Object;II)V HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->plus([II)[I PLkotlin/collections/ArraysKt___ArraysJvmKt;->plus([II)[I HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;II)V HPLkotlin/collections/ArraysKt___ArraysJvmKt;->sortWith([Ljava/lang/Object;Ljava/util/Comparator;II)V Lkotlin/collections/ArraysKt___ArraysKt; HSPLkotlin/collections/ArraysKt___ArraysKt;->asIterable([Ljava/lang/Object;)Ljava/lang/Iterable; PLkotlin/collections/ArraysKt___ArraysKt;->asIterable([Ljava/lang/Object;)Ljava/lang/Iterable; HSPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNull([Ljava/lang/Object;)Ljava/util/List; PLkotlin/collections/ArraysKt___ArraysKt;->filterNotNull([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysKt;->filterNotNullTo([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; PLkotlin/collections/ArraysKt___ArraysKt;->filterNotNullTo([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; HSPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([I)I PLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([I)I HSPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([Ljava/lang/Object;)I HPLkotlin/collections/ArraysKt___ArraysKt;->getLastIndex([Ljava/lang/Object;)I HSPLkotlin/collections/ArraysKt___ArraysKt;->getOrNull([II)Ljava/lang/Integer; PLkotlin/collections/ArraysKt___ArraysKt;->getOrNull([II)Ljava/lang/Integer; HSPLkotlin/collections/ArraysKt___ArraysKt;->getOrNull([Ljava/lang/Object;I)Ljava/lang/Object; PLkotlin/collections/ArraysKt___ArraysKt;->getOrNull([Ljava/lang/Object;I)Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysKt;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I HPLkotlin/collections/ArraysKt___ArraysKt;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I HSPLkotlin/collections/ArraysKt___ArraysKt;->map([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/util/List; PLkotlin/collections/ArraysKt___ArraysKt;->map([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysKt;->toCollection([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; PLkotlin/collections/ArraysKt___ArraysKt;->toCollection([Ljava/lang/Object;Ljava/util/Collection;)Ljava/util/Collection; HSPLkotlin/collections/ArraysKt___ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; PLkotlin/collections/ArraysKt___ArraysKt;->toList([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysKt;->toMutableList([Ljava/lang/Object;)Ljava/util/List; PLkotlin/collections/ArraysKt___ArraysKt;->toMutableList([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; PLkotlin/collections/ArraysKt___ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/ArraysKt___ArraysKt;->withIndex([Ljava/lang/Object;)Ljava/lang/Iterable; PLkotlin/collections/ArraysKt___ArraysKt;->withIndex([Ljava/lang/Object;)Ljava/lang/Iterable; Lkotlin/collections/ArraysKt___ArraysKt$asIterable$$inlined$Iterable$1; HSPLkotlin/collections/ArraysKt___ArraysKt$asIterable$$inlined$Iterable$1;->([Ljava/lang/Object;)V PLkotlin/collections/ArraysKt___ArraysKt$asIterable$$inlined$Iterable$1;->([Ljava/lang/Object;)V HSPLkotlin/collections/ArraysKt___ArraysKt$asIterable$$inlined$Iterable$1;->iterator()Ljava/util/Iterator; PLkotlin/collections/ArraysKt___ArraysKt$asIterable$$inlined$Iterable$1;->iterator()Ljava/util/Iterator; Lkotlin/collections/ArraysKt___ArraysKt$withIndex$1; HSPLkotlin/collections/ArraysKt___ArraysKt$withIndex$1;->([Ljava/lang/Object;)V PLkotlin/collections/ArraysKt___ArraysKt$withIndex$1;->([Ljava/lang/Object;)V HSPLkotlin/collections/ArraysKt___ArraysKt$withIndex$1;->invoke()Ljava/lang/Object; PLkotlin/collections/ArraysKt___ArraysKt$withIndex$1;->invoke()Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysKt$withIndex$1;->invoke()Ljava/util/Iterator; PLkotlin/collections/ArraysKt___ArraysKt$withIndex$1;->invoke()Ljava/util/Iterator; Lkotlin/collections/CollectionsKt; HSPLkotlin/collections/CollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)V PLkotlin/collections/CollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)V HSPLkotlin/collections/CollectionsKt;->addAll(Ljava/util/List;[Ljava/lang/Object;)V PLkotlin/collections/CollectionsKt;->addAll(Ljava/util/List;[Ljava/lang/Object;)V HSPLkotlin/collections/CollectionsKt;->binarySearch$default(Ljava/util/List;Ljava/lang/Comparable;)I PLkotlin/collections/CollectionsKt;->binarySearch$default(Ljava/util/List;Ljava/lang/Comparable;)I HSPLkotlin/collections/CollectionsKt;->collectionSizeOrDefault(Ljava/lang/Iterable;)I HPLkotlin/collections/CollectionsKt;->collectionSizeOrDefault(Ljava/lang/Iterable;)I HSPLkotlin/collections/CollectionsKt;->filterNotNull(Ljava/util/List;)Ljava/util/List; PLkotlin/collections/CollectionsKt;->filterNotNull(Ljava/util/List;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt;->toBooleanArray(Ljava/util/List;)[Z PLkotlin/collections/CollectionsKt;->toBooleanArray(Ljava/util/List;)[Z HSPLkotlin/collections/CollectionsKt;->toHashSet(Ljava/util/List;)Ljava/util/HashSet; PLkotlin/collections/CollectionsKt;->toHashSet(Ljava/util/List;)Ljava/util/HashSet; HSPLkotlin/collections/CollectionsKt;->toIntArray(Ljava/util/List;)[I PLkotlin/collections/CollectionsKt;->toIntArray(Ljava/util/List;)[I Lkotlin/collections/CollectionsKt__CollectionsJVMKt; HSPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->build(Ljava/util/List;)Ljava/util/List; PLkotlin/collections/CollectionsKt__CollectionsJVMKt;->build(Ljava/util/List;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->copyToArrayOfAny([Ljava/lang/Object;Z)[Ljava/lang/Object; HPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->copyToArrayOfAny([Ljava/lang/Object;Z)[Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->listOf(Ljava/lang/Object;)Ljava/util/List; HPLkotlin/collections/CollectionsKt__CollectionsJVMKt;->listOf(Ljava/lang/Object;)Ljava/util/List; Lkotlin/collections/CollectionsKt__CollectionsKt; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->arrayListOf([Ljava/lang/Object;)Ljava/util/ArrayList; PLkotlin/collections/CollectionsKt__CollectionsKt;->arrayListOf([Ljava/lang/Object;)Ljava/util/ArrayList; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->asCollection([Ljava/lang/Object;)Ljava/util/Collection; PLkotlin/collections/CollectionsKt__CollectionsKt;->asCollection([Ljava/lang/Object;)Ljava/util/Collection; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->binarySearch$default(Ljava/util/List;Ljava/lang/Comparable;IIILjava/lang/Object;)I PLkotlin/collections/CollectionsKt__CollectionsKt;->binarySearch$default(Ljava/util/List;Ljava/lang/Comparable;IIILjava/lang/Object;)I HSPLkotlin/collections/CollectionsKt__CollectionsKt;->binarySearch(Ljava/util/List;Ljava/lang/Comparable;II)I PLkotlin/collections/CollectionsKt__CollectionsKt;->binarySearch(Ljava/util/List;Ljava/lang/Comparable;II)I HSPLkotlin/collections/CollectionsKt__CollectionsKt;->getLastIndex(Ljava/util/List;)I HPLkotlin/collections/CollectionsKt__CollectionsKt;->getLastIndex(Ljava/util/List;)I HSPLkotlin/collections/CollectionsKt__CollectionsKt;->listOf([Ljava/lang/Object;)Ljava/util/List; HPLkotlin/collections/CollectionsKt__CollectionsKt;->listOf([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull([Ljava/lang/Object;)Ljava/util/List; PLkotlin/collections/CollectionsKt__CollectionsKt;->listOfNotNull([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->mutableListOf([Ljava/lang/Object;)Ljava/util/List; PLkotlin/collections/CollectionsKt__CollectionsKt;->mutableListOf([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List; PLkotlin/collections/CollectionsKt__CollectionsKt;->optimizeReadOnlyList(Ljava/util/List;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt__CollectionsKt;->rangeCheck$CollectionsKt__CollectionsKt(III)V PLkotlin/collections/CollectionsKt__CollectionsKt;->rangeCheck$CollectionsKt__CollectionsKt(III)V Lkotlin/collections/CollectionsKt__IterablesKt; HSPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I HPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrDefault(Ljava/lang/Iterable;I)I HSPLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrNull(Ljava/lang/Iterable;)Ljava/lang/Integer; PLkotlin/collections/CollectionsKt__IterablesKt;->collectionSizeOrNull(Ljava/lang/Iterable;)Ljava/lang/Integer; HSPLkotlin/collections/CollectionsKt__IterablesKt;->flatten(Ljava/lang/Iterable;)Ljava/util/List; PLkotlin/collections/CollectionsKt__IterablesKt;->flatten(Ljava/lang/Iterable;)Ljava/util/List; Lkotlin/collections/CollectionsKt__IteratorsJVMKt; Lkotlin/collections/CollectionsKt__IteratorsKt; Lkotlin/collections/CollectionsKt__MutableCollectionsJVMKt; HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sort(Ljava/util/List;)V PLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sort(Ljava/util/List;)V HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sortWith(Ljava/util/List;Ljava/util/Comparator;)V HPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sortWith(Ljava/util/List;Ljava/util/Comparator;)V Lkotlin/collections/CollectionsKt__MutableCollectionsKt; HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeFirst(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeFirst(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeFirstOrNull(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->removeFirstOrNull(Ljava/util/List;)Ljava/lang/Object; Lkotlin/collections/CollectionsKt__ReversedViewsKt; Lkotlin/collections/CollectionsKt___CollectionsJvmKt; Lkotlin/collections/CollectionsKt___CollectionsKt; PLkotlin/collections/CollectionsKt___CollectionsKt;->asSequence(Ljava/lang/Iterable;)Lkotlin/sequences/Sequence; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->filterNotNull(Ljava/lang/Iterable;)Ljava/util/List; PLkotlin/collections/CollectionsKt___CollectionsKt;->filterNotNull(Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->filterNotNullTo(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; PLkotlin/collections/CollectionsKt___CollectionsKt;->filterNotNullTo(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->first(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->first(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/lang/Iterable;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/lang/Iterable;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->getOrNull(Ljava/util/List;I)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->getOrNull(Ljava/util/List;I)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->lastOrNull(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->lastOrNull(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->minus(Ljava/lang/Iterable;Ljava/lang/Object;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->minus(Ljava/lang/Iterable;Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->singleOrNull(Ljava/util/List;)Ljava/lang/Object; HPLkotlin/collections/CollectionsKt___CollectionsKt;->singleOrNull(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List; PLkotlin/collections/CollectionsKt___CollectionsKt;->sortedWith(Ljava/lang/Iterable;Ljava/util/Comparator;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toBooleanArray(Ljava/util/Collection;)[Z PLkotlin/collections/CollectionsKt___CollectionsKt;->toBooleanArray(Ljava/util/Collection;)[Z HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toCollection(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; PLkotlin/collections/CollectionsKt___CollectionsKt;->toCollection(Ljava/lang/Iterable;Ljava/util/Collection;)Ljava/util/Collection; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toHashSet(Ljava/lang/Iterable;)Ljava/util/HashSet; PLkotlin/collections/CollectionsKt___CollectionsKt;->toHashSet(Ljava/lang/Iterable;)Ljava/util/HashSet; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toIntArray(Ljava/util/Collection;)[I HPLkotlin/collections/CollectionsKt___CollectionsKt;->toIntArray(Ljava/util/Collection;)[I HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toList(Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List; PLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/List; HPLkotlin/collections/CollectionsKt___CollectionsKt;->toMutableList(Ljava/util/Collection;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->toSet(Ljava/lang/Iterable;)Ljava/util/Set; PLkotlin/collections/CollectionsKt___CollectionsKt;->toSet(Ljava/lang/Iterable;)Ljava/util/Set; PLkotlin/collections/CollectionsKt___CollectionsKt$asSequence$$inlined$Sequence$1;->(Ljava/lang/Iterable;)V PLkotlin/collections/CollectionsKt___CollectionsKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; Lkotlin/collections/EmptyIterator; HSPLkotlin/collections/EmptyIterator;->()V PLkotlin/collections/EmptyIterator;->()V HSPLkotlin/collections/EmptyIterator;->()V PLkotlin/collections/EmptyIterator;->()V HSPLkotlin/collections/EmptyIterator;->hasNext()Z PLkotlin/collections/EmptyIterator;->hasNext()Z Lkotlin/collections/EmptyList; HSPLkotlin/collections/EmptyList;->()V PLkotlin/collections/EmptyList;->()V HSPLkotlin/collections/EmptyList;->()V PLkotlin/collections/EmptyList;->()V HSPLkotlin/collections/EmptyList;->contains(Ljava/lang/Object;)Z PLkotlin/collections/EmptyList;->contains(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z HPLkotlin/collections/EmptyList;->equals(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptyList;->hashCode()I HPLkotlin/collections/EmptyList;->hashCode()I HSPLkotlin/collections/EmptyList;->isEmpty()Z HPLkotlin/collections/EmptyList;->isEmpty()Z HSPLkotlin/collections/EmptyList;->iterator()Ljava/util/Iterator; PLkotlin/collections/EmptyList;->iterator()Ljava/util/Iterator; HSPLkotlin/collections/EmptyList;->size()I HPLkotlin/collections/EmptyList;->size()I HSPLkotlin/collections/EmptyList;->toArray()[Ljava/lang/Object; PLkotlin/collections/EmptyList;->toArray()[Ljava/lang/Object; Lkotlin/collections/EmptyMap; HSPLkotlin/collections/EmptyMap;->()V PLkotlin/collections/EmptyMap;->()V HSPLkotlin/collections/EmptyMap;->()V PLkotlin/collections/EmptyMap;->()V HSPLkotlin/collections/EmptyMap;->containsKey(Ljava/lang/Object;)Z PLkotlin/collections/EmptyMap;->containsKey(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set; PLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set; HSPLkotlin/collections/EmptyMap;->equals(Ljava/lang/Object;)Z PLkotlin/collections/EmptyMap;->equals(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlin/collections/EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/collections/EmptyMap;->isEmpty()Z PLkotlin/collections/EmptyMap;->isEmpty()Z HSPLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set; PLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set; HSPLkotlin/collections/EmptyMap;->size()I HPLkotlin/collections/EmptyMap;->size()I HSPLkotlin/collections/EmptyMap;->values()Ljava/util/Collection; PLkotlin/collections/EmptyMap;->values()Ljava/util/Collection; Lkotlin/collections/EmptySet; HSPLkotlin/collections/EmptySet;->()V PLkotlin/collections/EmptySet;->()V HSPLkotlin/collections/EmptySet;->()V PLkotlin/collections/EmptySet;->()V HSPLkotlin/collections/EmptySet;->contains(Ljava/lang/Object;)Z PLkotlin/collections/EmptySet;->contains(Ljava/lang/Object;)Z HSPLkotlin/collections/EmptySet;->hashCode()I PLkotlin/collections/EmptySet;->hashCode()I HSPLkotlin/collections/EmptySet;->isEmpty()Z PLkotlin/collections/EmptySet;->isEmpty()Z HSPLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator; PLkotlin/collections/EmptySet;->iterator()Ljava/util/Iterator; HSPLkotlin/collections/EmptySet;->size()I PLkotlin/collections/EmptySet;->size()I Lkotlin/collections/IndexedValue; HSPLkotlin/collections/IndexedValue;->(ILjava/lang/Object;)V PLkotlin/collections/IndexedValue;->(ILjava/lang/Object;)V HSPLkotlin/collections/IndexedValue;->getIndex()I PLkotlin/collections/IndexedValue;->getIndex()I HSPLkotlin/collections/IndexedValue;->getValue()Ljava/lang/Object; PLkotlin/collections/IndexedValue;->getValue()Ljava/lang/Object; Lkotlin/collections/IndexingIterable; HSPLkotlin/collections/IndexingIterable;->(Lkotlin/jvm/functions/Function0;)V PLkotlin/collections/IndexingIterable;->(Lkotlin/jvm/functions/Function0;)V HSPLkotlin/collections/IndexingIterable;->iterator()Ljava/util/Iterator; PLkotlin/collections/IndexingIterable;->iterator()Ljava/util/Iterator; Lkotlin/collections/IndexingIterator; HSPLkotlin/collections/IndexingIterator;->(Ljava/util/Iterator;)V PLkotlin/collections/IndexingIterator;->(Ljava/util/Iterator;)V HSPLkotlin/collections/IndexingIterator;->hasNext()Z PLkotlin/collections/IndexingIterator;->hasNext()Z HSPLkotlin/collections/IndexingIterator;->next()Ljava/lang/Object; PLkotlin/collections/IndexingIterator;->next()Ljava/lang/Object; HSPLkotlin/collections/IndexingIterator;->next()Lkotlin/collections/IndexedValue; PLkotlin/collections/IndexingIterator;->next()Lkotlin/collections/IndexedValue; Lkotlin/collections/IntIterator; HSPLkotlin/collections/IntIterator;->()V HPLkotlin/collections/IntIterator;->()V Lkotlin/collections/MapWithDefault; Lkotlin/collections/MapsKt; Lkotlin/collections/MapsKt__MapWithDefaultKt; HSPLkotlin/collections/MapsKt__MapWithDefaultKt;->getOrImplicitDefaultNullable(Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlin/collections/MapsKt__MapWithDefaultKt;->getOrImplicitDefaultNullable(Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/collections/MapsKt__MapsJVMKt; HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I PLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; PLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; Lkotlin/collections/MapsKt__MapsKt; HSPLkotlin/collections/MapsKt__MapsKt;->emptyMap()Ljava/util/Map; HPLkotlin/collections/MapsKt__MapsKt;->emptyMap()Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->getValue(Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/collections/MapsKt__MapsKt;->getValue(Ljava/util/Map;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/collections/MapsKt__MapsKt;->hashMapOf([Lkotlin/Pair;)Ljava/util/HashMap; PLkotlin/collections/MapsKt__MapsKt;->hashMapOf([Lkotlin/Pair;)Ljava/util/HashMap; HSPLkotlin/collections/MapsKt__MapsKt;->mapOf([Lkotlin/Pair;)Ljava/util/Map; PLkotlin/collections/MapsKt__MapsKt;->mapOf([Lkotlin/Pair;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;Ljava/lang/Iterable;)V PLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;Ljava/lang/Iterable;)V HSPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V HPLkotlin/collections/MapsKt__MapsKt;->putAll(Ljava/util/Map;[Lkotlin/Pair;)V HSPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map; PLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;Ljava/util/Map;)Ljava/util/Map; PLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; PLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->toMap([Lkotlin/Pair;Ljava/util/Map;)Ljava/util/Map; PLkotlin/collections/MapsKt__MapsKt;->toMap([Lkotlin/Pair;Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map; HPLkotlin/collections/MapsKt__MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map; Lkotlin/collections/MapsKt___MapsJvmKt; Lkotlin/collections/MapsKt___MapsKt; PLkotlin/collections/MapsKt___MapsKt;->asSequence(Ljava/util/Map;)Lkotlin/sequences/Sequence; Lkotlin/collections/SetsKt; HSPLkotlin/collections/SetsKt;->build(Lkotlin/collections/builders/SetBuilder;)Ljava/util/Set; PLkotlin/collections/SetsKt;->build(Lkotlin/collections/builders/SetBuilder;)Ljava/util/Set; Lkotlin/collections/SetsKt__SetsJVMKt; HSPLkotlin/collections/SetsKt__SetsJVMKt;->build(Ljava/util/Set;)Ljava/util/Set; PLkotlin/collections/SetsKt__SetsJVMKt;->build(Ljava/util/Set;)Ljava/util/Set; HSPLkotlin/collections/SetsKt__SetsJVMKt;->setOf(Ljava/lang/Object;)Ljava/util/Set; PLkotlin/collections/SetsKt__SetsJVMKt;->setOf(Ljava/lang/Object;)Ljava/util/Set; Lkotlin/collections/SetsKt__SetsKt; HSPLkotlin/collections/SetsKt__SetsKt;->mutableSetOf([Ljava/lang/Object;)Ljava/util/Set; PLkotlin/collections/SetsKt__SetsKt;->mutableSetOf([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/SetsKt__SetsKt;->setOf([Ljava/lang/Object;)Ljava/util/Set; PLkotlin/collections/SetsKt__SetsKt;->setOf([Ljava/lang/Object;)Ljava/util/Set; Lkotlin/collections/SetsKt___SetsKt; HSPLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; PLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; PLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; Lkotlin/collections/builders/ListBuilder; HSPLkotlin/collections/builders/ListBuilder;->()V PLkotlin/collections/builders/ListBuilder;->()V HSPLkotlin/collections/builders/ListBuilder;->()V PLkotlin/collections/builders/ListBuilder;->()V HSPLkotlin/collections/builders/ListBuilder;->(I)V PLkotlin/collections/builders/ListBuilder;->(I)V HSPLkotlin/collections/builders/ListBuilder;->([Ljava/lang/Object;IIZLkotlin/collections/builders/ListBuilder;Lkotlin/collections/builders/ListBuilder;)V PLkotlin/collections/builders/ListBuilder;->([Ljava/lang/Object;IIZLkotlin/collections/builders/ListBuilder;Lkotlin/collections/builders/ListBuilder;)V HSPLkotlin/collections/builders/ListBuilder;->access$getArray$p(Lkotlin/collections/builders/ListBuilder;)[Ljava/lang/Object; PLkotlin/collections/builders/ListBuilder;->access$getArray$p(Lkotlin/collections/builders/ListBuilder;)[Ljava/lang/Object; HSPLkotlin/collections/builders/ListBuilder;->access$getLength$p(Lkotlin/collections/builders/ListBuilder;)I PLkotlin/collections/builders/ListBuilder;->access$getLength$p(Lkotlin/collections/builders/ListBuilder;)I HSPLkotlin/collections/builders/ListBuilder;->access$getOffset$p(Lkotlin/collections/builders/ListBuilder;)I PLkotlin/collections/builders/ListBuilder;->access$getOffset$p(Lkotlin/collections/builders/ListBuilder;)I HSPLkotlin/collections/builders/ListBuilder;->add(Ljava/lang/Object;)Z PLkotlin/collections/builders/ListBuilder;->add(Ljava/lang/Object;)Z HSPLkotlin/collections/builders/ListBuilder;->addAtInternal(ILjava/lang/Object;)V PLkotlin/collections/builders/ListBuilder;->addAtInternal(ILjava/lang/Object;)V HSPLkotlin/collections/builders/ListBuilder;->build()Ljava/util/List; PLkotlin/collections/builders/ListBuilder;->build()Ljava/util/List; HSPLkotlin/collections/builders/ListBuilder;->checkIsMutable()V PLkotlin/collections/builders/ListBuilder;->checkIsMutable()V HSPLkotlin/collections/builders/ListBuilder;->insertAtInternal(II)V PLkotlin/collections/builders/ListBuilder;->insertAtInternal(II)V HSPLkotlin/collections/builders/ListBuilder;->iterator()Ljava/util/Iterator; PLkotlin/collections/builders/ListBuilder;->iterator()Ljava/util/Iterator; Lkotlin/collections/builders/ListBuilder$Companion; HSPLkotlin/collections/builders/ListBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/builders/ListBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/collections/builders/ListBuilder$Itr; HSPLkotlin/collections/builders/ListBuilder$Itr;->(Lkotlin/collections/builders/ListBuilder;I)V PLkotlin/collections/builders/ListBuilder$Itr;->(Lkotlin/collections/builders/ListBuilder;I)V HSPLkotlin/collections/builders/ListBuilder$Itr;->hasNext()Z PLkotlin/collections/builders/ListBuilder$Itr;->hasNext()Z HSPLkotlin/collections/builders/ListBuilder$Itr;->next()Ljava/lang/Object; PLkotlin/collections/builders/ListBuilder$Itr;->next()Ljava/lang/Object; Lkotlin/collections/builders/ListBuilderKt; HSPLkotlin/collections/builders/ListBuilderKt;->arrayOfUninitializedElements(I)[Ljava/lang/Object; PLkotlin/collections/builders/ListBuilderKt;->arrayOfUninitializedElements(I)[Ljava/lang/Object; Lkotlin/collections/builders/MapBuilder; HSPLkotlin/collections/builders/MapBuilder;->()V PLkotlin/collections/builders/MapBuilder;->()V HSPLkotlin/collections/builders/MapBuilder;->()V PLkotlin/collections/builders/MapBuilder;->()V HSPLkotlin/collections/builders/MapBuilder;->(I)V PLkotlin/collections/builders/MapBuilder;->(I)V HSPLkotlin/collections/builders/MapBuilder;->access$getEmpty$cp()Lkotlin/collections/builders/MapBuilder; PLkotlin/collections/builders/MapBuilder;->access$getEmpty$cp()Lkotlin/collections/builders/MapBuilder; HSPLkotlin/collections/builders/MapBuilder;->build()Ljava/util/Map; PLkotlin/collections/builders/MapBuilder;->build()Ljava/util/Map; HSPLkotlin/collections/builders/MapBuilder;->checkIsMutable$kotlin_stdlib()V PLkotlin/collections/builders/MapBuilder;->checkIsMutable$kotlin_stdlib()V HSPLkotlin/collections/builders/MapBuilder;->isEmpty()Z PLkotlin/collections/builders/MapBuilder;->isEmpty()Z HSPLkotlin/collections/builders/MapBuilder;->size()I PLkotlin/collections/builders/MapBuilder;->size()I Lkotlin/collections/builders/MapBuilder$Companion; HSPLkotlin/collections/builders/MapBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/builders/MapBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/collections/builders/MapBuilder$Companion;->access$computeHashSize(Lkotlin/collections/builders/MapBuilder$Companion;I)I PLkotlin/collections/builders/MapBuilder$Companion;->access$computeHashSize(Lkotlin/collections/builders/MapBuilder$Companion;I)I HSPLkotlin/collections/builders/MapBuilder$Companion;->access$computeShift(Lkotlin/collections/builders/MapBuilder$Companion;I)I PLkotlin/collections/builders/MapBuilder$Companion;->access$computeShift(Lkotlin/collections/builders/MapBuilder$Companion;I)I Lkotlin/collections/builders/SetBuilder; HSPLkotlin/collections/builders/SetBuilder;->()V PLkotlin/collections/builders/SetBuilder;->()V HSPLkotlin/collections/builders/SetBuilder;->()V PLkotlin/collections/builders/SetBuilder;->()V HSPLkotlin/collections/builders/SetBuilder;->(Lkotlin/collections/builders/MapBuilder;)V PLkotlin/collections/builders/SetBuilder;->(Lkotlin/collections/builders/MapBuilder;)V HSPLkotlin/collections/builders/SetBuilder;->build()Ljava/util/Set; PLkotlin/collections/builders/SetBuilder;->build()Ljava/util/Set; HSPLkotlin/collections/builders/SetBuilder;->getSize()I PLkotlin/collections/builders/SetBuilder;->getSize()I HSPLkotlin/collections/builders/SetBuilder;->isEmpty()Z PLkotlin/collections/builders/SetBuilder;->isEmpty()Z Lkotlin/collections/builders/SetBuilder$Companion; HSPLkotlin/collections/builders/SetBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/collections/builders/SetBuilder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/comparisons/ComparisonsKt; Lkotlin/comparisons/ComparisonsKt__ComparisonsKt; HSPLkotlin/comparisons/ComparisonsKt__ComparisonsKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I HPLkotlin/comparisons/ComparisonsKt__ComparisonsKt;->compareValues(Ljava/lang/Comparable;Ljava/lang/Comparable;)I HSPLkotlin/comparisons/ComparisonsKt__ComparisonsKt;->naturalOrder()Ljava/util/Comparator; PLkotlin/comparisons/ComparisonsKt__ComparisonsKt;->naturalOrder()Ljava/util/Comparator; Lkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt; HSPLkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt;->maxOf(F[F)F HPLkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt;->maxOf(F[F)F HSPLkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt;->minOf(F[F)F HPLkotlin/comparisons/ComparisonsKt___ComparisonsJvmKt;->minOf(F[F)F Lkotlin/comparisons/ComparisonsKt___ComparisonsKt; Lkotlin/comparisons/NaturalOrderComparator; HSPLkotlin/comparisons/NaturalOrderComparator;->()V PLkotlin/comparisons/NaturalOrderComparator;->()V HSPLkotlin/comparisons/NaturalOrderComparator;->()V PLkotlin/comparisons/NaturalOrderComparator;->()V HSPLkotlin/comparisons/NaturalOrderComparator;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I PLkotlin/comparisons/NaturalOrderComparator;->compare(Ljava/lang/Comparable;Ljava/lang/Comparable;)I HSPLkotlin/comparisons/NaturalOrderComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I PLkotlin/comparisons/NaturalOrderComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I Lkotlin/coroutines/AbstractCoroutineContextElement; HSPLkotlin/coroutines/AbstractCoroutineContextElement;->(Lkotlin/coroutines/CoroutineContext$Key;)V PLkotlin/coroutines/AbstractCoroutineContextElement;->(Lkotlin/coroutines/CoroutineContext$Key;)V HSPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/coroutines/AbstractCoroutineContextElement;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLkotlin/coroutines/AbstractCoroutineContextElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; PLkotlin/coroutines/AbstractCoroutineContextElement;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HPLkotlin/coroutines/AbstractCoroutineContextElement;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HSPLkotlin/coroutines/AbstractCoroutineContextElement;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; PLkotlin/coroutines/AbstractCoroutineContextElement;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlin/coroutines/AbstractCoroutineContextElement;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/AbstractCoroutineContextKey; HSPLkotlin/coroutines/AbstractCoroutineContextKey;->(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V PLkotlin/coroutines/AbstractCoroutineContextKey;->(Lkotlin/coroutines/CoroutineContext$Key;Lkotlin/jvm/functions/Function1;)V Lkotlin/coroutines/CombinedContext; HSPLkotlin/coroutines/CombinedContext;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)V HPLkotlin/coroutines/CombinedContext;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)V HSPLkotlin/coroutines/CombinedContext;->equals(Ljava/lang/Object;)Z PLkotlin/coroutines/CombinedContext;->equals(Ljava/lang/Object;)Z HSPLkotlin/coroutines/CombinedContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/coroutines/CombinedContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLkotlin/coroutines/CombinedContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlin/coroutines/CombinedContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CombinedContext;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CombinedContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/Continuation; Lkotlin/coroutines/ContinuationInterceptor; HSPLkotlin/coroutines/ContinuationInterceptor;->()V PLkotlin/coroutines/ContinuationInterceptor;->()V Lkotlin/coroutines/ContinuationInterceptor$DefaultImpls; HSPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->get(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->get(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->minusKey(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/ContinuationInterceptor$DefaultImpls;->minusKey(Lkotlin/coroutines/ContinuationInterceptor;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/ContinuationInterceptor$Key; HSPLkotlin/coroutines/ContinuationInterceptor$Key;->()V PLkotlin/coroutines/ContinuationInterceptor$Key;->()V HSPLkotlin/coroutines/ContinuationInterceptor$Key;->()V PLkotlin/coroutines/ContinuationInterceptor$Key;->()V Lkotlin/coroutines/ContinuationKt; HSPLkotlin/coroutines/ContinuationKt;->createCoroutine(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlin/coroutines/ContinuationKt;->createCoroutine(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlin/coroutines/ContinuationKt;->startCoroutine(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/ContinuationKt;->startCoroutine(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/CoroutineContext$DefaultImpls; HSPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CoroutineContext$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/CoroutineContext$Element; Lkotlin/coroutines/CoroutineContext$Element$DefaultImpls; HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->fold(Lkotlin/coroutines/CoroutineContext$Element;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->fold(Lkotlin/coroutines/CoroutineContext$Element;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->get(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->minusKey(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlin/coroutines/CoroutineContext$Element$DefaultImpls;->plus(Lkotlin/coroutines/CoroutineContext$Element;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/CoroutineContext$Key; Lkotlin/coroutines/CoroutineContext$plus$1; HSPLkotlin/coroutines/CoroutineContext$plus$1;->()V PLkotlin/coroutines/CoroutineContext$plus$1;->()V HSPLkotlin/coroutines/CoroutineContext$plus$1;->()V PLkotlin/coroutines/CoroutineContext$plus$1;->()V HSPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/CoroutineContext$plus$1;->invoke(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext$Element;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/EmptyCoroutineContext; HSPLkotlin/coroutines/EmptyCoroutineContext;->()V PLkotlin/coroutines/EmptyCoroutineContext;->()V HSPLkotlin/coroutines/EmptyCoroutineContext;->()V PLkotlin/coroutines/EmptyCoroutineContext;->()V HSPLkotlin/coroutines/EmptyCoroutineContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlin/coroutines/EmptyCoroutineContext;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlin/coroutines/EmptyCoroutineContext;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/EmptyCoroutineContext;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/SafeContinuation; HSPLkotlin/coroutines/SafeContinuation;->()V PLkotlin/coroutines/SafeContinuation;->()V HSPLkotlin/coroutines/SafeContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)V HPLkotlin/coroutines/SafeContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)V HSPLkotlin/coroutines/SafeContinuation;->resumeWith(Ljava/lang/Object;)V HPLkotlin/coroutines/SafeContinuation;->resumeWith(Ljava/lang/Object;)V Lkotlin/coroutines/SafeContinuation$Companion; HSPLkotlin/coroutines/SafeContinuation$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/coroutines/SafeContinuation$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/coroutines/intrinsics/CoroutineSingletons; HSPLkotlin/coroutines/intrinsics/CoroutineSingletons;->()V PLkotlin/coroutines/intrinsics/CoroutineSingletons;->()V HSPLkotlin/coroutines/intrinsics/CoroutineSingletons;->(Ljava/lang/String;I)V PLkotlin/coroutines/intrinsics/CoroutineSingletons;->(Ljava/lang/String;I)V Lkotlin/coroutines/intrinsics/IntrinsicsKt; Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt; HSPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt;->createCoroutineUnintercepted(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt;->createCoroutineUnintercepted(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt;->intercepted(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt;->intercepted(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$3; Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$4; Lkotlin/coroutines/intrinsics/IntrinsicsKt__IntrinsicsKt; Lkotlin/coroutines/jvm/internal/BaseContinuationImpl; HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->releaseIntercepted()V HPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->releaseIntercepted()V HSPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V HPLkotlin/coroutines/jvm/internal/BaseContinuationImpl;->resumeWith(Ljava/lang/Object;)V Lkotlin/coroutines/jvm/internal/CompletedContinuation; HSPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V PLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V HSPLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V PLkotlin/coroutines/jvm/internal/CompletedContinuation;->()V Lkotlin/coroutines/jvm/internal/ContinuationImpl; HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->(Lkotlin/coroutines/Continuation;Lkotlin/coroutines/CoroutineContext;)V HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->intercepted()Lkotlin/coroutines/Continuation; HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->intercepted()Lkotlin/coroutines/Continuation; HSPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V HPLkotlin/coroutines/jvm/internal/ContinuationImpl;->releaseIntercepted()V Lkotlin/coroutines/jvm/internal/CoroutineStackFrame; Lkotlin/coroutines/jvm/internal/DebugProbesKt; HSPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineResumed(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineResumed(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineSuspended(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineSuspended(Lkotlin/coroutines/Continuation;)V Lkotlin/coroutines/jvm/internal/RestrictedContinuationImpl; HSPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; Lkotlin/coroutines/jvm/internal/RestrictedSuspendLambda; HSPLkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;->(ILkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;->(ILkotlin/coroutines/Continuation;)V Lkotlin/coroutines/jvm/internal/SuspendFunction; Lkotlin/coroutines/jvm/internal/SuspendLambda; HSPLkotlin/coroutines/jvm/internal/SuspendLambda;->(ILkotlin/coroutines/Continuation;)V HPLkotlin/coroutines/jvm/internal/SuspendLambda;->(ILkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I HPLkotlin/coroutines/jvm/internal/SuspendLambda;->getArity()I Lkotlin/enums/EnumEntries; Lkotlin/enums/EnumEntriesKt; HSPLkotlin/enums/EnumEntriesKt;->enumEntries([Ljava/lang/Enum;)Lkotlin/enums/EnumEntries; PLkotlin/enums/EnumEntriesKt;->enumEntries([Ljava/lang/Enum;)Lkotlin/enums/EnumEntries; Lkotlin/enums/EnumEntriesList; HSPLkotlin/enums/EnumEntriesList;->([Ljava/lang/Enum;)V PLkotlin/enums/EnumEntriesList;->([Ljava/lang/Enum;)V Lkotlin/internal/PlatformImplementations; HSPLkotlin/internal/PlatformImplementations;->()V PLkotlin/internal/PlatformImplementations;->()V Lkotlin/internal/PlatformImplementationsKt; HSPLkotlin/internal/PlatformImplementationsKt;->()V PLkotlin/internal/PlatformImplementationsKt;->()V Lkotlin/internal/ProgressionUtilKt; HSPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(III)I HPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(III)I HSPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(JJJ)J PLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(JJJ)J Lkotlin/internal/jdk7/JDK7PlatformImplementations; HSPLkotlin/internal/jdk7/JDK7PlatformImplementations;->()V PLkotlin/internal/jdk7/JDK7PlatformImplementations;->()V Lkotlin/internal/jdk8/JDK8PlatformImplementations; HSPLkotlin/internal/jdk8/JDK8PlatformImplementations;->()V PLkotlin/internal/jdk8/JDK8PlatformImplementations;->()V HSPLkotlin/internal/jdk8/JDK8PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random; PLkotlin/internal/jdk8/JDK8PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random; Lkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion; HSPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V PLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V HSPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V PLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V Lkotlin/io/CloseableKt; HSPLkotlin/io/CloseableKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V PLkotlin/io/CloseableKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V Lkotlin/io/FileSystemException; Lkotlin/io/FilesKt; Lkotlin/io/FilesKt__FilePathComponentsKt; Lkotlin/io/FilesKt__FileReadWriteKt; Lkotlin/io/FilesKt__FileTreeWalkKt; Lkotlin/io/FilesKt__UtilsKt; HSPLkotlin/io/FilesKt__UtilsKt;->getExtension(Ljava/io/File;)Ljava/lang/String; PLkotlin/io/FilesKt__UtilsKt;->getExtension(Ljava/io/File;)Ljava/lang/String; Lkotlin/io/TerminateException; Lkotlin/jvm/JvmClassMappingKt; HSPLkotlin/jvm/JvmClassMappingKt;->getJavaClass(Lkotlin/reflect/KClass;)Ljava/lang/Class; PLkotlin/jvm/JvmClassMappingKt;->getJavaClass(Lkotlin/reflect/KClass;)Ljava/lang/Class; HSPLkotlin/jvm/JvmClassMappingKt;->getJavaObjectType(Lkotlin/reflect/KClass;)Ljava/lang/Class; HPLkotlin/jvm/JvmClassMappingKt;->getJavaObjectType(Lkotlin/reflect/KClass;)Ljava/lang/Class; HSPLkotlin/jvm/JvmClassMappingKt;->getJavaPrimitiveType(Lkotlin/reflect/KClass;)Ljava/lang/Class; PLkotlin/jvm/JvmClassMappingKt;->getJavaPrimitiveType(Lkotlin/reflect/KClass;)Ljava/lang/Class; Lkotlin/jvm/functions/Function0; Lkotlin/jvm/functions/Function1; Lkotlin/jvm/functions/Function10; Lkotlin/jvm/functions/Function11; Lkotlin/jvm/functions/Function12; Lkotlin/jvm/functions/Function13; Lkotlin/jvm/functions/Function14; Lkotlin/jvm/functions/Function15; Lkotlin/jvm/functions/Function16; Lkotlin/jvm/functions/Function17; Lkotlin/jvm/functions/Function18; Lkotlin/jvm/functions/Function19; Lkotlin/jvm/functions/Function2; Lkotlin/jvm/functions/Function20; Lkotlin/jvm/functions/Function21; Lkotlin/jvm/functions/Function22; Lkotlin/jvm/functions/Function3; Lkotlin/jvm/functions/Function4; Lkotlin/jvm/functions/Function5; Lkotlin/jvm/functions/Function6; Lkotlin/jvm/functions/Function7; Lkotlin/jvm/functions/Function8; Lkotlin/jvm/functions/Function9; Lkotlin/jvm/functions/FunctionN; Lkotlin/jvm/internal/AdaptedFunctionReference; HSPLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/AdaptedFunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/ArrayIterator; HSPLkotlin/jvm/internal/ArrayIterator;->([Ljava/lang/Object;)V PLkotlin/jvm/internal/ArrayIterator;->([Ljava/lang/Object;)V HSPLkotlin/jvm/internal/ArrayIterator;->hasNext()Z PLkotlin/jvm/internal/ArrayIterator;->hasNext()Z HSPLkotlin/jvm/internal/ArrayIterator;->next()Ljava/lang/Object; PLkotlin/jvm/internal/ArrayIterator;->next()Ljava/lang/Object; Lkotlin/jvm/internal/ArrayIteratorKt; HSPLkotlin/jvm/internal/ArrayIteratorKt;->iterator([Ljava/lang/Object;)Ljava/util/Iterator; PLkotlin/jvm/internal/ArrayIteratorKt;->iterator([Ljava/lang/Object;)Ljava/util/Iterator; Lkotlin/jvm/internal/BooleanCompanionObject; HSPLkotlin/jvm/internal/BooleanCompanionObject;->()V PLkotlin/jvm/internal/BooleanCompanionObject;->()V HSPLkotlin/jvm/internal/BooleanCompanionObject;->()V PLkotlin/jvm/internal/BooleanCompanionObject;->()V Lkotlin/jvm/internal/ByteCompanionObject; HSPLkotlin/jvm/internal/ByteCompanionObject;->()V PLkotlin/jvm/internal/ByteCompanionObject;->()V HSPLkotlin/jvm/internal/ByteCompanionObject;->()V PLkotlin/jvm/internal/ByteCompanionObject;->()V Lkotlin/jvm/internal/CallableReference; HSPLkotlin/jvm/internal/CallableReference;->()V PLkotlin/jvm/internal/CallableReference;->()V HSPLkotlin/jvm/internal/CallableReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V HPLkotlin/jvm/internal/CallableReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Z)V HSPLkotlin/jvm/internal/CallableReference;->getBoundReceiver()Ljava/lang/Object; PLkotlin/jvm/internal/CallableReference;->getBoundReceiver()Ljava/lang/Object; HSPLkotlin/jvm/internal/CallableReference;->getName()Ljava/lang/String; HPLkotlin/jvm/internal/CallableReference;->getName()Ljava/lang/String; HSPLkotlin/jvm/internal/CallableReference;->getOwner()Lkotlin/reflect/KDeclarationContainer; HPLkotlin/jvm/internal/CallableReference;->getOwner()Lkotlin/reflect/KDeclarationContainer; HSPLkotlin/jvm/internal/CallableReference;->getSignature()Ljava/lang/String; HPLkotlin/jvm/internal/CallableReference;->getSignature()Ljava/lang/String; Lkotlin/jvm/internal/CallableReference$NoReceiver; HSPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V PLkotlin/jvm/internal/CallableReference$NoReceiver;->()V HSPLkotlin/jvm/internal/CallableReference$NoReceiver;->()V PLkotlin/jvm/internal/CallableReference$NoReceiver;->()V HSPLkotlin/jvm/internal/CallableReference$NoReceiver;->access$000()Lkotlin/jvm/internal/CallableReference$NoReceiver; PLkotlin/jvm/internal/CallableReference$NoReceiver;->access$000()Lkotlin/jvm/internal/CallableReference$NoReceiver; Lkotlin/jvm/internal/CharCompanionObject; HSPLkotlin/jvm/internal/CharCompanionObject;->()V PLkotlin/jvm/internal/CharCompanionObject;->()V HSPLkotlin/jvm/internal/CharCompanionObject;->()V PLkotlin/jvm/internal/CharCompanionObject;->()V Lkotlin/jvm/internal/ClassBasedDeclarationContainer; Lkotlin/jvm/internal/CollectionToArray; HSPLkotlin/jvm/internal/CollectionToArray;->()V PLkotlin/jvm/internal/CollectionToArray;->()V HSPLkotlin/jvm/internal/CollectionToArray;->toArray(Ljava/util/Collection;)[Ljava/lang/Object; PLkotlin/jvm/internal/CollectionToArray;->toArray(Ljava/util/Collection;)[Ljava/lang/Object; Lkotlin/jvm/internal/DefaultConstructorMarker; Lkotlin/jvm/internal/DoubleCompanionObject; HSPLkotlin/jvm/internal/DoubleCompanionObject;->()V PLkotlin/jvm/internal/DoubleCompanionObject;->()V HSPLkotlin/jvm/internal/DoubleCompanionObject;->()V PLkotlin/jvm/internal/DoubleCompanionObject;->()V Lkotlin/jvm/internal/FloatCompanionObject; HSPLkotlin/jvm/internal/FloatCompanionObject;->()V PLkotlin/jvm/internal/FloatCompanionObject;->()V HSPLkotlin/jvm/internal/FloatCompanionObject;->()V PLkotlin/jvm/internal/FloatCompanionObject;->()V Lkotlin/jvm/internal/FunctionAdapter; Lkotlin/jvm/internal/FunctionBase; Lkotlin/jvm/internal/FunctionReference; HSPLkotlin/jvm/internal/FunctionReference;->(I)V PLkotlin/jvm/internal/FunctionReference;->(I)V HSPLkotlin/jvm/internal/FunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HPLkotlin/jvm/internal/FunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/FunctionReference;->equals(Ljava/lang/Object;)Z HPLkotlin/jvm/internal/FunctionReference;->equals(Ljava/lang/Object;)Z HSPLkotlin/jvm/internal/FunctionReference;->getArity()I HPLkotlin/jvm/internal/FunctionReference;->getArity()I Lkotlin/jvm/internal/FunctionReferenceImpl; HSPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/IntCompanionObject; HSPLkotlin/jvm/internal/IntCompanionObject;->()V PLkotlin/jvm/internal/IntCompanionObject;->()V HSPLkotlin/jvm/internal/IntCompanionObject;->()V PLkotlin/jvm/internal/IntCompanionObject;->()V Lkotlin/jvm/internal/Intrinsics; HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Float;F)Z HPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Float;F)Z HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z HPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V PLkotlin/jvm/internal/Intrinsics;->checkExpressionValueIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V HPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V HPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V HPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V HPLkotlin/jvm/internal/Intrinsics;->checkNotNullParameter(Ljava/lang/Object;Ljava/lang/String;)V HSPLkotlin/jvm/internal/Intrinsics;->checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V PLkotlin/jvm/internal/Intrinsics;->checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V HSPLkotlin/jvm/internal/Intrinsics;->compare(II)I HPLkotlin/jvm/internal/Intrinsics;->compare(II)I HSPLkotlin/jvm/internal/Intrinsics;->sanitizeStackTrace(Ljava/lang/String;Ljava/lang/Throwable;)V PLkotlin/jvm/internal/Intrinsics;->sanitizeStackTrace(Ljava/lang/String;Ljava/lang/Throwable;)V HSPLkotlin/jvm/internal/Intrinsics;->stringPlus(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; PLkotlin/jvm/internal/Intrinsics;->stringPlus(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; Lkotlin/jvm/internal/KTypeBase; Lkotlin/jvm/internal/Lambda; HSPLkotlin/jvm/internal/Lambda;->(I)V HPLkotlin/jvm/internal/Lambda;->(I)V HSPLkotlin/jvm/internal/Lambda;->getArity()I HPLkotlin/jvm/internal/Lambda;->getArity()I Lkotlin/jvm/internal/LongCompanionObject; HSPLkotlin/jvm/internal/LongCompanionObject;->()V PLkotlin/jvm/internal/LongCompanionObject;->()V HSPLkotlin/jvm/internal/LongCompanionObject;->()V PLkotlin/jvm/internal/LongCompanionObject;->()V Lkotlin/jvm/internal/MutablePropertyReference; HSPLkotlin/jvm/internal/MutablePropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/MutablePropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/MutablePropertyReference1; HSPLkotlin/jvm/internal/MutablePropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/MutablePropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/MutablePropertyReference1Impl; HSPLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V PLkotlin/jvm/internal/MutablePropertyReference1Impl;->(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V Lkotlin/jvm/internal/PropertyReference; HSPLkotlin/jvm/internal/PropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HPLkotlin/jvm/internal/PropertyReference;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/PropertyReference;->equals(Ljava/lang/Object;)Z HPLkotlin/jvm/internal/PropertyReference;->equals(Ljava/lang/Object;)Z Lkotlin/jvm/internal/PropertyReference0; HSPLkotlin/jvm/internal/PropertyReference0;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/PropertyReference0;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/PropertyReference0;->invoke()Ljava/lang/Object; HPLkotlin/jvm/internal/PropertyReference0;->invoke()Ljava/lang/Object; Lkotlin/jvm/internal/PropertyReference0Impl; HSPLkotlin/jvm/internal/PropertyReference0Impl;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/PropertyReference0Impl;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/PropertyReference1; HSPLkotlin/jvm/internal/PropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/PropertyReference1;->(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/PropertyReference1Impl; HSPLkotlin/jvm/internal/PropertyReference1Impl;->(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V PLkotlin/jvm/internal/PropertyReference1Impl;->(Lkotlin/reflect/KDeclarationContainer;Ljava/lang/String;Ljava/lang/String;)V Lkotlin/jvm/internal/PropertyReference2; HSPLkotlin/jvm/internal/PropertyReference2;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/PropertyReference2;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/PropertyReference2Impl; HSPLkotlin/jvm/internal/PropertyReference2Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V PLkotlin/jvm/internal/PropertyReference2Impl;->(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V Lkotlin/jvm/internal/Ref$BooleanRef; HSPLkotlin/jvm/internal/Ref$BooleanRef;->()V PLkotlin/jvm/internal/Ref$BooleanRef;->()V Lkotlin/jvm/internal/Ref$FloatRef; HSPLkotlin/jvm/internal/Ref$FloatRef;->()V PLkotlin/jvm/internal/Ref$FloatRef;->()V Lkotlin/jvm/internal/Ref$IntRef; HSPLkotlin/jvm/internal/Ref$IntRef;->()V PLkotlin/jvm/internal/Ref$IntRef;->()V Lkotlin/jvm/internal/Ref$LongRef; HSPLkotlin/jvm/internal/Ref$LongRef;->()V PLkotlin/jvm/internal/Ref$LongRef;->()V Lkotlin/jvm/internal/Ref$ObjectRef; HSPLkotlin/jvm/internal/Ref$ObjectRef;->()V HPLkotlin/jvm/internal/Ref$ObjectRef;->()V Lkotlin/jvm/internal/Reflection; HSPLkotlin/jvm/internal/Reflection;->()V PLkotlin/jvm/internal/Reflection;->()V HSPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; HPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; HSPLkotlin/jvm/internal/Reflection;->getOrCreateKotlinPackage(Ljava/lang/Class;)Lkotlin/reflect/KDeclarationContainer; PLkotlin/jvm/internal/Reflection;->getOrCreateKotlinPackage(Ljava/lang/Class;)Lkotlin/reflect/KDeclarationContainer; HSPLkotlin/jvm/internal/Reflection;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; PLkotlin/jvm/internal/Reflection;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; HSPLkotlin/jvm/internal/Reflection;->property1(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1; PLkotlin/jvm/internal/Reflection;->property1(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1; HSPLkotlin/jvm/internal/Reflection;->property2(Lkotlin/jvm/internal/PropertyReference2;)Lkotlin/reflect/KProperty2; PLkotlin/jvm/internal/Reflection;->property2(Lkotlin/jvm/internal/PropertyReference2;)Lkotlin/reflect/KProperty2; HSPLkotlin/jvm/internal/Reflection;->typeOf(Ljava/lang/Class;)Lkotlin/reflect/KType; PLkotlin/jvm/internal/Reflection;->typeOf(Ljava/lang/Class;)Lkotlin/reflect/KType; Lkotlin/jvm/internal/ReflectionFactory; HSPLkotlin/jvm/internal/ReflectionFactory;->()V PLkotlin/jvm/internal/ReflectionFactory;->()V Lkotlin/jvm/internal/ShortCompanionObject; HSPLkotlin/jvm/internal/ShortCompanionObject;->()V PLkotlin/jvm/internal/ShortCompanionObject;->()V HSPLkotlin/jvm/internal/ShortCompanionObject;->()V PLkotlin/jvm/internal/ShortCompanionObject;->()V Lkotlin/jvm/internal/StringCompanionObject; HSPLkotlin/jvm/internal/StringCompanionObject;->()V PLkotlin/jvm/internal/StringCompanionObject;->()V HSPLkotlin/jvm/internal/StringCompanionObject;->()V PLkotlin/jvm/internal/StringCompanionObject;->()V Lkotlin/jvm/internal/TypeIntrinsics; HSPLkotlin/jvm/internal/TypeIntrinsics;->asMutableCollection(Ljava/lang/Object;)Ljava/util/Collection; HPLkotlin/jvm/internal/TypeIntrinsics;->asMutableCollection(Ljava/lang/Object;)Ljava/util/Collection; HSPLkotlin/jvm/internal/TypeIntrinsics;->beforeCheckcastToFunctionOfArity(Ljava/lang/Object;I)Ljava/lang/Object; HPLkotlin/jvm/internal/TypeIntrinsics;->beforeCheckcastToFunctionOfArity(Ljava/lang/Object;I)Ljava/lang/Object; HSPLkotlin/jvm/internal/TypeIntrinsics;->castToCollection(Ljava/lang/Object;)Ljava/util/Collection; HPLkotlin/jvm/internal/TypeIntrinsics;->castToCollection(Ljava/lang/Object;)Ljava/util/Collection; HSPLkotlin/jvm/internal/TypeIntrinsics;->getFunctionArity(Ljava/lang/Object;)I HPLkotlin/jvm/internal/TypeIntrinsics;->getFunctionArity(Ljava/lang/Object;)I HSPLkotlin/jvm/internal/TypeIntrinsics;->isFunctionOfArity(Ljava/lang/Object;I)Z HPLkotlin/jvm/internal/TypeIntrinsics;->isFunctionOfArity(Ljava/lang/Object;I)Z HSPLkotlin/jvm/internal/TypeIntrinsics;->isMutableSet(Ljava/lang/Object;)Z PLkotlin/jvm/internal/TypeIntrinsics;->isMutableSet(Ljava/lang/Object;)Z Lkotlin/jvm/internal/markers/KMappedMarker; Lkotlin/jvm/internal/markers/KMutableCollection; Lkotlin/jvm/internal/markers/KMutableIterable; Lkotlin/jvm/internal/markers/KMutableIterator; Lkotlin/jvm/internal/markers/KMutableList; Lkotlin/jvm/internal/markers/KMutableListIterator; Lkotlin/jvm/internal/markers/KMutableMap; Lkotlin/jvm/internal/markers/KMutableSet; Lkotlin/math/MathKt; Lkotlin/math/MathKt__MathHKt; Lkotlin/math/MathKt__MathJVMKt; HSPLkotlin/math/MathKt__MathJVMKt;->getSign(I)I HPLkotlin/math/MathKt__MathJVMKt;->getSign(I)I HSPLkotlin/math/MathKt__MathJVMKt;->roundToInt(F)I HPLkotlin/math/MathKt__MathJVMKt;->roundToInt(F)I Lkotlin/properties/ObservableProperty; HSPLkotlin/properties/ObservableProperty;->(Ljava/lang/Object;)V HPLkotlin/properties/ObservableProperty;->(Ljava/lang/Object;)V HSPLkotlin/properties/ObservableProperty;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V PLkotlin/properties/ObservableProperty;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V HSPLkotlin/properties/ObservableProperty;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; PLkotlin/properties/ObservableProperty;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; HSPLkotlin/properties/ObservableProperty;->setValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V PLkotlin/properties/ObservableProperty;->setValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V Lkotlin/properties/ReadOnlyProperty; Lkotlin/properties/ReadWriteProperty; Lkotlin/random/AbstractPlatformRandom; HSPLkotlin/random/AbstractPlatformRandom;->()V PLkotlin/random/AbstractPlatformRandom;->()V HSPLkotlin/random/AbstractPlatformRandom;->nextInt()I PLkotlin/random/AbstractPlatformRandom;->nextInt()I HSPLkotlin/random/AbstractPlatformRandom;->nextInt(I)I PLkotlin/random/AbstractPlatformRandom;->nextInt(I)I Lkotlin/random/FallbackThreadLocalRandom; HSPLkotlin/random/FallbackThreadLocalRandom;->()V PLkotlin/random/FallbackThreadLocalRandom;->()V HSPLkotlin/random/FallbackThreadLocalRandom;->getImpl()Ljava/util/Random; PLkotlin/random/FallbackThreadLocalRandom;->getImpl()Ljava/util/Random; Lkotlin/random/FallbackThreadLocalRandom$implStorage$1; HSPLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->()V PLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->()V HSPLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->initialValue()Ljava/lang/Object; PLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->initialValue()Ljava/lang/Object; Lkotlin/random/Random; HSPLkotlin/random/Random;->()V PLkotlin/random/Random;->()V HSPLkotlin/random/Random;->()V PLkotlin/random/Random;->()V HSPLkotlin/random/Random;->access$getDefaultRandom$cp()Lkotlin/random/Random; PLkotlin/random/Random;->access$getDefaultRandom$cp()Lkotlin/random/Random; Lkotlin/random/Random$Default; HSPLkotlin/random/Random$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/random/Random$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/random/Random$Default;->nextInt()I PLkotlin/random/Random$Default;->nextInt()I HSPLkotlin/random/Random$Default;->nextInt(I)I PLkotlin/random/Random$Default;->nextInt(I)I Lkotlin/ranges/ClosedRange; Lkotlin/ranges/IntProgression; HSPLkotlin/ranges/IntProgression;->()V PLkotlin/ranges/IntProgression;->()V HSPLkotlin/ranges/IntProgression;->(III)V HPLkotlin/ranges/IntProgression;->(III)V HSPLkotlin/ranges/IntProgression;->getFirst()I PLkotlin/ranges/IntProgression;->getFirst()I HSPLkotlin/ranges/IntProgression;->getLast()I PLkotlin/ranges/IntProgression;->getLast()I HSPLkotlin/ranges/IntProgression;->getStep()I PLkotlin/ranges/IntProgression;->getStep()I HSPLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator; PLkotlin/ranges/IntProgression;->iterator()Ljava/util/Iterator; HSPLkotlin/ranges/IntProgression;->iterator()Lkotlin/collections/IntIterator; PLkotlin/ranges/IntProgression;->iterator()Lkotlin/collections/IntIterator; Lkotlin/ranges/IntProgression$Companion; HSPLkotlin/ranges/IntProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/ranges/IntProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/ranges/IntProgressionIterator; HSPLkotlin/ranges/IntProgressionIterator;->(III)V HPLkotlin/ranges/IntProgressionIterator;->(III)V HSPLkotlin/ranges/IntProgressionIterator;->hasNext()Z PLkotlin/ranges/IntProgressionIterator;->hasNext()Z HSPLkotlin/ranges/IntProgressionIterator;->nextInt()I PLkotlin/ranges/IntProgressionIterator;->nextInt()I Lkotlin/ranges/IntRange; HSPLkotlin/ranges/IntRange;->()V PLkotlin/ranges/IntRange;->()V HSPLkotlin/ranges/IntRange;->(II)V HPLkotlin/ranges/IntRange;->(II)V HSPLkotlin/ranges/IntRange;->contains(I)Z PLkotlin/ranges/IntRange;->contains(I)Z HSPLkotlin/ranges/IntRange;->getStart()Ljava/lang/Integer; PLkotlin/ranges/IntRange;->getStart()Ljava/lang/Integer; Lkotlin/ranges/IntRange$Companion; HSPLkotlin/ranges/IntRange$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/ranges/IntRange$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/ranges/LongProgression; HSPLkotlin/ranges/LongProgression;->()V PLkotlin/ranges/LongProgression;->()V HSPLkotlin/ranges/LongProgression;->(JJJ)V PLkotlin/ranges/LongProgression;->(JJJ)V HSPLkotlin/ranges/LongProgression;->getFirst()J PLkotlin/ranges/LongProgression;->getFirst()J HSPLkotlin/ranges/LongProgression;->getLast()J PLkotlin/ranges/LongProgression;->getLast()J Lkotlin/ranges/LongProgression$Companion; HSPLkotlin/ranges/LongProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/ranges/LongProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/ranges/LongRange; HSPLkotlin/ranges/LongRange;->()V PLkotlin/ranges/LongRange;->()V HSPLkotlin/ranges/LongRange;->(JJ)V PLkotlin/ranges/LongRange;->(JJ)V HSPLkotlin/ranges/LongRange;->contains(J)Z PLkotlin/ranges/LongRange;->contains(J)Z Lkotlin/ranges/LongRange$Companion; HSPLkotlin/ranges/LongRange$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/ranges/LongRange$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/ranges/OpenEndRange; Lkotlin/ranges/RangesKt; HSPLkotlin/ranges/RangesKt;->step(Lkotlin/ranges/IntRange;I)Lkotlin/ranges/IntProgression; PLkotlin/ranges/RangesKt;->step(Lkotlin/ranges/IntRange;I)Lkotlin/ranges/IntProgression; Lkotlin/ranges/RangesKt__RangesKt; HSPLkotlin/ranges/RangesKt__RangesKt;->checkStepIsPositive(ZLjava/lang/Number;)V PLkotlin/ranges/RangesKt__RangesKt;->checkStepIsPositive(ZLjava/lang/Number;)V Lkotlin/ranges/RangesKt___RangesKt; HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(DDD)D HPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(DDD)D HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(FFF)F HPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(FFF)F HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(III)I HPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(III)I HSPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(JJJ)J HPLkotlin/ranges/RangesKt___RangesKt;->coerceIn(JJJ)J HSPLkotlin/ranges/RangesKt___RangesKt;->step(Lkotlin/ranges/IntProgression;I)Lkotlin/ranges/IntProgression; PLkotlin/ranges/RangesKt___RangesKt;->step(Lkotlin/ranges/IntProgression;I)Lkotlin/ranges/IntProgression; HSPLkotlin/ranges/RangesKt___RangesKt;->until(II)Lkotlin/ranges/IntRange; PLkotlin/ranges/RangesKt___RangesKt;->until(II)Lkotlin/ranges/IntRange; Lkotlin/reflect/KAnnotatedElement; Lkotlin/reflect/KCallable; Lkotlin/reflect/KClass; Lkotlin/reflect/KClassifier; Lkotlin/reflect/KDeclarationContainer; Lkotlin/reflect/KFunction; Lkotlin/reflect/KMutableProperty; Lkotlin/reflect/KMutableProperty1; Lkotlin/reflect/KProperty; Lkotlin/reflect/KProperty0; Lkotlin/reflect/KProperty1; Lkotlin/reflect/KProperty2; Lkotlin/reflect/KType; Lkotlin/reflect/full/KClassifiers; HSPLkotlin/reflect/full/KClassifiers;->createType(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLjava/util/List;)Lkotlin/reflect/KType; PLkotlin/reflect/full/KClassifiers;->createType(Lkotlin/reflect/KClassifier;Ljava/util/List;ZLjava/util/List;)Lkotlin/reflect/KType; Lkotlin/reflect/jvm/internal/CacheByClass; HSPLkotlin/reflect/jvm/internal/CacheByClass;->()V PLkotlin/reflect/jvm/internal/CacheByClass;->()V Lkotlin/reflect/jvm/internal/CacheByClassKt; HSPLkotlin/reflect/jvm/internal/CacheByClassKt;->()V PLkotlin/reflect/jvm/internal/CacheByClassKt;->()V HSPLkotlin/reflect/jvm/internal/CacheByClassKt;->createCache(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/CacheByClass; PLkotlin/reflect/jvm/internal/CacheByClassKt;->createCache(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/CacheByClass; Lkotlin/reflect/jvm/internal/CachesKt; HSPLkotlin/reflect/jvm/internal/CachesKt;->()V PLkotlin/reflect/jvm/internal/CachesKt;->()V HSPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKType(Ljava/lang/Class;Ljava/util/List;Z)Lkotlin/reflect/KType; HPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKType(Ljava/lang/Class;Ljava/util/List;Z)Lkotlin/reflect/KType; HSPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; HPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; HSPLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKotlinPackage(Ljava/lang/Class;)Lkotlin/reflect/KDeclarationContainer; PLkotlin/reflect/jvm/internal/CachesKt;->getOrCreateKotlinPackage(Ljava/lang/Class;)Lkotlin/reflect/KDeclarationContainer; Lkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1; HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->invoke(Ljava/lang/Class;)Lkotlin/reflect/KType; PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->invoke(Ljava/lang/Class;)Lkotlin/reflect/KType; HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_GENERIC_CLASSIFIERS$1; HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_GENERIC_CLASSIFIERS$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_GENERIC_CLASSIFIERS$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_GENERIC_CLASSIFIERS$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_GENERIC_CLASSIFIERS$1;->()V Lkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$1; HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$CACHE_FOR_NULLABLE_BASE_CLASSIFIERS$1;->()V Lkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1; HSPLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->invoke(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; PLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->invoke(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KClassImpl; HSPLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/CachesKt$K_CLASS_CACHE$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1; HSPLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->()V PLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->()V HSPLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->invoke(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KPackageImpl; PLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->invoke(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/KPackageImpl; HSPLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/CachesKt$K_PACKAGE_CACHE$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/ConcurrentHashMapCache; HSPLkotlin/reflect/jvm/internal/ConcurrentHashMapCache;->(Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/ConcurrentHashMapCache;->(Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/ConcurrentHashMapCache;->get(Ljava/lang/Class;)Ljava/lang/Object; HPLkotlin/reflect/jvm/internal/ConcurrentHashMapCache;->get(Ljava/lang/Class;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/KCallableImpl; HSPLkotlin/reflect/jvm/internal/KCallableImpl;->()V PLkotlin/reflect/jvm/internal/KCallableImpl;->()V Lkotlin/reflect/jvm/internal/KCallableImpl$_absentArguments$1; HSPLkotlin/reflect/jvm/internal/KCallableImpl$_absentArguments$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V PLkotlin/reflect/jvm/internal/KCallableImpl$_absentArguments$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V Lkotlin/reflect/jvm/internal/KCallableImpl$_annotations$1; HSPLkotlin/reflect/jvm/internal/KCallableImpl$_annotations$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V PLkotlin/reflect/jvm/internal/KCallableImpl$_annotations$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V Lkotlin/reflect/jvm/internal/KCallableImpl$_parameters$1; HSPLkotlin/reflect/jvm/internal/KCallableImpl$_parameters$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V PLkotlin/reflect/jvm/internal/KCallableImpl$_parameters$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V Lkotlin/reflect/jvm/internal/KCallableImpl$_returnType$1; HSPLkotlin/reflect/jvm/internal/KCallableImpl$_returnType$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V PLkotlin/reflect/jvm/internal/KCallableImpl$_returnType$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V Lkotlin/reflect/jvm/internal/KCallableImpl$_typeParameters$1; HSPLkotlin/reflect/jvm/internal/KCallableImpl$_typeParameters$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V PLkotlin/reflect/jvm/internal/KCallableImpl$_typeParameters$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V Lkotlin/reflect/jvm/internal/KCallableImpl$parametersNeedMFVCFlattening$1; HSPLkotlin/reflect/jvm/internal/KCallableImpl$parametersNeedMFVCFlattening$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V PLkotlin/reflect/jvm/internal/KCallableImpl$parametersNeedMFVCFlattening$1;->(Lkotlin/reflect/jvm/internal/KCallableImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl; HSPLkotlin/reflect/jvm/internal/KClassImpl;->(Ljava/lang/Class;)V PLkotlin/reflect/jvm/internal/KClassImpl;->(Ljava/lang/Class;)V HSPLkotlin/reflect/jvm/internal/KClassImpl;->access$getClassId(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/KClassImpl;->access$getClassId(Lkotlin/reflect/jvm/internal/KClassImpl;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/KClassImpl;->equals(Ljava/lang/Object;)Z HPLkotlin/reflect/jvm/internal/KClassImpl;->equals(Ljava/lang/Object;)Z HSPLkotlin/reflect/jvm/internal/KClassImpl;->getData()Lkotlin/reflect/jvm/internal/ReflectProperties$LazyVal; PLkotlin/reflect/jvm/internal/KClassImpl;->getData()Lkotlin/reflect/jvm/internal/ReflectProperties$LazyVal; HSPLkotlin/reflect/jvm/internal/KClassImpl;->getDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/KClassImpl;->getDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/KClassImpl;->getDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; PLkotlin/reflect/jvm/internal/KClassImpl;->getDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; HSPLkotlin/reflect/jvm/internal/KClassImpl;->getJClass()Ljava/lang/Class; PLkotlin/reflect/jvm/internal/KClassImpl;->getJClass()Ljava/lang/Class; HSPLkotlin/reflect/jvm/internal/KClassImpl;->getQualifiedName()Ljava/lang/String; HPLkotlin/reflect/jvm/internal/KClassImpl;->getQualifiedName()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/KClassImpl;->getSimpleName()Ljava/lang/String; PLkotlin/reflect/jvm/internal/KClassImpl;->getSimpleName()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/KClassImpl;->hashCode()I HPLkotlin/reflect/jvm/internal/KClassImpl;->hashCode()I HSPLkotlin/reflect/jvm/internal/KClassImpl;->isInstance(Ljava/lang/Object;)Z PLkotlin/reflect/jvm/internal/KClassImpl;->isInstance(Ljava/lang/Object;)Z Lkotlin/reflect/jvm/internal/KClassImpl$Data; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data;->()V PLkotlin/reflect/jvm/internal/KClassImpl$Data;->()V HSPLkotlin/reflect/jvm/internal/KClassImpl$Data;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V HSPLkotlin/reflect/jvm/internal/KClassImpl$Data;->getDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/KClassImpl$Data;->getDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data;->getQualifiedName()Ljava/lang/String; HPLkotlin/reflect/jvm/internal/KClassImpl$Data;->getQualifiedName()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data;->getSimpleName()Ljava/lang/String; PLkotlin/reflect/jvm/internal/KClassImpl$Data;->getSimpleName()Ljava/lang/String; Lkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$allMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$allNonStaticMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$allNonStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$allNonStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$allStaticMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$allStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$allStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$annotations$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$annotations$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$annotations$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$constructors$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$constructors$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$constructors$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$declaredNonStaticMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredNonStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredNonStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$declaredStaticMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$declaredStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2;->invoke()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/KClassImpl$Data$descriptor$2;->invoke()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; Lkotlin/reflect/jvm/internal/KClassImpl$Data$inheritedNonStaticMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$inheritedNonStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$inheritedNonStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$inheritedStaticMembers$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$inheritedStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$inheritedStaticMembers$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$nestedClasses$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$nestedClasses$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$nestedClasses$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$objectInstance$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$objectInstance$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$objectInstance$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2;->invoke()Ljava/lang/String; PLkotlin/reflect/jvm/internal/KClassImpl$Data$qualifiedName$2;->invoke()Ljava/lang/String; Lkotlin/reflect/jvm/internal/KClassImpl$Data$sealedSubclasses$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$sealedSubclasses$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$sealedSubclasses$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2;->invoke()Ljava/lang/String; PLkotlin/reflect/jvm/internal/KClassImpl$Data$simpleName$2;->invoke()Ljava/lang/String; Lkotlin/reflect/jvm/internal/KClassImpl$Data$supertypes$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$supertypes$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$supertypes$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$Data$typeParameters$2; HSPLkotlin/reflect/jvm/internal/KClassImpl$Data$typeParameters$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$Data$typeParameters$2;->(Lkotlin/reflect/jvm/internal/KClassImpl$Data;Lkotlin/reflect/jvm/internal/KClassImpl;)V Lkotlin/reflect/jvm/internal/KClassImpl$data$1; HSPLkotlin/reflect/jvm/internal/KClassImpl$data$1;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V PLkotlin/reflect/jvm/internal/KClassImpl$data$1;->(Lkotlin/reflect/jvm/internal/KClassImpl;)V HSPLkotlin/reflect/jvm/internal/KClassImpl$data$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KClassImpl$data$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KClassImpl$data$1;->invoke()Lkotlin/reflect/jvm/internal/KClassImpl$Data; PLkotlin/reflect/jvm/internal/KClassImpl$data$1;->invoke()Lkotlin/reflect/jvm/internal/KClassImpl$Data; Lkotlin/reflect/jvm/internal/KClassifierImpl; Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl;->()V Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion; HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data; HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->()V PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->()V HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->getModuleData()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;->getModuleData()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2; HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;)V HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2;->invoke()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; PLkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data$moduleData$2;->invoke()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; Lkotlin/reflect/jvm/internal/KMutableProperty1Impl; HSPLkotlin/reflect/jvm/internal/KMutableProperty1Impl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V HPLkotlin/reflect/jvm/internal/KMutableProperty1Impl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V Lkotlin/reflect/jvm/internal/KMutableProperty1Impl$_setter$1; HSPLkotlin/reflect/jvm/internal/KMutableProperty1Impl$_setter$1;->(Lkotlin/reflect/jvm/internal/KMutableProperty1Impl;)V PLkotlin/reflect/jvm/internal/KMutableProperty1Impl$_setter$1;->(Lkotlin/reflect/jvm/internal/KMutableProperty1Impl;)V Lkotlin/reflect/jvm/internal/KPackageImpl; HSPLkotlin/reflect/jvm/internal/KPackageImpl;->(Ljava/lang/Class;)V PLkotlin/reflect/jvm/internal/KPackageImpl;->(Ljava/lang/Class;)V Lkotlin/reflect/jvm/internal/KPackageImpl$data$1; HSPLkotlin/reflect/jvm/internal/KPackageImpl$data$1;->(Lkotlin/reflect/jvm/internal/KPackageImpl;)V PLkotlin/reflect/jvm/internal/KPackageImpl$data$1;->(Lkotlin/reflect/jvm/internal/KPackageImpl;)V Lkotlin/reflect/jvm/internal/KProperty1Impl; HSPLkotlin/reflect/jvm/internal/KProperty1Impl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V HPLkotlin/reflect/jvm/internal/KProperty1Impl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V Lkotlin/reflect/jvm/internal/KProperty1Impl$_getter$1; HSPLkotlin/reflect/jvm/internal/KProperty1Impl$_getter$1;->(Lkotlin/reflect/jvm/internal/KProperty1Impl;)V PLkotlin/reflect/jvm/internal/KProperty1Impl$_getter$1;->(Lkotlin/reflect/jvm/internal/KProperty1Impl;)V Lkotlin/reflect/jvm/internal/KProperty1Impl$delegateSource$1; HSPLkotlin/reflect/jvm/internal/KProperty1Impl$delegateSource$1;->(Lkotlin/reflect/jvm/internal/KProperty1Impl;)V PLkotlin/reflect/jvm/internal/KProperty1Impl$delegateSource$1;->(Lkotlin/reflect/jvm/internal/KProperty1Impl;)V Lkotlin/reflect/jvm/internal/KProperty2Impl; HSPLkotlin/reflect/jvm/internal/KProperty2Impl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/KProperty2Impl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;)V Lkotlin/reflect/jvm/internal/KProperty2Impl$_getter$1; HSPLkotlin/reflect/jvm/internal/KProperty2Impl$_getter$1;->(Lkotlin/reflect/jvm/internal/KProperty2Impl;)V PLkotlin/reflect/jvm/internal/KProperty2Impl$_getter$1;->(Lkotlin/reflect/jvm/internal/KProperty2Impl;)V Lkotlin/reflect/jvm/internal/KProperty2Impl$delegateSource$1; HSPLkotlin/reflect/jvm/internal/KProperty2Impl$delegateSource$1;->(Lkotlin/reflect/jvm/internal/KProperty2Impl;)V PLkotlin/reflect/jvm/internal/KProperty2Impl$delegateSource$1;->(Lkotlin/reflect/jvm/internal/KProperty2Impl;)V Lkotlin/reflect/jvm/internal/KPropertyImpl; HSPLkotlin/reflect/jvm/internal/KPropertyImpl;->()V PLkotlin/reflect/jvm/internal/KPropertyImpl;->()V HSPLkotlin/reflect/jvm/internal/KPropertyImpl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V HPLkotlin/reflect/jvm/internal/KPropertyImpl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V HSPLkotlin/reflect/jvm/internal/KPropertyImpl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor;Ljava/lang/Object;)V PLkotlin/reflect/jvm/internal/KPropertyImpl;->(Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;Ljava/lang/String;Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor;Ljava/lang/Object;)V Lkotlin/reflect/jvm/internal/KPropertyImpl$Companion; HSPLkotlin/reflect/jvm/internal/KPropertyImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/KPropertyImpl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/KPropertyImpl$_descriptor$1; HSPLkotlin/reflect/jvm/internal/KPropertyImpl$_descriptor$1;->(Lkotlin/reflect/jvm/internal/KPropertyImpl;)V PLkotlin/reflect/jvm/internal/KPropertyImpl$_descriptor$1;->(Lkotlin/reflect/jvm/internal/KPropertyImpl;)V Lkotlin/reflect/jvm/internal/KPropertyImpl$_javaField$1; HSPLkotlin/reflect/jvm/internal/KPropertyImpl$_javaField$1;->(Lkotlin/reflect/jvm/internal/KPropertyImpl;)V PLkotlin/reflect/jvm/internal/KPropertyImpl$_javaField$1;->(Lkotlin/reflect/jvm/internal/KPropertyImpl;)V Lkotlin/reflect/jvm/internal/KTypeImpl; HSPLkotlin/reflect/jvm/internal/KTypeImpl;->()V PLkotlin/reflect/jvm/internal/KTypeImpl;->()V HSPLkotlin/reflect/jvm/internal/KTypeImpl;->(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/KTypeImpl;->(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/KTypeImpl;->(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/KTypeImpl;->(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/KTypeImpl;->access$convert(Lkotlin/reflect/jvm/internal/KTypeImpl;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Lkotlin/reflect/KClassifier; PLkotlin/reflect/jvm/internal/KTypeImpl;->access$convert(Lkotlin/reflect/jvm/internal/KTypeImpl;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Lkotlin/reflect/KClassifier; HSPLkotlin/reflect/jvm/internal/KTypeImpl;->convert(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Lkotlin/reflect/KClassifier; PLkotlin/reflect/jvm/internal/KTypeImpl;->convert(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Lkotlin/reflect/KClassifier; HSPLkotlin/reflect/jvm/internal/KTypeImpl;->getArguments()Ljava/util/List; HPLkotlin/reflect/jvm/internal/KTypeImpl;->getArguments()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/KTypeImpl;->getClassifier()Lkotlin/reflect/KClassifier; HPLkotlin/reflect/jvm/internal/KTypeImpl;->getClassifier()Lkotlin/reflect/KClassifier; HSPLkotlin/reflect/jvm/internal/KTypeImpl;->getType()Lkotlin/reflect/jvm/internal/impl/types/KotlinType; PLkotlin/reflect/jvm/internal/KTypeImpl;->getType()Lkotlin/reflect/jvm/internal/impl/types/KotlinType; HSPLkotlin/reflect/jvm/internal/KTypeImpl;->hashCode()I HPLkotlin/reflect/jvm/internal/KTypeImpl;->hashCode()I Lkotlin/reflect/jvm/internal/KTypeImpl$arguments$2; HSPLkotlin/reflect/jvm/internal/KTypeImpl$arguments$2;->(Lkotlin/reflect/jvm/internal/KTypeImpl;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/KTypeImpl$arguments$2;->(Lkotlin/reflect/jvm/internal/KTypeImpl;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/KTypeImpl$arguments$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KTypeImpl$arguments$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KTypeImpl$arguments$2;->invoke()Ljava/util/List; PLkotlin/reflect/jvm/internal/KTypeImpl$arguments$2;->invoke()Ljava/util/List; Lkotlin/reflect/jvm/internal/KTypeImpl$classifier$2; HSPLkotlin/reflect/jvm/internal/KTypeImpl$classifier$2;->(Lkotlin/reflect/jvm/internal/KTypeImpl;)V PLkotlin/reflect/jvm/internal/KTypeImpl$classifier$2;->(Lkotlin/reflect/jvm/internal/KTypeImpl;)V HSPLkotlin/reflect/jvm/internal/KTypeImpl$classifier$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/KTypeImpl$classifier$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/KTypeImpl$classifier$2;->invoke()Lkotlin/reflect/KClassifier; PLkotlin/reflect/jvm/internal/KTypeImpl$classifier$2;->invoke()Lkotlin/reflect/KClassifier; Lkotlin/reflect/jvm/internal/KTypeParameterOwnerImpl; Lkotlin/reflect/jvm/internal/ModuleByClassLoaderKt; HSPLkotlin/reflect/jvm/internal/ModuleByClassLoaderKt;->()V PLkotlin/reflect/jvm/internal/ModuleByClassLoaderKt;->()V HSPLkotlin/reflect/jvm/internal/ModuleByClassLoaderKt;->getOrCreateModule(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; PLkotlin/reflect/jvm/internal/ModuleByClassLoaderKt;->getOrCreateModule(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; Lkotlin/reflect/jvm/internal/ReflectProperties; HSPLkotlin/reflect/jvm/internal/ReflectProperties;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazyVal; PLkotlin/reflect/jvm/internal/ReflectProperties;->lazy(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazyVal; HSPLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; PLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; HSPLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; PLkotlin/reflect/jvm/internal/ReflectProperties;->lazySoft(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal; HSPLkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)V HPLkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;->invoke()Ljava/lang/Object; HPLkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;->invoke()Ljava/lang/Object; Lkotlin/reflect/jvm/internal/ReflectProperties$LazyVal; HSPLkotlin/reflect/jvm/internal/ReflectProperties$LazyVal;->(Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/ReflectProperties$LazyVal;->(Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/ReflectProperties$LazyVal;->invoke()Ljava/lang/Object; HPLkotlin/reflect/jvm/internal/ReflectProperties$LazyVal;->invoke()Ljava/lang/Object; Lkotlin/reflect/jvm/internal/ReflectProperties$Val; HSPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->()V PLkotlin/reflect/jvm/internal/ReflectProperties$Val;->()V HSPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->()V HPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->()V HSPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->escape(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/ReflectProperties$Val;->escape(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->unescape(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlin/reflect/jvm/internal/ReflectProperties$Val;->unescape(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/ReflectProperties$Val$1; HSPLkotlin/reflect/jvm/internal/ReflectProperties$Val$1;->()V PLkotlin/reflect/jvm/internal/ReflectProperties$Val$1;->()V Lkotlin/reflect/jvm/internal/ReflectionFactoryImpl; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->()V PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->()V HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; HPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOrCreateKotlinClass(Ljava/lang/Class;)Lkotlin/reflect/KClass; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOrCreateKotlinPackage(Ljava/lang/Class;Ljava/lang/String;)Lkotlin/reflect/KDeclarationContainer; PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOrCreateKotlinPackage(Ljava/lang/Class;Ljava/lang/String;)Lkotlin/reflect/KDeclarationContainer; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOwner(Lkotlin/jvm/internal/CallableReference;)Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->getOwner(Lkotlin/jvm/internal/CallableReference;)Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->mutableProperty1(Lkotlin/jvm/internal/MutablePropertyReference1;)Lkotlin/reflect/KMutableProperty1; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->property1(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1; PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->property1(Lkotlin/jvm/internal/PropertyReference1;)Lkotlin/reflect/KProperty1; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->property2(Lkotlin/jvm/internal/PropertyReference2;)Lkotlin/reflect/KProperty2; PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->property2(Lkotlin/jvm/internal/PropertyReference2;)Lkotlin/reflect/KProperty2; HSPLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->typeOf(Lkotlin/reflect/KClassifier;Ljava/util/List;Z)Lkotlin/reflect/KType; PLkotlin/reflect/jvm/internal/ReflectionFactoryImpl;->typeOf(Lkotlin/reflect/KClassifier;Ljava/util/List;Z)Lkotlin/reflect/KType; Lkotlin/reflect/jvm/internal/RuntimeTypeMapper; HSPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V PLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V HSPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V PLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->()V HSPLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->mapJvmClassToKotlinClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/RuntimeTypeMapper;->mapJvmClassToKotlinClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/UtilKt; HSPLkotlin/reflect/jvm/internal/UtilKt;->()V PLkotlin/reflect/jvm/internal/UtilKt;->()V HSPLkotlin/reflect/jvm/internal/UtilKt;->toJavaClass(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)Ljava/lang/Class; PLkotlin/reflect/jvm/internal/UtilKt;->toJavaClass(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)Ljava/lang/Class; Lkotlin/reflect/jvm/internal/WeakClassLoaderBox; HSPLkotlin/reflect/jvm/internal/WeakClassLoaderBox;->(Ljava/lang/ClassLoader;)V PLkotlin/reflect/jvm/internal/WeakClassLoaderBox;->(Ljava/lang/ClassLoader;)V HSPLkotlin/reflect/jvm/internal/WeakClassLoaderBox;->hashCode()I PLkotlin/reflect/jvm/internal/WeakClassLoaderBox;->hashCode()I Lkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping; HSPLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->()V PLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->()V PLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->allClassesWithIntrinsicCompanions()Ljava/util/Set; PLkotlin/reflect/jvm/internal/impl/builtins/CompanionObjectMapping;->allClassesWithIntrinsicCompanions()Ljava/util/Set; Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->()V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->access$200(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->access$200(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->access$202(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->access$202(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->getBuiltInsModule()Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->getBuiltInsModule()Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->setBuiltInsModule(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;->setBuiltInsModule(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$1; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)V Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)V Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$3; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$3;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$3;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;)V Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4;->(Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4;->invoke()Ljava/lang/Void; PLkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns$4;->invoke()Ljava/lang/Void; Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->()V PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->(Ljava/lang/String;ILjava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->(Ljava/lang/String;ILjava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->getArrayTypeName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->getArrayTypeName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->getTypeName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->getTypeName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion; HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$arrayTypeFqName$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$arrayTypeFqName$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)V PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$arrayTypeFqName$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)V Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$typeFqName$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$typeFqName$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)V PLkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType$typeFqName$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)V Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes; HSPLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;->()V PLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V PLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$ClassLookup; HSPLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$ClassLookup;->(I)V PLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$ClassLookup;->(I)V Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$Companion; HSPLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$kotlinReflectScope$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$kotlinReflectScope$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V PLkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes$kotlinReflectScope$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V Lkotlin/reflect/jvm/internal/impl/builtins/StandardNames; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->()V PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->()V PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getFunctionClassId(I)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getFunctionClassId(I)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getFunctionName(I)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getFunctionName(I)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getPrimitiveFqName(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames;->getPrimitiveFqName(Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;)Lkotlin/reflect/jvm/internal/impl/name/FqName; Lkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->()V PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->()V PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->annotationName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->annotationName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->collectionsFqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->collectionsFqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->fqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->fqName(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->fqNameUnsafe(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->fqNameUnsafe(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->reflect(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/builtins/StandardNames$FqNames;->reflect(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; Lkotlin/reflect/jvm/internal/impl/builtins/functions/BuiltInFictitiousFunctionClassFactory; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/BuiltInFictitiousFunctionClassFactory;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V PLkotlin/reflect/jvm/internal/impl/builtins/functions/BuiltInFictitiousFunctionClassFactory;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;)V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;ZLkotlin/reflect/jvm/internal/impl/name/ClassId;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getClassNamePrefix()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getClassNamePrefix()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$Function;->()V Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KFunction;->()V Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$KSuspendFunction;->()V Lkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction; HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction;->()V PLkotlin/reflect/jvm/internal/impl/builtins/functions/FunctionTypeKind$SuspendFunction;->()V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->add(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->add(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addKotlinToJava(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addKotlinToJava(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addTopLevel(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addTopLevel(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addTopLevel(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->addTopLevel(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->classId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->classId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->mapJavaToKotlin(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap;->mapJavaToKotlin(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component1()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component1()Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component2()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component2()Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component3()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMap$PlatformMutabilityMapping;->component3()Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMapper; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMapper;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMapper;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMapper;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JavaToKotlinClassMapper;->()V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$1; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$1;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$1;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$1;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$1;->()V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$Companion; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$cloneable$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$cloneable$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory$cloneable$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInClassDescriptorFactory;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->getCustomizer()Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->getCustomizer()Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->initialize(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Z)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->initialize(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Z)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->setPostponedSettingsComputation(Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;->setPostponedSettingsComputation(Lkotlin/jvm/functions/Function0;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;->(Ljava/lang/String;I)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;->values()[Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind;->values()[Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$Kind; Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$WhenMappings; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$WhenMappings;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$WhenMappings;->()V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2;->invoke()Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2;->invoke()Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer; Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2$1; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$customizer$2$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$initialize$1; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$initialize$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Z)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltIns$initialize$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Z)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function0;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$cloneableType$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$cloneableType$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$cloneableType$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$createMockJavaIoSerializableType$mockJavaIoPackageFragment$1; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$createMockJavaIoSerializableType$mockJavaIoPackageFragment$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$createMockJavaIoSerializableType$mockJavaIoPackageFragment$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$createMockJavaIoSerializableType$superTypes$1; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$createMockJavaIoSerializableType$superTypes$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$createMockJavaIoSerializableType$superTypes$1;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$notConsideredDeprecation$2; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$notConsideredDeprecation$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer$notConsideredDeprecation$2;->(Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsCustomizer;)V Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider;->()V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider;->()V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;)V HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider;->findPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializedPackageFragment; PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider;->findPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializedPackageFragment; Lkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider$Companion; HSPLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/builtins/jvm/JvmBuiltInsPackageFragmentProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/descriptors/CallableDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind; HSPLkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptorWithTypeParameters; Lkotlin/reflect/jvm/internal/impl/descriptors/ConstructorDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorNonRoot; Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorVisitor; Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorWithSource; Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorWithVisibility; Lkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility;->getDelegate()Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility; PLkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility;->getDelegate()Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility; Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities;->recordVisibilityMapping(Lkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities;->recordVisibilityMapping(Lkotlin/reflect/jvm/internal/impl/descriptors/DelegatedDescriptorVisibility;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities;->toDescriptorVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities;->toDescriptorVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$10; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$10;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$10;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$11; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$11;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$11;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$12; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$12;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$12;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$2; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$3; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$3;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$3;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$4; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$4;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$4;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$5; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$5;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$5;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$6; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$6;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$6;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$7; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$7;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$7;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$8; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$8;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$8;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$9; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$9;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown;)V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibilities$9;->(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown;)V Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; HSPLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/FindClassInModuleKt; HSPLkotlin/reflect/jvm/internal/impl/descriptors/FindClassInModuleKt;->findClassAcrossModuleDependencies(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/FindClassInModuleKt;->findClassAcrossModuleDependencies(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/FindClassInModuleKt;->findClassifierAcrossModuleDependencies(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/FindClassInModuleKt;->findClassifierAcrossModuleDependencies(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/FunctionDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/MemberDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/Modality; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Modality;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Modality;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Modality;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/descriptors/Modality;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/descriptors/Modality$Companion; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Modality$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/Modality$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Modality$Companion;->convertFromFlags(ZZZ)Lkotlin/reflect/jvm/internal/impl/descriptors/Modality; PLkotlin/reflect/jvm/internal/impl/descriptors/Modality$Companion;->convertFromFlags(ZZZ)Lkotlin/reflect/jvm/internal/impl/descriptors/Modality; Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability;->(Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability;->(Ljava/lang/String;)V Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor$DefaultImpls; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor$DefaultImpls;->accept(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorVisitor;Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor$DefaultImpls;->accept(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorVisitor;Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/descriptors/Named; Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses; HSPLkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V PLkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses$classes$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses$classes$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V PLkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses$classes$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses$packageFragments$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses$packageFragments$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V PLkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses$packageFragments$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider; Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt; HSPLkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt;->collectPackageFragmentsOptimizedIfPossible(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V PLkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt;->collectPackageFragmentsOptimizedIfPossible(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt;->isEmpty(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z PLkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt;->isEmpty(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt;->packageFragments(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderKt;->packageFragments(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProviderOptimized; Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function1;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function1;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->access$getKotlinTypeRefinerForOwnerModule$p(Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;)Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->access$getKotlinTypeRefinerForOwnerModule$p(Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;)Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->access$getScopeFactory$p(Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;)Lkotlin/jvm/functions/Function1; PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->access$getScopeFactory$p(Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;)Lkotlin/jvm/functions/Function1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->getScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;->getScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$Companion; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$Companion;->create(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass; PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$Companion;->create(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass; Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;)V PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2;->invoke()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/descriptors/ScopesHolderForClass$scopeForOwnerModule$2;->invoke()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement; HSPLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement$1;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement$1;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Substitutable; Lkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker; Lkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker$EMPTY; HSPLkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker$EMPTY;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker$EMPTY;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker$EMPTY;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker$EMPTY;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterUtilsKt; HSPLkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterUtilsKt;->computeConstructorTypeParameters(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptorWithTypeParameters;)Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterUtilsKt;->computeConstructorTypeParameters(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptorWithTypeParameters;)Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/descriptors/ValueDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/VariableDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/VariableDescriptorWithAccessors; Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Inherited;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Internal;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$InvisibleFake;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Local;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Private;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$PrivateToThis;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Protected;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Public;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibilities$Unknown;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility; HSPLkotlin/reflect/jvm/internal/impl/descriptors/Visibility;->(Ljava/lang/String;Z)V PLkotlin/reflect/jvm/internal/impl/descriptors/Visibility;->(Ljava/lang/String;Z)V Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotated; Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/AnnotatedImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/annotations/AnnotatedImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;)V PLkotlin/reflect/jvm/internal/impl/descriptors/annotations/AnnotatedImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;)V Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; HSPLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion; HSPLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion;->getEMPTY()Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; PLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion;->getEMPTY()Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion$EMPTY$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion$EMPTY$1;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations$Companion$EMPTY$1;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider; Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/ClassDescriptorFactory; Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter; Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer; Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer$None; HSPLkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer$None;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer$None;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer$None;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer$None;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getContextReceivers()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getContextReceivers()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getDefaultType()Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getDefaultType()Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getUnsubstitutedMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;->getUnsubstitutedMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;->invoke()Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;->invoke()Lkotlin/reflect/jvm/internal/impl/types/SimpleType; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$1;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$2; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$3; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$3;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor$3;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/AbstractClassDescriptor;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ConstructorDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;ZLkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ConstructorDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;ZLkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->calculateDispatchReceiverParameter()Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->calculateDispatchReceiverParameter()Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->create(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;ZLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->create(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;ZLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->initialize(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->initialize(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->initialize(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;Ljava/util/List;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl;->initialize(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;Ljava/util/List;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassConstructorDescriptorImpl; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;Z)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;Z)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase;->getSource()Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorBase;->getSource()Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;Ljava/util/Collection;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;ZLkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;Ljava/util/Collection;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;ZLkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->getDeclaredTypeParameters()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->getDeclaredTypeParameters()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->getTypeConstructor()Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->getTypeConstructor()Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->getUnsubstitutedMemberScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->getUnsubstitutedMemberScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->initialize(Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Ljava/util/Set;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->initialize(Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Ljava/util/Set;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->isInner()Z PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ClassDescriptorImpl;->isInner()Z Lkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider;->(Ljava/util/List;Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider;->(Ljava/util/List;Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider;->collectPackageFragments(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider;->collectPackageFragments(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider;->isEmpty(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z PLkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider;->isEmpty(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z Lkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl;->toString(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorImpl;->toString(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorNonRootImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorNonRootImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorNonRootImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorNonRootImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/DeclarationDescriptorNonRootImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/FunctionDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/FunctionDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl;->initialize(Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl;->initialize(Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl;->setReturnType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/FunctionDescriptorImpl;->setReturnType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getEmpty()Z PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getEmpty()Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getFragments()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getFragments()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2;->invoke()Ljava/lang/Boolean; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2;->invoke()Ljava/lang/Boolean; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$empty$2;->invoke()Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2;->invoke()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$fragments$2;->invoke()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1;->invoke()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/LazyPackageViewDescriptorImpl$memberScope$1;->invoke()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor$Companion; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleAwareClassDescriptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependencies; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependenciesImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependenciesImpl;->(Ljava/util/List;Ljava/util/Set;Ljava/util/List;Ljava/util/Set;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependenciesImpl;->(Ljava/util/List;Ljava/util/Set;Ljava/util/List;Ljava/util/Set;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependenciesImpl;->getAllDependencies()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependenciesImpl;->getAllDependencies()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/platform/TargetPlatform;Ljava/util/Map;Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/platform/TargetPlatform;Ljava/util/Map;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/platform/TargetPlatform;Ljava/util/Map;Lkotlin/reflect/jvm/internal/impl/name/Name;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns;Lkotlin/reflect/jvm/internal/impl/platform/TargetPlatform;Ljava/util/Map;Lkotlin/reflect/jvm/internal/impl/name/Name;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->accept(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorVisitor;Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->accept(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptorVisitor;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getDependencies$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependencies; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getDependencies$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependencies; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getPackageFragmentProviderForModuleContent$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getPackageFragmentProviderForModuleContent$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getPackageViewDescriptorFactory$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getPackageViewDescriptorFactory$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getStorageManager$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$getStorageManager$p(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$isInitialized(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Z PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->access$isInitialized(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->assertValid()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->assertValid()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getBuiltIns()Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getBuiltIns()Lkotlin/reflect/jvm/internal/impl/builtins/KotlinBuiltIns; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getCapability(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getCapability(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getPackageFragmentProvider()Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->getPackageFragmentProvider()Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->initialize(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->initialize(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies(Ljava/util/List;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies(Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies(Ljava/util/List;Ljava/util/Set;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies(Ljava/util/List;Ljava/util/Set;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependencies;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDependencies;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies([Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->setDependencies([Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->toString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;->toString()Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2;->invoke()Lkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packageFragmentProviderForWholeModuleWithDependencies$2;->invoke()Lkotlin/reflect/jvm/internal/impl/descriptors/impl/CompositePackageFragmentProvider; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl$packages$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->getContainingDeclaration()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageFragmentDescriptorImpl;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion;->getCAPABILITY()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Companion;->getCAPABILITY()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default;->compute(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PackageViewDescriptorFactory$Default;->compute(Lkotlin/reflect/jvm/internal/impl/descriptors/impl/ModuleDescriptorImpl;Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageViewDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;ZLkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;ZZZZZZ)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;ZLkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;ZZZZZZ)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl;->create(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;ZLkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;ZZZZZZ)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl; PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl;->create(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;ZLkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/descriptors/CallableMemberDescriptor$Kind;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;ZZZZZZ)Lkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl;->setType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/PropertyDescriptorImpl;->setType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/SubpackagesScope; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/SubpackagesScope;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/SubpackagesScope;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorImpl;->setOutType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorImpl;->setOutType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)V Lkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorWithInitializerImpl; HSPLkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorWithInitializerImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;ZLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V PLkotlin/reflect/jvm/internal/impl/descriptors/impl/VariableDescriptorWithInitializerImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations;Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;ZLkotlin/reflect/jvm/internal/impl/descriptors/SourceElement;)V Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility; HSPLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage; HSPLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility; HSPLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/PackagePartScopeCache; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/PackagePartScopeCache;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/PackagePartScopeCache;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;)V Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure;->loadClassAnnotations(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectClassStructure;->loadClassAnnotations(Ljava/lang/Class;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor;)V Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->(Ljava/lang/ClassLoader;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->(Ljava/lang/ClassLoader;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->findClass(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;)Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->findClass(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;)Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->findPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;Z)Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->findPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;Z)Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->knownClassNamesInPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/util/Set; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinder;->knownClassNamesInPackage(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/util/Set; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinderKt; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinderKt;->tryLoadClass(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectJavaClassFinderKt;->tryLoadClass(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass$Factory; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass$Factory;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass$Factory;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass$Factory;->create(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass$Factory;->create(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;->(Ljava/lang/ClassLoader;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;->(Ljava/lang/ClassLoader;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;->findBuiltInsData(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/io/InputStream; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;->findBuiltInsData(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/io/InputStream; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;->findKotlinClassOrContent(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder$Result; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinder;->findKotlinClassOrContent(Lkotlin/reflect/jvm/internal/impl/name/ClassId;Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder$Result; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinderKt; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinderKt;->access$toRuntimeFqName(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClassFinderKt;->access$toRuntimeFqName(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeErrorReporter; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeErrorReporter;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeErrorReporter;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeErrorReporter;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeErrorReporter;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/PackagePartScopeCache;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/PackagePartScopeCache;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData$Companion; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData$Companion;->create(Ljava/lang/ClassLoader;)Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData$Companion;->create(Ljava/lang/ClassLoader;)Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeModuleData; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory;->source(Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaElement;)Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElement; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory;->source(Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaElement;)Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElement; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory$RuntimeSourceElement; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory$RuntimeSourceElement;->(Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory$RuntimeSourceElement;->(Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory$RuntimeSourceElement;->getJavaElement()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/RuntimeSourceElementFactory$RuntimeSourceElement;->getJavaElement()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->initCache()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->initCache()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->loadIsSealed(Ljava/lang/Class;)Ljava/lang/Boolean; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader;->loadIsSealed(Ljava/lang/Class;)Ljava/lang/Boolean; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache;->(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache;->(Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache;->isSealed()Ljava/lang/reflect/Method; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/Java16SealedRecordLoader$Cache;->isSealed()Ljava/lang/reflect/Method; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->()V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getClassId(Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getFunctionClassArity(Ljava/lang/Class;)Ljava/lang/Integer; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getFunctionClassArity(Ljava/lang/Class;)Ljava/lang/Integer; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getPrimitiveByWrapper(Ljava/lang/Class;)Ljava/lang/Class; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getPrimitiveByWrapper(Ljava/lang/Class;)Ljava/lang/Class; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getSafeClassLoader(Ljava/lang/Class;)Ljava/lang/ClassLoader; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getSafeClassLoader(Ljava/lang/Class;)Ljava/lang/ClassLoader; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getWrapperByPrimitive(Ljava/lang/Class;)Ljava/lang/Class; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectClassUtilKt;->getWrapperByPrimitive(Ljava/lang/Class;)Ljava/lang/Class; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaAnnotationOwner; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->(Ljava/lang/Class;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->(Ljava/lang/Class;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getElement()Ljava/lang/Class; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getElement()Ljava/lang/Class; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getLightClassOriginKind()Lkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getLightClassOriginKind()Lkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getModifiers()I PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getModifiers()I HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getOuterClass()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getOuterClass()Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getOuterClass()Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getOuterClass()Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getTypeParameters()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getTypeParameters()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getVisibility()Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->getVisibility()Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isAbstract()Z PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isAbstract()Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isAnnotationType()Z PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isAnnotationType()Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isEnum()Z PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isEnum()Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isFinal()Z PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isFinal()Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isInterface()Z PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isInterface()Z HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isSealed()Z PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaClass;->isSealed()Z Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement;->()V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaElement;->()V Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaModifierListOwner; Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaPackage; HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaPackage;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;)V PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaPackage;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;)V HSPLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaPackage;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/descriptors/runtime/structure/ReflectJavaPackage;->getFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; Lkotlin/reflect/jvm/internal/impl/incremental/UtilsKt; HSPLkotlin/reflect/jvm/internal/impl/incremental/UtilsKt;->record(Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentDescriptor;Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/incremental/UtilsKt;->record(Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentDescriptor;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/incremental/UtilsKt;->recordPackageLookup(Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;Ljava/lang/String;Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/incremental/UtilsKt;->recordPackageLookup(Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;Ljava/lang/String;Ljava/lang/String;)V Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation; Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker; Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker$DO_NOTHING; HSPLkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker$DO_NOTHING;->()V PLkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker$DO_NOTHING;->()V HSPLkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker$DO_NOTHING;->()V PLkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker$DO_NOTHING;->()V Lkotlin/reflect/jvm/internal/impl/incremental/components/NoLookupLocation; HSPLkotlin/reflect/jvm/internal/impl/incremental/components/NoLookupLocation;->()V PLkotlin/reflect/jvm/internal/impl/incremental/components/NoLookupLocation;->()V HSPLkotlin/reflect/jvm/internal/impl/incremental/components/NoLookupLocation;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/incremental/components/NoLookupLocation;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver; HSPLkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver;->()V PLkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;)V PLkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;)V Lkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/AbstractAnnotationTypeQualifierResolver$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType; HSPLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->()V PLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->(Ljava/lang/String;ILjava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->(Ljava/lang/String;ILjava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->getJavaTarget()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->getJavaTarget()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->values()[Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType; PLkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType;->values()[Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationQualifierApplicabilityType; Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver; HSPLkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;)V PLkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;)V Lkotlin/reflect/jvm/internal/impl/load/java/ErasedOverridabilityCondition; HSPLkotlin/reflect/jvm/internal/impl/load/java/ErasedOverridabilityCondition;->()V PLkotlin/reflect/jvm/internal/impl/load/java/ErasedOverridabilityCondition;->()V Lkotlin/reflect/jvm/internal/impl/load/java/FieldOverridabilityCondition; HSPLkotlin/reflect/jvm/internal/impl/load/java/FieldOverridabilityCondition;->()V PLkotlin/reflect/jvm/internal/impl/load/java/FieldOverridabilityCondition;->()V Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder; Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$$Util; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$$Util;->findPackage$default(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/name/FqName;ZILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage; PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$$Util;->findPackage$default(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/name/FqName;ZILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage; Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;[BLkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;[BLkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;[BLkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;->(Lkotlin/reflect/jvm/internal/impl/name/ClassId;[BLkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;->getClassId()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder$Request;->getClassId()Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker; Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default;->reportClass(Lkotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker$Default;->reportClass(Lkotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaClassDescriptor;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities;->toDescriptorVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; PLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities;->toDescriptorVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; Lkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$1;->(Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$PackageVisibility;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$2;->(Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedStaticVisibility;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$3; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$3;->(Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaDescriptorVisibilities$3;->(Lkotlin/reflect/jvm/internal/impl/descriptors/java/JavaVisibilities$ProtectedAndPackage;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition;->()V Lkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaIncompatibilityRulesOverridabilityCondition$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaModuleAnnotationsProvider; Lkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultJsr305Settings$default(Lkotlin/KotlinVersion;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultJsr305Settings$default(Lkotlin/KotlinVersion;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultJsr305Settings(Lkotlin/KotlinVersion;)Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultJsr305Settings(Lkotlin/KotlinVersion;)Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultMigrationJsr305ReportLevelForGivenGlobal(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultMigrationJsr305ReportLevelForGivenGlobal(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultReportLevelForAnnotation(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getDefaultReportLevelForAnnotation(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getJSPECIFY_ANNOTATIONS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getJSPECIFY_ANNOTATIONS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getReportLevelForAnnotation$default(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates;Lkotlin/KotlinVersion;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getReportLevelForAnnotation$default(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates;Lkotlin/KotlinVersion;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getReportLevelForAnnotation(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates;Lkotlin/KotlinVersion;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationSettingsKt;->getReportLevelForAnnotation(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates;Lkotlin/KotlinVersion;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; Lkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/KotlinVersion;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/KotlinVersion;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/KotlinVersion;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/KotlinVersion;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->access$getDEFAULT$cp()Lkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->access$getDEFAULT$cp()Lkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->getReportLevelBefore()Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->getReportLevelBefore()Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->getSinceVersion()Lkotlin/KotlinVersion; PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus;->getSinceVersion()Lkotlin/KotlinVersion; Lkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaNullabilityAnnotationsStatus$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->(Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->(Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->access$getDEFAULT$cp()Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState; PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->access$getDEFAULT$cp()Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->getDisabledDefaultAnnotations()Z PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;->getDisabledDefaultAnnotations()Z Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->()V PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; PLkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState$Companion$DEFAULT$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings; HSPLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Ljava/util/Map;)V PLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Ljava/util/Map;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;->(Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;->isDisabled()Z PLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;->isDisabled()Z Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings$description$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings$description$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;)V PLkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings$description$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/Jsr305Settings;)V Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates; HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates;->()V PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates;->()V Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion;->()V PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion;->()V PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion;->getEMPTY()Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates; PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates$Companion;->getEMPTY()Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStates; Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl; HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;->(Ljava/util/Map;)V PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;->(Ljava/util/Map;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;->get(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;->get(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;->getStates()Ljava/util/Map; PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;->getStates()Ljava/util/Map; Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;)V PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/NullabilityAnnotationStatesImpl$cache$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel; HSPLkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;->()V PLkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;->(Ljava/lang/String;ILjava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/load/java/ReportLevel;->(Ljava/lang/String;ILjava/lang/String;)V Lkotlin/reflect/jvm/internal/impl/load/java/ReportLevel$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/ReportLevel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/ReportLevel$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/UtilsKt; HSPLkotlin/reflect/jvm/internal/impl/load/java/UtilsKt;->toDescriptorVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; PLkotlin/reflect/jvm/internal/impl/load/java/UtilsKt;->toDescriptorVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/Visibility;)Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator; Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator$DoNothing; HSPLkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator$DoNothing;->()V PLkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator$DoNothing;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator$DoNothing;->()V PLkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator$DoNothing;->()V Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache; HSPLkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;->()V PLkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;->()V Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache$1;->()V PLkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache$1;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache$1;->recordClass(Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache$1;->recordClass(Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)V Lkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator; HSPLkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator;->()V PLkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator;->()V Lkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator$1;->()V PLkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator$1;->()V Lkotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaClassDescriptor; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt;->childForClassOrPackage$default(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner;IILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt;->childForClassOrPackage$default(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner;IILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt;->childForClassOrPackage(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner;I)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt;->childForClassOrPackage(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner;I)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt$childForClassOrPackage$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt$childForClassOrPackage$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/ContextKt$childForClassOrPackage$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassOrPackageFragmentDescriptor;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver;Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;Lkotlin/reflect/jvm/internal/impl/load/java/JavaModuleAnnotationsProvider;Lkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver;Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;Lkotlin/reflect/jvm/internal/impl/load/java/JavaModuleAnnotationsProvider;Lkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver;Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;Lkotlin/reflect/jvm/internal/impl/load/java/JavaModuleAnnotationsProvider;Lkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/load/java/components/SignaturePropagator;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaPropertyInitializerEvaluator;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/SupertypeLoopChecker;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/builtins/ReflectionTypes;Lkotlin/reflect/jvm/internal/impl/load/java/AnnotationTypeQualifierResolver;Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState;Lkotlin/reflect/jvm/internal/impl/load/java/JavaModuleAnnotationsProvider;Lkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getDeserializedDescriptorResolver()Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getDeserializedDescriptorResolver()Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getFinder()Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getFinder()Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getJavaClassesTracker()Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getJavaClassesTracker()Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassesTracker; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getJavaResolverCache()Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getJavaResolverCache()Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getJavaTypeEnhancementState()Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getJavaTypeEnhancementState()Lkotlin/reflect/jvm/internal/impl/load/java/JavaTypeEnhancementState; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getKotlinClassFinder()Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getKotlinClassFinder()Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getKotlinTypeChecker()Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getKotlinTypeChecker()Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getLookupTracker()Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getLookupTracker()Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getSourceElementFactory()Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getSourceElementFactory()Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getStorageManager()Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;->getStorageManager()Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings$Default; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings$Default;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings$Default;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings$Default;->()V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner;Z)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner;Z)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations$annotationDescriptors$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations$annotationDescriptors$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations$annotationDescriptors$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotations;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotationsKt; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotationsKt;->resolveAnnotations(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner;)Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaAnnotationsKt;->resolveAnnotations(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner;)Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->access$getC$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->access$getC$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->collectPackageFragments(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->collectPackageFragments(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->getPackageFragment(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->getPackageFragment(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->isEmpty(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;->isEmpty(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1;->invoke()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider$getPackageFragment$1;->invoke()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver;Lkotlin/Lazy;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver;Lkotlin/Lazy;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getComponents()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getComponents()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverComponents; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getStorageManager()Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getStorageManager()Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getTypeParameterResolver()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;->getTypeParameterResolver()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner;I)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner;I)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver$resolve$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver$resolve$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver$resolve$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaTypeParameterResolver;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/SingleModuleClassResolver; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/SingleModuleClassResolver;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/SingleModuleClassResolver;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/SingleModuleClassResolver;->setResolver(Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/SingleModuleClassResolver;->setResolver(Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver$EMPTY; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver$EMPTY;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver$EMPTY;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver$EMPTY;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver$EMPTY;->()V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->recordLookup(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;->recordLookup(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope$kotlinScopes$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope$kotlinScopes$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope$kotlinScopes$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/JvmPackageScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->access$getAdditionalSupertypeClassDescriptor$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->access$getAdditionalSupertypeClassDescriptor$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->access$getC$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->access$getC$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->access$getUnsubstitutedMemberScope$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->access$getUnsubstitutedMemberScope$p(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getDeclaredTypeParameters()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getDeclaredTypeParameters()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getJClass()Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getJClass()Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getKind()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getKind()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getTypeConstructor()Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getTypeConstructor()Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getUnsubstitutedMemberScope(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getVisibility()Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->getVisibility()Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->isExpect()Z PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->isExpect()Z HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->isInner()Z PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;->isInner()Z Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor;->getDeclarationDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor;->getDeclarationDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor;->getParameters()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor;->getParameters()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1;->invoke()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$LazyJavaClassTypeConstructor$parameters$1;->invoke()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1;->invoke()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$declaredParameters$1;->invoke()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$moduleAnnotations$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$moduleAnnotations$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$moduleAnnotations$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1;->invoke(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassDescriptor$scopeHolder$1;->invoke(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;ZLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;ZLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;ZLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;ZLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$constructors$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$constructors$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$constructors$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$enumEntryIndex$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$enumEntryIndex$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$enumEntryIndex$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$generatedNestedClassNames$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$generatedNestedClassNames$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$generatedNestedClassNames$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$nestedClassIndex$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$nestedClassIndex$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$nestedClassIndex$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$nestedClasses$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$nestedClasses$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope$nestedClasses$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaClassMemberScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;->getMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;->getMemberScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$binaryClasses$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$binaryClasses$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$binaryClasses$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$partToFacade$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$partToFacade$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$partToFacade$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$subPackages$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$subPackages$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment$subPackages$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->access$getJvmMetadataVersion(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;)Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->access$getJvmMetadataVersion(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;)Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->access$resolveKotlinBinaryClass(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->access$resolveKotlinBinaryClass(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->findClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->findClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->getOwnerDescriptor()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;->getOwnerDescriptor()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageFragment; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->getJavaClass()Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->getJavaClass()Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->getName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->hashCode()I PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;->hashCode()I Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$Found; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$NotFound; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$NotFound;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$NotFound;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$NotFound;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$NotFound;->()V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$KotlinClassLookupResult$SyntheticClass; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1;->invoke(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$classes$1;->invoke(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$FindClassRequest;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1;->invoke()Ljava/util/Set; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaPackageScope$knownClassNamesInPackage$1;->invoke()Ljava/util/Set; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->getC()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;->getC()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext; Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$allDescriptors$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$allDescriptors$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$allDescriptors$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$classNamesLazy$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$classNamesLazy$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$classNamesLazy$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredField$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredField$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredField$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredFunctions$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredFunctions$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredFunctions$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredMemberIndex$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredMemberIndex$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$declaredMemberIndex$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$functionNamesLazy$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$functionNamesLazy$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$functionNamesLazy$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$functions$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$functions$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$functions$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$properties$1; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$properties$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$properties$1;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$propertyNamesLazy$2; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$propertyNamesLazy$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope$propertyNamesLazy$2;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaScope;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaStaticClassScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaStaticClassScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaClassDescriptor;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaStaticClassScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass;Lkotlin/reflect/jvm/internal/impl/load/java/descriptors/JavaClassDescriptor;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaStaticScope; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaStaticScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/descriptors/LazyJavaStaticScope;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeResolver; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver;)V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/types/JavaTypeResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaResolverContext;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/TypeParameterResolver;)V Lkotlin/reflect/jvm/internal/impl/load/java/lazy/types/RawProjectionComputer; HSPLkotlin/reflect/jvm/internal/impl/load/java/lazy/types/RawProjectionComputer;->()V PLkotlin/reflect/jvm/internal/impl/load/java/lazy/types/RawProjectionComputer;->()V Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElement; Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaAnnotationOwner; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClass; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaClassifier; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaElement; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaModifierListOwner; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaNamedElement; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaPackage; Lkotlin/reflect/jvm/internal/impl/load/java/structure/JavaTypeParameterListOwner; Lkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind; HSPLkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind;->()V PLkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind;->()V HSPLkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/load/java/structure/LightClassOriginKind;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/JavaTypeEnhancement; HSPLkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/JavaTypeEnhancement;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings;)V PLkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/JavaTypeEnhancement;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/JavaResolverSettings;)V Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement; HSPLkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement;->(Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/JavaTypeEnhancement;)V PLkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/SignatureEnhancement;->(Lkotlin/reflect/jvm/internal/impl/load/java/typeEnhancement/JavaTypeEnhancement;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$storage$1; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$storage$1;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader$storage$1;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationLoader; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationLoader;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/AbstractBinaryClassAnnotationLoader;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->setJvmMetadataVersion(Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;->setJvmMetadataVersion(Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImplKt; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImplKt;->createBinaryClassAnnotationAndConstantLoader(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl; PLkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImplKt;->createBinaryClassAnnotationAndConstantLoader(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl; Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/load/kotlin/JavaClassDataFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/load/kotlin/JavaClassDataFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;->getComponents()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;->getComponents()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion;->createModuleData(Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion;->createModuleData(Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData; Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->getDeserializationComponentsForJava()Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->getDeserializationComponentsForJava()Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->getDeserializedDescriptorResolver()Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava$Companion$ModuleData;->getDeserializedDescriptorResolver()Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver; Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt;->makeDeserializationComponentsForJava(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt;->makeDeserializationComponentsForJava(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt;->makeLazyJavaPackageFragmentProvider$default(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt;->makeLazyJavaPackageFragmentProvider$default(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt;->makeLazyJavaPackageFragmentProvider(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt;->makeLazyJavaPackageFragmentProvider(Lkotlin/reflect/jvm/internal/impl/load/java/JavaClassFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/load/java/sources/JavaSourceElementFactory;Lkotlin/reflect/jvm/internal/impl/load/java/lazy/ModuleClassResolver;Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider;)Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt$makeLazyJavaPackageFragmentProvider$javaResolverComponents$1; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt$makeLazyJavaPackageFragmentProvider$javaResolverComponents$1;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJavaKt$makeLazyJavaPackageFragmentProvider$javaResolverComponents$1;->()V Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->getComponents()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->getComponents()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->setComponents(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->setComponents(Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializationComponentsForJava;)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->setComponents(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;->setComponents(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/JavaClassDataFinder; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/JavaClassDataFinder;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/JavaClassDataFinder;->(Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder;Lkotlin/reflect/jvm/internal/impl/load/kotlin/DeserializedDescriptorResolver;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/JavaFlexibleTypeDeserializer; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/JavaFlexibleTypeDeserializer;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/JavaFlexibleTypeDeserializer;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/JavaFlexibleTypeDeserializer;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/JavaFlexibleTypeDeserializer;->()V Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder; Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder$Result; Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinClassFinder$Result$ClassFileContent; Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass; Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinaryClass$AnnotationVisitor; Lkotlin/reflect/jvm/internal/impl/load/kotlin/KotlinJvmBinarySourceElement; Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider; Lkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/PackagePartProvider$Empty;->()V Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind;->(Ljava/lang/String;II)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind;->(Ljava/lang/String;II)V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind;->values()[Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind; PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind;->values()[Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind; Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind$Companion; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader$Kind$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->()V HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->createHeader(Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader; PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->createHeader(Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;)Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->createHeaderWithDefaultMetadataVersion()Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader; PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->createHeaderWithDefaultMetadataVersion()Lkotlin/reflect/jvm/internal/impl/load/kotlin/header/KotlinClassHeader; HSPLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->visitEnd()V PLkotlin/reflect/jvm/internal/impl/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor;->visitEnd()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type;->(Ljava/lang/String;II)V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type;->(Ljava/lang/String;II)V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$ValueOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$AnnotationOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Class$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ClassOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ConstructorOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Contract$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ContractOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntry$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$EnumEntryOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$FunctionOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$PackageOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$PropertyOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance;->(Ljava/lang/String;II)V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter$Variance;->(Ljava/lang/String;II)V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameterOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTable$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeTableOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameter$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$ValueParameterOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable; PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable; Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTable$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$VersionRequirementTableOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsProtoBuf; HSPLkotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsProtoBuf;->()V PLkotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsProtoBuf;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsProtoBuf;->registerAllExtensions(Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V PLkotlin/reflect/jvm/internal/impl/metadata/builtins/BuiltInsProtoBuf;->registerAllExtensions(Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion; HSPLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->()V PLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->([I)V PLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->([I)V HSPLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->getMajor()I PLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->getMajor()I HSPLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->getMinor()I PLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;->getMinor()I Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion$Companion; HSPLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf;->registerAllExtensions(Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf;->registerAllExtensions(Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature; PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature; Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignature$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmFieldSignatureOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature; PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature; Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignature$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmMethodSignatureOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature; PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->getDefaultInstance()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->initFields()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature;->initFields()V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature$1; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature$1;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignature$1;->()V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/JvmProtoBuf$JvmPropertySignatureOrBuilder; Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->([I)V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->([I)V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->([IZ)V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->([IZ)V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->next()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;->next()Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion$Companion; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->getEXTENSION_REGISTRY()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; PLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->getEXTENSION_REGISTRY()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;Z)V PLkotlin/reflect/jvm/internal/impl/name/ClassId;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;Z)V HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/name/ClassId;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->asSingleFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/ClassId;->asSingleFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->createNestedClassId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/ClassId;->createNestedClassId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/ClassId;->getPackageFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->getRelativeClassName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/ClassId;->getRelativeClassName()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->getShortClassName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/ClassId;->getShortClassName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->hashCode()I PLkotlin/reflect/jvm/internal/impl/name/ClassId;->hashCode()I HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->isLocal()Z PLkotlin/reflect/jvm/internal/impl/name/ClassId;->isLocal()Z HSPLkotlin/reflect/jvm/internal/impl/name/ClassId;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/ClassId;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->()V PLkotlin/reflect/jvm/internal/impl/name/FqName;->()V HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->(Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/name/FqName;->(Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->(Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;)V PLkotlin/reflect/jvm/internal/impl/name/FqName;->(Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;)V HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->(Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V PLkotlin/reflect/jvm/internal/impl/name/FqName;->(Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/FqName;)V HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->asString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/FqName;->asString()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->child(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/FqName;->child(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->equals(Ljava/lang/Object;)Z PLkotlin/reflect/jvm/internal/impl/name/FqName;->equals(Ljava/lang/Object;)Z HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->hashCode()I PLkotlin/reflect/jvm/internal/impl/name/FqName;->hashCode()I HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->isRoot()Z PLkotlin/reflect/jvm/internal/impl/name/FqName;->isRoot()Z HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->parent()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/FqName;->parent()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->pathSegments()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/name/FqName;->pathSegments()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->shortName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/FqName;->shortName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->shortNameOrSpecial()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/FqName;->shortNameOrSpecial()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->startsWith(Lkotlin/reflect/jvm/internal/impl/name/Name;)Z PLkotlin/reflect/jvm/internal/impl/name/FqName;->startsWith(Lkotlin/reflect/jvm/internal/impl/name/Name;)Z HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->toString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/FqName;->toString()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->toUnsafe()Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/name/FqName;->toUnsafe()Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/name/FqName;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/FqName;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqName; Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->()V PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->()V HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;Lkotlin/reflect/jvm/internal/impl/name/Name;)V HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->asString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->asString()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->child(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->child(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->compute()V PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->compute()V HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->equals(Ljava/lang/Object;)Z PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->equals(Ljava/lang/Object;)Z HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->hashCode()I HPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->hashCode()I HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->isRoot()Z HPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->isRoot()Z HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->parent()Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->parent()Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->pathSegments()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->pathSegments()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->shortName()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->shortName()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->shortNameOrSpecial()Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->shortNameOrSpecial()Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->startsWith(Lkotlin/reflect/jvm/internal/impl/name/Name;)Z PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->startsWith(Lkotlin/reflect/jvm/internal/impl/name/Name;)Z HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->toSafe()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->toSafe()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->toString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->toString()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe;->topLevel(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$1; HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$1;->()V PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$1;->()V HSPLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt; HSPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->findValueForMostSpecificFqname(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Map;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->findValueForMostSpecificFqname(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Map;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->isChildOf(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z PLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->isChildOf(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z HSPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->isSubpackageOf(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z PLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->isSubpackageOf(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Z HSPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->parentOrNull(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->parentOrNull(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->tail(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/FqNamesUtilKt;->tail(Lkotlin/reflect/jvm/internal/impl/name/FqName;Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/name/FqName; Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/Name;->(Ljava/lang/String;Z)V PLkotlin/reflect/jvm/internal/impl/name/Name;->(Ljava/lang/String;Z)V HSPLkotlin/reflect/jvm/internal/impl/name/Name;->asString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/Name;->asString()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/name/Name;->equals(Ljava/lang/Object;)Z PLkotlin/reflect/jvm/internal/impl/name/Name;->equals(Ljava/lang/Object;)Z HSPLkotlin/reflect/jvm/internal/impl/name/Name;->getIdentifier()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/Name;->getIdentifier()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/name/Name;->guessByFirstCharacter(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/Name;->guessByFirstCharacter(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/Name;->hashCode()I PLkotlin/reflect/jvm/internal/impl/name/Name;->hashCode()I HSPLkotlin/reflect/jvm/internal/impl/name/Name;->identifier(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/Name;->identifier(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/Name;->isSpecial()Z PLkotlin/reflect/jvm/internal/impl/name/Name;->isSpecial()Z HSPLkotlin/reflect/jvm/internal/impl/name/Name;->special(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; PLkotlin/reflect/jvm/internal/impl/name/Name;->special(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/Name; HSPLkotlin/reflect/jvm/internal/impl/name/Name;->toString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/name/Name;->toString()Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/name/SpecialNames; HSPLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->()V PLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->()V HSPLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->()V PLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->()V HSPLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->isSafeIdentifier(Lkotlin/reflect/jvm/internal/impl/name/Name;)Z PLkotlin/reflect/jvm/internal/impl/name/SpecialNames;->isSafeIdentifier(Lkotlin/reflect/jvm/internal/impl/name/Name;)Z Lkotlin/reflect/jvm/internal/impl/name/StandardClassIds; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->()V PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->()V HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->()V PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->()V HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getArray()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getArray()Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ANNOTATION_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ANNOTATION_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_COLLECTIONS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_COLLECTIONS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_COROUTINES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_COROUTINES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ENUMS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_ENUMS_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_KOTLIN_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_KOTLIN_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_RANGES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_RANGES_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_REFLECT_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getBASE_REFLECT_PACKAGE()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKClass()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKClass()Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKFunction()Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIds;->getKFunction()Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->()V PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->()V HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$annotationId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$annotationId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$baseId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$baseId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$collectionsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$collectionsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$coroutinesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$coroutinesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$enumsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$enumsId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$inverseMap(Ljava/util/Map;)Ljava/util/Map; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$inverseMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$primitiveArrayId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$primitiveArrayId(Lkotlin/reflect/jvm/internal/impl/name/Name;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$rangesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$rangesId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$reflectId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$reflectId(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$unsignedId(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; PLkotlin/reflect/jvm/internal/impl/name/StandardClassIdsKt;->access$unsignedId(Lkotlin/reflect/jvm/internal/impl/name/ClassId;)Lkotlin/reflect/jvm/internal/impl/name/ClassId; Lkotlin/reflect/jvm/internal/impl/protobuf/AbstractMessageLite; HSPLkotlin/reflect/jvm/internal/impl/protobuf/AbstractMessageLite;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/AbstractMessageLite;->()V Lkotlin/reflect/jvm/internal/impl/protobuf/AbstractParser; HSPLkotlin/reflect/jvm/internal/impl/protobuf/AbstractParser;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/AbstractParser;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/AbstractParser;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/AbstractParser;->()V Lkotlin/reflect/jvm/internal/impl/protobuf/ByteString; HSPLkotlin/reflect/jvm/internal/impl/protobuf/ByteString;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/ByteString;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/ByteString;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/ByteString;->()V Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->(I)V PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->(I)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->add(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;)V PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->add(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->getEmptyRegistry()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->getEmptyRegistry()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->newInstance()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;->newInstance()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite$ObjectIntPair; HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite$ObjectIntPair;->(Ljava/lang/Object;I)V PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite$ObjectIntPair;->(Ljava/lang/Object;I)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite$ObjectIntPair;->hashCode()I PLkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite$ObjectIntPair;->hashCode()I Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet; HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->(I)V PLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->(I)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->makeImmutable()V PLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->makeImmutable()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->newFieldSet()Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet; PLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->newFieldSet()Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet; Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet$FieldDescriptorLite; Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite; HSPLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite;->newRepeatedGeneratedExtension(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;ZLjava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension; PLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite;->newRepeatedGeneratedExtension(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;ZLjava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension; HSPLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite;->newSingularGeneratedExtension(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Ljava/lang/Object;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension; PLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite;->newSingularGeneratedExtension(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Ljava/lang/Object;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;Ljava/lang/Class;)Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension; Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtendableMessage; HSPLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtendableMessage;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtendableMessage;->()V Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtendableMessageOrBuilder; Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtensionDescriptor; HSPLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtensionDescriptor;->(Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;ZZ)V PLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtensionDescriptor;->(Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLiteMap;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;ZZ)V Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension; HSPLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;->(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Ljava/lang/Object;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtensionDescriptor;Ljava/lang/Class;)V PLkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;->(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Ljava/lang/Object;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$ExtensionDescriptor;Ljava/lang/Class;)V Lkotlin/reflect/jvm/internal/impl/protobuf/Internal$EnumLite; Lkotlin/reflect/jvm/internal/impl/protobuf/InvalidProtocolBufferException; Lkotlin/reflect/jvm/internal/impl/protobuf/LiteralByteString; HSPLkotlin/reflect/jvm/internal/impl/protobuf/LiteralByteString;->([B)V PLkotlin/reflect/jvm/internal/impl/protobuf/LiteralByteString;->([B)V Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite; Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLiteOrBuilder; Lkotlin/reflect/jvm/internal/impl/protobuf/Parser; Lkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->(I)V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->(I)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getNumArrayEntries()I PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getNumArrayEntries()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getOverflowEntries()Ljava/lang/Iterable; PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->getOverflowEntries()Ljava/lang/Iterable; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->isImmutable()Z PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->isImmutable()Z HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->makeImmutable()V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->makeImmutable()V Lkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1;->(I)V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1;->(I)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1;->makeImmutable()V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$1;->makeImmutable()V Lkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet;->access$700()Ljava/util/Iterator; PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet;->access$700()Ljava/util/Iterator; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet;->iterable()Ljava/lang/Iterable; PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet;->iterable()Ljava/lang/Iterable; Lkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1;->hasNext()Z PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$1;->hasNext()Z Lkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2; HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2;->iterator()Ljava/util/Iterator; PLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap$EmptySet$2;->iterator()Ljava/util/Iterator; Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType; HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;I)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;I)V HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;II)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;II)V Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$1; HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$1;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$1;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$2; HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$2;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$2;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$3; HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$3;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$3;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$4; HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$4;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType$4;->(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;)V Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType; HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;->()V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;->()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;->(Ljava/lang/Object;ILjava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$JavaType;->(Ljava/lang/Object;ILjava/lang/String;)V Lkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy; HSPLkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy;->()V PLkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy;->(Ljava/lang/String;IZI)V PLkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy;->(Ljava/lang/String;IZI)V HSPLkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy;->(Ljava/lang/String;IZZ)V PLkotlin/reflect/jvm/internal/impl/renderer/AnnotationArgumentsRenderingPolicy;->(Ljava/lang/String;IZZ)V Lkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy; Lkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$FULLY_QUALIFIED; HSPLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$FULLY_QUALIFIED;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$FULLY_QUALIFIED;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$FULLY_QUALIFIED;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$FULLY_QUALIFIED;->()V Lkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SHORT; HSPLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SHORT;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SHORT;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SHORT;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SHORT;->()V Lkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SOURCE_CODE_QUALIFIED; HSPLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SOURCE_CODE_QUALIFIED;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SOURCE_CODE_QUALIFIED;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SOURCE_CODE_QUALIFIED;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy$SOURCE_CODE_QUALIFIED;->()V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer;->()V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion;->withOptions(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion;->withOptions(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer; Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITHOUT_SUPERTYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_MODIFIERS$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$COMPACT_WITH_SHORT_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$DEBUG_TEXT$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$HTML$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$ONLY_NAMES_WITH_SHORT_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$Companion$SHORT_NAMES_IN_TYPES$1;->invoke(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$ValueParametersHandler; Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$ValueParametersHandler$DEFAULT; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$ValueParametersHandler$DEFAULT;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$ValueParametersHandler$DEFAULT;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$ValueParametersHandler$DEFAULT;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRenderer$ValueParametersHandler$DEFAULT;->()V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->access$renderName(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/lang/StringBuilder;Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->access$renderName(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/lang/StringBuilder;Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->escape(Ljava/lang/String;)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->escape(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->getBoldOnlyForNamesInHtml()Z PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->getBoldOnlyForNamesInHtml()Z HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->getTextFormat()Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->getTextFormat()Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->getWithDefinedIn()Z PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->getWithDefinedIn()Z HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->render(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->render(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->renderName(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/lang/StringBuilder;Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->renderName(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/lang/StringBuilder;Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->renderName(Lkotlin/reflect/jvm/internal/impl/name/Name;Z)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;->renderName(Lkotlin/reflect/jvm/internal/impl/name/Name;Z)Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor;->(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor;->(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor;->visitModuleDeclaration(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor;->visitModuleDeclaration(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor;->visitModuleDeclaration(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Ljava/lang/StringBuilder;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$RenderDeclarationDescriptorVisitor;->visitModuleDeclaration(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Ljava/lang/StringBuilder;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$functionTypeAnnotationsRenderer$2; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$functionTypeAnnotationsRenderer$2;->(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl$functionTypeAnnotationsRenderer$2;->(Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererImpl;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier;->(ILjava/lang/String;Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier;->(ILjava/lang/String;Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier;->values()[Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier;->values()[Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier; Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier$Companion; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererModifier$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptions; Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->getBoldOnlyForNamesInHtml()Z PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->getBoldOnlyForNamesInHtml()Z HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->getTextFormat()Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat; PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->getTextFormat()Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->getWithDefinedIn()Z PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->getWithDefinedIn()Z HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->isLocked()Z PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->isLocked()Z HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->lock()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->lock()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setClassifierNamePolicy(Lkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setClassifierNamePolicy(Lkotlin/reflect/jvm/internal/impl/renderer/ClassifierNamePolicy;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setDebugMode(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setDebugMode(Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setModifiers(Ljava/util/Set;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setModifiers(Ljava/util/Set;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setParameterNameRenderingPolicy(Lkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setParameterNameRenderingPolicy(Lkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setReceiverAfterName(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setReceiverAfterName(Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setRenderCompanionObjectName(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setRenderCompanionObjectName(Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setStartFromName(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setStartFromName(Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setTextFormat(Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setTextFormat(Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setWithDefinedIn(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setWithDefinedIn(Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setWithoutSuperTypes(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setWithoutSuperTypes(Z)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setWithoutTypeParameters(Z)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;->setWithoutTypeParameters(Z)V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$defaultParameterValueRenderer$2; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$defaultParameterValueRenderer$2;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$defaultParameterValueRenderer$2;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$defaultParameterValueRenderer$2;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$defaultParameterValueRenderer$2;->()V Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$property$$inlined$vetoable$1; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$property$$inlined$vetoable$1;->(Ljava/lang/Object;Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;)V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$property$$inlined$vetoable$1;->(Ljava/lang/Object;Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl;)V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$property$$inlined$vetoable$1;->beforeChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)Z PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$property$$inlined$vetoable$1;->beforeChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)Z Lkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$typeNormalizer$2; HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$typeNormalizer$2;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$typeNormalizer$2;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$typeNormalizer$2;->()V PLkotlin/reflect/jvm/internal/impl/renderer/DescriptorRendererOptionsImpl$typeNormalizer$2;->()V Lkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations; HSPLkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations;->getInternalAnnotationsForResolve()Ljava/util/Set; PLkotlin/reflect/jvm/internal/impl/renderer/ExcludedTypeAnnotations;->getInternalAnnotationsForResolve()Ljava/util/Set; Lkotlin/reflect/jvm/internal/impl/renderer/KeywordStringsGenerated; HSPLkotlin/reflect/jvm/internal/impl/renderer/KeywordStringsGenerated;->()V PLkotlin/reflect/jvm/internal/impl/renderer/KeywordStringsGenerated;->()V Lkotlin/reflect/jvm/internal/impl/renderer/OverrideRenderingPolicy; HSPLkotlin/reflect/jvm/internal/impl/renderer/OverrideRenderingPolicy;->()V PLkotlin/reflect/jvm/internal/impl/renderer/OverrideRenderingPolicy;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/OverrideRenderingPolicy;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/renderer/OverrideRenderingPolicy;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy; HSPLkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy;->()V PLkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/renderer/ParameterNameRenderingPolicy;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/renderer/PropertyAccessorRenderingPolicy; HSPLkotlin/reflect/jvm/internal/impl/renderer/PropertyAccessorRenderingPolicy;->()V PLkotlin/reflect/jvm/internal/impl/renderer/PropertyAccessorRenderingPolicy;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/PropertyAccessorRenderingPolicy;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/renderer/PropertyAccessorRenderingPolicy;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat; HSPLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat;->()V PLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat;->(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$HTML; HSPLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$HTML;->()V PLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$HTML;->()V Lkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$PLAIN; HSPLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$PLAIN;->()V PLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$PLAIN;->()V HSPLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$PLAIN;->escape(Ljava/lang/String;)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/renderer/RenderingFormat$PLAIN;->escape(Ljava/lang/String;)Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/renderer/RenderingUtilsKt; HSPLkotlin/reflect/jvm/internal/impl/renderer/RenderingUtilsKt;->render(Lkotlin/reflect/jvm/internal/impl/name/Name;)Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/renderer/RenderingUtilsKt;->render(Lkotlin/reflect/jvm/internal/impl/name/Name;)Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils; HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->()V PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getContainingModule(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getContainingModule(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getContainingModuleOrNull(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getContainingModuleOrNull(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getFqName(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getFqName(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getFqNameSafeIfPossible(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getFqNameSafeIfPossible(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getFqNameUnsafe(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->getFqNameUnsafe(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/name/FqNameUnsafe; HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isAnonymousObject(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isAnonymousObject(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isClass(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isClass(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isDescriptorWithLocalVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isDescriptorWithLocalVisibility(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isKindOf(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;)Z PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isKindOf(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ClassKind;)Z HSPLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isLocal(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z PLkotlin/reflect/jvm/internal/impl/resolve/DescriptorUtils;->isLocal(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z Lkotlin/reflect/jvm/internal/impl/resolve/ExternalOverridabilityCondition; Lkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil; HSPLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil;->()V PLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil;->(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeChecker$TypeConstructorEquality;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default;)V PLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil;->(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeChecker$TypeConstructorEquality;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil;->createWithTypeRefiner(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil; PLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil;->createWithTypeRefiner(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil; Lkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$1; HSPLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$1;->()V PLkotlin/reflect/jvm/internal/impl/resolve/OverridingUtil$1;->()V Lkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProvider; Lkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt; HSPLkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt;->()V PLkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt;->getResolutionAnchorIfAny(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/resolve/ResolutionAnchorProviderKt;->getResolutionAnchorIfAny(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; Lkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt; HSPLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt;->()V PLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt;->getKotlinTypeRefiner(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; PLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt;->getKotlinTypeRefiner(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; HSPLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt;->getModule(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/resolve/descriptorUtil/DescriptorUtilsKt;->getModule(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; Lkotlin/reflect/jvm/internal/impl/resolve/jvm/CompositeSyntheticJavaPartsProvider; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/CompositeSyntheticJavaPartsProvider;->(Ljava/util/List;)V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/CompositeSyntheticJavaPartsProvider;->(Ljava/util/List;)V Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;)V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver;->(Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/load/java/components/JavaResolverCache;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver;->getPackageFragmentProvider()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JavaDescriptorResolver;->getPackageFragmentProvider()Lkotlin/reflect/jvm/internal/impl/load/java/lazy/LazyJavaPackageFragmentProvider; Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->()V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->(Ljava/lang/String;ILkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->get(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->get(Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getDesc()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getDesc()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getJavaKeywordName()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getJavaKeywordName()Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getPrimitiveType()Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getPrimitiveType()Lkotlin/reflect/jvm/internal/impl/builtins/PrimitiveType; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getWrapperFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->getWrapperFqName()Lkotlin/reflect/jvm/internal/impl/name/FqName; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType;->values()[Lkotlin/reflect/jvm/internal/impl/resolve/jvm/JvmPrimitiveType; Lkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider;->()V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider;->()V Lkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion; HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion;->()V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion;->()V PLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion;->getEMPTY()Lkotlin/reflect/jvm/internal/impl/resolve/jvm/CompositeSyntheticJavaPartsProvider; PLkotlin/reflect/jvm/internal/impl/resolve/jvm/SyntheticJavaPartsProvider$Companion;->getEMPTY()Lkotlin/reflect/jvm/internal/impl/resolve/jvm/CompositeSyntheticJavaPartsProvider; Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver; Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolverImpl; HSPLkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolverImpl;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Ljava/lang/Iterable;)V PLkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolverImpl;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Ljava/lang/Iterable;)V Lkotlin/reflect/jvm/internal/impl/resolve/scopes/AbstractScopeAdapter; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/AbstractScopeAdapter;->()V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/AbstractScopeAdapter;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/AbstractScopeAdapter;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/AbstractScopeAdapter;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope;->()V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope;->(Ljava/lang/String;[Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope;->(Ljava/lang/String;[Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope;->getContributedClassifier(Lkotlin/reflect/jvm/internal/impl/name/Name;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupLocation;)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion;->create(Ljava/lang/String;Ljava/lang/Iterable;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion;->create(Ljava/lang/String;Ljava/lang/Iterable;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion;->createOrSingle$descriptors(Ljava/lang/String;Ljava/util/List;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/ChainedMemberScope$Companion;->createOrSingle$descriptors(Ljava/lang/String;Ljava/util/List;)Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/InnerClassesScopeWrapper; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/InnerClassesScopeWrapper;->(Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;)V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/InnerClassesScopeWrapper;->(Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;)V Lkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter;->getWorkerScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter;->getWorkerScope()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1;->(Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1;->(Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1;->invoke()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; PLkotlin/reflect/jvm/internal/impl/resolve/scopes/LazyScopeAdapter$lazyScope$1;->invoke()Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope$Empty; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope$Empty;->()V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope$Empty;->()V HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope$Empty;->()V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope$Empty;->()V Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScopeImpl; HSPLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScopeImpl;->()V PLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScopeImpl;->()V Lkotlin/reflect/jvm/internal/impl/resolve/scopes/ResolutionScope; Lkotlin/reflect/jvm/internal/impl/resolve/scopes/receivers/ReceiverValue; Lkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol; HSPLkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol;->(Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;)V PLkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol;->(Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$GeneratedExtension;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol;->getExtensionRegistry()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; PLkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol;->getExtensionRegistry()Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/KotlinMetadataFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/KotlinMetadataFinder;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->collectPackageFragments(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->collectPackageFragments(Lkotlin/reflect/jvm/internal/impl/name/FqName;Ljava/util/Collection;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->getFinder()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/KotlinMetadataFinder; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->getFinder()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/KotlinMetadataFinder; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->setComponents(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;->setComponents(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentDescriptor; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AbstractDeserializedPackageFragmentProvider$fragments$1;->invoke(Lkotlin/reflect/jvm/internal/impl/name/FqName;)Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentDescriptor; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoader; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoaderImpl; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoaderImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoaderImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/SerializerExtensionProtocol;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationDeserializer; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationDeserializer;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationDeserializer;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationLoader; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDataFinder; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$Companion; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$classes$1; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$classes$1;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer$classes$1;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDeserializer;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion;->getDEFAULT()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion;->getDEFAULT()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion$DEFAULT$1; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion$DEFAULT$1;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer$Companion$DEFAULT$1;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDataFinder;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoader;Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer;Ljava/lang/Iterable;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/EnumEntriesDeserializationSupport;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDataFinder;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoader;Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer;Ljava/lang/Iterable;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/EnumEntriesDeserializationSupport;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDataFinder;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoader;Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer;Ljava/lang/Iterable;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/EnumEntriesDeserializationSupport;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ClassDataFinder;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotationAndConstantLoader;Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;Lkotlin/reflect/jvm/internal/impl/incremental/components/LookupTracker;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer;Ljava/lang/Iterable;Lkotlin/reflect/jvm/internal/impl/descriptors/NotFoundClasses;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ContractDeserializer;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/AdditionalClassPartsProvider;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentDeclarationFilter;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;Lkotlin/reflect/jvm/internal/impl/resolve/sam/SamConversionResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/deserialization/PlatformDependentTypeTransformer;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/EnumEntriesDeserializationSupport;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->getConfiguration()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->getConfiguration()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->getModuleDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->getModuleDescriptor()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->getStorageManager()Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;->getStorageManager()Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getBinaryVersion()Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion; PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getBinaryVersion()Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializedClassDataFinder; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializedClassDataFinder;->(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;)V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializedClassDataFinder;->(Lkotlin/reflect/jvm/internal/impl/descriptors/PackageFragmentProvider;)V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/EnumEntriesDeserializationSupport; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter$1; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter$1;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/ErrorReporter$1;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer$ThrowException; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer$ThrowException;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer$ThrowException;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer$ThrowException;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/FlexibleTypeDeserializer$ThrowException;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/JvmEnumEntriesDeserializationSupport; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/JvmEnumEntriesDeserializationSupport;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/JvmEnumEntriesDeserializationSupport;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/JvmEnumEntriesDeserializationSupport;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/JvmEnumEntriesDeserializationSupport;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/KotlinMetadataFinder; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings; Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings$Default; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings$Default;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings$Default;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/LocalClassifierTypeSettings$Default;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInSerializerProtocol; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInSerializerProtocol;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInSerializerProtocol;->()V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInSerializerProtocol;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInSerializerProtocol;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsResourceLoader; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsResourceLoader;->()V PLkotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsResourceLoader;->()V Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedContainerSource; Lkotlin/reflect/jvm/internal/impl/storage/CacheWithNotNullValues; Lkotlin/reflect/jvm/internal/impl/storage/CacheWithNullableValues; Lkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock; HSPLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->(Ljava/util/concurrent/locks/Lock;)V PLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->(Ljava/util/concurrent/locks/Lock;)V HSPLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->(Ljava/util/concurrent/locks/Lock;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->(Ljava/util/concurrent/locks/Lock;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->lock()V PLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->lock()V HSPLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->unlock()V PLkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock;->unlock()V Lkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock; HSPLkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;->()V PLkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;->()V PLkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;->()V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->()V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->(Ljava/lang/String;Ljava/lang/Runnable;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->(Ljava/lang/String;Ljava/lang/Runnable;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;Lkotlin/reflect/jvm/internal/impl/storage/SimpleLock;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->(Ljava/lang/String;Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;Lkotlin/reflect/jvm/internal/impl/storage/SimpleLock;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;Lkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;Lkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->compute(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->compute(Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createCacheWithNotNullValues()Lkotlin/reflect/jvm/internal/impl/storage/CacheWithNotNullValues; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createCacheWithNotNullValues()Lkotlin/reflect/jvm/internal/impl/storage/CacheWithNotNullValues; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createCacheWithNullableValues()Lkotlin/reflect/jvm/internal/impl/storage/CacheWithNullableValues; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createCacheWithNullableValues()Lkotlin/reflect/jvm/internal/impl/storage/CacheWithNullableValues; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createLazyValue(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createLazyValue(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createLazyValueWithPostCompute(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createLazyValueWithPostCompute(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunction(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNotNull; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunction(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNotNull; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunction(Lkotlin/jvm/functions/Function1;Ljava/util/concurrent/ConcurrentMap;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNotNull; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunction(Lkotlin/jvm/functions/Function1;Ljava/util/concurrent/ConcurrentMap;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNotNull; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunctionWithNullableValues(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNullable; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunctionWithNullableValues(Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNullable; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunctionWithNullableValues(Lkotlin/jvm/functions/Function1;Ljava/util/concurrent/ConcurrentMap;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNullable; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createMemoizedFunctionWithNullableValues(Lkotlin/jvm/functions/Function1;Ljava/util/concurrent/ConcurrentMap;)Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNullable; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createNullableLazyValue(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/impl/storage/NullableLazyValue; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createNullableLazyValue(Lkotlin/jvm/functions/Function0;)Lkotlin/reflect/jvm/internal/impl/storage/NullableLazyValue; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createRecursionTolerantLazyValue(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;->createRecursionTolerantLazyValue(Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$1; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$1;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;Lkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$1;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;Lkotlin/reflect/jvm/internal/impl/storage/EmptySimpleLock;)V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$4; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$4;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$4;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;Ljava/lang/Object;)V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$5; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$5;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$5;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNotNullValuesBasedOnMemoizedFunction; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNotNullValuesBasedOnMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentHashMap;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNotNullValuesBasedOnMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentHashMap;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNotNullValuesBasedOnMemoizedFunction;->computeIfAbsent(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNotNullValuesBasedOnMemoizedFunction;->computeIfAbsent(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentHashMap;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentHashMap;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction;->computeIfAbsent(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction;->computeIfAbsent(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1;->()V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1;->invoke(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$CacheWithNullableValuesBasedOnMemoizedFunction$1;->invoke(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;->()V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy;->()V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy$1; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy$1;->()V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$ExceptionHandlingStrategy$1;->()V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->access$400(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;)Lkotlin/jvm/functions/Function0; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->access$400(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;)Lkotlin/jvm/functions/Function0; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->hashCode()I PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$KeyWithComputation;->hashCode()I Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->invoke()Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->postCompute(Ljava/lang/Object;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValue;->postCompute(Ljava/lang/Object;)V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValueWithPostCompute; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValueWithPostCompute;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedLazyValueWithPostCompute;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValue; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValue;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValue;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValue;->invoke()Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValue;->invoke()Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValueWithPostCompute; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValueWithPostCompute;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$LockBasedNotNullLazyValueWithPostCompute;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Lkotlin/jvm/functions/Function0;)V Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentMap;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentMap;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunction;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentMap;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->(Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager;Ljava/util/concurrent/ConcurrentMap;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$NotValue; HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$NotValue;->()V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$NotValue;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$NotValue;->(Ljava/lang/String;I)V PLkotlin/reflect/jvm/internal/impl/storage/LockBasedStorageManager$NotValue;->(Ljava/lang/String;I)V Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNotNull; Lkotlin/reflect/jvm/internal/impl/storage/MemoizedFunctionToNullable; Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue; Lkotlin/reflect/jvm/internal/impl/storage/NullableLazyValue; Lkotlin/reflect/jvm/internal/impl/storage/SimpleLock; HSPLkotlin/reflect/jvm/internal/impl/storage/SimpleLock;->()V PLkotlin/reflect/jvm/internal/impl/storage/SimpleLock;->()V Lkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion; HSPLkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion;->()V PLkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion;->()V PLkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion;->simpleLock(Ljava/lang/Runnable;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock; PLkotlin/reflect/jvm/internal/impl/storage/SimpleLock$Companion;->simpleLock(Ljava/lang/Runnable;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/storage/DefaultSimpleLock; Lkotlin/reflect/jvm/internal/impl/storage/StorageKt; HSPLkotlin/reflect/jvm/internal/impl/storage/StorageKt;->getValue(Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue;Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/storage/StorageKt;->getValue(Lkotlin/reflect/jvm/internal/impl/storage/NotNullLazyValue;Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/storage/StorageManager; Lkotlin/reflect/jvm/internal/impl/types/AbstractClassTypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractClassTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/types/AbstractClassTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V Lkotlin/reflect/jvm/internal/impl/types/AbstractStubType; Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$1; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$1;->(Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor;)V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$1;->(Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor;)V Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$2; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$2;->()V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$2;->()V HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$2;->()V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$2;->()V Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$3; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$3;->(Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor;)V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor$supertypes$3;->(Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeConstructor;)V Lkotlin/reflect/jvm/internal/impl/types/AbstractTypePreparator; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypePreparator;->()V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypePreparator;->()V Lkotlin/reflect/jvm/internal/impl/types/AbstractTypeRefiner; HSPLkotlin/reflect/jvm/internal/impl/types/AbstractTypeRefiner;->()V PLkotlin/reflect/jvm/internal/impl/types/AbstractTypeRefiner;->()V Lkotlin/reflect/jvm/internal/impl/types/ClassTypeConstructorImpl; HSPLkotlin/reflect/jvm/internal/impl/types/ClassTypeConstructorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Ljava/util/List;Ljava/util/Collection;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V PLkotlin/reflect/jvm/internal/impl/types/ClassTypeConstructorImpl;->(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassDescriptor;Ljava/util/List;Ljava/util/Collection;Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;)V HSPLkotlin/reflect/jvm/internal/impl/types/ClassTypeConstructorImpl;->getParameters()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/types/ClassTypeConstructorImpl;->getParameters()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/types/ClassifierBasedTypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/types/ClassifierBasedTypeConstructor;->()V PLkotlin/reflect/jvm/internal/impl/types/ClassifierBasedTypeConstructor;->()V HSPLkotlin/reflect/jvm/internal/impl/types/ClassifierBasedTypeConstructor;->hashCode()I PLkotlin/reflect/jvm/internal/impl/types/ClassifierBasedTypeConstructor;->hashCode()I Lkotlin/reflect/jvm/internal/impl/types/CustomTypeParameter; Lkotlin/reflect/jvm/internal/impl/types/DefaultTypeAttributeTranslator; HSPLkotlin/reflect/jvm/internal/impl/types/DefaultTypeAttributeTranslator;->()V PLkotlin/reflect/jvm/internal/impl/types/DefaultTypeAttributeTranslator;->()V HSPLkotlin/reflect/jvm/internal/impl/types/DefaultTypeAttributeTranslator;->()V PLkotlin/reflect/jvm/internal/impl/types/DefaultTypeAttributeTranslator;->()V Lkotlin/reflect/jvm/internal/impl/types/DefinitelyNotNullType; Lkotlin/reflect/jvm/internal/impl/types/DelegatingSimpleType; HSPLkotlin/reflect/jvm/internal/impl/types/DelegatingSimpleType;->()V PLkotlin/reflect/jvm/internal/impl/types/DelegatingSimpleType;->()V Lkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer; HSPLkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer;->()V PLkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer;->()V Lkotlin/reflect/jvm/internal/impl/types/FlexibleType; Lkotlin/reflect/jvm/internal/impl/types/FlexibleTypesKt; HSPLkotlin/reflect/jvm/internal/impl/types/FlexibleTypesKt;->isFlexible(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z PLkotlin/reflect/jvm/internal/impl/types/FlexibleTypesKt;->isFlexible(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z Lkotlin/reflect/jvm/internal/impl/types/IntersectionTypeConstructor; Lkotlin/reflect/jvm/internal/impl/types/KotlinType; HSPLkotlin/reflect/jvm/internal/impl/types/KotlinType;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/KotlinType;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/types/KotlinType;->hashCode()I PLkotlin/reflect/jvm/internal/impl/types/KotlinType;->hashCode()I Lkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory; HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->()V PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->()V HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->()V PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->()V HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->simpleType$default(Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->simpleType$default(Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->simpleType(Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->simpleType(Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->simpleTypeWithNonTrivialMemberScope(Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory;->simpleTypeWithNonTrivialMemberScope(Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; Lkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory$EMPTY_REFINED_TYPE_FACTORY$1; HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory$EMPTY_REFINED_TYPE_FACTORY$1;->()V PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory$EMPTY_REFINED_TYPE_FACTORY$1;->()V HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory$EMPTY_REFINED_TYPE_FACTORY$1;->()V PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeFactory$EMPTY_REFINED_TYPE_FACTORY$1;->()V Lkotlin/reflect/jvm/internal/impl/types/KotlinTypeKt; HSPLkotlin/reflect/jvm/internal/impl/types/KotlinTypeKt;->isError(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z PLkotlin/reflect/jvm/internal/impl/types/KotlinTypeKt;->isError(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z Lkotlin/reflect/jvm/internal/impl/types/LazyWrappedType; HSPLkotlin/reflect/jvm/internal/impl/types/LazyWrappedType;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function0;)V PLkotlin/reflect/jvm/internal/impl/types/LazyWrappedType;->(Lkotlin/reflect/jvm/internal/impl/storage/StorageManager;Lkotlin/jvm/functions/Function0;)V Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/types/SimpleType;->()V PLkotlin/reflect/jvm/internal/impl/types/SimpleType;->()V Lkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl; HSPLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)V PLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Ljava/util/List;ZLkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->getArguments()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->getArguments()Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->getConstructor()Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; PLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->getConstructor()Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->isMarkedNullable()Z PLkotlin/reflect/jvm/internal/impl/types/SimpleTypeImpl;->isMarkedNullable()Z Lkotlin/reflect/jvm/internal/impl/types/SpecialTypesKt; HSPLkotlin/reflect/jvm/internal/impl/types/SpecialTypesKt;->isDefinitelyNotNullType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z PLkotlin/reflect/jvm/internal/impl/types/SpecialTypesKt;->isDefinitelyNotNullType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z Lkotlin/reflect/jvm/internal/impl/types/TypeAttributeTranslator; Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes; HSPLkotlin/reflect/jvm/internal/impl/types/TypeAttributes;->()V PLkotlin/reflect/jvm/internal/impl/types/TypeAttributes;->()V HSPLkotlin/reflect/jvm/internal/impl/types/TypeAttributes;->(Ljava/util/List;)V PLkotlin/reflect/jvm/internal/impl/types/TypeAttributes;->(Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/types/TypeAttributes;->access$getEmpty$cp()Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes; PLkotlin/reflect/jvm/internal/impl/types/TypeAttributes;->access$getEmpty$cp()Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes; Lkotlin/reflect/jvm/internal/impl/types/TypeAttributes$Companion; HSPLkotlin/reflect/jvm/internal/impl/types/TypeAttributes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/TypeAttributes$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor; Lkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions; HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions;->(ZZ)V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions;->(ZZ)V Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser; HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;->()V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;->()V HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;->(Lkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer;Lkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions;)V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;->(Lkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer;Lkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions;)V HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;->(Lkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer;Lkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;->(Lkotlin/reflect/jvm/internal/impl/types/ErasureProjectionComputer;Lkotlin/reflect/jvm/internal/impl/types/TypeParameterErasureOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$Companion; HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$erroneousErasedBound$2; HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$erroneousErasedBound$2;->(Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;)V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$erroneousErasedBound$2;->(Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;)V Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$getErasedUpperBound$1; HSPLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$getErasedUpperBound$1;->(Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;)V PLkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser$getErasedUpperBound$1;->(Lkotlin/reflect/jvm/internal/impl/types/TypeParameterUpperBoundEraser;)V Lkotlin/reflect/jvm/internal/impl/types/TypeUtils; HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->()V PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->()V HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->getDefaultTypeProjections(Ljava/util/List;)Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->getDefaultTypeProjections(Ljava/util/List;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->getTypeParameterDescriptorOrNull(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Lkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterDescriptor; PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->getTypeParameterDescriptorOrNull(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Lkotlin/reflect/jvm/internal/impl/descriptors/TypeParameterDescriptor; HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->isNullableType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->isNullableType(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->isTypeParameter(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->isTypeParameter(Lkotlin/reflect/jvm/internal/impl/types/KotlinType;)Z HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->makeUnsubstitutedType(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->makeUnsubstitutedType(Lkotlin/reflect/jvm/internal/impl/descriptors/ClassifierDescriptor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->makeUnsubstitutedType(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; PLkotlin/reflect/jvm/internal/impl/types/TypeUtils;->makeUnsubstitutedType(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/jvm/functions/Function1;)Lkotlin/reflect/jvm/internal/impl/types/SimpleType; Lkotlin/reflect/jvm/internal/impl/types/TypeUtils$SpecialType; HSPLkotlin/reflect/jvm/internal/impl/types/TypeUtils$SpecialType;->(Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/types/TypeUtils$SpecialType;->(Ljava/lang/String;)V Lkotlin/reflect/jvm/internal/impl/types/UnwrappedType; HSPLkotlin/reflect/jvm/internal/impl/types/UnwrappedType;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/UnwrappedType;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/types/UnwrappedType;->unwrap()Lkotlin/reflect/jvm/internal/impl/types/UnwrappedType; PLkotlin/reflect/jvm/internal/impl/types/UnwrappedType;->unwrap()Lkotlin/reflect/jvm/internal/impl/types/UnwrappedType; Lkotlin/reflect/jvm/internal/impl/types/WrappedType; HSPLkotlin/reflect/jvm/internal/impl/types/WrappedType;->()V PLkotlin/reflect/jvm/internal/impl/types/WrappedType;->()V Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeChecker; Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeChecker$TypeConstructorEquality; Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator; HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator;->()V Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default; HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator$Default;->()V Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;->()V Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default; HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default;->()V HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default;->isRefinementNeededForModule(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)Z PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner$Default;->isRefinementNeededForModule(Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor;)Z Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefinerKt; HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefinerKt;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefinerKt;->()V HSPLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefinerKt;->getREFINER_CAPABILITY()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability; PLkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefinerKt;->getREFINER_CAPABILITY()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleCapability; Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker; HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker;->()V Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion; HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion;->()V PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion;->()V HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion;->getDefault()Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl; PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeChecker$Companion;->getDefault()Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl; Lkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl; HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl;->(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator;)V PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl;->(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator;)V HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl;->(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl;->(Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner;Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypePreparator;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl;->getKotlinTypeRefiner()Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; PLkotlin/reflect/jvm/internal/impl/types/checker/NewKotlinTypeCheckerImpl;->getKotlinTypeRefiner()Lkotlin/reflect/jvm/internal/impl/types/checker/KotlinTypeRefiner; Lkotlin/reflect/jvm/internal/impl/types/checker/NewTypeVariableConstructor; Lkotlin/reflect/jvm/internal/impl/types/checker/Ref; Lkotlin/reflect/jvm/internal/impl/types/error/ErrorClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/name/Name;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorClassDescriptor;->(Lkotlin/reflect/jvm/internal/impl/name/Name;)V Lkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity;->(Ljava/lang/String;ILjava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity;->(Ljava/lang/String;ILjava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity;->getDebugText()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorEntity;->getDebugText()Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor;->()V Lkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor$builtIns$2; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor$builtIns$2;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor$builtIns$2;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor$builtIns$2;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorModuleDescriptor$builtIns$2;->()V Lkotlin/reflect/jvm/internal/impl/types/error/ErrorPropertyDescriptor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorPropertyDescriptor;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorPropertyDescriptor;->()V Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScope; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorScope;->(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;[Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorScope;->(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;[Ljava/lang/String;)V Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;->(Ljava/lang/String;ILjava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;->(Ljava/lang/String;ILjava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;->getDebugMessage()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;->getDebugMessage()Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorType;->(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;Z[Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorType;->(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;Z[Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorType;->(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;Z[Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorType;->(Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;Z[Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;[Ljava/lang/String;)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor;->(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;[Ljava/lang/String;)V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor;->toString()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor;->toString()Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;->(Ljava/lang/String;Ljava/lang/String;IZ)V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;->(Ljava/lang/String;Ljava/lang/String;IZ)V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;->getDebugMessage()Ljava/lang/String; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;->getDebugMessage()Ljava/lang/String; Lkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->()V PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->()V HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorScope(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;Z[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScope; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorScope(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;Z[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScope; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorScope(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScope; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorScope(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScopeKind;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorScope; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorType(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorType(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorTypeConstructor(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorTypeConstructor(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeConstructor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorTypeWithArguments(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorTypeWithArguments(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/TypeConstructor;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorTypeWithArguments(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->createErrorTypeWithArguments(Lkotlin/reflect/jvm/internal/impl/types/error/ErrorTypeKind;Ljava/util/List;[Ljava/lang/String;)Lkotlin/reflect/jvm/internal/impl/types/error/ErrorType; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->getErrorClass()Lkotlin/reflect/jvm/internal/impl/types/error/ErrorClassDescriptor; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->getErrorClass()Lkotlin/reflect/jvm/internal/impl/types/error/ErrorClassDescriptor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->getErrorModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->getErrorModule()Lkotlin/reflect/jvm/internal/impl/descriptors/ModuleDescriptor; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->getErrorPropertyType()Lkotlin/reflect/jvm/internal/impl/types/KotlinType; PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->getErrorPropertyType()Lkotlin/reflect/jvm/internal/impl/types/KotlinType; HSPLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->isError(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z PLkotlin/reflect/jvm/internal/impl/types/error/ErrorUtils;->isError(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;)Z Lkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators; HSPLkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators;->(Ljava/util/List;)V PLkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators;->(Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators;->getTranslators()Ljava/util/List; PLkotlin/reflect/jvm/internal/impl/types/extensions/TypeAttributeTranslators;->getTranslators()Ljava/util/List; Lkotlin/reflect/jvm/internal/impl/types/model/DefinitelyNotNullTypeMarker; Lkotlin/reflect/jvm/internal/impl/types/model/FlexibleTypeMarker; Lkotlin/reflect/jvm/internal/impl/types/model/IntersectionTypeConstructorMarker; Lkotlin/reflect/jvm/internal/impl/types/model/KotlinTypeMarker; Lkotlin/reflect/jvm/internal/impl/types/model/SimpleTypeMarker; Lkotlin/reflect/jvm/internal/impl/types/model/TypeArgumentListMarker; Lkotlin/reflect/jvm/internal/impl/types/model/TypeConstructorMarker; Lkotlin/reflect/jvm/internal/impl/types/model/TypeParameterMarker; Lkotlin/reflect/jvm/internal/impl/util/AbstractArrayMapOwner; HSPLkotlin/reflect/jvm/internal/impl/util/AbstractArrayMapOwner;->()V PLkotlin/reflect/jvm/internal/impl/util/AbstractArrayMapOwner;->()V HSPLkotlin/reflect/jvm/internal/impl/util/AbstractArrayMapOwner;->isEmpty()Z PLkotlin/reflect/jvm/internal/impl/util/AbstractArrayMapOwner;->isEmpty()Z Lkotlin/reflect/jvm/internal/impl/util/ArrayMap; HSPLkotlin/reflect/jvm/internal/impl/util/ArrayMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/reflect/jvm/internal/impl/util/ArrayMap;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner; HSPLkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner;->()V PLkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner;->()V HSPLkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner;->(Lkotlin/reflect/jvm/internal/impl/util/ArrayMap;)V PLkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner;->(Lkotlin/reflect/jvm/internal/impl/util/ArrayMap;)V HSPLkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner;->getArrayMap()Lkotlin/reflect/jvm/internal/impl/util/ArrayMap; PLkotlin/reflect/jvm/internal/impl/util/AttributeArrayOwner;->getArrayMap()Lkotlin/reflect/jvm/internal/impl/util/ArrayMap; Lkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap; HSPLkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap;->()V PLkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap;->()V HSPLkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap;->()V PLkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap;->()V HSPLkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap;->getSize()I PLkotlin/reflect/jvm/internal/impl/util/EmptyArrayMap;->getSize()I Lkotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper; Lkotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper$EMPTY; HSPLkotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper$EMPTY;->()V PLkotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper$EMPTY;->()V HSPLkotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper$EMPTY;->()V PLkotlin/reflect/jvm/internal/impl/util/ModuleVisibilityHelper$EMPTY;->()V Lkotlin/reflect/jvm/internal/impl/util/TypeRegistry; HSPLkotlin/reflect/jvm/internal/impl/util/TypeRegistry;->()V PLkotlin/reflect/jvm/internal/impl/util/TypeRegistry;->()V Lkotlin/reflect/jvm/internal/impl/utils/CollectionsKt; HSPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->addIfNotNull(Ljava/util/Collection;Ljava/lang/Object;)V PLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->addIfNotNull(Ljava/util/Collection;Ljava/lang/Object;)V HSPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->mapToIndex(Ljava/lang/Iterable;)Ljava/util/Map; PLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->mapToIndex(Ljava/lang/Iterable;)Ljava/util/Map; HSPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashMapWithExpectedSize(I)Ljava/util/HashMap; PLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashMapWithExpectedSize(I)Ljava/util/HashMap; HSPLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashSetWithExpectedSize(I)Ljava/util/HashSet; PLkotlin/reflect/jvm/internal/impl/utils/CollectionsKt;->newHashSetWithExpectedSize(I)Ljava/util/HashSet; Lkotlin/reflect/jvm/internal/impl/utils/DeserializationHelpersKt; HSPLkotlin/reflect/jvm/internal/impl/utils/DeserializationHelpersKt;->jvmMetadataVersionOrDefault(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;)Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; PLkotlin/reflect/jvm/internal/impl/utils/DeserializationHelpersKt;->jvmMetadataVersionOrDefault(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration;)Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion; Lkotlin/reflect/jvm/internal/impl/utils/SmartList; HSPLkotlin/reflect/jvm/internal/impl/utils/SmartList;->()V PLkotlin/reflect/jvm/internal/impl/utils/SmartList;->()V HSPLkotlin/reflect/jvm/internal/impl/utils/SmartList;->add(Ljava/lang/Object;)Z PLkotlin/reflect/jvm/internal/impl/utils/SmartList;->add(Ljava/lang/Object;)Z HSPLkotlin/reflect/jvm/internal/impl/utils/SmartList;->size()I PLkotlin/reflect/jvm/internal/impl/utils/SmartList;->size()I HSPLkotlin/reflect/jvm/internal/impl/utils/SmartList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/utils/SmartList;->toArray([Ljava/lang/Object;)[Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/utils/WrappedValues; HSPLkotlin/reflect/jvm/internal/impl/utils/WrappedValues;->()V PLkotlin/reflect/jvm/internal/impl/utils/WrappedValues;->()V HSPLkotlin/reflect/jvm/internal/impl/utils/WrappedValues;->escapeNull(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/utils/WrappedValues;->escapeNull(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/utils/WrappedValues;->unescapeThrowable(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/reflect/jvm/internal/impl/utils/WrappedValues;->unescapeThrowable(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/reflect/jvm/internal/impl/utils/WrappedValues$1; HSPLkotlin/reflect/jvm/internal/impl/utils/WrappedValues$1;->()V PLkotlin/reflect/jvm/internal/impl/utils/WrappedValues$1;->()V Lkotlin/reflect/jvm/internal/impl/utils/WrappedValues$ThrowableWrapper; Lkotlin/sequences/ConstrainedOnceSequence; HSPLkotlin/sequences/ConstrainedOnceSequence;->(Lkotlin/sequences/Sequence;)V PLkotlin/sequences/ConstrainedOnceSequence;->(Lkotlin/sequences/Sequence;)V HSPLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator; PLkotlin/sequences/ConstrainedOnceSequence;->iterator()Ljava/util/Iterator; Lkotlin/sequences/FilteringSequence; HSPLkotlin/sequences/FilteringSequence;->(Lkotlin/sequences/Sequence;ZLkotlin/jvm/functions/Function1;)V HPLkotlin/sequences/FilteringSequence;->(Lkotlin/sequences/Sequence;ZLkotlin/jvm/functions/Function1;)V HSPLkotlin/sequences/FilteringSequence;->access$getPredicate$p(Lkotlin/sequences/FilteringSequence;)Lkotlin/jvm/functions/Function1; PLkotlin/sequences/FilteringSequence;->access$getPredicate$p(Lkotlin/sequences/FilteringSequence;)Lkotlin/jvm/functions/Function1; HSPLkotlin/sequences/FilteringSequence;->access$getSendWhen$p(Lkotlin/sequences/FilteringSequence;)Z PLkotlin/sequences/FilteringSequence;->access$getSendWhen$p(Lkotlin/sequences/FilteringSequence;)Z HSPLkotlin/sequences/FilteringSequence;->access$getSequence$p(Lkotlin/sequences/FilteringSequence;)Lkotlin/sequences/Sequence; PLkotlin/sequences/FilteringSequence;->access$getSequence$p(Lkotlin/sequences/FilteringSequence;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/FilteringSequence;->iterator()Ljava/util/Iterator; PLkotlin/sequences/FilteringSequence;->iterator()Ljava/util/Iterator; Lkotlin/sequences/FilteringSequence$iterator$1; HSPLkotlin/sequences/FilteringSequence$iterator$1;->(Lkotlin/sequences/FilteringSequence;)V HPLkotlin/sequences/FilteringSequence$iterator$1;->(Lkotlin/sequences/FilteringSequence;)V HSPLkotlin/sequences/FilteringSequence$iterator$1;->calcNext()V HPLkotlin/sequences/FilteringSequence$iterator$1;->calcNext()V HSPLkotlin/sequences/FilteringSequence$iterator$1;->hasNext()Z HPLkotlin/sequences/FilteringSequence$iterator$1;->hasNext()Z HSPLkotlin/sequences/FilteringSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/sequences/FilteringSequence$iterator$1;->next()Ljava/lang/Object; Lkotlin/sequences/GeneratorSequence; HSPLkotlin/sequences/GeneratorSequence;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V HPLkotlin/sequences/GeneratorSequence;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/sequences/GeneratorSequence;->access$getGetInitialValue$p(Lkotlin/sequences/GeneratorSequence;)Lkotlin/jvm/functions/Function0; PLkotlin/sequences/GeneratorSequence;->access$getGetInitialValue$p(Lkotlin/sequences/GeneratorSequence;)Lkotlin/jvm/functions/Function0; HSPLkotlin/sequences/GeneratorSequence;->access$getGetNextValue$p(Lkotlin/sequences/GeneratorSequence;)Lkotlin/jvm/functions/Function1; PLkotlin/sequences/GeneratorSequence;->access$getGetNextValue$p(Lkotlin/sequences/GeneratorSequence;)Lkotlin/jvm/functions/Function1; HSPLkotlin/sequences/GeneratorSequence;->iterator()Ljava/util/Iterator; PLkotlin/sequences/GeneratorSequence;->iterator()Ljava/util/Iterator; Lkotlin/sequences/GeneratorSequence$iterator$1; HSPLkotlin/sequences/GeneratorSequence$iterator$1;->(Lkotlin/sequences/GeneratorSequence;)V HPLkotlin/sequences/GeneratorSequence$iterator$1;->(Lkotlin/sequences/GeneratorSequence;)V HSPLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext()V HPLkotlin/sequences/GeneratorSequence$iterator$1;->calcNext()V HSPLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z HPLkotlin/sequences/GeneratorSequence$iterator$1;->hasNext()Z HSPLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object; HPLkotlin/sequences/GeneratorSequence$iterator$1;->next()Ljava/lang/Object; Lkotlin/sequences/Sequence; Lkotlin/sequences/SequenceBuilderIterator; HSPLkotlin/sequences/SequenceBuilderIterator;->()V PLkotlin/sequences/SequenceBuilderIterator;->()V HSPLkotlin/sequences/SequenceBuilderIterator;->getContext()Lkotlin/coroutines/CoroutineContext; PLkotlin/sequences/SequenceBuilderIterator;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlin/sequences/SequenceBuilderIterator;->hasNext()Z HPLkotlin/sequences/SequenceBuilderIterator;->hasNext()Z HSPLkotlin/sequences/SequenceBuilderIterator;->next()Ljava/lang/Object; HPLkotlin/sequences/SequenceBuilderIterator;->next()Ljava/lang/Object; HSPLkotlin/sequences/SequenceBuilderIterator;->resumeWith(Ljava/lang/Object;)V HPLkotlin/sequences/SequenceBuilderIterator;->resumeWith(Ljava/lang/Object;)V HSPLkotlin/sequences/SequenceBuilderIterator;->setNextStep(Lkotlin/coroutines/Continuation;)V PLkotlin/sequences/SequenceBuilderIterator;->setNextStep(Lkotlin/coroutines/Continuation;)V HSPLkotlin/sequences/SequenceBuilderIterator;->yield(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/sequences/SequenceBuilderIterator;->yield(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlin/sequences/SequenceScope; HSPLkotlin/sequences/SequenceScope;->()V HPLkotlin/sequences/SequenceScope;->()V Lkotlin/sequences/SequencesKt; Lkotlin/sequences/SequencesKt__SequenceBuilderKt; HSPLkotlin/sequences/SequencesKt__SequenceBuilderKt;->iterator(Lkotlin/jvm/functions/Function2;)Ljava/util/Iterator; HPLkotlin/sequences/SequencesKt__SequenceBuilderKt;->iterator(Lkotlin/jvm/functions/Function2;)Ljava/util/Iterator; HSPLkotlin/sequences/SequencesKt__SequenceBuilderKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; HPLkotlin/sequences/SequencesKt__SequenceBuilderKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; Lkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1; HSPLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->(Lkotlin/jvm/functions/Function2;)V HPLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->(Lkotlin/jvm/functions/Function2;)V HSPLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; Lkotlin/sequences/SequencesKt__SequencesJVMKt; Lkotlin/sequences/SequencesKt__SequencesKt; HSPLkotlin/sequences/SequencesKt__SequencesKt;->asSequence(Ljava/util/Iterator;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt__SequencesKt;->asSequence(Ljava/util/Iterator;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt__SequencesKt;->constrainOnce(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt__SequencesKt;->constrainOnce(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; Lkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1; HSPLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->(Ljava/util/Iterator;)V PLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->(Ljava/util/Iterator;)V HSPLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; PLkotlin/sequences/SequencesKt__SequencesKt$asSequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; Lkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2; HSPLkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;->(Ljava/lang/Object;)V HPLkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;->(Ljava/lang/Object;)V HSPLkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;->invoke()Ljava/lang/Object; PLkotlin/sequences/SequencesKt__SequencesKt$generateSequence$2;->invoke()Ljava/lang/Object; Lkotlin/sequences/SequencesKt___SequencesJvmKt; Lkotlin/sequences/SequencesKt___SequencesKt; HPLkotlin/sequences/SequencesKt___SequencesKt;->filter(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt;->filterNot(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HPLkotlin/sequences/SequencesKt___SequencesKt;->filterNot(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt;->filterNotNull(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; HPLkotlin/sequences/SequencesKt___SequencesKt;->filterNotNull(Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt;->firstOrNull(Lkotlin/sequences/Sequence;)Ljava/lang/Object; HPLkotlin/sequences/SequencesKt___SequencesKt;->firstOrNull(Lkotlin/sequences/Sequence;)Ljava/lang/Object; HPLkotlin/sequences/SequencesKt___SequencesKt;->map(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt;->mapNotNull(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HPLkotlin/sequences/SequencesKt___SequencesKt;->mapNotNull(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List; PLkotlin/sequences/SequencesKt___SequencesKt;->toList(Lkotlin/sequences/Sequence;)Ljava/util/List; Lkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1; HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V PLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V PLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; HPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlin/sequences/TransformingSequence; HSPLkotlin/sequences/TransformingSequence;->(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)V HPLkotlin/sequences/TransformingSequence;->(Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)V HSPLkotlin/sequences/TransformingSequence;->access$getSequence$p(Lkotlin/sequences/TransformingSequence;)Lkotlin/sequences/Sequence; PLkotlin/sequences/TransformingSequence;->access$getSequence$p(Lkotlin/sequences/TransformingSequence;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/TransformingSequence;->access$getTransformer$p(Lkotlin/sequences/TransformingSequence;)Lkotlin/jvm/functions/Function1; PLkotlin/sequences/TransformingSequence;->access$getTransformer$p(Lkotlin/sequences/TransformingSequence;)Lkotlin/jvm/functions/Function1; HSPLkotlin/sequences/TransformingSequence;->iterator()Ljava/util/Iterator; PLkotlin/sequences/TransformingSequence;->iterator()Ljava/util/Iterator; Lkotlin/sequences/TransformingSequence$iterator$1; HSPLkotlin/sequences/TransformingSequence$iterator$1;->(Lkotlin/sequences/TransformingSequence;)V HPLkotlin/sequences/TransformingSequence$iterator$1;->(Lkotlin/sequences/TransformingSequence;)V HSPLkotlin/sequences/TransformingSequence$iterator$1;->hasNext()Z PLkotlin/sequences/TransformingSequence$iterator$1;->hasNext()Z HSPLkotlin/sequences/TransformingSequence$iterator$1;->next()Ljava/lang/Object; PLkotlin/sequences/TransformingSequence$iterator$1;->next()Ljava/lang/Object; Lkotlin/text/CharsKt; Lkotlin/text/CharsKt__CharJVMKt; HSPLkotlin/text/CharsKt__CharJVMKt;->checkRadix(I)I HPLkotlin/text/CharsKt__CharJVMKt;->checkRadix(I)I HSPLkotlin/text/CharsKt__CharJVMKt;->isWhitespace(C)Z HPLkotlin/text/CharsKt__CharJVMKt;->isWhitespace(C)Z Lkotlin/text/CharsKt__CharKt; Lkotlin/text/Charsets; HSPLkotlin/text/Charsets;->()V PLkotlin/text/Charsets;->()V HSPLkotlin/text/Charsets;->()V PLkotlin/text/Charsets;->()V Lkotlin/text/MatchGroup; HSPLkotlin/text/MatchGroup;->(Ljava/lang/String;Lkotlin/ranges/IntRange;)V PLkotlin/text/MatchGroup;->(Ljava/lang/String;Lkotlin/ranges/IntRange;)V HSPLkotlin/text/MatchGroup;->getValue()Ljava/lang/String; PLkotlin/text/MatchGroup;->getValue()Ljava/lang/String; Lkotlin/text/MatchGroupCollection; Lkotlin/text/MatchNamedGroupCollection; Lkotlin/text/MatchResult; Lkotlin/text/MatcherMatchResult; HSPLkotlin/text/MatcherMatchResult;->(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)V PLkotlin/text/MatcherMatchResult;->(Ljava/util/regex/Matcher;Ljava/lang/CharSequence;)V HSPLkotlin/text/MatcherMatchResult;->access$getMatchResult(Lkotlin/text/MatcherMatchResult;)Ljava/util/regex/MatchResult; PLkotlin/text/MatcherMatchResult;->access$getMatchResult(Lkotlin/text/MatcherMatchResult;)Ljava/util/regex/MatchResult; HSPLkotlin/text/MatcherMatchResult;->getGroupValues()Ljava/util/List; PLkotlin/text/MatcherMatchResult;->getGroupValues()Ljava/util/List; HSPLkotlin/text/MatcherMatchResult;->getGroups()Lkotlin/text/MatchGroupCollection; PLkotlin/text/MatcherMatchResult;->getGroups()Lkotlin/text/MatchGroupCollection; HSPLkotlin/text/MatcherMatchResult;->getRange()Lkotlin/ranges/IntRange; PLkotlin/text/MatcherMatchResult;->getRange()Lkotlin/ranges/IntRange; Lkotlin/text/MatcherMatchResult$groupValues$1; HSPLkotlin/text/MatcherMatchResult$groupValues$1;->(Lkotlin/text/MatcherMatchResult;)V PLkotlin/text/MatcherMatchResult$groupValues$1;->(Lkotlin/text/MatcherMatchResult;)V HSPLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/Object; PLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/Object; HSPLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/String; PLkotlin/text/MatcherMatchResult$groupValues$1;->get(I)Ljava/lang/String; Lkotlin/text/MatcherMatchResult$groups$1; HSPLkotlin/text/MatcherMatchResult$groups$1;->(Lkotlin/text/MatcherMatchResult;)V PLkotlin/text/MatcherMatchResult$groups$1;->(Lkotlin/text/MatcherMatchResult;)V HSPLkotlin/text/MatcherMatchResult$groups$1;->get(I)Lkotlin/text/MatchGroup; PLkotlin/text/MatcherMatchResult$groups$1;->get(I)Lkotlin/text/MatchGroup; Lkotlin/text/Regex; HSPLkotlin/text/Regex;->()V PLkotlin/text/Regex;->()V HSPLkotlin/text/Regex;->(Ljava/lang/String;)V PLkotlin/text/Regex;->(Ljava/lang/String;)V HSPLkotlin/text/Regex;->(Ljava/util/regex/Pattern;)V PLkotlin/text/Regex;->(Ljava/util/regex/Pattern;)V HSPLkotlin/text/Regex;->find(Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; PLkotlin/text/Regex;->find(Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; HSPLkotlin/text/Regex;->matches(Ljava/lang/CharSequence;)Z PLkotlin/text/Regex;->matches(Ljava/lang/CharSequence;)Z HSPLkotlin/text/Regex;->replace(Ljava/lang/CharSequence;Ljava/lang/String;)Ljava/lang/String; PLkotlin/text/Regex;->replace(Ljava/lang/CharSequence;Ljava/lang/String;)Ljava/lang/String; Lkotlin/text/Regex$Companion; HSPLkotlin/text/Regex$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/text/Regex$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/text/RegexKt; HSPLkotlin/text/RegexKt;->access$findNext(Ljava/util/regex/Matcher;ILjava/lang/CharSequence;)Lkotlin/text/MatchResult; PLkotlin/text/RegexKt;->access$findNext(Ljava/util/regex/Matcher;ILjava/lang/CharSequence;)Lkotlin/text/MatchResult; HSPLkotlin/text/RegexKt;->access$range(Ljava/util/regex/MatchResult;)Lkotlin/ranges/IntRange; PLkotlin/text/RegexKt;->access$range(Ljava/util/regex/MatchResult;)Lkotlin/ranges/IntRange; HSPLkotlin/text/RegexKt;->access$range(Ljava/util/regex/MatchResult;I)Lkotlin/ranges/IntRange; PLkotlin/text/RegexKt;->access$range(Ljava/util/regex/MatchResult;I)Lkotlin/ranges/IntRange; Lkotlin/text/StringsKt; HSPLkotlin/text/StringsKt;->contains$default(Ljava/lang/CharSequence;C)Z PLkotlin/text/StringsKt;->contains$default(Ljava/lang/CharSequence;C)Z HSPLkotlin/text/StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z PLkotlin/text/StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z HSPLkotlin/text/StringsKt;->endsWith$default(Ljava/lang/CharSequence;)Z PLkotlin/text/StringsKt;->endsWith$default(Ljava/lang/CharSequence;)Z HSPLkotlin/text/StringsKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;)Z PLkotlin/text/StringsKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;)Z HSPLkotlin/text/StringsKt;->equals(Ljava/lang/String;Ljava/lang/String;)Z PLkotlin/text/StringsKt;->equals(Ljava/lang/String;Ljava/lang/String;)Z HSPLkotlin/text/StringsKt;->indexOf$default(Ljava/lang/CharSequence;CII)I PLkotlin/text/StringsKt;->indexOf$default(Ljava/lang/CharSequence;CII)I HSPLkotlin/text/StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CII)I PLkotlin/text/StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CII)I HSPLkotlin/text/StringsKt;->removeSuffix(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLkotlin/text/StringsKt;->removeSuffix(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt;->repeat(Ljava/lang/String;I)Ljava/lang/String; PLkotlin/text/StringsKt;->repeat(Ljava/lang/String;I)Ljava/lang/String; HSPLkotlin/text/StringsKt;->replace$default(Ljava/lang/String;CC)Ljava/lang/String; PLkotlin/text/StringsKt;->replace$default(Ljava/lang/String;CC)Ljava/lang/String; HSPLkotlin/text/StringsKt;->split$default(Ljava/lang/CharSequence;[C)Ljava/util/List; PLkotlin/text/StringsKt;->split$default(Ljava/lang/CharSequence;[C)Ljava/util/List; HSPLkotlin/text/StringsKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;)Z PLkotlin/text/StringsKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;)Z HSPLkotlin/text/StringsKt;->startsWith(Ljava/lang/String;Ljava/lang/String;I)Z PLkotlin/text/StringsKt;->startsWith(Ljava/lang/String;Ljava/lang/String;I)Z HSPLkotlin/text/StringsKt;->substringAfter$default(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLkotlin/text/StringsKt;->substringAfter$default(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt;->substringAfterLast(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLkotlin/text/StringsKt;->substringAfterLast(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt;->substringBeforeLast$1(Ljava/lang/String;)Ljava/lang/String; PLkotlin/text/StringsKt;->substringBeforeLast$1(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt;->substringBeforeLast$default(Ljava/lang/String;C)Ljava/lang/String; PLkotlin/text/StringsKt;->substringBeforeLast$default(Ljava/lang/String;C)Ljava/lang/String; Lkotlin/text/StringsKt__AppendableKt; Lkotlin/text/StringsKt__IndentKt; Lkotlin/text/StringsKt__RegexExtensionsJVMKt; Lkotlin/text/StringsKt__RegexExtensionsKt; Lkotlin/text/StringsKt__StringBuilderJVMKt; Lkotlin/text/StringsKt__StringBuilderKt; Lkotlin/text/StringsKt__StringNumberConversionsJVMKt; Lkotlin/text/StringsKt__StringNumberConversionsKt; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toIntOrNull(Ljava/lang/String;)Ljava/lang/Integer; PLkotlin/text/StringsKt__StringNumberConversionsKt;->toIntOrNull(Ljava/lang/String;)Ljava/lang/Integer; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toIntOrNull(Ljava/lang/String;I)Ljava/lang/Integer; PLkotlin/text/StringsKt__StringNumberConversionsKt;->toIntOrNull(Ljava/lang/String;I)Ljava/lang/Integer; Lkotlin/text/StringsKt__StringsJVMKt; HSPLkotlin/text/StringsKt__StringsJVMKt;->concatToString([C)Ljava/lang/String; PLkotlin/text/StringsKt__StringsJVMKt;->concatToString([C)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->concatToString([CII)Ljava/lang/String; HPLkotlin/text/StringsKt__StringsJVMKt;->concatToString([CII)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z PLkotlin/text/StringsKt__StringsJVMKt;->endsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->endsWith(Ljava/lang/String;Ljava/lang/String;Z)Z PLkotlin/text/StringsKt__StringsJVMKt;->endsWith(Ljava/lang/String;Ljava/lang/String;Z)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->equals(Ljava/lang/String;Ljava/lang/String;Z)Z PLkotlin/text/StringsKt__StringsJVMKt;->equals(Ljava/lang/String;Ljava/lang/String;Z)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->getCASE_INSENSITIVE_ORDER(Lkotlin/jvm/internal/StringCompanionObject;)Ljava/util/Comparator; PLkotlin/text/StringsKt__StringsJVMKt;->getCASE_INSENSITIVE_ORDER(Lkotlin/jvm/internal/StringCompanionObject;)Ljava/util/Comparator; HSPLkotlin/text/StringsKt__StringsJVMKt;->isBlank(Ljava/lang/CharSequence;)Z HPLkotlin/text/StringsKt__StringsJVMKt;->isBlank(Ljava/lang/CharSequence;)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->regionMatches(Ljava/lang/String;ILjava/lang/String;IIZ)Z PLkotlin/text/StringsKt__StringsJVMKt;->regionMatches(Ljava/lang/String;ILjava/lang/String;IIZ)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->repeat(Ljava/lang/CharSequence;I)Ljava/lang/String; PLkotlin/text/StringsKt__StringsJVMKt;->repeat(Ljava/lang/CharSequence;I)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;CCZILjava/lang/Object;)Ljava/lang/String; PLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;CCZILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->replace(Ljava/lang/String;CCZ)Ljava/lang/String; HPLkotlin/text/StringsKt__StringsJVMKt;->replace(Ljava/lang/String;CCZ)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z PLkotlin/text/StringsKt__StringsJVMKt;->startsWith$default(Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;IZ)Z PLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;IZ)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;Z)Z HPLkotlin/text/StringsKt__StringsJVMKt;->startsWith(Ljava/lang/String;Ljava/lang/String;Z)Z Lkotlin/text/StringsKt__StringsKt; HSPLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;CZILjava/lang/Object;)Z PLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;CZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z PLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;CZ)Z PLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;CZ)Z HSPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z PLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z HSPLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z PLkotlin/text/StringsKt__StringsKt;->endsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->endsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z PLkotlin/text/StringsKt__StringsKt;->endsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z HSPLkotlin/text/StringsKt__StringsKt;->getIndices(Ljava/lang/CharSequence;)Lkotlin/ranges/IntRange; HPLkotlin/text/StringsKt__StringsKt;->getIndices(Ljava/lang/CharSequence;)Lkotlin/ranges/IntRange; HSPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I HPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I PLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I PLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf(Ljava/lang/CharSequence;CIZ)I HPLkotlin/text/StringsKt__StringsKt;->indexOf(Ljava/lang/CharSequence;CIZ)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I HPLkotlin/text/StringsKt__StringsKt;->indexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I HSPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I PLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I HSPLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I PLkotlin/text/StringsKt__StringsKt;->lastIndexOf$default(Ljava/lang/CharSequence;Ljava/lang/String;IZILjava/lang/Object;)I HSPLkotlin/text/StringsKt__StringsKt;->lastIndexOf(Ljava/lang/CharSequence;CIZ)I HPLkotlin/text/StringsKt__StringsKt;->lastIndexOf(Ljava/lang/CharSequence;CIZ)I HSPLkotlin/text/StringsKt__StringsKt;->lastIndexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I PLkotlin/text/StringsKt__StringsKt;->lastIndexOf(Ljava/lang/CharSequence;Ljava/lang/String;IZ)I HSPLkotlin/text/StringsKt__StringsKt;->removePrefix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; PLkotlin/text/StringsKt__StringsKt;->removePrefix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->removeSuffix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; PLkotlin/text/StringsKt__StringsKt;->removeSuffix(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->requireNonNegativeLimit(I)V PLkotlin/text/StringsKt__StringsKt;->requireNonNegativeLimit(I)V HSPLkotlin/text/StringsKt__StringsKt;->split$StringsKt__StringsKt(Ljava/lang/CharSequence;Ljava/lang/String;IZ)Ljava/util/List; PLkotlin/text/StringsKt__StringsKt;->split$StringsKt__StringsKt(Ljava/lang/CharSequence;Ljava/lang/String;IZ)Ljava/util/List; HSPLkotlin/text/StringsKt__StringsKt;->split$default(Ljava/lang/CharSequence;[CZIILjava/lang/Object;)Ljava/util/List; PLkotlin/text/StringsKt__StringsKt;->split$default(Ljava/lang/CharSequence;[CZIILjava/lang/Object;)Ljava/util/List; HSPLkotlin/text/StringsKt__StringsKt;->split(Ljava/lang/CharSequence;[CZI)Ljava/util/List; PLkotlin/text/StringsKt__StringsKt;->split(Ljava/lang/CharSequence;[CZI)Ljava/util/List; HSPLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z PLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->startsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z PLkotlin/text/StringsKt__StringsKt;->startsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z HSPLkotlin/text/StringsKt__StringsKt;->substringAfter$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; HPLkotlin/text/StringsKt__StringsKt;->substringAfter$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringAfter(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HPLkotlin/text/StringsKt__StringsKt;->substringAfter(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; PLkotlin/text/StringsKt__StringsKt;->substringAfterLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast$default(Ljava/lang/String;CLjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; HPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast$default(Ljava/lang/String;CLjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; HPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast(Ljava/lang/String;CLjava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLkotlin/text/StringsKt__StringsKt;->substringBeforeLast(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; PLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; Lkotlin/text/StringsKt___StringsJvmKt; Lkotlin/text/StringsKt___StringsKt; HSPLkotlin/text/StringsKt___StringsKt;->last(Ljava/lang/CharSequence;)C HPLkotlin/text/StringsKt___StringsKt;->last(Ljava/lang/CharSequence;)C Lkotlin/time/Duration; HSPLkotlin/time/Duration;->()V PLkotlin/time/Duration;->()V HSPLkotlin/time/Duration;->getInWholeMilliseconds-impl(J)J PLkotlin/time/Duration;->getInWholeMilliseconds-impl(J)J HSPLkotlin/time/Duration;->getInWholeSeconds-impl(J)J PLkotlin/time/Duration;->getInWholeSeconds-impl(J)J HSPLkotlin/time/Duration;->getNanosecondsComponent-impl(J)I PLkotlin/time/Duration;->getNanosecondsComponent-impl(J)I HSPLkotlin/time/Duration;->getStorageUnit-impl(J)Lkotlin/time/DurationUnit; PLkotlin/time/Duration;->getStorageUnit-impl(J)Lkotlin/time/DurationUnit; HSPLkotlin/time/Duration;->isInfinite-impl(J)Z PLkotlin/time/Duration;->isInfinite-impl(J)Z HSPLkotlin/time/Duration;->toLong-impl(JLkotlin/time/DurationUnit;)J PLkotlin/time/Duration;->toLong-impl(JLkotlin/time/DurationUnit;)J Lkotlin/time/Duration$Companion; HSPLkotlin/time/Duration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlin/time/Duration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlin/time/DurationJvmKt; HSPLkotlin/time/DurationJvmKt;->()V PLkotlin/time/DurationJvmKt;->()V Lkotlin/time/DurationKt; HSPLkotlin/time/DurationKt;->access$durationOfMillis(J)J PLkotlin/time/DurationKt;->access$durationOfMillis(J)J HSPLkotlin/time/DurationKt;->durationOfNanos(J)J PLkotlin/time/DurationKt;->durationOfNanos(J)J HSPLkotlin/time/DurationKt;->toDuration(ILkotlin/time/DurationUnit;)J PLkotlin/time/DurationKt;->toDuration(ILkotlin/time/DurationUnit;)J HSPLkotlin/time/DurationKt;->toDuration(JLkotlin/time/DurationUnit;)J PLkotlin/time/DurationKt;->toDuration(JLkotlin/time/DurationUnit;)J Lkotlin/time/DurationUnit; HSPLkotlin/time/DurationUnit;->()V PLkotlin/time/DurationUnit;->()V HSPLkotlin/time/DurationUnit;->(Ljava/lang/String;ILjava/util/concurrent/TimeUnit;)V PLkotlin/time/DurationUnit;->(Ljava/lang/String;ILjava/util/concurrent/TimeUnit;)V HSPLkotlin/time/DurationUnit;->getTimeUnit$kotlin_stdlib()Ljava/util/concurrent/TimeUnit; PLkotlin/time/DurationUnit;->getTimeUnit$kotlin_stdlib()Ljava/util/concurrent/TimeUnit; Lkotlin/time/DurationUnitKt__DurationUnitJvmKt; HSPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnit(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J PLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnit(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J HSPLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnitOverflow(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J PLkotlin/time/DurationUnitKt__DurationUnitJvmKt;->convertDurationUnitOverflow(JLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)J Lkotlinx/collections/immutable/implementations/immutableList/ObjectRef; HSPLkotlinx/collections/immutable/implementations/immutableList/ObjectRef;->(FF)V HPLkotlinx/collections/immutable/implementations/immutableList/ObjectRef;->(FF)V HSPLkotlinx/collections/immutable/implementations/immutableList/ObjectRef;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec; HPLkotlinx/collections/immutable/implementations/immutableList/ObjectRef;->get(I)Landroidx/compose/animation/core/FloatAnimationSpec; Lkotlinx/coroutines/AbstractCoroutine; HSPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;ZZ)V HPLkotlinx/coroutines/AbstractCoroutine;->(Lkotlin/coroutines/CoroutineContext;ZZ)V HSPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->afterResume(Ljava/lang/Object;)V HSPLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String; PLkotlinx/coroutines/AbstractCoroutine;->cancellationExceptionMessage()Ljava/lang/String; HSPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/AbstractCoroutine;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/AbstractCoroutine;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/AbstractCoroutine;->isActive()Z HPLkotlinx/coroutines/AbstractCoroutine;->isActive()Z HSPLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V HPLkotlinx/coroutines/AbstractCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V HSPLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->onCompleted(Ljava/lang/Object;)V HSPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->onCompletionInternal(Ljava/lang/Object;)V HSPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V HPLkotlinx/coroutines/AbstractCoroutine;->resumeWith(Ljava/lang/Object;)V HSPLkotlinx/coroutines/AbstractCoroutine;->start(Lkotlinx/coroutines/CoroutineStart;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V HPLkotlinx/coroutines/AbstractCoroutine;->start(Lkotlinx/coroutines/CoroutineStart;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V Lkotlinx/coroutines/AbstractTimeSourceKt; HSPLkotlinx/coroutines/AbstractTimeSourceKt;->getTimeSource()Lkotlinx/coroutines/AbstractTimeSource; PLkotlinx/coroutines/AbstractTimeSourceKt;->getTimeSource()Lkotlinx/coroutines/AbstractTimeSource; Lkotlinx/coroutines/Active; HSPLkotlinx/coroutines/Active;->()V PLkotlinx/coroutines/Active;->()V HSPLkotlinx/coroutines/Active;->()V PLkotlinx/coroutines/Active;->()V Lkotlinx/coroutines/BlockingEventLoop; HSPLkotlinx/coroutines/BlockingEventLoop;->(Ljava/lang/Thread;)V PLkotlinx/coroutines/BlockingEventLoop;->(Ljava/lang/Thread;)V Lkotlinx/coroutines/BuildersKt; HSPLkotlinx/coroutines/BuildersKt;->async$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Deferred; PLkotlinx/coroutines/BuildersKt;->async$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Deferred; HSPLkotlinx/coroutines/BuildersKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; HPLkotlinx/coroutines/BuildersKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/BuildersKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/BuildersKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/BuildersKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/BuildersKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/BuildersKt__Builders_commonKt; HSPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->async$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Deferred; PLkotlinx/coroutines/BuildersKt__Builders_commonKt;->async$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Deferred; HSPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->async(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Deferred; PLkotlinx/coroutines/BuildersKt__Builders_commonKt;->async(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Deferred; HSPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; HPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; HPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->launch(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/BuildersKt__Builders_commonKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/BuildersKt__Builders_commonKt;->withContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/CancelHandler; HSPLkotlinx/coroutines/CancelHandler;->()V PLkotlinx/coroutines/CancelHandler;->()V Lkotlinx/coroutines/CancelHandlerBase; HSPLkotlinx/coroutines/CancelHandlerBase;->()V HPLkotlinx/coroutines/CancelHandlerBase;->()V Lkotlinx/coroutines/CancellableContinuation; Lkotlinx/coroutines/CancellableContinuation$DefaultImpls; Lkotlinx/coroutines/CancellableContinuationImpl; HSPLkotlinx/coroutines/CancellableContinuationImpl;->()V PLkotlinx/coroutines/CancellableContinuationImpl;->()V HSPLkotlinx/coroutines/CancellableContinuationImpl;->(Lkotlin/coroutines/Continuation;I)V HPLkotlinx/coroutines/CancellableContinuationImpl;->(Lkotlin/coroutines/Continuation;I)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->callCancelHandler(Lkotlinx/coroutines/CancelHandler;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->callSegmentOnCancellation(Lkotlinx/coroutines/internal/Segment;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->callSegmentOnCancellation(Lkotlinx/coroutines/internal/Segment;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/CancellableContinuationImpl;->cancel(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->cancelCompletedResult$kotlinx_coroutines_core(Ljava/lang/Object;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->completeResume(Ljava/lang/Object;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->completeResume(Ljava/lang/Object;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V HPLkotlinx/coroutines/CancellableContinuationImpl;->detachChild$kotlinx_coroutines_core()V HSPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V HPLkotlinx/coroutines/CancellableContinuationImpl;->dispatchResume(I)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/CancellableContinuationImpl;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/Job;)Ljava/lang/Throwable; HPLkotlinx/coroutines/CancellableContinuationImpl;->getContinuationCancellationCause(Lkotlinx/coroutines/Job;)Ljava/lang/Throwable; HSPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/CancellableContinuationImpl;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; PLkotlinx/coroutines/CancellableContinuationImpl;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; HSPLkotlinx/coroutines/CancellableContinuationImpl;->getResult()Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->getResult()Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->getState$kotlinx_coroutines_core()Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->getState$kotlinx_coroutines_core()Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/CancellableContinuationImpl;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V HPLkotlinx/coroutines/CancellableContinuationImpl;->initCancellability()V HSPLkotlinx/coroutines/CancellableContinuationImpl;->installParentHandle()Lkotlinx/coroutines/DisposableHandle; HPLkotlinx/coroutines/CancellableContinuationImpl;->installParentHandle()Lkotlinx/coroutines/DisposableHandle; HSPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V HPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellationImpl(Ljava/lang/Object;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->invokeOnCancellationImpl(Ljava/lang/Object;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->isCompleted()Z HPLkotlinx/coroutines/CancellableContinuationImpl;->isCompleted()Z HSPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z HPLkotlinx/coroutines/CancellableContinuationImpl;->isReusable()Z HSPLkotlinx/coroutines/CancellableContinuationImpl;->parentCancelled$kotlinx_coroutines_core(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->parentCancelled$kotlinx_coroutines_core(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->releaseClaimedReusableContinuation$kotlinx_coroutines_core()V PLkotlinx/coroutines/CancellableContinuationImpl;->releaseClaimedReusableContinuation$kotlinx_coroutines_core()V HSPLkotlinx/coroutines/CancellableContinuationImpl;->resetStateReusable()Z HPLkotlinx/coroutines/CancellableContinuationImpl;->resetStateReusable()Z HSPLkotlinx/coroutines/CancellableContinuationImpl;->resume(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/CancellableContinuationImpl;->resume(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl(Ljava/lang/Object;ILkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->resumeImpl(Ljava/lang/Object;ILkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Ljava/lang/Object;)V PLkotlinx/coroutines/CancellableContinuationImpl;->resumeUndispatched(Lkotlinx/coroutines/CoroutineDispatcher;Ljava/lang/Object;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V HPLkotlinx/coroutines/CancellableContinuationImpl;->resumeWith(Ljava/lang/Object;)V HSPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->resumedState(Lkotlinx/coroutines/NotCompleted;Ljava/lang/Object;ILkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HPLkotlinx/coroutines/CancellableContinuationImpl;->tryResume(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/CancellableContinuationImpl;->tryResumeImpl(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/internal/Symbol; Lkotlinx/coroutines/CancellableContinuationImplKt; HSPLkotlinx/coroutines/CancellableContinuationImplKt;->()V PLkotlinx/coroutines/CancellableContinuationImplKt;->()V Lkotlinx/coroutines/CancellableContinuationKt; HSPLkotlinx/coroutines/CancellableContinuationKt;->disposeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/DisposableHandle;)V PLkotlinx/coroutines/CancellableContinuationKt;->disposeOnCancellation(Lkotlinx/coroutines/CancellableContinuation;Lkotlinx/coroutines/DisposableHandle;)V HSPLkotlinx/coroutines/CancellableContinuationKt;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl; HPLkotlinx/coroutines/CancellableContinuationKt;->getOrCreateCancellableContinuation(Lkotlin/coroutines/Continuation;)Lkotlinx/coroutines/CancellableContinuationImpl; Lkotlinx/coroutines/CancelledContinuation; HSPLkotlinx/coroutines/CancelledContinuation;->()V PLkotlinx/coroutines/CancelledContinuation;->()V HSPLkotlinx/coroutines/CancelledContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V HPLkotlinx/coroutines/CancelledContinuation;->(Lkotlin/coroutines/Continuation;Ljava/lang/Throwable;Z)V HSPLkotlinx/coroutines/CancelledContinuation;->makeResumed()Z PLkotlinx/coroutines/CancelledContinuation;->makeResumed()Z Lkotlinx/coroutines/ChildContinuation; HSPLkotlinx/coroutines/ChildContinuation;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V PLkotlinx/coroutines/ChildContinuation;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/ChildContinuation;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/ChildHandle; Lkotlinx/coroutines/ChildHandleNode; HSPLkotlinx/coroutines/ChildHandleNode;->(Lkotlinx/coroutines/ChildJob;)V PLkotlinx/coroutines/ChildHandleNode;->(Lkotlinx/coroutines/ChildJob;)V HSPLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/ChildHandleNode;->childCancelled(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/ChildHandleNode;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/ChildJob; Lkotlinx/coroutines/CompletableJob; Lkotlinx/coroutines/CompletedContinuation; HSPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HPLkotlinx/coroutines/CompletedContinuation;->(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/CompletedContinuation;->copy$default(Lkotlinx/coroutines/CompletedContinuation;Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;ILjava/lang/Object;)Lkotlinx/coroutines/CompletedContinuation; HPLkotlinx/coroutines/CompletedContinuation;->copy$default(Lkotlinx/coroutines/CompletedContinuation;Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;ILjava/lang/Object;)Lkotlinx/coroutines/CompletedContinuation; HSPLkotlinx/coroutines/CompletedContinuation;->copy(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;)Lkotlinx/coroutines/CompletedContinuation; HPLkotlinx/coroutines/CompletedContinuation;->copy(Ljava/lang/Object;Lkotlinx/coroutines/CancelHandler;Lkotlin/jvm/functions/Function1;Ljava/lang/Object;Ljava/lang/Throwable;)Lkotlinx/coroutines/CompletedContinuation; HSPLkotlinx/coroutines/CompletedContinuation;->getCancelled()Z PLkotlinx/coroutines/CompletedContinuation;->getCancelled()Z HSPLkotlinx/coroutines/CompletedContinuation;->invokeHandlers(Lkotlinx/coroutines/CancellableContinuationImpl;Ljava/lang/Throwable;)V PLkotlinx/coroutines/CompletedContinuation;->invokeHandlers(Lkotlinx/coroutines/CancellableContinuationImpl;Ljava/lang/Throwable;)V Lkotlinx/coroutines/CompletedExceptionally; HSPLkotlinx/coroutines/CompletedExceptionally;->()V PLkotlinx/coroutines/CompletedExceptionally;->()V HSPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;Z)V HPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;Z)V HSPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V HPLkotlinx/coroutines/CompletedExceptionally;->(Ljava/lang/Throwable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z HPLkotlinx/coroutines/CompletedExceptionally;->getHandled()Z HSPLkotlinx/coroutines/CompletedExceptionally;->makeHandled()Z HPLkotlinx/coroutines/CompletedExceptionally;->makeHandled()Z Lkotlinx/coroutines/CompletedWithCancellation; Lkotlinx/coroutines/CompletionHandlerBase; HSPLkotlinx/coroutines/CompletionHandlerBase;->()V HPLkotlinx/coroutines/CompletionHandlerBase;->()V Lkotlinx/coroutines/CompletionHandlerException; Lkotlinx/coroutines/CompletionStateKt; HSPLkotlinx/coroutines/CompletionStateKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/CompletionStateKt;->recoverResult(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/CompletionStateKt;->toState$default(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/CompletionStateKt;->toState$default(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Object; PLkotlinx/coroutines/CompletionStateKt;->toState(Ljava/lang/Object;Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Object; Lkotlinx/coroutines/CopyableThreadContextElement; Lkotlinx/coroutines/CopyableThrowable; Lkotlinx/coroutines/CoroutineContextKt; HSPLkotlinx/coroutines/CoroutineContextKt;->foldCopies(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Z)Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/CoroutineContextKt;->foldCopies(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;Z)Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/CoroutineContextKt;->newCoroutineContext(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; Lkotlinx/coroutines/CoroutineContextKt$foldCopies$1; Lkotlinx/coroutines/CoroutineContextKt$foldCopies$folded$1; Lkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1; HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->()V PLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->()V HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->()V PLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->()V HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->invoke(ZLkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Boolean; HPLkotlinx/coroutines/CoroutineContextKt$hasCopyableElements$1;->invoke(ZLkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Boolean; Lkotlinx/coroutines/CoroutineDispatcher; HSPLkotlinx/coroutines/CoroutineDispatcher;->()V PLkotlinx/coroutines/CoroutineDispatcher;->()V HSPLkotlinx/coroutines/CoroutineDispatcher;->()V PLkotlinx/coroutines/CoroutineDispatcher;->()V HSPLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/CoroutineDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlinx/coroutines/CoroutineDispatcher;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlinx/coroutines/CoroutineDispatcher;->interceptContinuation(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/CoroutineDispatcher;->interceptContinuation(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z HPLkotlinx/coroutines/CoroutineDispatcher;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z HSPLkotlinx/coroutines/CoroutineDispatcher;->limitedParallelism(I)Lkotlinx/coroutines/CoroutineDispatcher; PLkotlinx/coroutines/CoroutineDispatcher;->limitedParallelism(I)Lkotlinx/coroutines/CoroutineDispatcher; HSPLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/CoroutineDispatcher;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/CoroutineDispatcher;->releaseInterceptedContinuation(Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/CoroutineDispatcher;->releaseInterceptedContinuation(Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/CoroutineDispatcher$Key; HSPLkotlinx/coroutines/CoroutineDispatcher$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/CoroutineDispatcher$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/CoroutineDispatcher$Key$1; HSPLkotlinx/coroutines/CoroutineDispatcher$Key$1;->()V PLkotlinx/coroutines/CoroutineDispatcher$Key$1;->()V HSPLkotlinx/coroutines/CoroutineDispatcher$Key$1;->()V PLkotlinx/coroutines/CoroutineDispatcher$Key$1;->()V Lkotlinx/coroutines/CoroutineExceptionHandler; HSPLkotlinx/coroutines/CoroutineExceptionHandler;->()V PLkotlinx/coroutines/CoroutineExceptionHandler;->()V Lkotlinx/coroutines/CoroutineExceptionHandler$Key; HSPLkotlinx/coroutines/CoroutineExceptionHandler$Key;->()V PLkotlinx/coroutines/CoroutineExceptionHandler$Key;->()V HSPLkotlinx/coroutines/CoroutineExceptionHandler$Key;->()V PLkotlinx/coroutines/CoroutineExceptionHandler$Key;->()V Lkotlinx/coroutines/CoroutineExceptionHandlerKt; Lkotlinx/coroutines/CoroutineName; HSPLkotlinx/coroutines/CoroutineName;->()V PLkotlinx/coroutines/CoroutineName;->()V HSPLkotlinx/coroutines/CoroutineName;->(Ljava/lang/String;)V PLkotlinx/coroutines/CoroutineName;->(Ljava/lang/String;)V Lkotlinx/coroutines/CoroutineName$Key; HSPLkotlinx/coroutines/CoroutineName$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/CoroutineName$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/CoroutineScope; Lkotlinx/coroutines/CoroutineScopeKt; HSPLkotlinx/coroutines/CoroutineScopeKt;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; HPLkotlinx/coroutines/CoroutineScopeKt;->CoroutineScope(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; HSPLkotlinx/coroutines/CoroutineScopeKt;->MainScope()Lkotlinx/coroutines/CoroutineScope; PLkotlinx/coroutines/CoroutineScopeKt;->MainScope()Lkotlinx/coroutines/CoroutineScope; HSPLkotlinx/coroutines/CoroutineScopeKt;->cancel(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;)V HPLkotlinx/coroutines/CoroutineScopeKt;->cancel(Lkotlinx/coroutines/CoroutineScope;Ljava/util/concurrent/CancellationException;)V HSPLkotlinx/coroutines/CoroutineScopeKt;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/CoroutineScopeKt;->coroutineScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/CoroutineScopeKt;->ensureActive(Lkotlinx/coroutines/CoroutineScope;)V PLkotlinx/coroutines/CoroutineScopeKt;->ensureActive(Lkotlinx/coroutines/CoroutineScope;)V HSPLkotlinx/coroutines/CoroutineScopeKt;->isActive(Lkotlinx/coroutines/CoroutineScope;)Z HPLkotlinx/coroutines/CoroutineScopeKt;->isActive(Lkotlinx/coroutines/CoroutineScope;)Z HSPLkotlinx/coroutines/CoroutineScopeKt;->plus(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; PLkotlinx/coroutines/CoroutineScopeKt;->plus(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/CoroutineScope; Lkotlinx/coroutines/CoroutineStart; HSPLkotlinx/coroutines/CoroutineStart;->()V PLkotlinx/coroutines/CoroutineStart;->()V HSPLkotlinx/coroutines/CoroutineStart;->(Ljava/lang/String;I)V PLkotlinx/coroutines/CoroutineStart;->(Ljava/lang/String;I)V HSPLkotlinx/coroutines/CoroutineStart;->invoke(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/CoroutineStart;->invoke(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/CoroutineStart;->isLazy()Z PLkotlinx/coroutines/CoroutineStart;->isLazy()Z HSPLkotlinx/coroutines/CoroutineStart;->values()[Lkotlinx/coroutines/CoroutineStart; PLkotlinx/coroutines/CoroutineStart;->values()[Lkotlinx/coroutines/CoroutineStart; Lkotlinx/coroutines/CoroutineStart$WhenMappings; HSPLkotlinx/coroutines/CoroutineStart$WhenMappings;->()V PLkotlinx/coroutines/CoroutineStart$WhenMappings;->()V Lkotlinx/coroutines/CoroutinesInternalError; Lkotlinx/coroutines/DebugStringsKt; HSPLkotlinx/coroutines/DebugStringsKt;->getClassSimpleName(Ljava/lang/Object;)Ljava/lang/String; HPLkotlinx/coroutines/DebugStringsKt;->getClassSimpleName(Ljava/lang/Object;)Ljava/lang/String; Lkotlinx/coroutines/DefaultExecutor; HSPLkotlinx/coroutines/DefaultExecutor;->()V PLkotlinx/coroutines/DefaultExecutor;->()V HSPLkotlinx/coroutines/DefaultExecutor;->()V PLkotlinx/coroutines/DefaultExecutor;->()V HSPLkotlinx/coroutines/DefaultExecutor;->acknowledgeShutdownIfNeeded()V PLkotlinx/coroutines/DefaultExecutor;->acknowledgeShutdownIfNeeded()V HSPLkotlinx/coroutines/DefaultExecutor;->getThread()Ljava/lang/Thread; HPLkotlinx/coroutines/DefaultExecutor;->getThread()Ljava/lang/Thread; HSPLkotlinx/coroutines/DefaultExecutor;->invokeOnTimeout(JLjava/lang/Runnable;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/DisposableHandle; PLkotlinx/coroutines/DefaultExecutor;->invokeOnTimeout(JLjava/lang/Runnable;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/DisposableHandle; HSPLkotlinx/coroutines/DefaultExecutor;->isShutdownRequested()Z PLkotlinx/coroutines/DefaultExecutor;->isShutdownRequested()Z HSPLkotlinx/coroutines/DefaultExecutor;->run()V HPLkotlinx/coroutines/DefaultExecutor;->run()V Lkotlinx/coroutines/DefaultExecutorKt; HSPLkotlinx/coroutines/DefaultExecutorKt;->()V PLkotlinx/coroutines/DefaultExecutorKt;->()V HSPLkotlinx/coroutines/DefaultExecutorKt;->getDefaultDelay()Lkotlinx/coroutines/Delay; PLkotlinx/coroutines/DefaultExecutorKt;->getDefaultDelay()Lkotlinx/coroutines/Delay; Lkotlinx/coroutines/Deferred; Lkotlinx/coroutines/DeferredCoroutine; HSPLkotlinx/coroutines/DeferredCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V PLkotlinx/coroutines/DeferredCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V HSPLkotlinx/coroutines/DeferredCoroutine;->await(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/DeferredCoroutine;->await(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/Delay; Lkotlinx/coroutines/DelayKt; HSPLkotlinx/coroutines/DelayKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/DelayKt;->delay(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/DelayKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay; PLkotlinx/coroutines/DelayKt;->getDelay(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Delay; Lkotlinx/coroutines/DispatchedCoroutine; HSPLkotlinx/coroutines/DispatchedCoroutine;->()V PLkotlinx/coroutines/DispatchedCoroutine;->()V HSPLkotlinx/coroutines/DispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/DispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/DispatchedCoroutine;->afterResume(Ljava/lang/Object;)V PLkotlinx/coroutines/DispatchedCoroutine;->afterResume(Ljava/lang/Object;)V HSPLkotlinx/coroutines/DispatchedCoroutine;->getResult$kotlinx_coroutines_core()Ljava/lang/Object; PLkotlinx/coroutines/DispatchedCoroutine;->getResult$kotlinx_coroutines_core()Ljava/lang/Object; Lkotlinx/coroutines/DispatchedTask; HSPLkotlinx/coroutines/DispatchedTask;->(I)V PLkotlinx/coroutines/DispatchedTask;->(I)V HSPLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; PLkotlinx/coroutines/DispatchedTask;->getExceptionalResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Throwable; HSPLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/DispatchedTask;->getSuccessfulResult$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/DispatchedTask;->handleFatalException$kotlinx_coroutines_core(Ljava/lang/Throwable;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/DispatchedTask;->handleFatalException$kotlinx_coroutines_core(Ljava/lang/Throwable;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/DispatchedTask;->run()V HPLkotlinx/coroutines/DispatchedTask;->run()V Lkotlinx/coroutines/DispatchedTaskKt; HSPLkotlinx/coroutines/DispatchedTaskKt;->dispatch(Lkotlinx/coroutines/DispatchedTask;I)V HPLkotlinx/coroutines/DispatchedTaskKt;->dispatch(Lkotlinx/coroutines/DispatchedTask;I)V HSPLkotlinx/coroutines/DispatchedTaskKt;->isCancellableMode(I)Z PLkotlinx/coroutines/DispatchedTaskKt;->isCancellableMode(I)Z HSPLkotlinx/coroutines/DispatchedTaskKt;->isReusableMode(I)Z PLkotlinx/coroutines/DispatchedTaskKt;->isReusableMode(I)Z HSPLkotlinx/coroutines/DispatchedTaskKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V HPLkotlinx/coroutines/DispatchedTaskKt;->resume(Lkotlinx/coroutines/DispatchedTask;Lkotlin/coroutines/Continuation;Z)V Lkotlinx/coroutines/Dispatchers; HSPLkotlinx/coroutines/Dispatchers;->()V PLkotlinx/coroutines/Dispatchers;->()V HSPLkotlinx/coroutines/Dispatchers;->()V PLkotlinx/coroutines/Dispatchers;->()V HSPLkotlinx/coroutines/Dispatchers;->getDefault()Lkotlinx/coroutines/CoroutineDispatcher; PLkotlinx/coroutines/Dispatchers;->getDefault()Lkotlinx/coroutines/CoroutineDispatcher; HSPLkotlinx/coroutines/Dispatchers;->getIO()Lkotlinx/coroutines/CoroutineDispatcher; PLkotlinx/coroutines/Dispatchers;->getIO()Lkotlinx/coroutines/CoroutineDispatcher; Lkotlinx/coroutines/DisposableHandle; Lkotlinx/coroutines/DisposeOnCancel; HSPLkotlinx/coroutines/DisposeOnCancel;->(Lkotlinx/coroutines/DisposableHandle;)V PLkotlinx/coroutines/DisposeOnCancel;->(Lkotlinx/coroutines/DisposableHandle;)V PLkotlinx/coroutines/DisposeOnCancel;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/Empty; HSPLkotlinx/coroutines/Empty;->(Z)V PLkotlinx/coroutines/Empty;->(Z)V HSPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/Empty;->getList()Lkotlinx/coroutines/NodeList; HSPLkotlinx/coroutines/Empty;->isActive()Z HPLkotlinx/coroutines/Empty;->isActive()Z Lkotlinx/coroutines/EventLoop; HSPLkotlinx/coroutines/EventLoop;->()V PLkotlinx/coroutines/EventLoop;->()V HSPLkotlinx/coroutines/EventLoop;->decrementUseCount(Z)V PLkotlinx/coroutines/EventLoop;->decrementUseCount(Z)V HSPLkotlinx/coroutines/EventLoop;->dispatchUnconfined(Lkotlinx/coroutines/DispatchedTask;)V PLkotlinx/coroutines/EventLoop;->dispatchUnconfined(Lkotlinx/coroutines/DispatchedTask;)V HSPLkotlinx/coroutines/EventLoop;->getNextTime()J PLkotlinx/coroutines/EventLoop;->getNextTime()J HSPLkotlinx/coroutines/EventLoop;->incrementUseCount$default(Lkotlinx/coroutines/EventLoop;ZILjava/lang/Object;)V PLkotlinx/coroutines/EventLoop;->incrementUseCount$default(Lkotlinx/coroutines/EventLoop;ZILjava/lang/Object;)V HSPLkotlinx/coroutines/EventLoop;->incrementUseCount(Z)V PLkotlinx/coroutines/EventLoop;->incrementUseCount(Z)V HSPLkotlinx/coroutines/EventLoop;->isUnconfinedLoopActive()Z PLkotlinx/coroutines/EventLoop;->isUnconfinedLoopActive()Z HSPLkotlinx/coroutines/EventLoop;->isUnconfinedQueueEmpty()Z PLkotlinx/coroutines/EventLoop;->isUnconfinedQueueEmpty()Z HSPLkotlinx/coroutines/EventLoop;->processUnconfinedEvent()Z PLkotlinx/coroutines/EventLoop;->processUnconfinedEvent()Z Lkotlinx/coroutines/EventLoopImplBase; HSPLkotlinx/coroutines/EventLoopImplBase;->()V PLkotlinx/coroutines/EventLoopImplBase;->()V HSPLkotlinx/coroutines/EventLoopImplBase;->()V PLkotlinx/coroutines/EventLoopImplBase;->()V HSPLkotlinx/coroutines/EventLoopImplBase;->access$isCompleted(Lkotlinx/coroutines/EventLoopImplBase;)Z HPLkotlinx/coroutines/EventLoopImplBase;->access$isCompleted(Lkotlinx/coroutines/EventLoopImplBase;)Z HSPLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z PLkotlinx/coroutines/EventLoopImplBase;->enqueueImpl(Ljava/lang/Runnable;)Z HSPLkotlinx/coroutines/EventLoopImplBase;->getNextTime()J HPLkotlinx/coroutines/EventLoopImplBase;->getNextTime()J HSPLkotlinx/coroutines/EventLoopImplBase;->isEmpty()Z PLkotlinx/coroutines/EventLoopImplBase;->isEmpty()Z HSPLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J HPLkotlinx/coroutines/EventLoopImplBase;->processNextEvent()J HSPLkotlinx/coroutines/EventLoopImplBase;->schedule(JLkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V HPLkotlinx/coroutines/EventLoopImplBase;->schedule(JLkotlinx/coroutines/EventLoopImplBase$DelayedTask;)V HSPLkotlinx/coroutines/EventLoopImplBase;->scheduleInvokeOnTimeout(JLjava/lang/Runnable;)Lkotlinx/coroutines/DisposableHandle; PLkotlinx/coroutines/EventLoopImplBase;->scheduleInvokeOnTimeout(JLjava/lang/Runnable;)Lkotlinx/coroutines/DisposableHandle; HSPLkotlinx/coroutines/EventLoopImplBase;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuation;)V HPLkotlinx/coroutines/EventLoopImplBase;->scheduleResumeAfterDelay(JLkotlinx/coroutines/CancellableContinuation;)V Lkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask; HSPLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->(Lkotlinx/coroutines/EventLoopImplBase;JLkotlinx/coroutines/CancellableContinuation;)V PLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->(Lkotlinx/coroutines/EventLoopImplBase;JLkotlinx/coroutines/CancellableContinuation;)V HSPLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->run()V PLkotlinx/coroutines/EventLoopImplBase$DelayedResumeTask;->run()V Lkotlinx/coroutines/EventLoopImplBase$DelayedRunnableTask; HSPLkotlinx/coroutines/EventLoopImplBase$DelayedRunnableTask;->(JLjava/lang/Runnable;)V PLkotlinx/coroutines/EventLoopImplBase$DelayedRunnableTask;->(JLjava/lang/Runnable;)V HSPLkotlinx/coroutines/EventLoopImplBase$DelayedRunnableTask;->run()V PLkotlinx/coroutines/EventLoopImplBase$DelayedRunnableTask;->run()V Lkotlinx/coroutines/EventLoopImplBase$DelayedTask; HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->(J)V HPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->(J)V HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->compareTo(Ljava/lang/Object;)I PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->compareTo(Ljava/lang/Object;)I HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->compareTo(Lkotlinx/coroutines/EventLoopImplBase$DelayedTask;)I PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->compareTo(Lkotlinx/coroutines/EventLoopImplBase$DelayedTask;)I PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->dispose()V PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->getHeap()Lkotlinx/coroutines/internal/ThreadSafeHeap; PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->getIndex()I HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->scheduleTask(JLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;Lkotlinx/coroutines/EventLoopImplBase;)I HPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->scheduleTask(JLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;Lkotlinx/coroutines/EventLoopImplBase;)I HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setHeap(Lkotlinx/coroutines/internal/ThreadSafeHeap;)V PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setHeap(Lkotlinx/coroutines/internal/ThreadSafeHeap;)V HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setIndex(I)V PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->setIndex(I)V HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->timeToExecute(J)Z PLkotlinx/coroutines/EventLoopImplBase$DelayedTask;->timeToExecute(J)Z Lkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue; HSPLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;->(J)V PLkotlinx/coroutines/EventLoopImplBase$DelayedTaskQueue;->(J)V Lkotlinx/coroutines/EventLoopImplPlatform; HSPLkotlinx/coroutines/EventLoopImplPlatform;->()V PLkotlinx/coroutines/EventLoopImplPlatform;->()V HSPLkotlinx/coroutines/EventLoopImplPlatform;->unpark()V HPLkotlinx/coroutines/EventLoopImplPlatform;->unpark()V Lkotlinx/coroutines/EventLoopKt; HSPLkotlinx/coroutines/EventLoopKt;->createEventLoop()Lkotlinx/coroutines/EventLoop; PLkotlinx/coroutines/EventLoopKt;->createEventLoop()Lkotlinx/coroutines/EventLoop; Lkotlinx/coroutines/EventLoop_commonKt; HSPLkotlinx/coroutines/EventLoop_commonKt;->()V PLkotlinx/coroutines/EventLoop_commonKt;->()V HSPLkotlinx/coroutines/EventLoop_commonKt;->access$getCLOSED_EMPTY$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/EventLoop_commonKt;->access$getCLOSED_EMPTY$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/EventLoop_commonKt;->access$getDISPOSED_TASK$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/EventLoop_commonKt;->access$getDISPOSED_TASK$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/EventLoop_commonKt;->delayToNanos(J)J PLkotlinx/coroutines/EventLoop_commonKt;->delayToNanos(J)J Lkotlinx/coroutines/ExceptionsKt; PLkotlinx/coroutines/ExceptionsKt;->CancellationException(Ljava/lang/String;Ljava/lang/Throwable;)Ljava/util/concurrent/CancellationException; Lkotlinx/coroutines/ExecutorCoroutineDispatcher; HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V PLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V PLkotlinx/coroutines/ExecutorCoroutineDispatcher;->()V Lkotlinx/coroutines/ExecutorCoroutineDispatcher$Key; HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$1; HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$1;->()V PLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$1;->()V HSPLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$1;->()V PLkotlinx/coroutines/ExecutorCoroutineDispatcher$Key$1;->()V Lkotlinx/coroutines/GlobalScope; HSPLkotlinx/coroutines/GlobalScope;->()V PLkotlinx/coroutines/GlobalScope;->()V HSPLkotlinx/coroutines/GlobalScope;->()V PLkotlinx/coroutines/GlobalScope;->()V HSPLkotlinx/coroutines/GlobalScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/GlobalScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; Lkotlinx/coroutines/InactiveNodeList; Lkotlinx/coroutines/Incomplete; Lkotlinx/coroutines/IncompleteStateBox; Lkotlinx/coroutines/InvokeOnCancel; HSPLkotlinx/coroutines/InvokeOnCancel;->(Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/InvokeOnCancel;->(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/InvokeOnCancel;->invoke(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/InvokeOnCancel;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/InvokeOnCancelling; Lkotlinx/coroutines/InvokeOnCompletion; HSPLkotlinx/coroutines/InvokeOnCompletion;->(Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/InvokeOnCompletion;->(Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/InvokeOnCompletion;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/Job;->()V PLkotlinx/coroutines/Job;->()V Lkotlinx/coroutines/Job$DefaultImpls; PLkotlinx/coroutines/Job$DefaultImpls;->cancel$default(Lkotlinx/coroutines/Job;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V HSPLkotlinx/coroutines/Job$DefaultImpls;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; HPLkotlinx/coroutines/Job$DefaultImpls;->invokeOnCompletion$default(Lkotlinx/coroutines/Job;ZZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/DisposableHandle; Lkotlinx/coroutines/Job$Key; HSPLkotlinx/coroutines/Job$Key;->()V PLkotlinx/coroutines/Job$Key;->()V HSPLkotlinx/coroutines/Job$Key;->()V PLkotlinx/coroutines/Job$Key;->()V Lkotlinx/coroutines/JobCancellationException; HSPLkotlinx/coroutines/JobCancellationException;->(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/JobCancellationException;->(Ljava/lang/String;Ljava/lang/Throwable;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z HPLkotlinx/coroutines/JobCancellationException;->equals(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable; PLkotlinx/coroutines/JobCancellationException;->fillInStackTrace()Ljava/lang/Throwable; Lkotlinx/coroutines/JobCancellingNode; HSPLkotlinx/coroutines/JobCancellingNode;->()V PLkotlinx/coroutines/JobCancellingNode;->()V Lkotlinx/coroutines/JobImpl; HSPLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V HPLkotlinx/coroutines/JobImpl;->(Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/JobImpl;->getHandlesException$kotlinx_coroutines_core()Z PLkotlinx/coroutines/JobImpl;->getHandlesException$kotlinx_coroutines_core()Z HSPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z HPLkotlinx/coroutines/JobImpl;->getOnCancelComplete$kotlinx_coroutines_core()Z Lkotlinx/coroutines/JobKt; HSPLkotlinx/coroutines/JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; PLkotlinx/coroutines/JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; PLkotlinx/coroutines/JobKt;->cancel$default(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V PLkotlinx/coroutines/JobKt;->cancelAndJoin(Lkotlinx/coroutines/Job;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V PLkotlinx/coroutines/JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V HPLkotlinx/coroutines/JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z PLkotlinx/coroutines/JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z Lkotlinx/coroutines/JobKt__JobKt; HSPLkotlinx/coroutines/JobKt__JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; PLkotlinx/coroutines/JobKt__JobKt;->Job$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; PLkotlinx/coroutines/JobKt__JobKt;->cancel$default(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V PLkotlinx/coroutines/JobKt__JobKt;->cancel(Lkotlin/coroutines/CoroutineContext;Ljava/util/concurrent/CancellationException;)V PLkotlinx/coroutines/JobKt__JobKt;->cancelAndJoin(Lkotlinx/coroutines/Job;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V HPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V HPLkotlinx/coroutines/JobKt__JobKt;->ensureActive(Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/JobKt__JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/JobKt__JobKt;->getJob(Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/JobKt__JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z HPLkotlinx/coroutines/JobKt__JobKt;->isActive(Lkotlin/coroutines/CoroutineContext;)Z Lkotlinx/coroutines/JobNode; HSPLkotlinx/coroutines/JobNode;->()V PLkotlinx/coroutines/JobNode;->()V HSPLkotlinx/coroutines/JobNode;->dispose()V HPLkotlinx/coroutines/JobNode;->dispose()V HSPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport; HPLkotlinx/coroutines/JobNode;->getJob()Lkotlinx/coroutines/JobSupport; HSPLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/JobNode;->getList()Lkotlinx/coroutines/NodeList; HSPLkotlinx/coroutines/JobNode;->isActive()Z HPLkotlinx/coroutines/JobNode;->isActive()Z HSPLkotlinx/coroutines/JobNode;->setJob(Lkotlinx/coroutines/JobSupport;)V PLkotlinx/coroutines/JobNode;->setJob(Lkotlinx/coroutines/JobSupport;)V Lkotlinx/coroutines/JobSupport; HSPLkotlinx/coroutines/JobSupport;->()V PLkotlinx/coroutines/JobSupport;->()V HSPLkotlinx/coroutines/JobSupport;->(Z)V HPLkotlinx/coroutines/JobSupport;->(Z)V HSPLkotlinx/coroutines/JobSupport;->access$cancellationExceptionMessage(Lkotlinx/coroutines/JobSupport;)Ljava/lang/String; PLkotlinx/coroutines/JobSupport;->access$cancellationExceptionMessage(Lkotlinx/coroutines/JobSupport;)Ljava/lang/String; HSPLkotlinx/coroutines/JobSupport;->access$continueCompleting(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V PLkotlinx/coroutines/JobSupport;->access$continueCompleting(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V HSPLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V HPLkotlinx/coroutines/JobSupport;->afterCompletion(Ljava/lang/Object;)V HSPLkotlinx/coroutines/JobSupport;->attachChild(Lkotlinx/coroutines/ChildJob;)Lkotlinx/coroutines/ChildHandle; HPLkotlinx/coroutines/JobSupport;->attachChild(Lkotlinx/coroutines/ChildJob;)Lkotlinx/coroutines/ChildHandle; HSPLkotlinx/coroutines/JobSupport;->awaitInternal(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupport;->awaitInternal(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->awaitSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupport;->awaitSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V HPLkotlinx/coroutines/JobSupport;->cancel(Ljava/util/concurrent/CancellationException;)V HSPLkotlinx/coroutines/JobSupport;->cancelCoroutine(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/JobSupport;->cancelCoroutine(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z HPLkotlinx/coroutines/JobSupport;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport;->cancelInternal(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/JobSupport;->cancelParent(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/JobSupport;->cancellationExceptionMessage()Ljava/lang/String; HSPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/JobSupport;->childCancelled(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V HPLkotlinx/coroutines/JobSupport;->completeStateFinalization(Lkotlinx/coroutines/Incomplete;Ljava/lang/Object;)V HSPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable; HPLkotlinx/coroutines/JobSupport;->createCauseException(Ljava/lang/Object;)Ljava/lang/Throwable; HSPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->finalizeFinishingState(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HPLkotlinx/coroutines/JobSupport;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException; HPLkotlinx/coroutines/JobSupport;->getCancellationException()Ljava/util/concurrent/CancellationException; HSPLkotlinx/coroutines/JobSupport;->getChildJobCancellationCause()Ljava/util/concurrent/CancellationException; HPLkotlinx/coroutines/JobSupport;->getChildJobCancellationCause()Ljava/util/concurrent/CancellationException; HSPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/List;)Ljava/lang/Throwable; HPLkotlinx/coroutines/JobSupport;->getFinalRootCause(Lkotlinx/coroutines/JobSupport$Finishing;Ljava/util/List;)Ljava/lang/Throwable; HSPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HPLkotlinx/coroutines/JobSupport;->getKey()Lkotlin/coroutines/CoroutineContext$Key; HSPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z HPLkotlinx/coroutines/JobSupport;->getOnCancelComplete$kotlinx_coroutines_core()Z HSPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/JobSupport;->getOrPromoteCancellingList(Lkotlinx/coroutines/Incomplete;)Lkotlinx/coroutines/NodeList; HSPLkotlinx/coroutines/JobSupport;->getParentHandle$kotlinx_coroutines_core()Lkotlinx/coroutines/ChildHandle; HPLkotlinx/coroutines/JobSupport;->getParentHandle$kotlinx_coroutines_core()Lkotlinx/coroutines/ChildHandle; HSPLkotlinx/coroutines/JobSupport;->getState$kotlinx_coroutines_core()Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->getState$kotlinx_coroutines_core()Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V HPLkotlinx/coroutines/JobSupport;->initParentJob(Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/JobSupport;->invokeOnCompletion(Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; PLkotlinx/coroutines/JobSupport;->invokeOnCompletion(Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; HSPLkotlinx/coroutines/JobSupport;->invokeOnCompletion(ZZLkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; HPLkotlinx/coroutines/JobSupport;->invokeOnCompletion(ZZLkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/DisposableHandle; HSPLkotlinx/coroutines/JobSupport;->isActive()Z HPLkotlinx/coroutines/JobSupport;->isActive()Z HSPLkotlinx/coroutines/JobSupport;->isCancelled()Z HPLkotlinx/coroutines/JobSupport;->isCancelled()Z HSPLkotlinx/coroutines/JobSupport;->isCompleted()Z HPLkotlinx/coroutines/JobSupport;->isCompleted()Z HSPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z HPLkotlinx/coroutines/JobSupport;->isScopedCoroutine()Z HSPLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->join(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->joinSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupport;->joinSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->makeCompletingOnce$kotlinx_coroutines_core(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/JobSupport;->minusKey(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode; HPLkotlinx/coroutines/JobSupport;->nextChild(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Lkotlinx/coroutines/ChildHandleNode; HSPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport;->notifyCancelling(Lkotlinx/coroutines/NodeList;Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/JobSupport;->onCancelling(Ljava/lang/Throwable;)V PLkotlinx/coroutines/JobSupport;->onCancelling(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V HPLkotlinx/coroutines/JobSupport;->onCompletionInternal(Ljava/lang/Object;)V HSPLkotlinx/coroutines/JobSupport;->parentCancelled(Lkotlinx/coroutines/ParentJob;)V PLkotlinx/coroutines/JobSupport;->parentCancelled(Lkotlinx/coroutines/ParentJob;)V HSPLkotlinx/coroutines/JobSupport;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/JobSupport;->plus(Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/JobSupport;->removeNode$kotlinx_coroutines_core(Lkotlinx/coroutines/JobNode;)V HPLkotlinx/coroutines/JobSupport;->removeNode$kotlinx_coroutines_core(Lkotlinx/coroutines/JobNode;)V HSPLkotlinx/coroutines/JobSupport;->setParentHandle$kotlinx_coroutines_core(Lkotlinx/coroutines/ChildHandle;)V HPLkotlinx/coroutines/JobSupport;->setParentHandle$kotlinx_coroutines_core(Lkotlinx/coroutines/ChildHandle;)V HSPLkotlinx/coroutines/JobSupport;->start()Z HPLkotlinx/coroutines/JobSupport;->start()Z HSPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I HPLkotlinx/coroutines/JobSupport;->startInternal(Ljava/lang/Object;)I HSPLkotlinx/coroutines/JobSupport;->toCancellationException$default(Lkotlinx/coroutines/JobSupport;Ljava/lang/Throwable;Ljava/lang/String;ILjava/lang/Object;)Ljava/util/concurrent/CancellationException; PLkotlinx/coroutines/JobSupport;->toCancellationException$default(Lkotlinx/coroutines/JobSupport;Ljava/lang/Throwable;Ljava/lang/String;ILjava/lang/Object;)Ljava/util/concurrent/CancellationException; HSPLkotlinx/coroutines/JobSupport;->toCancellationException(Ljava/lang/Throwable;Ljava/lang/String;)Ljava/util/concurrent/CancellationException; PLkotlinx/coroutines/JobSupport;->toCancellationException(Ljava/lang/Throwable;Ljava/lang/String;)Ljava/util/concurrent/CancellationException; HSPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/JobSupport;->tryMakeCompleting(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z PLkotlinx/coroutines/JobSupport;->tryWaitForChild(Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)Z Lkotlinx/coroutines/JobSupport$AwaitContinuation; HSPLkotlinx/coroutines/JobSupport$AwaitContinuation;->(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/JobSupport;)V PLkotlinx/coroutines/JobSupport$AwaitContinuation;->(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/JobSupport;)V Lkotlinx/coroutines/JobSupport$ChildCompletion; HSPLkotlinx/coroutines/JobSupport$ChildCompletion;->(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V PLkotlinx/coroutines/JobSupport$ChildCompletion;->(Lkotlinx/coroutines/JobSupport;Lkotlinx/coroutines/JobSupport$Finishing;Lkotlinx/coroutines/ChildHandleNode;Ljava/lang/Object;)V HSPLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/JobSupport$ChildCompletion;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/JobSupport$Finishing; HSPLkotlinx/coroutines/JobSupport$Finishing;->()V PLkotlinx/coroutines/JobSupport$Finishing;->()V HSPLkotlinx/coroutines/JobSupport$Finishing;->(Lkotlinx/coroutines/NodeList;ZLjava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport$Finishing;->(Lkotlinx/coroutines/NodeList;ZLjava/lang/Throwable;)V HSPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/JobSupport$Finishing;->addExceptionLocked(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/JobSupport$Finishing;->getList()Lkotlinx/coroutines/NodeList; HSPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable; HPLkotlinx/coroutines/JobSupport$Finishing;->getRootCause()Ljava/lang/Throwable; HSPLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z HPLkotlinx/coroutines/JobSupport$Finishing;->isActive()Z HSPLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z PLkotlinx/coroutines/JobSupport$Finishing;->isCancelling()Z HSPLkotlinx/coroutines/JobSupport$Finishing;->isCompleting()Z PLkotlinx/coroutines/JobSupport$Finishing;->isCompleting()Z HSPLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z PLkotlinx/coroutines/JobSupport$Finishing;->isSealed()Z HSPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/List; HPLkotlinx/coroutines/JobSupport$Finishing;->sealLocked(Ljava/lang/Throwable;)Ljava/util/List; HSPLkotlinx/coroutines/JobSupport$Finishing;->setCompleting(Z)V PLkotlinx/coroutines/JobSupport$Finishing;->setCompleting(Z)V HSPLkotlinx/coroutines/JobSupport$Finishing;->setRootCause(Ljava/lang/Throwable;)V PLkotlinx/coroutines/JobSupport$Finishing;->setRootCause(Ljava/lang/Throwable;)V Lkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1; HSPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/JobSupport;Ljava/lang/Object;)V PLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/JobSupport;Ljava/lang/Object;)V HSPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupport$addLastAtomic$$inlined$addLastIf$1;->prepare(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Ljava/lang/Object; Lkotlinx/coroutines/JobSupportKt; HSPLkotlinx/coroutines/JobSupportKt;->()V PLkotlinx/coroutines/JobSupportKt;->()V HSPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_ALREADY$p()Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_ALREADY$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_RETRY$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/JobSupportKt;->access$getCOMPLETING_RETRY$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/JobSupportKt;->access$getEMPTY_ACTIVE$p()Lkotlinx/coroutines/Empty; PLkotlinx/coroutines/JobSupportKt;->access$getEMPTY_ACTIVE$p()Lkotlinx/coroutines/Empty; HSPLkotlinx/coroutines/JobSupportKt;->access$getSEALED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/JobSupportKt;->access$getSEALED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/JobSupportKt;->access$getTOO_LATE_TO_CANCEL$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/JobSupportKt;->access$getTOO_LATE_TO_CANCEL$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/JobSupportKt;->boxIncomplete(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupportKt;->boxIncomplete(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/JobSupportKt;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/JobSupportKt;->unboxState(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/LazyStandaloneCoroutine; Lkotlinx/coroutines/MainCoroutineDispatcher; HSPLkotlinx/coroutines/MainCoroutineDispatcher;->()V PLkotlinx/coroutines/MainCoroutineDispatcher;->()V Lkotlinx/coroutines/NodeList; HSPLkotlinx/coroutines/NodeList;->()V PLkotlinx/coroutines/NodeList;->()V HSPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList; HPLkotlinx/coroutines/NodeList;->getList()Lkotlinx/coroutines/NodeList; HSPLkotlinx/coroutines/NodeList;->isActive()Z HPLkotlinx/coroutines/NodeList;->isActive()Z Lkotlinx/coroutines/NonDisposableHandle; HSPLkotlinx/coroutines/NonDisposableHandle;->()V PLkotlinx/coroutines/NonDisposableHandle;->()V HSPLkotlinx/coroutines/NonDisposableHandle;->()V PLkotlinx/coroutines/NonDisposableHandle;->()V HSPLkotlinx/coroutines/NonDisposableHandle;->dispose()V PLkotlinx/coroutines/NonDisposableHandle;->dispose()V Lkotlinx/coroutines/NotCompleted; Lkotlinx/coroutines/ParentJob; Lkotlinx/coroutines/ResumeAwaitOnCompletion; HSPLkotlinx/coroutines/ResumeAwaitOnCompletion;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V PLkotlinx/coroutines/ResumeAwaitOnCompletion;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLkotlinx/coroutines/ResumeAwaitOnCompletion;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/ResumeAwaitOnCompletion;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/ResumeOnCompletion; HSPLkotlinx/coroutines/ResumeOnCompletion;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/ResumeOnCompletion;->(Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/ResumeOnCompletion;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/ResumeOnCompletion;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/StandaloneCoroutine; HSPLkotlinx/coroutines/StandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V HPLkotlinx/coroutines/StandaloneCoroutine;->(Lkotlin/coroutines/CoroutineContext;Z)V Lkotlinx/coroutines/SupervisorJobImpl; HSPLkotlinx/coroutines/SupervisorJobImpl;->(Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/SupervisorJobImpl;->(Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/SupervisorJobImpl;->childCancelled(Ljava/lang/Throwable;)Z Lkotlinx/coroutines/SupervisorKt; HSPLkotlinx/coroutines/SupervisorKt;->SupervisorJob$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; PLkotlinx/coroutines/SupervisorKt;->SupervisorJob$default(Lkotlinx/coroutines/Job;ILjava/lang/Object;)Lkotlinx/coroutines/CompletableJob; HSPLkotlinx/coroutines/SupervisorKt;->SupervisorJob(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; PLkotlinx/coroutines/SupervisorKt;->SupervisorJob(Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/CompletableJob; Lkotlinx/coroutines/ThreadContextElement; Lkotlinx/coroutines/ThreadLocalEventLoop; HSPLkotlinx/coroutines/ThreadLocalEventLoop;->()V PLkotlinx/coroutines/ThreadLocalEventLoop;->()V HSPLkotlinx/coroutines/ThreadLocalEventLoop;->()V PLkotlinx/coroutines/ThreadLocalEventLoop;->()V HSPLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoop; PLkotlinx/coroutines/ThreadLocalEventLoop;->getEventLoop$kotlinx_coroutines_core()Lkotlinx/coroutines/EventLoop; HSPLkotlinx/coroutines/ThreadLocalEventLoop;->setEventLoop$kotlinx_coroutines_core(Lkotlinx/coroutines/EventLoop;)V PLkotlinx/coroutines/ThreadLocalEventLoop;->setEventLoop$kotlinx_coroutines_core(Lkotlinx/coroutines/EventLoop;)V Lkotlinx/coroutines/TimeoutCancellationException; Lkotlinx/coroutines/Unconfined; HSPLkotlinx/coroutines/Unconfined;->()V PLkotlinx/coroutines/Unconfined;->()V HSPLkotlinx/coroutines/Unconfined;->()V PLkotlinx/coroutines/Unconfined;->()V Lkotlinx/coroutines/UndispatchedCoroutine; HSPLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/UndispatchedCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/UndispatchedCoroutine;->afterResume(Ljava/lang/Object;)V Lkotlinx/coroutines/UndispatchedMarker; HSPLkotlinx/coroutines/UndispatchedMarker;->()V PLkotlinx/coroutines/UndispatchedMarker;->()V HSPLkotlinx/coroutines/UndispatchedMarker;->()V PLkotlinx/coroutines/UndispatchedMarker;->()V HSPLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; PLkotlinx/coroutines/UndispatchedMarker;->fold(Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HSPLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; PLkotlinx/coroutines/UndispatchedMarker;->get(Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; HSPLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key; PLkotlinx/coroutines/UndispatchedMarker;->getKey()Lkotlin/coroutines/CoroutineContext$Key; Lkotlinx/coroutines/Waiter; Lkotlinx/coroutines/YieldContext; HSPLkotlinx/coroutines/YieldContext;->()V PLkotlinx/coroutines/YieldContext;->()V HSPLkotlinx/coroutines/YieldContext;->()V PLkotlinx/coroutines/YieldContext;->()V Lkotlinx/coroutines/YieldContext$Key; HSPLkotlinx/coroutines/YieldContext$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/YieldContext$Key;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/YieldKt; HSPLkotlinx/coroutines/YieldKt;->yield(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/YieldKt;->yield(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/android/AndroidDispatcherFactory; HSPLkotlinx/coroutines/android/AndroidDispatcherFactory;->()V PLkotlinx/coroutines/android/AndroidDispatcherFactory;->()V HSPLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; PLkotlinx/coroutines/android/AndroidDispatcherFactory;->createDispatcher(Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; Lkotlinx/coroutines/android/HandlerContext; HSPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;)V PLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;)V HSPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;Z)V PLkotlinx/coroutines/android/HandlerContext;->(Landroid/os/Handler;Ljava/lang/String;Z)V HSPLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HPLkotlinx/coroutines/android/HandlerContext;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z PLkotlinx/coroutines/android/HandlerContext;->equals(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/MainCoroutineDispatcher; PLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/MainCoroutineDispatcher; HSPLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/android/HandlerDispatcher; PLkotlinx/coroutines/android/HandlerContext;->getImmediate()Lkotlinx/coroutines/android/HandlerDispatcher; HSPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z HPLkotlinx/coroutines/android/HandlerContext;->isDispatchNeeded(Lkotlin/coroutines/CoroutineContext;)Z Lkotlinx/coroutines/android/HandlerDispatcher; HSPLkotlinx/coroutines/android/HandlerDispatcher;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/android/HandlerDispatcher;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/android/HandlerDispatcherKt; HSPLkotlinx/coroutines/android/HandlerDispatcherKt;->()V PLkotlinx/coroutines/android/HandlerDispatcherKt;->()V HSPLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;Z)Landroid/os/Handler; PLkotlinx/coroutines/android/HandlerDispatcherKt;->asHandler(Landroid/os/Looper;Z)Landroid/os/Handler; Lkotlinx/coroutines/channels/BufferOverflow; HSPLkotlinx/coroutines/channels/BufferOverflow;->()V PLkotlinx/coroutines/channels/BufferOverflow;->()V HSPLkotlinx/coroutines/channels/BufferOverflow;->(Ljava/lang/String;I)V PLkotlinx/coroutines/channels/BufferOverflow;->(Ljava/lang/String;I)V Lkotlinx/coroutines/channels/BufferedChannel; HSPLkotlinx/coroutines/channels/BufferedChannel;->()V PLkotlinx/coroutines/channels/BufferedChannel;->()V HSPLkotlinx/coroutines/channels/BufferedChannel;->(ILkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/channels/BufferedChannel;->(ILkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/channels/BufferedChannel;->access$findSegmentReceive(Lkotlinx/coroutines/channels/BufferedChannel;JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; PLkotlinx/coroutines/channels/BufferedChannel;->access$findSegmentReceive(Lkotlinx/coroutines/channels/BufferedChannel;JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$findSegmentSend(Lkotlinx/coroutines/channels/BufferedChannel;JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; HPLkotlinx/coroutines/channels/BufferedChannel;->access$findSegmentSend(Lkotlinx/coroutines/channels/BufferedChannel;JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$getReceiveSegment$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; PLkotlinx/coroutines/channels/BufferedChannel;->access$getReceiveSegment$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$getReceivers$FU$p()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; PLkotlinx/coroutines/channels/BufferedChannel;->access$getReceivers$FU$p()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$getSendSegment$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; PLkotlinx/coroutines/channels/BufferedChannel;->access$getSendSegment$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$getSendersAndCloseStatus$FU$p()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; PLkotlinx/coroutines/channels/BufferedChannel;->access$getSendersAndCloseStatus$FU$p()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$isClosedForSend0(Lkotlinx/coroutines/channels/BufferedChannel;J)Z PLkotlinx/coroutines/channels/BufferedChannel;->access$isClosedForSend0(Lkotlinx/coroutines/channels/BufferedChannel;J)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->access$prepareReceiverForSuspension(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/Waiter;Lkotlinx/coroutines/channels/ChannelSegment;I)V PLkotlinx/coroutines/channels/BufferedChannel;->access$prepareReceiverForSuspension(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/Waiter;Lkotlinx/coroutines/channels/ChannelSegment;I)V HSPLkotlinx/coroutines/channels/BufferedChannel;->access$prepareSenderForSuspension(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/Waiter;Lkotlinx/coroutines/channels/ChannelSegment;I)V PLkotlinx/coroutines/channels/BufferedChannel;->access$prepareSenderForSuspension(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/Waiter;Lkotlinx/coroutines/channels/ChannelSegment;I)V HSPLkotlinx/coroutines/channels/BufferedChannel;->access$processResultSelectReceive(Lkotlinx/coroutines/channels/BufferedChannel;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->access$processResultSelectReceive(Lkotlinx/coroutines/channels/BufferedChannel;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$processResultSelectReceiveCatching(Lkotlinx/coroutines/channels/BufferedChannel;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->access$processResultSelectReceiveCatching(Lkotlinx/coroutines/channels/BufferedChannel;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->access$receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$registerSelectForReceive(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)V HPLkotlinx/coroutines/channels/BufferedChannel;->access$registerSelectForReceive(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)V HSPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellReceive(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLjava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellReceive(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;IJLjava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellSend(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I HPLkotlinx/coroutines/channels/BufferedChannel;->access$updateCellSend(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I HSPLkotlinx/coroutines/channels/BufferedChannel;->bufferOrRendezvousSend(J)Z HPLkotlinx/coroutines/channels/BufferedChannel;->bufferOrRendezvousSend(J)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->cancel(Ljava/util/concurrent/CancellationException;)V PLkotlinx/coroutines/channels/BufferedChannel;->cancel(Ljava/util/concurrent/CancellationException;)V HSPLkotlinx/coroutines/channels/BufferedChannel;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Throwable;)Z PLkotlinx/coroutines/channels/BufferedChannel;->cancelImpl$kotlinx_coroutines_core(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->close(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/channels/BufferedChannel;->close(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->closeOrCancelImpl(Ljava/lang/Throwable;Z)Z HPLkotlinx/coroutines/channels/BufferedChannel;->closeOrCancelImpl(Ljava/lang/Throwable;Z)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->completeClose(J)Lkotlinx/coroutines/channels/ChannelSegment; HPLkotlinx/coroutines/channels/BufferedChannel;->completeClose(J)Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/BufferedChannel;->dropFirstElementUntilTheSpecifiedCellIsInTheBuffer(J)V HPLkotlinx/coroutines/channels/BufferedChannel;->dropFirstElementUntilTheSpecifiedCellIsInTheBuffer(J)V HSPLkotlinx/coroutines/channels/BufferedChannel;->expandBuffer()V HPLkotlinx/coroutines/channels/BufferedChannel;->expandBuffer()V HSPLkotlinx/coroutines/channels/BufferedChannel;->findSegmentReceive(JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; HPLkotlinx/coroutines/channels/BufferedChannel;->findSegmentReceive(JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/BufferedChannel;->getBufferEndCounter()J HPLkotlinx/coroutines/channels/BufferedChannel;->getBufferEndCounter()J HSPLkotlinx/coroutines/channels/BufferedChannel;->getCloseCause()Ljava/lang/Throwable; PLkotlinx/coroutines/channels/BufferedChannel;->getCloseCause()Ljava/lang/Throwable; HSPLkotlinx/coroutines/channels/BufferedChannel;->getOnReceive()Lkotlinx/coroutines/selects/SelectClause1; HPLkotlinx/coroutines/channels/BufferedChannel;->getOnReceive()Lkotlinx/coroutines/selects/SelectClause1; HSPLkotlinx/coroutines/channels/BufferedChannel;->getOnReceiveCatching()Lkotlinx/coroutines/selects/SelectClause1; HPLkotlinx/coroutines/channels/BufferedChannel;->getOnReceiveCatching()Lkotlinx/coroutines/selects/SelectClause1; HSPLkotlinx/coroutines/channels/BufferedChannel;->getReceiversCounter$kotlinx_coroutines_core()J HPLkotlinx/coroutines/channels/BufferedChannel;->getReceiversCounter$kotlinx_coroutines_core()J HSPLkotlinx/coroutines/channels/BufferedChannel;->getSendersCounter$kotlinx_coroutines_core()J HPLkotlinx/coroutines/channels/BufferedChannel;->getSendersCounter$kotlinx_coroutines_core()J HSPLkotlinx/coroutines/channels/BufferedChannel;->incCompletedExpandBufferAttempts(J)V HPLkotlinx/coroutines/channels/BufferedChannel;->incCompletedExpandBufferAttempts(J)V HSPLkotlinx/coroutines/channels/BufferedChannel;->invokeOnClose(Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/channels/BufferedChannel;->invokeOnClose(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/channels/BufferedChannel;->isClosed(JZ)Z HPLkotlinx/coroutines/channels/BufferedChannel;->isClosed(JZ)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForReceive()Z HPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForReceive()Z HSPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForSend()Z HPLkotlinx/coroutines/channels/BufferedChannel;->isClosedForSend()Z HSPLkotlinx/coroutines/channels/BufferedChannel;->isConflatedDropOldest()Z PLkotlinx/coroutines/channels/BufferedChannel;->isConflatedDropOldest()Z HSPLkotlinx/coroutines/channels/BufferedChannel;->isRendezvousOrUnlimited()Z HPLkotlinx/coroutines/channels/BufferedChannel;->isRendezvousOrUnlimited()Z HSPLkotlinx/coroutines/channels/BufferedChannel;->iterator()Lkotlinx/coroutines/channels/ChannelIterator; HPLkotlinx/coroutines/channels/BufferedChannel;->iterator()Lkotlinx/coroutines/channels/ChannelIterator; HSPLkotlinx/coroutines/channels/BufferedChannel;->onClosedIdempotent()V PLkotlinx/coroutines/channels/BufferedChannel;->onClosedIdempotent()V HSPLkotlinx/coroutines/channels/BufferedChannel;->onReceiveDequeued()V PLkotlinx/coroutines/channels/BufferedChannel;->onReceiveDequeued()V HSPLkotlinx/coroutines/channels/BufferedChannel;->onReceiveEnqueued()V PLkotlinx/coroutines/channels/BufferedChannel;->onReceiveEnqueued()V HSPLkotlinx/coroutines/channels/BufferedChannel;->receive(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->receive(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU$suspendImpl(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU$suspendImpl(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->receiveCatching-JP2dKIU(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->receiveCatchingOnNoWaiterSuspend-GKJJFZk(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->receiveOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->receiveOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->resumeWaiterOnClosedChannel(Lkotlinx/coroutines/Waiter;Z)V PLkotlinx/coroutines/channels/BufferedChannel;->resumeWaiterOnClosedChannel(Lkotlinx/coroutines/Waiter;Z)V HSPLkotlinx/coroutines/channels/BufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->sendOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->sendOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->tryReceive-PtdJZtk()Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->tryResumeReceiver(Ljava/lang/Object;Ljava/lang/Object;)Z HPLkotlinx/coroutines/channels/BufferedChannel;->tryResumeReceiver(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->tryResumeSender(Ljava/lang/Object;Lkotlinx/coroutines/channels/ChannelSegment;I)Z PLkotlinx/coroutines/channels/BufferedChannel;->tryResumeSender(Ljava/lang/Object;Lkotlinx/coroutines/channels/ChannelSegment;I)Z HSPLkotlinx/coroutines/channels/BufferedChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel;->updateCellReceive(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;J)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel;->updateCellReceive(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;J)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel;->updateCellSendSlow(Lkotlinx/coroutines/channels/ChannelSegment;ILjava/lang/Object;JLjava/lang/Object;Z)I HSPLkotlinx/coroutines/channels/BufferedChannel;->waitExpandBufferCompletion$kotlinx_coroutines_core(J)V HPLkotlinx/coroutines/channels/BufferedChannel;->waitExpandBufferCompletion$kotlinx_coroutines_core(J)V Lkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator; HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->(Lkotlinx/coroutines/channels/BufferedChannel;)V HPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->(Lkotlinx/coroutines/channels/BufferedChannel;)V HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNext(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNext(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNextOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->hasNextOnNoWaiterSuspend(Lkotlinx/coroutines/channels/ChannelSegment;IJLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V PLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->next()Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->next()Ljava/lang/Object; HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->tryResumeHasNext(Ljava/lang/Object;)Z HPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->tryResumeHasNext(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->tryResumeHasNextOnClosedChannel()V HPLkotlinx/coroutines/channels/BufferedChannel$BufferedChannelIterator;->tryResumeHasNextOnClosedChannel()V Lkotlinx/coroutines/channels/BufferedChannel$SendBroadcast; Lkotlinx/coroutines/channels/BufferedChannel$onReceive$1; HSPLkotlinx/coroutines/channels/BufferedChannel$onReceive$1;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceive$1;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceive$1;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceive$1;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceive$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel$onReceive$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/BufferedChannel$onReceive$2; HSPLkotlinx/coroutines/channels/BufferedChannel$onReceive$2;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceive$2;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceive$2;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceive$2;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceive$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel$onReceive$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1; HSPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2; HSPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2;->()V PLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2;->()V HSPLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel$onReceiveCatching$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1; HSPLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel$receiveCatching$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1; HSPLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->(Lkotlinx/coroutines/channels/BufferedChannel;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/BufferedChannel$receiveCatchingOnNoWaiterSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/BufferedChannelKt; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->()V PLkotlinx/coroutines/channels/BufferedChannelKt;->()V HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$createSegment(JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$createSegment(JLkotlinx/coroutines/channels/ChannelSegment;)Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getCLOSE_HANDLER_CLOSED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getCLOSE_HANDLER_CLOSED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getCLOSE_HANDLER_INVOKED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getCLOSE_HANDLER_INVOKED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getDONE_RCV$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getDONE_RCV$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getEXPAND_BUFFER_COMPLETION_WAIT_ITERATIONS$p()I PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getEXPAND_BUFFER_COMPLETION_WAIT_ITERATIONS$p()I HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getFAILED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getFAILED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_RCV$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_RCV$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_SEND$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getINTERRUPTED_SEND$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getIN_BUFFER$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getIN_BUFFER$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_CLOSE_CAUSE$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_CLOSE_CAUSE$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_RECEIVE_RESULT$p()Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNO_RECEIVE_RESULT$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNULL_SEGMENT$p()Lkotlinx/coroutines/channels/ChannelSegment; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getNULL_SEGMENT$p()Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getRESUMING_BY_EB$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getRESUMING_BY_EB$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getRESUMING_BY_RCV$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getRESUMING_BY_RCV$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND_NO_WAITER$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/channels/BufferedChannelKt;->access$getSUSPEND_NO_WAITER$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$initialBufferEnd(I)J PLkotlinx/coroutines/channels/BufferedChannelKt;->access$initialBufferEnd(I)J HSPLkotlinx/coroutines/channels/BufferedChannelKt;->access$tryResume0(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z PLkotlinx/coroutines/channels/BufferedChannelKt;->access$tryResume0(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Z HSPLkotlinx/coroutines/channels/BufferedChannelKt;->getCHANNEL_CLOSED()Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/channels/BufferedChannelKt;->getCHANNEL_CLOSED()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/channels/BufferedChannelKt;->tryResume0$default(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;)Z PLkotlinx/coroutines/channels/BufferedChannelKt;->tryResume0$default(Lkotlinx/coroutines/CancellableContinuation;Ljava/lang/Object;)Z Lkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1; HSPLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->()V PLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->()V HSPLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->()V PLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->()V HSPLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/BufferedChannelKt$createSegmentFunction$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/Channel; HSPLkotlinx/coroutines/channels/Channel;->()V PLkotlinx/coroutines/channels/Channel;->()V Lkotlinx/coroutines/channels/Channel$Factory; HSPLkotlinx/coroutines/channels/Channel$Factory;->()V PLkotlinx/coroutines/channels/Channel$Factory;->()V HSPLkotlinx/coroutines/channels/Channel$Factory;->()V PLkotlinx/coroutines/channels/Channel$Factory;->()V HSPLkotlinx/coroutines/channels/Channel$Factory;->getCHANNEL_DEFAULT_CAPACITY$kotlinx_coroutines_core()I PLkotlinx/coroutines/channels/Channel$Factory;->getCHANNEL_DEFAULT_CAPACITY$kotlinx_coroutines_core()I Lkotlinx/coroutines/channels/ChannelCoroutine; HSPLkotlinx/coroutines/channels/ChannelCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;ZZ)V HPLkotlinx/coroutines/channels/ChannelCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;ZZ)V HSPLkotlinx/coroutines/channels/ChannelCoroutine;->cancel(Ljava/util/concurrent/CancellationException;)V HPLkotlinx/coroutines/channels/ChannelCoroutine;->cancel(Ljava/util/concurrent/CancellationException;)V HSPLkotlinx/coroutines/channels/ChannelCoroutine;->cancelInternal(Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ChannelCoroutine;->cancelInternal(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/channels/ChannelCoroutine;->getOnReceive()Lkotlinx/coroutines/selects/SelectClause1; PLkotlinx/coroutines/channels/ChannelCoroutine;->getOnReceive()Lkotlinx/coroutines/selects/SelectClause1; HSPLkotlinx/coroutines/channels/ChannelCoroutine;->getOnReceiveCatching()Lkotlinx/coroutines/selects/SelectClause1; PLkotlinx/coroutines/channels/ChannelCoroutine;->getOnReceiveCatching()Lkotlinx/coroutines/selects/SelectClause1; HSPLkotlinx/coroutines/channels/ChannelCoroutine;->get_channel()Lkotlinx/coroutines/channels/Channel; PLkotlinx/coroutines/channels/ChannelCoroutine;->get_channel()Lkotlinx/coroutines/channels/Channel; HSPLkotlinx/coroutines/channels/ChannelCoroutine;->invokeOnClose(Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/channels/ChannelCoroutine;->invokeOnClose(Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/channels/ChannelCoroutine;->iterator()Lkotlinx/coroutines/channels/ChannelIterator; PLkotlinx/coroutines/channels/ChannelCoroutine;->iterator()Lkotlinx/coroutines/channels/ChannelIterator; HSPLkotlinx/coroutines/channels/ChannelCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ChannelCoroutine;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ChannelCoroutine;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/ChannelCoroutine;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/ChannelIterator; Lkotlinx/coroutines/channels/ChannelKt; HSPLkotlinx/coroutines/channels/ChannelKt;->Channel$default(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; PLkotlinx/coroutines/channels/ChannelKt;->Channel$default(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/channels/Channel; HSPLkotlinx/coroutines/channels/ChannelKt;->Channel(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/channels/Channel; HPLkotlinx/coroutines/channels/ChannelKt;->Channel(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/channels/Channel; Lkotlinx/coroutines/channels/ChannelResult; HSPLkotlinx/coroutines/channels/ChannelResult;->()V PLkotlinx/coroutines/channels/ChannelResult;->()V HSPLkotlinx/coroutines/channels/ChannelResult;->(Ljava/lang/Object;)V PLkotlinx/coroutines/channels/ChannelResult;->(Ljava/lang/Object;)V HSPLkotlinx/coroutines/channels/ChannelResult;->access$getFailed$cp()Lkotlinx/coroutines/channels/ChannelResult$Failed; PLkotlinx/coroutines/channels/ChannelResult;->access$getFailed$cp()Lkotlinx/coroutines/channels/ChannelResult$Failed; HSPLkotlinx/coroutines/channels/ChannelResult;->box-impl(Ljava/lang/Object;)Lkotlinx/coroutines/channels/ChannelResult; PLkotlinx/coroutines/channels/ChannelResult;->box-impl(Ljava/lang/Object;)Lkotlinx/coroutines/channels/ChannelResult; HSPLkotlinx/coroutines/channels/ChannelResult;->getOrNull-impl(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/ChannelResult;->getOrNull-impl(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ChannelResult;->unbox-impl()Ljava/lang/Object; PLkotlinx/coroutines/channels/ChannelResult;->unbox-impl()Ljava/lang/Object; Lkotlinx/coroutines/channels/ChannelResult$Closed; PLkotlinx/coroutines/channels/ChannelResult$Closed;->(Ljava/lang/Throwable;)V Lkotlinx/coroutines/channels/ChannelResult$Companion; HSPLkotlinx/coroutines/channels/ChannelResult$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/channels/ChannelResult$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/channels/ChannelResult$Companion;->closed-JP2dKIU(Ljava/lang/Throwable;)Ljava/lang/Object; Lkotlinx/coroutines/channels/ChannelResult$Failed; HSPLkotlinx/coroutines/channels/ChannelResult$Failed;->()V PLkotlinx/coroutines/channels/ChannelResult$Failed;->()V Lkotlinx/coroutines/channels/ChannelSegment; HSPLkotlinx/coroutines/channels/ChannelSegment;->(JLkotlinx/coroutines/channels/ChannelSegment;Lkotlinx/coroutines/channels/BufferedChannel;I)V HPLkotlinx/coroutines/channels/ChannelSegment;->(JLkotlinx/coroutines/channels/ChannelSegment;Lkotlinx/coroutines/channels/BufferedChannel;I)V HSPLkotlinx/coroutines/channels/ChannelSegment;->casState$kotlinx_coroutines_core(ILjava/lang/Object;Ljava/lang/Object;)Z HPLkotlinx/coroutines/channels/ChannelSegment;->casState$kotlinx_coroutines_core(ILjava/lang/Object;Ljava/lang/Object;)Z HSPLkotlinx/coroutines/channels/ChannelSegment;->cleanElement$kotlinx_coroutines_core(I)V PLkotlinx/coroutines/channels/ChannelSegment;->cleanElement$kotlinx_coroutines_core(I)V HSPLkotlinx/coroutines/channels/ChannelSegment;->getChannel()Lkotlinx/coroutines/channels/BufferedChannel; HPLkotlinx/coroutines/channels/ChannelSegment;->getChannel()Lkotlinx/coroutines/channels/BufferedChannel; HSPLkotlinx/coroutines/channels/ChannelSegment;->getElement$kotlinx_coroutines_core(I)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ChannelSegment;->getElement$kotlinx_coroutines_core(I)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ChannelSegment;->getNumberOfSlots()I HPLkotlinx/coroutines/channels/ChannelSegment;->getNumberOfSlots()I HSPLkotlinx/coroutines/channels/ChannelSegment;->getState$kotlinx_coroutines_core(I)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ChannelSegment;->getState$kotlinx_coroutines_core(I)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ChannelSegment;->onCancellation(ILjava/lang/Throwable;Lkotlin/coroutines/CoroutineContext;)V HPLkotlinx/coroutines/channels/ChannelSegment;->onCancellation(ILjava/lang/Throwable;Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/channels/ChannelSegment;->onCancelledRequest(IZ)V HPLkotlinx/coroutines/channels/ChannelSegment;->onCancelledRequest(IZ)V HSPLkotlinx/coroutines/channels/ChannelSegment;->retrieveElement$kotlinx_coroutines_core(I)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ChannelSegment;->retrieveElement$kotlinx_coroutines_core(I)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ChannelSegment;->setState$kotlinx_coroutines_core(ILjava/lang/Object;)V PLkotlinx/coroutines/channels/ChannelSegment;->setState$kotlinx_coroutines_core(ILjava/lang/Object;)V HSPLkotlinx/coroutines/channels/ChannelSegment;->storeElement$kotlinx_coroutines_core(ILjava/lang/Object;)V HPLkotlinx/coroutines/channels/ChannelSegment;->storeElement$kotlinx_coroutines_core(ILjava/lang/Object;)V Lkotlinx/coroutines/channels/ChannelsKt; HSPLkotlinx/coroutines/channels/ChannelsKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ChannelsKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V Lkotlinx/coroutines/channels/ChannelsKt__Channels_commonKt; HSPLkotlinx/coroutines/channels/ChannelsKt__Channels_commonKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ChannelsKt__Channels_commonKt;->cancelConsumed(Lkotlinx/coroutines/channels/ReceiveChannel;Ljava/lang/Throwable;)V Lkotlinx/coroutines/channels/ClosedReceiveChannelException; Lkotlinx/coroutines/channels/ClosedSendChannelException; Lkotlinx/coroutines/channels/ConflatedBufferedChannel; HSPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->(ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->isConflatedDropOldest()Z PLkotlinx/coroutines/channels/ConflatedBufferedChannel;->isConflatedDropOldest()Z HSPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->send(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySend-JP2dKIU(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendImpl-Mj0NB7M(Ljava/lang/Object;Z)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ConflatedBufferedChannel;->trySendImpl-Mj0NB7M(Ljava/lang/Object;Z)Ljava/lang/Object; Lkotlinx/coroutines/channels/ProduceKt; HSPLkotlinx/coroutines/channels/ProduceKt;->awaitClose(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ProduceKt;->awaitClose(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ProduceKt;->produce$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/channels/ProduceKt;->produce$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; HSPLkotlinx/coroutines/channels/ProduceKt;->produce$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; HPLkotlinx/coroutines/channels/ProduceKt;->produce$default(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; HSPLkotlinx/coroutines/channels/ProduceKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/channels/ProduceKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; HSPLkotlinx/coroutines/channels/ProduceKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; HPLkotlinx/coroutines/channels/ProduceKt;->produce(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/channels/ReceiveChannel; Lkotlinx/coroutines/channels/ProduceKt$awaitClose$1; HSPLkotlinx/coroutines/channels/ProduceKt$awaitClose$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/channels/ProduceKt$awaitClose$1;->(Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/channels/ProduceKt$awaitClose$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/channels/ProduceKt$awaitClose$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1; HSPLkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V PLkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;->invoke(Ljava/lang/Throwable;)V PLkotlinx/coroutines/channels/ProduceKt$awaitClose$4$1;->invoke(Ljava/lang/Throwable;)V Lkotlinx/coroutines/channels/ProducerCoroutine; HSPLkotlinx/coroutines/channels/ProducerCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;)V PLkotlinx/coroutines/channels/ProducerCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/channels/Channel;)V HSPLkotlinx/coroutines/channels/ProducerCoroutine;->getChannel()Lkotlinx/coroutines/channels/SendChannel; PLkotlinx/coroutines/channels/ProducerCoroutine;->getChannel()Lkotlinx/coroutines/channels/SendChannel; HSPLkotlinx/coroutines/channels/ProducerCoroutine;->isActive()Z PLkotlinx/coroutines/channels/ProducerCoroutine;->isActive()Z HSPLkotlinx/coroutines/channels/ProducerCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V HPLkotlinx/coroutines/channels/ProducerCoroutine;->onCancelled(Ljava/lang/Throwable;Z)V HSPLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Ljava/lang/Object;)V PLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Ljava/lang/Object;)V HSPLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Lkotlin/Unit;)V PLkotlinx/coroutines/channels/ProducerCoroutine;->onCompleted(Lkotlin/Unit;)V Lkotlinx/coroutines/channels/ProducerScope; Lkotlinx/coroutines/channels/ReceiveCatching; HSPLkotlinx/coroutines/channels/ReceiveCatching;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V PLkotlinx/coroutines/channels/ReceiveCatching;->(Lkotlinx/coroutines/CancellableContinuationImpl;)V HSPLkotlinx/coroutines/channels/ReceiveCatching;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V PLkotlinx/coroutines/channels/ReceiveCatching;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V Lkotlinx/coroutines/channels/ReceiveChannel; Lkotlinx/coroutines/channels/SendChannel; Lkotlinx/coroutines/channels/SendChannel$DefaultImpls; HSPLkotlinx/coroutines/channels/SendChannel$DefaultImpls;->close$default(Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z PLkotlinx/coroutines/channels/SendChannel$DefaultImpls;->close$default(Lkotlinx/coroutines/channels/SendChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z Lkotlinx/coroutines/channels/WaiterEB; Lkotlinx/coroutines/flow/AbstractFlow; HSPLkotlinx/coroutines/flow/AbstractFlow;->()V HPLkotlinx/coroutines/flow/AbstractFlow;->()V HSPLkotlinx/coroutines/flow/AbstractFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/AbstractFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/AbstractFlow$collect$1; HSPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->(Lkotlinx/coroutines/flow/AbstractFlow;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->(Lkotlinx/coroutines/flow/AbstractFlow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/AbstractFlow$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/CallbackFlowBuilder; HSPLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/flow/CallbackFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/flow/CallbackFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/CallbackFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1; HSPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->(Lkotlinx/coroutines/flow/CallbackFlowBuilder;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->(Lkotlinx/coroutines/flow/CallbackFlowBuilder;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/CallbackFlowBuilder$collectTo$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/CancellableFlow; Lkotlinx/coroutines/flow/ChannelAsFlow; HSPLkotlinx/coroutines/flow/ChannelAsFlow;->()V PLkotlinx/coroutines/flow/ChannelAsFlow;->()V HSPLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/flow/ChannelAsFlow;->(Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/flow/ChannelAsFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ChannelAsFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/ChannelAsFlow;->markConsumed()V PLkotlinx/coroutines/flow/ChannelAsFlow;->markConsumed()V Lkotlinx/coroutines/flow/ChannelFlowBuilder; HSPLkotlinx/coroutines/flow/ChannelFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/ChannelFlowBuilder;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/ChannelFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ChannelFlowBuilder;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/DistinctFlowImpl; HSPLkotlinx/coroutines/flow/DistinctFlowImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/DistinctFlowImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/DistinctFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2; HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->(Lkotlinx/coroutines/flow/DistinctFlowImpl;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->(Lkotlinx/coroutines/flow/DistinctFlowImpl;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1; HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->(Lkotlinx/coroutines/flow/DistinctFlowImpl$collect$2;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/DistinctFlowImpl$collect$2$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowCollector; Lkotlinx/coroutines/flow/FlowKt; HSPLkotlinx/coroutines/flow/FlowKt;->asStateFlow(Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; PLkotlinx/coroutines/flow/FlowKt;->asStateFlow(Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; HSPLkotlinx/coroutines/flow/FlowKt;->callbackFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->callbackFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function6;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function6;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->conflate(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->conflate(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->debounce(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->debounce(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->drop(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->drop(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt;->firstOrNull(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt;->firstOrNull(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt;->flow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->flow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->flowOn(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->flowOn(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->launchIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/flow/FlowKt;->launchIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/flow/FlowKt;->merge(Ljava/lang/Iterable;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->merge(Ljava/lang/Iterable;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->merge([Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->merge([Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->receiveAsFlow(Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->receiveAsFlow(Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->sample(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->sample(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt;->shareIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;I)Lkotlinx/coroutines/flow/SharedFlow; PLkotlinx/coroutines/flow/FlowKt;->shareIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;I)Lkotlinx/coroutines/flow/SharedFlow; HSPLkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; PLkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; HSPLkotlinx/coroutines/flow/FlowKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__BuildersKt; HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt;->callbackFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__BuildersKt;->callbackFlow(Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3; HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3;->(Ljava/lang/Iterable;)V PLkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3;->(Ljava/lang/Iterable;)V HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3$1; HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3$1;->(Lkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3$1;->(Lkotlinx/coroutines/flow/FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2; HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2;->(Ljava/lang/Object;)V PLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2;->(Ljava/lang/Object;)V HSPLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__BuildersKt$flowOf$$inlined$unsafeFlow$2;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ChannelsKt; HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->access$emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->access$emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->emitAllImpl$FlowKt__ChannelsKt(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/channels/ReceiveChannel;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->receiveAsFlow(Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ChannelsKt;->receiveAsFlow(Lkotlinx/coroutines/channels/ReceiveChannel;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1; HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->(Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ChannelsKt$emitAllImpl$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__CollectKt; HSPLkotlinx/coroutines/flow/FlowKt__CollectKt;->collect(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__CollectKt;->collect(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__CollectKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__CollectKt;->collectLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__CollectKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__CollectKt;->emitAll(Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__CollectKt;->launchIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/flow/FlowKt__CollectKt;->launchIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/Job; Lkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1; HSPLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__CollectKt$launchIn$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ContextKt; HSPLkotlinx/coroutines/flow/FlowKt__ContextKt;->buffer$default(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ContextKt;->buffer$default(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__ContextKt;->buffer(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ContextKt;->buffer(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__ContextKt;->conflate(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ContextKt;->conflate(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__ContextKt;->flowOn(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ContextKt;->flowOn(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__DelayKt; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt;->debounce(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__DelayKt;->debounce(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt;->fixedPeriodTicker$default(Lkotlinx/coroutines/CoroutineScope;JJILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/flow/FlowKt__DelayKt;->fixedPeriodTicker$default(Lkotlinx/coroutines/CoroutineScope;JJILjava/lang/Object;)Lkotlinx/coroutines/channels/ReceiveChannel; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt;->fixedPeriodTicker(Lkotlinx/coroutines/CoroutineScope;JJ)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/flow/FlowKt__DelayKt;->fixedPeriodTicker(Lkotlinx/coroutines/CoroutineScope;JJ)Lkotlinx/coroutines/channels/ReceiveChannel; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt;->sample(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__DelayKt;->sample(Lkotlinx/coroutines/flow/Flow;J)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2;->(J)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2;->(J)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2;->invoke(Ljava/lang/Object;)Ljava/lang/Long; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2;->invoke(Ljava/lang/Object;)Ljava/lang/Long; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounce$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->(Lkotlin/jvm/functions/Function1;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->create(Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->invoke(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->invoke-WpGqRn0(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->invoke-WpGqRn0(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$3$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1;->(Lkotlinx/coroutines/channels/ProducerScope;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1;->(Lkotlinx/coroutines/channels/ProducerScope;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1$emit$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$debounceInternal$1$values$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3;->(JJLkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3;->(JJLkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__DelayKt$fixedPeriodTicker$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->(JLkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->(JLkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/channels/ReceiveChannel;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V HPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->invoke(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->invoke(Lkotlin/Unit;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1$1; HSPLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1$1;->(Lkotlinx/coroutines/channels/ProducerScope;)V PLkotlinx/coroutines/flow/FlowKt__DelayKt$sample$2$values$1$1;->(Lkotlinx/coroutines/channels/ProducerScope;)V Lkotlinx/coroutines/flow/FlowKt__DistinctKt; HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->()V PLkotlinx/coroutines/flow/FlowKt__DistinctKt;->()V HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__DistinctKt;->distinctUntilChanged(Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt;->distinctUntilChangedBy$FlowKt__DistinctKt(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__DistinctKt;->distinctUntilChangedBy$FlowKt__DistinctKt(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1; HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->()V PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->()V HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->()V PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->()V HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Boolean; PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Boolean; HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultAreEquivalent$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1; HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->()V PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->()V HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->()V PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->()V HSPLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__DistinctKt$defaultKeySelector$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__EmittersKt; HSPLkotlinx/coroutines/flow/FlowKt__EmittersKt;->ensureActive(Lkotlinx/coroutines/flow/FlowCollector;)V HPLkotlinx/coroutines/flow/FlowKt__EmittersKt;->ensureActive(Lkotlinx/coroutines/flow/FlowCollector;)V Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1; HSPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/flow/Flow;)V HPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function2;Lkotlinx/coroutines/flow/Flow;)V HSPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1; HSPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ErrorsKt; HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt;->catchImpl(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ErrorsKt;->catchImpl(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1; HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1; HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catch$$inlined$unsafeFlow$1;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1; HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$1;->(Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2; HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1; HSPLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__ErrorsKt$catchImpl$2;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__LimitKt; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt;->drop(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__LimitKt;->drop(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;I)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;I)V HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;->(Lkotlin/jvm/internal/Ref$IntRef;ILkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;->(Lkotlin/jvm/internal/Ref$IntRef;ILkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1$emit$1; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$drop$2$1;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1; HSPLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->(Lkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__LimitKt$dropWhile$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__MergeKt; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt;->()V PLkotlinx/coroutines/flow/FlowKt__MergeKt;->()V HSPLkotlinx/coroutines/flow/FlowKt__MergeKt;->mapLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__MergeKt;->mapLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt;->merge(Ljava/lang/Iterable;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__MergeKt;->merge(Ljava/lang/Iterable;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt;->merge([Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__MergeKt;->merge([Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__MergeKt;->transformLatest(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__MergeKt$mapLatest$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt;->first(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt;->firstOrNull(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt;->firstOrNull(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->(Lkotlin/jvm/functions/Function2;Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;->(Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2$1;->(Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$$inlined$collectWhile$2;Lkotlin/coroutines/Continuation;)V Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->(Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$first$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$$inlined$collectWhile$1; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$$inlined$collectWhile$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$$inlined$collectWhile$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$$inlined$collectWhile$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$$inlined$collectWhile$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$1; HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$1;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$1;->(Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ReduceKt$firstOrNull$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ShareKt; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt;->asStateFlow(Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; PLkotlinx/coroutines/flow/FlowKt__ShareKt;->asStateFlow(Lkotlinx/coroutines/flow/MutableStateFlow;)Lkotlinx/coroutines/flow/StateFlow; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt;->configureSharing$FlowKt__ShareKt(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/SharingConfig; PLkotlinx/coroutines/flow/FlowKt__ShareKt;->configureSharing$FlowKt__ShareKt(Lkotlinx/coroutines/flow/Flow;I)Lkotlinx/coroutines/flow/SharingConfig; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt;->launchSharing$FlowKt__ShareKt(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/flow/FlowKt__ShareKt;->launchSharing$FlowKt__ShareKt(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/Job; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt;->shareIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;I)Lkotlinx/coroutines/flow/SharedFlow; PLkotlinx/coroutines/flow/FlowKt__ShareKt;->shareIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;I)Lkotlinx/coroutines/flow/SharedFlow; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; PLkotlinx/coroutines/flow/FlowKt__ShareKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->(Lkotlinx/coroutines/flow/SharingStarted;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/MutableSharedFlow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Lkotlinx/coroutines/flow/SharingCommand;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invoke(Lkotlinx/coroutines/flow/SharingCommand;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2$WhenMappings; HSPLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2$WhenMappings;->()V PLkotlinx/coroutines/flow/FlowKt__ShareKt$launchSharing$1$2$WhenMappings;->()V Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1; HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2; HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1; HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->(Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->(Lkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ZipKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function6;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/FlowKt__ZipKt;->combine(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function6;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function4;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function4;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function6;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3;->([Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function6;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function6;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->(Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function6;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$combineUnsafe$FlowKt__ZipKt$3$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->(Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->(Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;[Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$combine$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1; HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->()V HSPLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Ljava/lang/Object; PLkotlinx/coroutines/flow/FlowKt__ZipKt$nullArrayFactory$1;->invoke()Ljava/lang/Object; Lkotlinx/coroutines/flow/MutableSharedFlow; Lkotlinx/coroutines/flow/MutableStateFlow; Lkotlinx/coroutines/flow/ReadonlySharedFlow; HSPLkotlinx/coroutines/flow/ReadonlySharedFlow;->(Lkotlinx/coroutines/flow/SharedFlow;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/flow/ReadonlySharedFlow;->(Lkotlinx/coroutines/flow/SharedFlow;Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/flow/ReadonlySharedFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ReadonlySharedFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/ReadonlyStateFlow; HSPLkotlinx/coroutines/flow/ReadonlyStateFlow;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/Job;)V PLkotlinx/coroutines/flow/ReadonlyStateFlow;->(Lkotlinx/coroutines/flow/StateFlow;Lkotlinx/coroutines/Job;)V HSPLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/ReadonlyStateFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object; HPLkotlinx/coroutines/flow/ReadonlyStateFlow;->getValue()Ljava/lang/Object; Lkotlinx/coroutines/flow/SafeFlow; HSPLkotlinx/coroutines/flow/SafeFlow;->(Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/flow/SafeFlow;->(Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/flow/SafeFlow;->collectSafely(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/SafeFlow;->collectSafely(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/SharedFlow; Lkotlinx/coroutines/flow/SharedFlowImpl; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->(IILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/SharedFlowImpl;->(IILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->awaitValue(Lkotlinx/coroutines/flow/SharedFlowSlot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V HPLkotlinx/coroutines/flow/SharedFlowImpl;->cleanupTailLocked()V HSPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/intrinsics/CoroutineSingletons; HPLkotlinx/coroutines/flow/SharedFlowImpl;->collect$suspendImpl(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/intrinsics/CoroutineSingletons; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/SharedFlowSlot; PLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/SharedFlowSlot; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/SharedFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/SharedFlowSlot; PLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/SharedFlowSlot; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/SharedFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->dropOldestLocked()V PLkotlinx/coroutines/flow/SharedFlowImpl;->dropOldestLocked()V HSPLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V HPLkotlinx/coroutines/flow/SharedFlowImpl;->enqueueLocked(Ljava/lang/Object;)V HSPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/SharedFlowImpl;->findSlotsToResumeLocked([Lkotlin/coroutines/Continuation;)[Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J HPLkotlinx/coroutines/flow/SharedFlowImpl;->getHead()J HSPLkotlinx/coroutines/flow/SharedFlowImpl;->getLastReplayedLocked()Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowImpl;->getLastReplayedLocked()Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer(II[Ljava/lang/Object;)[Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowImpl;->growBuffer(II[Ljava/lang/Object;)[Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmit(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryEmitLocked(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryPeekLocked(Lkotlinx/coroutines/flow/SharedFlowSlot;)J HSPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl;->tryTakeValue(Lkotlinx/coroutines/flow/SharedFlowSlot;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V HPLkotlinx/coroutines/flow/SharedFlowImpl;->updateBufferLocked(JJJJ)V HSPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/SharedFlowImpl;->updateCollectorIndexLocked$kotlinx_coroutines_core(J)[Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/SharedFlowImpl;->updateNewCollectorIndexLocked$kotlinx_coroutines_core()J PLkotlinx/coroutines/flow/SharedFlowImpl;->updateNewCollectorIndexLocked$kotlinx_coroutines_core()J Lkotlinx/coroutines/flow/SharedFlowImpl$Emitter; Lkotlinx/coroutines/flow/SharedFlowImpl$collect$1; HSPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/SharedFlowImpl;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/SharedFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/SharedFlowKt; HSPLkotlinx/coroutines/flow/SharedFlowKt;->()V PLkotlinx/coroutines/flow/SharedFlowKt;->()V HSPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow$default(IILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/MutableSharedFlow; PLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow$default(IILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/MutableSharedFlow; HSPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/MutableSharedFlow; HPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/MutableSharedFlow; HSPLkotlinx/coroutines/flow/SharedFlowKt;->access$getBufferAt([Ljava/lang/Object;J)Ljava/lang/Object; PLkotlinx/coroutines/flow/SharedFlowKt;->access$getBufferAt([Ljava/lang/Object;J)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/SharedFlowKt;->access$setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V PLkotlinx/coroutines/flow/SharedFlowKt;->access$setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V Lkotlinx/coroutines/flow/SharedFlowSlot; HSPLkotlinx/coroutines/flow/SharedFlowSlot;->()V HPLkotlinx/coroutines/flow/SharedFlowSlot;->()V HSPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Ljava/lang/Object;)Z PLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/SharedFlowImpl;)Z PLkotlinx/coroutines/flow/SharedFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/SharedFlowImpl;)Z HSPLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/SharedFlowImpl;)[Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/SharedFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/SharedFlowImpl;)[Lkotlin/coroutines/Continuation; Lkotlinx/coroutines/flow/SharingCommand; HSPLkotlinx/coroutines/flow/SharingCommand;->()V PLkotlinx/coroutines/flow/SharingCommand;->()V HSPLkotlinx/coroutines/flow/SharingCommand;->(Ljava/lang/String;I)V PLkotlinx/coroutines/flow/SharingCommand;->(Ljava/lang/String;I)V HSPLkotlinx/coroutines/flow/SharingCommand;->values()[Lkotlinx/coroutines/flow/SharingCommand; PLkotlinx/coroutines/flow/SharingCommand;->values()[Lkotlinx/coroutines/flow/SharingCommand; Lkotlinx/coroutines/flow/SharingConfig; HSPLkotlinx/coroutines/flow/SharingConfig;->(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/coroutines/CoroutineContext;)V PLkotlinx/coroutines/flow/SharingConfig;->(Lkotlinx/coroutines/flow/Flow;ILkotlinx/coroutines/channels/BufferOverflow;Lkotlin/coroutines/CoroutineContext;)V Lkotlinx/coroutines/flow/SharingStarted; HSPLkotlinx/coroutines/flow/SharingStarted;->()V PLkotlinx/coroutines/flow/SharingStarted;->()V Lkotlinx/coroutines/flow/SharingStarted$Companion; HSPLkotlinx/coroutines/flow/SharingStarted$Companion;->()V PLkotlinx/coroutines/flow/SharingStarted$Companion;->()V HSPLkotlinx/coroutines/flow/SharingStarted$Companion;->()V PLkotlinx/coroutines/flow/SharingStarted$Companion;->()V HSPLkotlinx/coroutines/flow/SharingStarted$Companion;->WhileSubscribed$default(Lkotlinx/coroutines/flow/SharingStarted$Companion;JJILjava/lang/Object;)Lkotlinx/coroutines/flow/SharingStarted; PLkotlinx/coroutines/flow/SharingStarted$Companion;->WhileSubscribed$default(Lkotlinx/coroutines/flow/SharingStarted$Companion;JJILjava/lang/Object;)Lkotlinx/coroutines/flow/SharingStarted; HSPLkotlinx/coroutines/flow/SharingStarted$Companion;->getEagerly()Lkotlinx/coroutines/flow/SharingStarted; PLkotlinx/coroutines/flow/SharingStarted$Companion;->getEagerly()Lkotlinx/coroutines/flow/SharingStarted; HSPLkotlinx/coroutines/flow/SharingStarted$Companion;->getLazily()Lkotlinx/coroutines/flow/SharingStarted; PLkotlinx/coroutines/flow/SharingStarted$Companion;->getLazily()Lkotlinx/coroutines/flow/SharingStarted; Lkotlinx/coroutines/flow/StartedEagerly; HSPLkotlinx/coroutines/flow/StartedEagerly;->()V PLkotlinx/coroutines/flow/StartedEagerly;->()V Lkotlinx/coroutines/flow/StartedLazily; HSPLkotlinx/coroutines/flow/StartedLazily;->()V PLkotlinx/coroutines/flow/StartedLazily;->()V Lkotlinx/coroutines/flow/StartedWhileSubscribed; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->(JJ)V PLkotlinx/coroutines/flow/StartedWhileSubscribed;->(JJ)V HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->access$getReplayExpiration$p(Lkotlinx/coroutines/flow/StartedWhileSubscribed;)J PLkotlinx/coroutines/flow/StartedWhileSubscribed;->access$getReplayExpiration$p(Lkotlinx/coroutines/flow/StartedWhileSubscribed;)J HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->access$getStopTimeout$p(Lkotlinx/coroutines/flow/StartedWhileSubscribed;)J PLkotlinx/coroutines/flow/StartedWhileSubscribed;->access$getStopTimeout$p(Lkotlinx/coroutines/flow/StartedWhileSubscribed;)J HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->command(Lkotlinx/coroutines/flow/StateFlow;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/StartedWhileSubscribed;->command(Lkotlinx/coroutines/flow/StateFlow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed;->equals(Ljava/lang/Object;)Z PLkotlinx/coroutines/flow/StartedWhileSubscribed;->equals(Ljava/lang/Object;)Z Lkotlinx/coroutines/flow/StartedWhileSubscribed$command$1; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->(Lkotlinx/coroutines/flow/StartedWhileSubscribed;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->(Lkotlinx/coroutines/flow/StartedWhileSubscribed;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invoke(Lkotlinx/coroutines/flow/FlowCollector;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/StartedWhileSubscribed$command$2; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->(Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->(Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Lkotlinx/coroutines/flow/SharingCommand;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invoke(Lkotlinx/coroutines/flow/SharingCommand;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StartedWhileSubscribed$command$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/StateFlow; Lkotlinx/coroutines/flow/StateFlowImpl; HSPLkotlinx/coroutines/flow/StateFlowImpl;->()V PLkotlinx/coroutines/flow/StateFlowImpl;->()V HSPLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V PLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V HSPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StateFlowImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z PLkotlinx/coroutines/flow/StateFlowImpl;->compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/StateFlowImpl;->createSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/StateFlowImpl;->createSlotArray(I)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/StateFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/StateFlowImpl;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V HPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V HSPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z HPLkotlinx/coroutines/flow/StateFlowImpl;->updateState(Ljava/lang/Object;Ljava/lang/Object;)Z Lkotlinx/coroutines/flow/StateFlowImpl$collect$1; HSPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->(Lkotlinx/coroutines/flow/StateFlowImpl;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowImpl$collect$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/StateFlowKt; HSPLkotlinx/coroutines/flow/StateFlowKt;->()V PLkotlinx/coroutines/flow/StateFlowKt;->()V HSPLkotlinx/coroutines/flow/StateFlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; PLkotlinx/coroutines/flow/StateFlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; HSPLkotlinx/coroutines/flow/StateFlowKt;->access$getNONE$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/flow/StateFlowKt;->access$getNONE$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/flow/StateFlowKt;->access$getPENDING$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/flow/StateFlowKt;->access$getPENDING$p()Lkotlinx/coroutines/internal/Symbol; Lkotlinx/coroutines/flow/StateFlowSlot; HSPLkotlinx/coroutines/flow/StateFlowSlot;->()V PLkotlinx/coroutines/flow/StateFlowSlot;->()V HSPLkotlinx/coroutines/flow/StateFlowSlot;->()V PLkotlinx/coroutines/flow/StateFlowSlot;->()V HSPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Ljava/lang/Object;)Z PLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/StateFlowImpl;)Z HPLkotlinx/coroutines/flow/StateFlowSlot;->allocateLocked(Lkotlinx/coroutines/flow/StateFlowImpl;)Z HSPLkotlinx/coroutines/flow/StateFlowSlot;->awaitPending(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/StateFlowSlot;->awaitPending(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Ljava/lang/Object;)[Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/StateFlowImpl;)[Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/StateFlowSlot;->freeLocked(Lkotlinx/coroutines/flow/StateFlowImpl;)[Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/StateFlowSlot;->makePending()V HPLkotlinx/coroutines/flow/StateFlowSlot;->makePending()V HSPLkotlinx/coroutines/flow/StateFlowSlot;->takePending()Z HPLkotlinx/coroutines/flow/StateFlowSlot;->takePending()Z Lkotlinx/coroutines/flow/SubscribedFlowCollector; Lkotlinx/coroutines/flow/ThrowingCollector; Lkotlinx/coroutines/flow/internal/AbortFlowException; HSPLkotlinx/coroutines/flow/internal/AbortFlowException;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/internal/AbortFlowException;->(Lkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/internal/AbortFlowException;->fillInStackTrace()Ljava/lang/Throwable; PLkotlinx/coroutines/flow/internal/AbortFlowException;->fillInStackTrace()Ljava/lang/Throwable; Lkotlinx/coroutines/flow/internal/AbstractSharedFlow; HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->()V HPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->()V HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->access$getNCollectors(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)I PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->access$getNCollectors(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)I HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->access$getSlots(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->access$getSlots(Lkotlinx/coroutines/flow/internal/AbstractSharedFlow;)[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->allocateSlot()Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V HPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->freeSlot(Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;)V HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getNCollectors()I PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getNCollectors()I HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSlots()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSlots()[Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSubscriptionCount()Lkotlinx/coroutines/flow/StateFlow; PLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSubscriptionCount()Lkotlinx/coroutines/flow/StateFlow; Lkotlinx/coroutines/flow/internal/AbstractSharedFlowKt; HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlowKt;->()V PLkotlinx/coroutines/flow/internal/AbstractSharedFlowKt;->()V Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;->()V HPLkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot;->()V Lkotlinx/coroutines/flow/internal/ChannelFlow; HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HPLkotlinx/coroutines/flow/internal/ChannelFlow;->(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; HPLkotlinx/coroutines/flow/internal/ChannelFlow;->fuse(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/Flow; HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->getCollectToFun$kotlinx_coroutines_core()Lkotlin/jvm/functions/Function2; PLkotlinx/coroutines/flow/internal/ChannelFlow;->getCollectToFun$kotlinx_coroutines_core()Lkotlin/jvm/functions/Function2; HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->getProduceCapacity$kotlinx_coroutines_core()I PLkotlinx/coroutines/flow/internal/ChannelFlow;->getProduceCapacity$kotlinx_coroutines_core()I HSPLkotlinx/coroutines/flow/internal/ChannelFlow;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/flow/internal/ChannelFlow;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; Lkotlinx/coroutines/flow/internal/ChannelFlow$collect$2; HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/internal/ChannelFlow;)V HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->(Lkotlin/coroutines/Continuation;Lkotlinx/coroutines/flow/FlowCollector;Lkotlinx/coroutines/flow/internal/ChannelFlow;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collect$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1; HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlow;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlow$collectToFun$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowOperator; HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowOperator;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl; HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->(Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowOperatorImpl;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->access$getTransform$p(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;)Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->access$getTransform$p(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;)Lkotlin/jvm/functions/Function3; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->create(Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/internal/ChannelFlow; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;->flowCollect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;)V HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest;Lkotlinx/coroutines/flow/FlowCollector;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1; HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->(Lkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelFlowTransformLatest$flowCollect$3$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge; HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->(Ljava/lang/Iterable;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->(Ljava/lang/Iterable;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;)V HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->(Ljava/lang/Iterable;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->(Ljava/lang/Iterable;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->collectTo(Lkotlinx/coroutines/channels/ProducerScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge;->produceImpl(Lkotlinx/coroutines/CoroutineScope;)Lkotlinx/coroutines/channels/ReceiveChannel; Lkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1; HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/internal/SendingCollector;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1;->(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/internal/SendingCollector;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/ChannelLimitedFlowMerge$collectTo$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/ChildCancelledException; HSPLkotlinx/coroutines/flow/internal/ChildCancelledException;->()V PLkotlinx/coroutines/flow/internal/ChildCancelledException;->()V HSPLkotlinx/coroutines/flow/internal/ChildCancelledException;->fillInStackTrace()Ljava/lang/Throwable; PLkotlinx/coroutines/flow/internal/ChildCancelledException;->fillInStackTrace()Ljava/lang/Throwable; Lkotlinx/coroutines/flow/internal/CombineKt; HSPLkotlinx/coroutines/flow/internal/CombineKt;->combineInternal(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt;->combineInternal(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->(Lkotlinx/coroutines/flow/FlowCollector;[Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->([Lkotlinx/coroutines/flow/Flow;ILjava/util/concurrent/atomic/AtomicInteger;Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->([Lkotlinx/coroutines/flow/Flow;ILjava/util/concurrent/atomic/AtomicInteger;Lkotlinx/coroutines/channels/Channel;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->(Lkotlinx/coroutines/channels/Channel;I)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->(Lkotlinx/coroutines/channels/Channel;I)V HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1; HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->(Lkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/CombineKt$combineInternal$2$1$1$emit$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/DownstreamExceptionContext; HSPLkotlinx/coroutines/flow/internal/DownstreamExceptionContext;->(Ljava/lang/Throwable;Lkotlin/coroutines/CoroutineContext;)V PLkotlinx/coroutines/flow/internal/DownstreamExceptionContext;->(Ljava/lang/Throwable;Lkotlin/coroutines/CoroutineContext;)V Lkotlinx/coroutines/flow/internal/FlowCoroutine; HSPLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/FlowCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/FlowCoroutine;->childCancelled(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/flow/internal/FlowCoroutine;->childCancelled(Ljava/lang/Throwable;)Z Lkotlinx/coroutines/flow/internal/FlowCoroutineKt; HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt;->flowScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/FlowCoroutineKt;->flowScope(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$$inlined$unsafeFlow$1; HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function3;)V PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$$inlined$unsafeFlow$1;->(Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$$inlined$unsafeFlow$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1; HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->(Lkotlin/jvm/functions/Function3;Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->invoke(Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/FlowCoroutineKt$scopedFlow$1$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/FlowExceptions_commonKt; HSPLkotlinx/coroutines/flow/internal/FlowExceptions_commonKt;->checkOwnership(Lkotlinx/coroutines/flow/internal/AbortFlowException;Lkotlinx/coroutines/flow/FlowCollector;)V PLkotlinx/coroutines/flow/internal/FlowExceptions_commonKt;->checkOwnership(Lkotlinx/coroutines/flow/internal/AbortFlowException;Lkotlinx/coroutines/flow/FlowCollector;)V Lkotlinx/coroutines/flow/internal/FusibleFlow; Lkotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls; HSPLkotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; PLkotlinx/coroutines/flow/internal/FusibleFlow$DefaultImpls;->fuse$default(Lkotlinx/coroutines/flow/internal/FusibleFlow;Lkotlin/coroutines/CoroutineContext;ILkotlinx/coroutines/channels/BufferOverflow;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; Lkotlinx/coroutines/flow/internal/NoOpContinuation; HSPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V PLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V HSPLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V PLkotlinx/coroutines/flow/internal/NoOpContinuation;->()V Lkotlinx/coroutines/flow/internal/NopCollector; HSPLkotlinx/coroutines/flow/internal/NopCollector;->()V PLkotlinx/coroutines/flow/internal/NopCollector;->()V HSPLkotlinx/coroutines/flow/internal/NopCollector;->()V PLkotlinx/coroutines/flow/internal/NopCollector;->()V HSPLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/NopCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/NullSurrogateKt; HSPLkotlinx/coroutines/flow/internal/NullSurrogateKt;->()V PLkotlinx/coroutines/flow/internal/NullSurrogateKt;->()V Lkotlinx/coroutines/flow/internal/SafeCollector; HSPLkotlinx/coroutines/flow/internal/SafeCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V HPLkotlinx/coroutines/flow/internal/SafeCollector;->(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SafeCollector;->emit(Lkotlin/coroutines/Continuation;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/flow/internal/SafeCollector;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/flow/internal/SafeCollector;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SafeCollector;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/flow/internal/SafeCollector;->releaseIntercepted()V HPLkotlinx/coroutines/flow/internal/SafeCollector;->releaseIntercepted()V Lkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1; HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->()V PLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->()V HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->()V PLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->()V HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->invoke(ILkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Integer; HPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->invoke(ILkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Integer; HSPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SafeCollector$collectContextSize$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/SafeCollectorKt; HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt;->()V PLkotlinx/coroutines/flow/internal/SafeCollectorKt;->()V HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt;->access$getEmitFun$p()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/flow/internal/SafeCollectorKt;->access$getEmitFun$p()Lkotlin/jvm/functions/Function3; Lkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1; HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V PLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V PLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->()V HSPLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SafeCollectorKt$emitFun$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/SafeCollector_commonKt; HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->checkContext(Lkotlinx/coroutines/flow/internal/SafeCollector;Lkotlin/coroutines/CoroutineContext;)V HPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->checkContext(Lkotlinx/coroutines/flow/internal/SafeCollector;Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->transitiveCoroutineParent(Lkotlinx/coroutines/Job;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; PLkotlinx/coroutines/flow/internal/SafeCollector_commonKt;->transitiveCoroutineParent(Lkotlinx/coroutines/Job;Lkotlinx/coroutines/Job;)Lkotlinx/coroutines/Job; Lkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1; HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->(Lkotlinx/coroutines/flow/internal/SafeCollector;)V HPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->(Lkotlinx/coroutines/flow/internal/SafeCollector;)V HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->invoke(ILkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Integer; HPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->invoke(ILkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Integer; HSPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/flow/internal/SafeCollector_commonKt$checkContext$result$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/SendingCollector; HSPLkotlinx/coroutines/flow/internal/SendingCollector;->(Lkotlinx/coroutines/channels/SendChannel;)V PLkotlinx/coroutines/flow/internal/SendingCollector;->(Lkotlinx/coroutines/channels/SendChannel;)V HSPLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/flow/internal/SendingCollector;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow; HSPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->(I)V PLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->(I)V HSPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->increment(I)Z HPLkotlinx/coroutines/flow/internal/SubscriptionCountStateFlow;->increment(I)Z Lkotlinx/coroutines/internal/AtomicKt; HSPLkotlinx/coroutines/internal/AtomicKt;->()V PLkotlinx/coroutines/internal/AtomicKt;->()V Lkotlinx/coroutines/internal/AtomicOp; HSPLkotlinx/coroutines/internal/AtomicOp;->()V PLkotlinx/coroutines/internal/AtomicOp;->()V HSPLkotlinx/coroutines/internal/AtomicOp;->()V PLkotlinx/coroutines/internal/AtomicOp;->()V HSPLkotlinx/coroutines/internal/AtomicOp;->perform(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/AtomicOp;->perform(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/internal/ConcurrentLinkedListKt; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->()V PLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->()V HSPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->access$getCLOSED$p()Lkotlinx/coroutines/internal/Symbol; HPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->access$getCLOSED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->close(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; PLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->close(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->findSegmentInternal(Lkotlinx/coroutines/internal/Segment;JLkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/ConcurrentLinkedListKt;->findSegmentInternal(Lkotlinx/coroutines/internal/Segment;JLkotlin/jvm/functions/Function2;)Ljava/lang/Object; Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->()V PLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->()V HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)V HPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)V HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->access$getNextOrClosed(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->access$getNextOrClosed(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Ljava/lang/Object; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->cleanPrev()V HPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->cleanPrev()V HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNext()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; PLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getNext()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getPrev()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; PLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->getPrev()Lkotlinx/coroutines/internal/ConcurrentLinkedListNode; HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->markAsClosed()Z PLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->markAsClosed()Z HSPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->trySetNext(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Z HPLkotlinx/coroutines/internal/ConcurrentLinkedListNode;->trySetNext(Lkotlinx/coroutines/internal/ConcurrentLinkedListNode;)Z Lkotlinx/coroutines/internal/ContextScope; HSPLkotlinx/coroutines/internal/ContextScope;->(Lkotlin/coroutines/CoroutineContext;)V PLkotlinx/coroutines/internal/ContextScope;->(Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/internal/ContextScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/internal/ContextScope;->getCoroutineContext()Lkotlin/coroutines/CoroutineContext; Lkotlinx/coroutines/internal/DispatchedContinuation; HSPLkotlinx/coroutines/internal/DispatchedContinuation;->()V PLkotlinx/coroutines/internal/DispatchedContinuation;->()V HSPLkotlinx/coroutines/internal/DispatchedContinuation;->(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/Continuation;)V PLkotlinx/coroutines/internal/DispatchedContinuation;->(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/internal/DispatchedContinuation;->awaitReusability$kotlinx_coroutines_core()V HPLkotlinx/coroutines/internal/DispatchedContinuation;->awaitReusability$kotlinx_coroutines_core()V HSPLkotlinx/coroutines/internal/DispatchedContinuation;->claimReusableCancellableContinuation$kotlinx_coroutines_core()Lkotlinx/coroutines/CancellableContinuationImpl; HPLkotlinx/coroutines/internal/DispatchedContinuation;->claimReusableCancellableContinuation$kotlinx_coroutines_core()Lkotlinx/coroutines/CancellableContinuationImpl; HSPLkotlinx/coroutines/internal/DispatchedContinuation;->dispatchYield$kotlinx_coroutines_core(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V PLkotlinx/coroutines/internal/DispatchedContinuation;->dispatchYield$kotlinx_coroutines_core(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V HSPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext; HPLkotlinx/coroutines/internal/DispatchedContinuation;->getContext()Lkotlin/coroutines/CoroutineContext; HSPLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; PLkotlinx/coroutines/internal/DispatchedContinuation;->getDelegate$kotlinx_coroutines_core()Lkotlin/coroutines/Continuation; HSPLkotlinx/coroutines/internal/DispatchedContinuation;->isReusable$kotlinx_coroutines_core()Z PLkotlinx/coroutines/internal/DispatchedContinuation;->isReusable$kotlinx_coroutines_core()Z HSPLkotlinx/coroutines/internal/DispatchedContinuation;->postponeCancellation$kotlinx_coroutines_core(Ljava/lang/Throwable;)Z HPLkotlinx/coroutines/internal/DispatchedContinuation;->postponeCancellation$kotlinx_coroutines_core(Ljava/lang/Throwable;)Z HSPLkotlinx/coroutines/internal/DispatchedContinuation;->release$kotlinx_coroutines_core()V HPLkotlinx/coroutines/internal/DispatchedContinuation;->release$kotlinx_coroutines_core()V HSPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/DispatchedContinuation;->resumeWith(Ljava/lang/Object;)V HSPLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; PLkotlinx/coroutines/internal/DispatchedContinuation;->takeState$kotlinx_coroutines_core()Ljava/lang/Object; HSPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinuation$kotlinx_coroutines_core(Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Throwable; HPLkotlinx/coroutines/internal/DispatchedContinuation;->tryReleaseClaimedContinuation$kotlinx_coroutines_core(Lkotlinx/coroutines/CancellableContinuation;)Ljava/lang/Throwable; Lkotlinx/coroutines/internal/DispatchedContinuationKt; HSPLkotlinx/coroutines/internal/DispatchedContinuationKt;->()V PLkotlinx/coroutines/internal/DispatchedContinuationKt;->()V HSPLkotlinx/coroutines/internal/DispatchedContinuationKt;->access$getUNDEFINED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/internal/DispatchedContinuationKt;->access$getUNDEFINED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWith$default(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V PLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWith$default(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V HSPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWith(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/internal/DispatchedContinuationKt;->resumeCancellableWith(Lkotlin/coroutines/Continuation;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V Lkotlinx/coroutines/internal/InlineList; HSPLkotlinx/coroutines/internal/InlineList;->plus-FjFbRPM(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/internal/InlineList;->plus-FjFbRPM(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/internal/LimitedDispatcher; HSPLkotlinx/coroutines/internal/LimitedDispatcher;->()V PLkotlinx/coroutines/internal/LimitedDispatcher;->()V HSPLkotlinx/coroutines/internal/LimitedDispatcher;->(Lkotlinx/coroutines/CoroutineDispatcher;I)V PLkotlinx/coroutines/internal/LimitedDispatcher;->(Lkotlinx/coroutines/CoroutineDispatcher;I)V HSPLkotlinx/coroutines/internal/LimitedDispatcher;->access$obtainTaskOrDeallocateWorker(Lkotlinx/coroutines/internal/LimitedDispatcher;)Ljava/lang/Runnable; PLkotlinx/coroutines/internal/LimitedDispatcher;->access$obtainTaskOrDeallocateWorker(Lkotlinx/coroutines/internal/LimitedDispatcher;)Ljava/lang/Runnable; HSPLkotlinx/coroutines/internal/LimitedDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HPLkotlinx/coroutines/internal/LimitedDispatcher;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/internal/LimitedDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/internal/LimitedDispatcher;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/internal/LimitedDispatcher;->obtainTaskOrDeallocateWorker()Ljava/lang/Runnable; HPLkotlinx/coroutines/internal/LimitedDispatcher;->obtainTaskOrDeallocateWorker()Ljava/lang/Runnable; Lkotlinx/coroutines/internal/LimitedDispatcher$Worker; HSPLkotlinx/coroutines/internal/LimitedDispatcher$Worker;->(Lkotlinx/coroutines/internal/LimitedDispatcher;Ljava/lang/Runnable;)V PLkotlinx/coroutines/internal/LimitedDispatcher$Worker;->(Lkotlinx/coroutines/internal/LimitedDispatcher;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/internal/LimitedDispatcher$Worker;->run()V PLkotlinx/coroutines/internal/LimitedDispatcher$Worker;->run()V Lkotlinx/coroutines/internal/LimitedDispatcherKt; HSPLkotlinx/coroutines/internal/LimitedDispatcherKt;->checkParallelism(I)V PLkotlinx/coroutines/internal/LimitedDispatcherKt;->checkParallelism(I)V Lkotlinx/coroutines/internal/LockFreeLinkedListHead; HSPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->()V HPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->()V HSPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->isRemoved()Z HPLkotlinx/coroutines/internal/LockFreeLinkedListHead;->isRemoved()Z Lkotlinx/coroutines/internal/LockFreeLinkedListKt; HSPLkotlinx/coroutines/internal/LockFreeLinkedListKt;->()V PLkotlinx/coroutines/internal/LockFreeLinkedListKt;->()V HSPLkotlinx/coroutines/internal/LockFreeLinkedListKt;->unwrap(Ljava/lang/Object;)Lkotlinx/coroutines/internal/LockFreeLinkedListNode; PLkotlinx/coroutines/internal/LockFreeLinkedListKt;->unwrap(Ljava/lang/Object;)Lkotlinx/coroutines/internal/LockFreeLinkedListNode; Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V PLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->()V HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->access$finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->access$finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->access$get_next$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; PLkotlinx/coroutines/internal/LockFreeLinkedListNode;->access$get_next$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addOneIfEmpty(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->addOneIfEmpty(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)Z HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->correctPrev()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->correctPrev()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->finishAdd(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNext()Ljava/lang/Object; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNext()Ljava/lang/Object; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getNextNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getPrevNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->getPrevNode()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->isRemoved()Z HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->remove()Z HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->remove()Z HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->removeOrNext()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->removeOrNext()Lkotlinx/coroutines/internal/LockFreeLinkedListNode; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->tryCondAddNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;)I HPLkotlinx/coroutines/internal/LockFreeLinkedListNode;->tryCondAddNext(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;)I Lkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp; HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V PLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V PLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Ljava/lang/Object;Ljava/lang/Object;)V HSPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/LockFreeLinkedListNode$CondAddOp;->complete(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;Ljava/lang/Object;)V Lkotlinx/coroutines/internal/LockFreeTaskQueue; HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;->()V PLkotlinx/coroutines/internal/LockFreeTaskQueue;->()V HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;->(Z)V PLkotlinx/coroutines/internal/LockFreeTaskQueue;->(Z)V HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;->addLast(Ljava/lang/Object;)Z HPLkotlinx/coroutines/internal/LockFreeTaskQueue;->addLast(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;->getSize()I PLkotlinx/coroutines/internal/LockFreeTaskQueue;->getSize()I HSPLkotlinx/coroutines/internal/LockFreeTaskQueue;->removeFirstOrNull()Ljava/lang/Object; HPLkotlinx/coroutines/internal/LockFreeTaskQueue;->removeFirstOrNull()Ljava/lang/Object; Lkotlinx/coroutines/internal/LockFreeTaskQueueCore; HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->()V PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->()V HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->(IZ)V PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->(IZ)V HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->addLast(Ljava/lang/Object;)I HPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->addLast(Ljava/lang/Object;)I HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->getSize()I PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->getSize()I HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->next()Lkotlinx/coroutines/internal/LockFreeTaskQueueCore; PLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->next()Lkotlinx/coroutines/internal/LockFreeTaskQueueCore; HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->removeFirstOrNull()Ljava/lang/Object; HPLkotlinx/coroutines/internal/LockFreeTaskQueueCore;->removeFirstOrNull()Ljava/lang/Object; Lkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion; HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->addFailReason(J)I PLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->addFailReason(J)I HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->updateHead(JI)J PLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->updateHead(JI)J HSPLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->updateTail(JI)J PLkotlinx/coroutines/internal/LockFreeTaskQueueCore$Companion;->updateTail(JI)J Lkotlinx/coroutines/internal/LockFreeTaskQueueCore$Placeholder; Lkotlinx/coroutines/internal/MainDispatcherFactory; Lkotlinx/coroutines/internal/MainDispatcherLoader; HSPLkotlinx/coroutines/internal/MainDispatcherLoader;->()V PLkotlinx/coroutines/internal/MainDispatcherLoader;->()V HSPLkotlinx/coroutines/internal/MainDispatcherLoader;->()V PLkotlinx/coroutines/internal/MainDispatcherLoader;->()V Lkotlinx/coroutines/internal/MainDispatchersKt; HSPLkotlinx/coroutines/internal/MainDispatchersKt;->tryCreateDispatcher(Lkotlinx/coroutines/internal/MainDispatcherFactory;Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; PLkotlinx/coroutines/internal/MainDispatchersKt;->tryCreateDispatcher(Lkotlinx/coroutines/internal/MainDispatcherFactory;Ljava/util/List;)Lkotlinx/coroutines/MainCoroutineDispatcher; Lkotlinx/coroutines/internal/OnUndeliveredElementKt; Lkotlinx/coroutines/internal/OpDescriptor; HSPLkotlinx/coroutines/internal/OpDescriptor;->()V PLkotlinx/coroutines/internal/OpDescriptor;->()V Lkotlinx/coroutines/internal/Removed; HSPLkotlinx/coroutines/internal/Removed;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V PLkotlinx/coroutines/internal/Removed;->(Lkotlinx/coroutines/internal/LockFreeLinkedListNode;)V Lkotlinx/coroutines/internal/ResizableAtomicArray; HSPLkotlinx/coroutines/internal/ResizableAtomicArray;->(I)V PLkotlinx/coroutines/internal/ResizableAtomicArray;->(I)V HSPLkotlinx/coroutines/internal/ResizableAtomicArray;->get(I)Ljava/lang/Object; HPLkotlinx/coroutines/internal/ResizableAtomicArray;->get(I)Ljava/lang/Object; HSPLkotlinx/coroutines/internal/ResizableAtomicArray;->setSynchronized(ILjava/lang/Object;)V PLkotlinx/coroutines/internal/ResizableAtomicArray;->setSynchronized(ILjava/lang/Object;)V Lkotlinx/coroutines/internal/ScopeCoroutine; HSPLkotlinx/coroutines/internal/ScopeCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/internal/ScopeCoroutine;->(Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V PLkotlinx/coroutines/internal/ScopeCoroutine;->afterCompletion(Ljava/lang/Object;)V HSPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/ScopeCoroutine;->afterResume(Ljava/lang/Object;)V HSPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z HPLkotlinx/coroutines/internal/ScopeCoroutine;->isScopedCoroutine()Z Lkotlinx/coroutines/internal/Segment; HSPLkotlinx/coroutines/internal/Segment;->()V PLkotlinx/coroutines/internal/Segment;->()V HSPLkotlinx/coroutines/internal/Segment;->(JLkotlinx/coroutines/internal/Segment;I)V HPLkotlinx/coroutines/internal/Segment;->(JLkotlinx/coroutines/internal/Segment;I)V HSPLkotlinx/coroutines/internal/Segment;->decPointers$kotlinx_coroutines_core()Z PLkotlinx/coroutines/internal/Segment;->decPointers$kotlinx_coroutines_core()Z HSPLkotlinx/coroutines/internal/Segment;->isRemoved()Z HPLkotlinx/coroutines/internal/Segment;->isRemoved()Z HSPLkotlinx/coroutines/internal/Segment;->onSlotCleaned()V HPLkotlinx/coroutines/internal/Segment;->onSlotCleaned()V HSPLkotlinx/coroutines/internal/Segment;->tryIncPointers$kotlinx_coroutines_core()Z HPLkotlinx/coroutines/internal/Segment;->tryIncPointers$kotlinx_coroutines_core()Z Lkotlinx/coroutines/internal/SegmentOrClosed; HSPLkotlinx/coroutines/internal/SegmentOrClosed;->getSegment-impl(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Segment; HPLkotlinx/coroutines/internal/SegmentOrClosed;->getSegment-impl(Ljava/lang/Object;)Lkotlinx/coroutines/internal/Segment; HSPLkotlinx/coroutines/internal/SegmentOrClosed;->isClosed-impl(Ljava/lang/Object;)Z PLkotlinx/coroutines/internal/SegmentOrClosed;->isClosed-impl(Ljava/lang/Object;)Z Lkotlinx/coroutines/internal/StackTraceRecoveryKt; Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;)V PLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;)V Lkotlinx/coroutines/internal/SystemPropsKt; HSPLkotlinx/coroutines/internal/SystemPropsKt;->getAVAILABLE_PROCESSORS()I PLkotlinx/coroutines/internal/SystemPropsKt;->getAVAILABLE_PROCESSORS()I HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I PLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J PLkotlinx/coroutines/internal/SystemPropsKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;III)I PLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;III)I HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;Z)Z PLkotlinx/coroutines/internal/SystemPropsKt;->systemProp(Ljava/lang/String;Z)Z Lkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt; HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->()V PLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->()V HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->getAVAILABLE_PROCESSORS()I PLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->getAVAILABLE_PROCESSORS()I HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->systemProp(Ljava/lang/String;)Ljava/lang/String; PLkotlinx/coroutines/internal/SystemPropsKt__SystemPropsKt;->systemProp(Ljava/lang/String;)Ljava/lang/String; Lkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt; HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I PLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp$default(Ljava/lang/String;IIIILjava/lang/Object;)I HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J PLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp$default(Ljava/lang/String;JJJILjava/lang/Object;)J HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;III)I PLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;III)I HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;JJJ)J PLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;JJJ)J HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Z)Z PLkotlinx/coroutines/internal/SystemPropsKt__SystemProps_commonKt;->systemProp(Ljava/lang/String;Z)Z Lkotlinx/coroutines/internal/ThreadContextKt; HSPLkotlinx/coroutines/internal/ThreadContextKt;->()V PLkotlinx/coroutines/internal/ThreadContextKt;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V HPLkotlinx/coroutines/internal/ThreadContextKt;->restoreThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)V HSPLkotlinx/coroutines/internal/ThreadContextKt;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object; PLkotlinx/coroutines/internal/ThreadContextKt;->threadContextElements(Lkotlin/coroutines/CoroutineContext;)Ljava/lang/Object; HSPLkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/ThreadContextKt;->updateThreadContext(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/internal/ThreadContextKt$countAll$1; HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->()V PLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->()V PLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->invoke(Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Object; PLkotlinx/coroutines/internal/ThreadContextKt$countAll$1;->invoke(Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext$Element;)Ljava/lang/Object; Lkotlinx/coroutines/internal/ThreadContextKt$findOne$1; HSPLkotlinx/coroutines/internal/ThreadContextKt$findOne$1;->()V PLkotlinx/coroutines/internal/ThreadContextKt$findOne$1;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt$findOne$1;->()V PLkotlinx/coroutines/internal/ThreadContextKt$findOne$1;->()V Lkotlinx/coroutines/internal/ThreadContextKt$updateState$1; HSPLkotlinx/coroutines/internal/ThreadContextKt$updateState$1;->()V PLkotlinx/coroutines/internal/ThreadContextKt$updateState$1;->()V HSPLkotlinx/coroutines/internal/ThreadContextKt$updateState$1;->()V PLkotlinx/coroutines/internal/ThreadContextKt$updateState$1;->()V Lkotlinx/coroutines/internal/ThreadSafeHeap; HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->()V PLkotlinx/coroutines/internal/ThreadSafeHeap;->()V HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->()V PLkotlinx/coroutines/internal/ThreadSafeHeap;->()V HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->addImpl(Lkotlinx/coroutines/internal/ThreadSafeHeapNode;)V HPLkotlinx/coroutines/internal/ThreadSafeHeap;->addImpl(Lkotlinx/coroutines/internal/ThreadSafeHeapNode;)V HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->firstImpl()Lkotlinx/coroutines/internal/ThreadSafeHeapNode; PLkotlinx/coroutines/internal/ThreadSafeHeap;->firstImpl()Lkotlinx/coroutines/internal/ThreadSafeHeapNode; HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->getSize()I HPLkotlinx/coroutines/internal/ThreadSafeHeap;->getSize()I HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->isEmpty()Z PLkotlinx/coroutines/internal/ThreadSafeHeap;->isEmpty()Z HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->peek()Lkotlinx/coroutines/internal/ThreadSafeHeapNode; PLkotlinx/coroutines/internal/ThreadSafeHeap;->peek()Lkotlinx/coroutines/internal/ThreadSafeHeapNode; PLkotlinx/coroutines/internal/ThreadSafeHeap;->remove(Lkotlinx/coroutines/internal/ThreadSafeHeapNode;)Z HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->removeAtImpl(I)Lkotlinx/coroutines/internal/ThreadSafeHeapNode; HPLkotlinx/coroutines/internal/ThreadSafeHeap;->removeAtImpl(I)Lkotlinx/coroutines/internal/ThreadSafeHeapNode; HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->siftUpFrom(I)V HPLkotlinx/coroutines/internal/ThreadSafeHeap;->siftUpFrom(I)V HSPLkotlinx/coroutines/internal/ThreadSafeHeap;->swap(II)V PLkotlinx/coroutines/internal/ThreadSafeHeap;->swap(II)V Lkotlinx/coroutines/internal/ThreadSafeHeapNode; Lkotlinx/coroutines/internal/ThreadState; Lkotlinx/coroutines/intrinsics/CancellableKt; HSPLkotlinx/coroutines/intrinsics/CancellableKt;->startCoroutineCancellable$default(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V HPLkotlinx/coroutines/intrinsics/CancellableKt;->startCoroutineCancellable$default(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V HSPLkotlinx/coroutines/intrinsics/CancellableKt;->startCoroutineCancellable(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;)V HPLkotlinx/coroutines/intrinsics/CancellableKt;->startCoroutineCancellable(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;Lkotlin/jvm/functions/Function1;)V Lkotlinx/coroutines/intrinsics/UndispatchedKt; HSPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startCoroutineUndispatched(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startCoroutineUndispatched(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; HPLkotlinx/coroutines/intrinsics/UndispatchedKt;->startUndispatchedOrReturn(Lkotlinx/coroutines/internal/ScopeCoroutine;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; Lkotlinx/coroutines/scheduling/CoroutineScheduler; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->()V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->()V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->(IIJLjava/lang/String;)V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->(IIJLjava/lang/String;)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->access$getControlState$FU$p()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; PLkotlinx/coroutines/scheduling/CoroutineScheduler;->access$getControlState$FU$p()Ljava/util/concurrent/atomic/AtomicLongFieldUpdater; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I PLkotlinx/coroutines/scheduling/CoroutineScheduler;->createNewWorker()I HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->createTask(Ljava/lang/Runnable;Lkotlinx/coroutines/scheduling/TaskContext;)Lkotlinx/coroutines/scheduling/Task; PLkotlinx/coroutines/scheduling/CoroutineScheduler;->createTask(Ljava/lang/Runnable;Lkotlinx/coroutines/scheduling/TaskContext;)Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;Lkotlinx/coroutines/scheduling/TaskContext;Z)V HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->dispatch(Ljava/lang/Runnable;Lkotlinx/coroutines/scheduling/TaskContext;Z)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->isTerminated()Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->isTerminated()Z HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPush(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackPush(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;)Z PLkotlinx/coroutines/scheduling/CoroutineScheduler;->parkedWorkersStackTopUpdate(Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;II)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->runSafely(Lkotlinx/coroutines/scheduling/Task;)V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->runSafely(Lkotlinx/coroutines/scheduling/Task;)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalCpuWork()V PLkotlinx/coroutines/scheduling/CoroutineScheduler;->signalCpuWork()V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker(J)Z PLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryCreateWorker(J)Z HSPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryUnpark()Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler;->tryUnpark()Z Lkotlinx/coroutines/scheduling/CoroutineScheduler$Companion; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/coroutines/scheduling/CoroutineScheduler$Worker; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->()V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->()V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->(Lkotlinx/coroutines/scheduling/CoroutineScheduler;I)V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->(Lkotlinx/coroutines/scheduling/CoroutineScheduler;I)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->findTask(Z)Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getIndexInArray()I HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object; PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getNextParkedWorker()Ljava/lang/Object; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getWorkerCtl$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->getWorkerCtl$FU()Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->nextInt(I)I HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->pollGlobalQueues()Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->pollGlobalQueues()Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->run()V HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->run()V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setIndexInArray(I)V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setIndexInArray(I)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setNextParkedWorker(Ljava/lang/Object;)V PLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->setNextParkedWorker(Ljava/lang/Object;)V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryReleaseCpu(Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;)Z HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->tryReleaseCpu(Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;)Z HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->trySteal(I)Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/CoroutineScheduler$Worker;->trySteal(I)Lkotlinx/coroutines/scheduling/Task; Lkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState; HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->()V PLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->()V HSPLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->(Ljava/lang/String;I)V PLkotlinx/coroutines/scheduling/CoroutineScheduler$WorkerState;->(Ljava/lang/String;I)V Lkotlinx/coroutines/scheduling/DefaultIoScheduler; HSPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V HSPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->()V HSPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/scheduling/DefaultIoScheduler;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V Lkotlinx/coroutines/scheduling/DefaultScheduler; HSPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultScheduler;->()V HSPLkotlinx/coroutines/scheduling/DefaultScheduler;->()V PLkotlinx/coroutines/scheduling/DefaultScheduler;->()V Lkotlinx/coroutines/scheduling/GlobalQueue; HSPLkotlinx/coroutines/scheduling/GlobalQueue;->()V PLkotlinx/coroutines/scheduling/GlobalQueue;->()V Lkotlinx/coroutines/scheduling/NanoTimeSource; HSPLkotlinx/coroutines/scheduling/NanoTimeSource;->()V PLkotlinx/coroutines/scheduling/NanoTimeSource;->()V HSPLkotlinx/coroutines/scheduling/NanoTimeSource;->()V PLkotlinx/coroutines/scheduling/NanoTimeSource;->()V HSPLkotlinx/coroutines/scheduling/NanoTimeSource;->nanoTime()J HPLkotlinx/coroutines/scheduling/NanoTimeSource;->nanoTime()J Lkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher; HSPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->(IIJLjava/lang/String;)V PLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->(IIJLjava/lang/String;)V HSPLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->dispatchWithContext$kotlinx_coroutines_core(Ljava/lang/Runnable;Lkotlinx/coroutines/scheduling/TaskContext;Z)V PLkotlinx/coroutines/scheduling/SchedulerCoroutineDispatcher;->dispatchWithContext$kotlinx_coroutines_core(Ljava/lang/Runnable;Lkotlinx/coroutines/scheduling/TaskContext;Z)V Lkotlinx/coroutines/scheduling/SchedulerTimeSource; HSPLkotlinx/coroutines/scheduling/SchedulerTimeSource;->()V PLkotlinx/coroutines/scheduling/SchedulerTimeSource;->()V Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/Task;->()V PLkotlinx/coroutines/scheduling/Task;->()V HSPLkotlinx/coroutines/scheduling/Task;->(JLkotlinx/coroutines/scheduling/TaskContext;)V HPLkotlinx/coroutines/scheduling/Task;->(JLkotlinx/coroutines/scheduling/TaskContext;)V Lkotlinx/coroutines/scheduling/TaskContext; Lkotlinx/coroutines/scheduling/TaskContextImpl; HSPLkotlinx/coroutines/scheduling/TaskContextImpl;->(I)V PLkotlinx/coroutines/scheduling/TaskContextImpl;->(I)V HSPLkotlinx/coroutines/scheduling/TaskContextImpl;->afterTask()V PLkotlinx/coroutines/scheduling/TaskContextImpl;->afterTask()V HSPLkotlinx/coroutines/scheduling/TaskContextImpl;->getTaskMode()I PLkotlinx/coroutines/scheduling/TaskContextImpl;->getTaskMode()I Lkotlinx/coroutines/scheduling/TaskImpl; HSPLkotlinx/coroutines/scheduling/TaskImpl;->(Ljava/lang/Runnable;JLkotlinx/coroutines/scheduling/TaskContext;)V PLkotlinx/coroutines/scheduling/TaskImpl;->(Ljava/lang/Runnable;JLkotlinx/coroutines/scheduling/TaskContext;)V HSPLkotlinx/coroutines/scheduling/TaskImpl;->run()V PLkotlinx/coroutines/scheduling/TaskImpl;->run()V Lkotlinx/coroutines/scheduling/TasksKt; HSPLkotlinx/coroutines/scheduling/TasksKt;->()V PLkotlinx/coroutines/scheduling/TasksKt;->()V Lkotlinx/coroutines/scheduling/UnlimitedIoScheduler; HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->()V HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatch(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->dispatchYield(Lkotlin/coroutines/CoroutineContext;Ljava/lang/Runnable;)V HSPLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->limitedParallelism(I)Lkotlinx/coroutines/CoroutineDispatcher; PLkotlinx/coroutines/scheduling/UnlimitedIoScheduler;->limitedParallelism(I)Lkotlinx/coroutines/CoroutineDispatcher; Lkotlinx/coroutines/scheduling/WorkQueue; HSPLkotlinx/coroutines/scheduling/WorkQueue;->()V PLkotlinx/coroutines/scheduling/WorkQueue;->()V HSPLkotlinx/coroutines/scheduling/WorkQueue;->()V PLkotlinx/coroutines/scheduling/WorkQueue;->()V HSPLkotlinx/coroutines/scheduling/WorkQueue;->add(Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task; PLkotlinx/coroutines/scheduling/WorkQueue;->add(Lkotlinx/coroutines/scheduling/Task;Z)Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/WorkQueue;->addLast(Lkotlinx/coroutines/scheduling/Task;)Lkotlinx/coroutines/scheduling/Task; PLkotlinx/coroutines/scheduling/WorkQueue;->addLast(Lkotlinx/coroutines/scheduling/Task;)Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/WorkQueue;->poll()Lkotlinx/coroutines/scheduling/Task; PLkotlinx/coroutines/scheduling/WorkQueue;->poll()Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/WorkQueue;->pollBuffer()Lkotlinx/coroutines/scheduling/Task; HPLkotlinx/coroutines/scheduling/WorkQueue;->pollBuffer()Lkotlinx/coroutines/scheduling/Task; HSPLkotlinx/coroutines/scheduling/WorkQueue;->trySteal(ILkotlin/jvm/internal/Ref$ObjectRef;)J HPLkotlinx/coroutines/scheduling/WorkQueue;->trySteal(ILkotlin/jvm/internal/Ref$ObjectRef;)J Lkotlinx/coroutines/selects/OnTimeout; HSPLkotlinx/coroutines/selects/OnTimeout;->(J)V PLkotlinx/coroutines/selects/OnTimeout;->(J)V HSPLkotlinx/coroutines/selects/OnTimeout;->access$register(Lkotlinx/coroutines/selects/OnTimeout;Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)V PLkotlinx/coroutines/selects/OnTimeout;->access$register(Lkotlinx/coroutines/selects/OnTimeout;Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)V HSPLkotlinx/coroutines/selects/OnTimeout;->getSelectClause()Lkotlinx/coroutines/selects/SelectClause0; PLkotlinx/coroutines/selects/OnTimeout;->getSelectClause()Lkotlinx/coroutines/selects/SelectClause0; Lkotlinx/coroutines/selects/OnTimeout$register$$inlined$Runnable$1; HSPLkotlinx/coroutines/selects/OnTimeout$register$$inlined$Runnable$1;->(Lkotlinx/coroutines/selects/SelectInstance;Lkotlinx/coroutines/selects/OnTimeout;)V PLkotlinx/coroutines/selects/OnTimeout$register$$inlined$Runnable$1;->(Lkotlinx/coroutines/selects/SelectInstance;Lkotlinx/coroutines/selects/OnTimeout;)V HSPLkotlinx/coroutines/selects/OnTimeout$register$$inlined$Runnable$1;->run()V PLkotlinx/coroutines/selects/OnTimeout$register$$inlined$Runnable$1;->run()V Lkotlinx/coroutines/selects/OnTimeout$selectClause$1; HSPLkotlinx/coroutines/selects/OnTimeout$selectClause$1;->()V PLkotlinx/coroutines/selects/OnTimeout$selectClause$1;->()V HSPLkotlinx/coroutines/selects/OnTimeout$selectClause$1;->()V PLkotlinx/coroutines/selects/OnTimeout$selectClause$1;->()V HSPLkotlinx/coroutines/selects/OnTimeout$selectClause$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/selects/OnTimeout$selectClause$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/selects/OnTimeoutKt; HSPLkotlinx/coroutines/selects/OnTimeoutKt;->onTimeout(Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/selects/OnTimeoutKt;->onTimeout(Lkotlinx/coroutines/selects/SelectBuilder;JLkotlin/jvm/functions/Function1;)V Lkotlinx/coroutines/selects/SelectBuilder; Lkotlinx/coroutines/selects/SelectClause; Lkotlinx/coroutines/selects/SelectClause0; Lkotlinx/coroutines/selects/SelectClause0Impl; HSPLkotlinx/coroutines/selects/SelectClause0Impl;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V PLkotlinx/coroutines/selects/SelectClause0Impl;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/selects/SelectClause0Impl;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/coroutines/selects/SelectClause0Impl;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/coroutines/selects/SelectClause0Impl;->getClauseObject()Ljava/lang/Object; PLkotlinx/coroutines/selects/SelectClause0Impl;->getClauseObject()Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectClause0Impl;->getOnCancellationConstructor()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectClause0Impl;->getOnCancellationConstructor()Lkotlin/jvm/functions/Function3; HSPLkotlinx/coroutines/selects/SelectClause0Impl;->getProcessResFunc()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectClause0Impl;->getProcessResFunc()Lkotlin/jvm/functions/Function3; HSPLkotlinx/coroutines/selects/SelectClause0Impl;->getRegFunc()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectClause0Impl;->getRegFunc()Lkotlin/jvm/functions/Function3; Lkotlinx/coroutines/selects/SelectClause1; Lkotlinx/coroutines/selects/SelectClause1Impl; HSPLkotlinx/coroutines/selects/SelectClause1Impl;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V HPLkotlinx/coroutines/selects/SelectClause1Impl;->(Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/selects/SelectClause1Impl;->getClauseObject()Ljava/lang/Object; PLkotlinx/coroutines/selects/SelectClause1Impl;->getClauseObject()Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectClause1Impl;->getOnCancellationConstructor()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectClause1Impl;->getOnCancellationConstructor()Lkotlin/jvm/functions/Function3; HSPLkotlinx/coroutines/selects/SelectClause1Impl;->getProcessResFunc()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectClause1Impl;->getProcessResFunc()Lkotlin/jvm/functions/Function3; HSPLkotlinx/coroutines/selects/SelectClause1Impl;->getRegFunc()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectClause1Impl;->getRegFunc()Lkotlin/jvm/functions/Function3; Lkotlinx/coroutines/selects/SelectImplementation; HSPLkotlinx/coroutines/selects/SelectImplementation;->()V PLkotlinx/coroutines/selects/SelectImplementation;->()V HSPLkotlinx/coroutines/selects/SelectImplementation;->(Lkotlin/coroutines/CoroutineContext;)V HPLkotlinx/coroutines/selects/SelectImplementation;->(Lkotlin/coroutines/CoroutineContext;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->access$doSelectSuspend(Lkotlinx/coroutines/selects/SelectImplementation;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlinx/coroutines/selects/SelectImplementation;->access$doSelectSuspend(Lkotlinx/coroutines/selects/SelectImplementation;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation;->access$getInternalResult$p(Lkotlinx/coroutines/selects/SelectImplementation;)Ljava/lang/Object; PLkotlinx/coroutines/selects/SelectImplementation;->access$getInternalResult$p(Lkotlinx/coroutines/selects/SelectImplementation;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation;->complete(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/selects/SelectImplementation;->complete(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation;->disposeOnCompletion(Lkotlinx/coroutines/DisposableHandle;)V PLkotlinx/coroutines/selects/SelectImplementation;->disposeOnCompletion(Lkotlinx/coroutines/DisposableHandle;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->doSelect(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/selects/SelectImplementation;->doSelect(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation;->doSelectSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/selects/SelectImplementation;->doSelectSuspend(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation;->findClause(Ljava/lang/Object;)Lkotlinx/coroutines/selects/SelectImplementation$ClauseData; HPLkotlinx/coroutines/selects/SelectImplementation;->findClause(Ljava/lang/Object;)Lkotlinx/coroutines/selects/SelectImplementation$ClauseData; HSPLkotlinx/coroutines/selects/SelectImplementation;->getContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/selects/SelectImplementation;->getContext()Lkotlin/coroutines/CoroutineContext; PLkotlinx/coroutines/selects/SelectImplementation;->invoke(Ljava/lang/Throwable;)V HPLkotlinx/coroutines/selects/SelectImplementation;->invoke(Ljava/lang/Throwable;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->invoke(Lkotlinx/coroutines/selects/SelectClause0;Lkotlin/jvm/functions/Function1;)V PLkotlinx/coroutines/selects/SelectImplementation;->invoke(Lkotlinx/coroutines/selects/SelectClause0;Lkotlin/jvm/functions/Function1;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->invoke(Lkotlinx/coroutines/selects/SelectClause1;Lkotlin/jvm/functions/Function2;)V PLkotlinx/coroutines/selects/SelectImplementation;->invoke(Lkotlinx/coroutines/selects/SelectClause1;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V HPLkotlinx/coroutines/selects/SelectImplementation;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V HSPLkotlinx/coroutines/selects/SelectImplementation;->register$default(Lkotlinx/coroutines/selects/SelectImplementation;Lkotlinx/coroutines/selects/SelectImplementation$ClauseData;ZILjava/lang/Object;)V HPLkotlinx/coroutines/selects/SelectImplementation;->register$default(Lkotlinx/coroutines/selects/SelectImplementation;Lkotlinx/coroutines/selects/SelectImplementation$ClauseData;ZILjava/lang/Object;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->register(Lkotlinx/coroutines/selects/SelectImplementation$ClauseData;Z)V HPLkotlinx/coroutines/selects/SelectImplementation;->register(Lkotlinx/coroutines/selects/SelectImplementation$ClauseData;Z)V HSPLkotlinx/coroutines/selects/SelectImplementation;->selectInRegistrationPhase(Ljava/lang/Object;)V PLkotlinx/coroutines/selects/SelectImplementation;->selectInRegistrationPhase(Ljava/lang/Object;)V HSPLkotlinx/coroutines/selects/SelectImplementation;->trySelect(Ljava/lang/Object;Ljava/lang/Object;)Z PLkotlinx/coroutines/selects/SelectImplementation;->trySelect(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLkotlinx/coroutines/selects/SelectImplementation;->trySelectInternal(Ljava/lang/Object;Ljava/lang/Object;)I HPLkotlinx/coroutines/selects/SelectImplementation;->trySelectInternal(Ljava/lang/Object;Ljava/lang/Object;)I HSPLkotlinx/coroutines/selects/SelectImplementation;->waitUntilSelected(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/selects/SelectImplementation;->waitUntilSelected(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Lkotlinx/coroutines/selects/SelectImplementation$ClauseData; HSPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->(Lkotlinx/coroutines/selects/SelectImplementation;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)V HPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->(Lkotlinx/coroutines/selects/SelectImplementation;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)V HSPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->createOnCancellationAction(Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)Lkotlin/jvm/functions/Function1; PLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->createOnCancellationAction(Lkotlinx/coroutines/selects/SelectInstance;Ljava/lang/Object;)Lkotlin/jvm/functions/Function1; HSPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->dispose()V HPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->dispose()V HSPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->invokeBlock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->invokeBlock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->processResult(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->processResult(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->tryRegisterAsWaiter(Lkotlinx/coroutines/selects/SelectImplementation;)Z PLkotlinx/coroutines/selects/SelectImplementation$ClauseData;->tryRegisterAsWaiter(Lkotlinx/coroutines/selects/SelectImplementation;)Z Lkotlinx/coroutines/selects/SelectImplementation$doSelectSuspend$1; HSPLkotlinx/coroutines/selects/SelectImplementation$doSelectSuspend$1;->(Lkotlinx/coroutines/selects/SelectImplementation;Lkotlin/coroutines/Continuation;)V HPLkotlinx/coroutines/selects/SelectImplementation$doSelectSuspend$1;->(Lkotlinx/coroutines/selects/SelectImplementation;Lkotlin/coroutines/Continuation;)V HSPLkotlinx/coroutines/selects/SelectImplementation$doSelectSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/coroutines/selects/SelectImplementation$doSelectSuspend$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/selects/SelectInstance; Lkotlinx/coroutines/selects/SelectInstanceInternal; Lkotlinx/coroutines/selects/SelectKt; HSPLkotlinx/coroutines/selects/SelectKt;->()V PLkotlinx/coroutines/selects/SelectKt;->()V HSPLkotlinx/coroutines/selects/SelectKt;->access$getDUMMY_PROCESS_RESULT_FUNCTION$p()Lkotlin/jvm/functions/Function3; PLkotlinx/coroutines/selects/SelectKt;->access$getDUMMY_PROCESS_RESULT_FUNCTION$p()Lkotlin/jvm/functions/Function3; HSPLkotlinx/coroutines/selects/SelectKt;->access$getNO_RESULT$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/selects/SelectKt;->access$getNO_RESULT$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/selects/SelectKt;->access$getSTATE_CANCELLED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/selects/SelectKt;->access$getSTATE_COMPLETED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/selects/SelectKt;->access$getSTATE_COMPLETED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/selects/SelectKt;->access$getSTATE_REG$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/selects/SelectKt;->access$getSTATE_REG$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/selects/SelectKt;->access$tryResume(Lkotlinx/coroutines/CancellableContinuation;Lkotlin/jvm/functions/Function1;)Z HPLkotlinx/coroutines/selects/SelectKt;->access$tryResume(Lkotlinx/coroutines/CancellableContinuation;Lkotlin/jvm/functions/Function1;)Z HSPLkotlinx/coroutines/selects/SelectKt;->getPARAM_CLAUSE_0()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/selects/SelectKt;->getPARAM_CLAUSE_0()Lkotlinx/coroutines/internal/Symbol; Lkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1; HSPLkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1;->()V PLkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1;->()V HSPLkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1;->()V PLkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1;->()V HSPLkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/selects/SelectKt$DUMMY_PROCESS_RESULT_FUNCTION$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Lkotlinx/coroutines/sync/Mutex; Lkotlinx/coroutines/sync/Mutex$DefaultImpls; HSPLkotlinx/coroutines/sync/Mutex$DefaultImpls;->lock$default(Lkotlinx/coroutines/sync/Mutex;Ljava/lang/Object;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; PLkotlinx/coroutines/sync/Mutex$DefaultImpls;->lock$default(Lkotlinx/coroutines/sync/Mutex;Ljava/lang/Object;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/coroutines/sync/Mutex$DefaultImpls;->unlock$default(Lkotlinx/coroutines/sync/Mutex;Ljava/lang/Object;ILjava/lang/Object;)V PLkotlinx/coroutines/sync/Mutex$DefaultImpls;->unlock$default(Lkotlinx/coroutines/sync/Mutex;Ljava/lang/Object;ILjava/lang/Object;)V Lkotlinx/coroutines/sync/MutexImpl; HSPLkotlinx/coroutines/sync/MutexImpl;->()V PLkotlinx/coroutines/sync/MutexImpl;->()V HSPLkotlinx/coroutines/sync/MutexImpl;->(Z)V HPLkotlinx/coroutines/sync/MutexImpl;->(Z)V HSPLkotlinx/coroutines/sync/MutexImpl;->access$getOwner$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; PLkotlinx/coroutines/sync/MutexImpl;->access$getOwner$FU$p()Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater; HSPLkotlinx/coroutines/sync/MutexImpl;->isLocked()Z PLkotlinx/coroutines/sync/MutexImpl;->isLocked()Z HSPLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/sync/MutexImpl;->lock(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/sync/MutexImpl;->lockSuspend(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLkotlinx/coroutines/sync/MutexImpl;->lockSuspend(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HSPLkotlinx/coroutines/sync/MutexImpl;->tryLock(Ljava/lang/Object;)Z HPLkotlinx/coroutines/sync/MutexImpl;->tryLock(Ljava/lang/Object;)Z HSPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V HPLkotlinx/coroutines/sync/MutexImpl;->unlock(Ljava/lang/Object;)V Lkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner; HSPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/CancellableContinuationImpl;Ljava/lang/Object;)V HPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/CancellableContinuationImpl;Ljava/lang/Object;)V HSPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->completeResume(Ljava/lang/Object;)V PLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->completeResume(Ljava/lang/Object;)V HSPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V PLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->invokeOnCancellation(Lkotlinx/coroutines/internal/Segment;I)V HSPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->tryResume(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; PLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->tryResume(Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; HSPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->tryResume(Lkotlin/Unit;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; PLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;->tryResume(Lkotlin/Unit;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; Lkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner$tryResume$token$1; HSPLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner$tryResume$token$1;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;)V PLkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner$tryResume$token$1;->(Lkotlinx/coroutines/sync/MutexImpl;Lkotlinx/coroutines/sync/MutexImpl$CancellableContinuationWithOwner;)V Lkotlinx/coroutines/sync/MutexImpl$onSelectCancellationUnlockConstructor$1; HSPLkotlinx/coroutines/sync/MutexImpl$onSelectCancellationUnlockConstructor$1;->(Lkotlinx/coroutines/sync/MutexImpl;)V HPLkotlinx/coroutines/sync/MutexImpl$onSelectCancellationUnlockConstructor$1;->(Lkotlinx/coroutines/sync/MutexImpl;)V Lkotlinx/coroutines/sync/MutexKt; HSPLkotlinx/coroutines/sync/MutexKt;->()V PLkotlinx/coroutines/sync/MutexKt;->()V HSPLkotlinx/coroutines/sync/MutexKt;->Mutex$default(ZILjava/lang/Object;)Lkotlinx/coroutines/sync/Mutex; PLkotlinx/coroutines/sync/MutexKt;->Mutex$default(ZILjava/lang/Object;)Lkotlinx/coroutines/sync/Mutex; HSPLkotlinx/coroutines/sync/MutexKt;->access$getNO_OWNER$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/sync/MutexKt;->access$getNO_OWNER$p()Lkotlinx/coroutines/internal/Symbol; Lkotlinx/coroutines/sync/Semaphore; Lkotlinx/coroutines/sync/SemaphoreImpl; HSPLkotlinx/coroutines/sync/SemaphoreImpl;->()V PLkotlinx/coroutines/sync/SemaphoreImpl;->()V HSPLkotlinx/coroutines/sync/SemaphoreImpl;->(II)V HPLkotlinx/coroutines/sync/SemaphoreImpl;->(II)V HSPLkotlinx/coroutines/sync/SemaphoreImpl;->acquire(Lkotlinx/coroutines/CancellableContinuation;)V HPLkotlinx/coroutines/sync/SemaphoreImpl;->acquire(Lkotlinx/coroutines/CancellableContinuation;)V HSPLkotlinx/coroutines/sync/SemaphoreImpl;->addAcquireToQueue(Lkotlinx/coroutines/Waiter;)Z HPLkotlinx/coroutines/sync/SemaphoreImpl;->addAcquireToQueue(Lkotlinx/coroutines/Waiter;)Z HSPLkotlinx/coroutines/sync/SemaphoreImpl;->getAvailablePermits()I HPLkotlinx/coroutines/sync/SemaphoreImpl;->getAvailablePermits()I HSPLkotlinx/coroutines/sync/SemaphoreImpl;->release()V HPLkotlinx/coroutines/sync/SemaphoreImpl;->release()V HSPLkotlinx/coroutines/sync/SemaphoreImpl;->tryAcquire()Z HPLkotlinx/coroutines/sync/SemaphoreImpl;->tryAcquire()Z Lkotlinx/coroutines/sync/SemaphoreImpl$addAcquireToQueue$createNewSegment$1; HSPLkotlinx/coroutines/sync/SemaphoreImpl$addAcquireToQueue$createNewSegment$1;->()V PLkotlinx/coroutines/sync/SemaphoreImpl$addAcquireToQueue$createNewSegment$1;->()V HSPLkotlinx/coroutines/sync/SemaphoreImpl$addAcquireToQueue$createNewSegment$1;->()V PLkotlinx/coroutines/sync/SemaphoreImpl$addAcquireToQueue$createNewSegment$1;->()V Lkotlinx/coroutines/sync/SemaphoreImpl$onCancellationRelease$1; HSPLkotlinx/coroutines/sync/SemaphoreImpl$onCancellationRelease$1;->(Lkotlinx/coroutines/sync/SemaphoreImpl;)V HPLkotlinx/coroutines/sync/SemaphoreImpl$onCancellationRelease$1;->(Lkotlinx/coroutines/sync/SemaphoreImpl;)V Lkotlinx/coroutines/sync/SemaphoreImpl$tryResumeNextFromQueue$createNewSegment$1; HSPLkotlinx/coroutines/sync/SemaphoreImpl$tryResumeNextFromQueue$createNewSegment$1;->()V PLkotlinx/coroutines/sync/SemaphoreImpl$tryResumeNextFromQueue$createNewSegment$1;->()V HSPLkotlinx/coroutines/sync/SemaphoreImpl$tryResumeNextFromQueue$createNewSegment$1;->()V PLkotlinx/coroutines/sync/SemaphoreImpl$tryResumeNextFromQueue$createNewSegment$1;->()V Lkotlinx/coroutines/sync/SemaphoreKt; HSPLkotlinx/coroutines/sync/SemaphoreKt;->()V PLkotlinx/coroutines/sync/SemaphoreKt;->()V HSPLkotlinx/coroutines/sync/SemaphoreKt;->access$getCANCELLED$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/sync/SemaphoreKt;->access$getCANCELLED$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/sync/SemaphoreKt;->access$getPERMIT$p()Lkotlinx/coroutines/internal/Symbol; PLkotlinx/coroutines/sync/SemaphoreKt;->access$getPERMIT$p()Lkotlinx/coroutines/internal/Symbol; HSPLkotlinx/coroutines/sync/SemaphoreKt;->access$getSEGMENT_SIZE$p()I PLkotlinx/coroutines/sync/SemaphoreKt;->access$getSEGMENT_SIZE$p()I Lkotlinx/coroutines/sync/SemaphoreSegment; HSPLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V HPLkotlinx/coroutines/sync/SemaphoreSegment;->(JLkotlinx/coroutines/sync/SemaphoreSegment;I)V HSPLkotlinx/coroutines/sync/SemaphoreSegment;->getAcquirers()Ljava/util/concurrent/atomic/AtomicReferenceArray; PLkotlinx/coroutines/sync/SemaphoreSegment;->getAcquirers()Ljava/util/concurrent/atomic/AtomicReferenceArray; HSPLkotlinx/coroutines/sync/SemaphoreSegment;->getNumberOfSlots()I PLkotlinx/coroutines/sync/SemaphoreSegment;->getNumberOfSlots()I Lkotlinx/serialization/DeserializationStrategy; Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/MissingFieldException; Lkotlinx/serialization/SerialFormat; Lkotlinx/serialization/SerializationException; Lkotlinx/serialization/SerializationStrategy; Lkotlinx/serialization/StringFormat; Lkotlinx/serialization/UnknownFieldException; Lkotlinx/serialization/builtins/BuiltinSerializersKt; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->BooleanArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->BooleanArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ByteArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->ByteArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->CharArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->CharArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->DoubleArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->DoubleArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->FloatArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->FloatArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->IntArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->IntArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ListSerializer(Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->ListSerializer(Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->LongArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->LongArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->MapSerializer(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->MapSerializer(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->NothingSerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->NothingSerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ShortArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->ShortArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UByteArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->UByteArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UIntArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->UIntArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->ULongArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->ULongArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->UShortArraySerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->UShortArraySerializer()Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UByte$Companion;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UByte$Companion;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UInt$Companion;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UInt$Companion;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/ULong$Companion;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/ULong$Companion;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UShort$Companion;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/UShort$Companion;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/Unit;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/Unit;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/BooleanCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/BooleanCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ByteCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ByteCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/CharCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/CharCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/DoubleCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/DoubleCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/FloatCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/FloatCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/IntCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/IntCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/LongCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/LongCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ShortCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/ShortCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/StringCompanionObject;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/jvm/internal/StringCompanionObject;)Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/time/Duration$Companion;)Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/builtins/BuiltinSerializersKt;->serializer(Lkotlin/time/Duration$Companion;)Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder; HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->(Ljava/lang/String;)V PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->(Ljava/lang/String;)V HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->element$default(Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Ljava/util/List;ZILjava/lang/Object;)V PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->element$default(Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Ljava/util/List;ZILjava/lang/Object;)V HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->element(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Ljava/util/List;Z)V PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->element(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Ljava/util/List;Z)V HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getAnnotations()Ljava/util/List; PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getAnnotations()Ljava/util/List; HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementAnnotations$kotlinx_serialization_core()Ljava/util/List; PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementAnnotations$kotlinx_serialization_core()Ljava/util/List; HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementDescriptors$kotlinx_serialization_core()Ljava/util/List; PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementDescriptors$kotlinx_serialization_core()Ljava/util/List; HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementNames$kotlinx_serialization_core()Ljava/util/List; PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementNames$kotlinx_serialization_core()Ljava/util/List; HSPLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementOptionality$kotlinx_serialization_core()Ljava/util/List; PLkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;->getElementOptionality$kotlinx_serialization_core()Ljava/util/List; Lkotlinx/serialization/descriptors/PolymorphicKind; HSPLkotlinx/serialization/descriptors/PolymorphicKind;->()V PLkotlinx/serialization/descriptors/PolymorphicKind;->()V HSPLkotlinx/serialization/descriptors/PolymorphicKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/descriptors/PolymorphicKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/descriptors/PolymorphicKind$SEALED; HSPLkotlinx/serialization/descriptors/PolymorphicKind$SEALED;->()V PLkotlinx/serialization/descriptors/PolymorphicKind$SEALED;->()V HSPLkotlinx/serialization/descriptors/PolymorphicKind$SEALED;->()V PLkotlinx/serialization/descriptors/PolymorphicKind$SEALED;->()V Lkotlinx/serialization/descriptors/PrimitiveKind; HSPLkotlinx/serialization/descriptors/PrimitiveKind;->()V PLkotlinx/serialization/descriptors/PrimitiveKind;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/descriptors/PrimitiveKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN; HSPLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$BOOLEAN;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$BYTE; HSPLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$BYTE;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$CHAR; HSPLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$CHAR;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE; HSPLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$DOUBLE;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$FLOAT; HSPLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$FLOAT;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$INT; HSPLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$INT;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$LONG; HSPLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$LONG;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$SHORT; HSPLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$SHORT;->()V Lkotlinx/serialization/descriptors/PrimitiveKind$STRING; HSPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V HSPLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V PLkotlinx/serialization/descriptors/PrimitiveKind$STRING;->()V Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/descriptors/SerialDescriptor$DefaultImpls; HSPLkotlinx/serialization/descriptors/SerialDescriptor$DefaultImpls;->isNullable(Lkotlinx/serialization/descriptors/SerialDescriptor;)Z PLkotlinx/serialization/descriptors/SerialDescriptor$DefaultImpls;->isNullable(Lkotlinx/serialization/descriptors/SerialDescriptor;)Z Lkotlinx/serialization/descriptors/SerialDescriptorImpl; HSPLkotlinx/serialization/descriptors/SerialDescriptorImpl;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialKind;ILjava/util/List;Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;)V PLkotlinx/serialization/descriptors/SerialDescriptorImpl;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialKind;ILjava/util/List;Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;)V Lkotlinx/serialization/descriptors/SerialDescriptorImpl$_hashCode$2; HSPLkotlinx/serialization/descriptors/SerialDescriptorImpl$_hashCode$2;->(Lkotlinx/serialization/descriptors/SerialDescriptorImpl;)V PLkotlinx/serialization/descriptors/SerialDescriptorImpl$_hashCode$2;->(Lkotlinx/serialization/descriptors/SerialDescriptorImpl;)V Lkotlinx/serialization/descriptors/SerialDescriptorKt; HSPLkotlinx/serialization/descriptors/SerialDescriptorKt;->getElementDescriptors(Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/lang/Iterable; PLkotlinx/serialization/descriptors/SerialDescriptorKt;->getElementDescriptors(Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/lang/Iterable; Lkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1; HSPLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->hasNext()Z PLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->hasNext()Z HSPLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->next()Ljava/lang/Object; PLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->next()Ljava/lang/Object; HSPLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->next()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/descriptors/SerialDescriptorKt$elementDescriptors$1$1;->next()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/descriptors/SerialDescriptorKt$special$$inlined$Iterable$1; HSPLkotlinx/serialization/descriptors/SerialDescriptorKt$special$$inlined$Iterable$1;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/descriptors/SerialDescriptorKt$special$$inlined$Iterable$1;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/descriptors/SerialDescriptorKt$special$$inlined$Iterable$1;->iterator()Ljava/util/Iterator; PLkotlinx/serialization/descriptors/SerialDescriptorKt$special$$inlined$Iterable$1;->iterator()Ljava/util/Iterator; Lkotlinx/serialization/descriptors/SerialDescriptorsKt; HSPLkotlinx/serialization/descriptors/SerialDescriptorsKt;->PrimitiveSerialDescriptor(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/descriptors/SerialDescriptorsKt;->PrimitiveSerialDescriptor(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/descriptors/SerialDescriptorsKt;->buildClassSerialDescriptor(Ljava/lang/String;[Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/descriptors/SerialDescriptorsKt;->buildClassSerialDescriptor(Ljava/lang/String;[Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/descriptors/SerialDescriptorsKt;->buildSerialDescriptor(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialKind;[Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/descriptors/SerialDescriptorsKt;->buildSerialDescriptor(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialKind;[Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/descriptors/SerialKind; HSPLkotlinx/serialization/descriptors/SerialKind;->()V PLkotlinx/serialization/descriptors/SerialKind;->()V HSPLkotlinx/serialization/descriptors/SerialKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/descriptors/SerialKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/descriptors/SerialKind;->hashCode()I PLkotlinx/serialization/descriptors/SerialKind;->hashCode()I HSPLkotlinx/serialization/descriptors/SerialKind;->toString()Ljava/lang/String; PLkotlinx/serialization/descriptors/SerialKind;->toString()Ljava/lang/String; Lkotlinx/serialization/descriptors/SerialKind$CONTEXTUAL; HSPLkotlinx/serialization/descriptors/SerialKind$CONTEXTUAL;->()V PLkotlinx/serialization/descriptors/SerialKind$CONTEXTUAL;->()V HSPLkotlinx/serialization/descriptors/SerialKind$CONTEXTUAL;->()V PLkotlinx/serialization/descriptors/SerialKind$CONTEXTUAL;->()V Lkotlinx/serialization/descriptors/SerialKind$ENUM; Lkotlinx/serialization/descriptors/StructureKind; HSPLkotlinx/serialization/descriptors/StructureKind;->()V PLkotlinx/serialization/descriptors/StructureKind;->()V HSPLkotlinx/serialization/descriptors/StructureKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/descriptors/StructureKind;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/descriptors/StructureKind$CLASS; HSPLkotlinx/serialization/descriptors/StructureKind$CLASS;->()V PLkotlinx/serialization/descriptors/StructureKind$CLASS;->()V HSPLkotlinx/serialization/descriptors/StructureKind$CLASS;->()V PLkotlinx/serialization/descriptors/StructureKind$CLASS;->()V Lkotlinx/serialization/descriptors/StructureKind$LIST; HSPLkotlinx/serialization/descriptors/StructureKind$LIST;->()V PLkotlinx/serialization/descriptors/StructureKind$LIST;->()V HSPLkotlinx/serialization/descriptors/StructureKind$LIST;->()V PLkotlinx/serialization/descriptors/StructureKind$LIST;->()V Lkotlinx/serialization/descriptors/StructureKind$MAP; HSPLkotlinx/serialization/descriptors/StructureKind$MAP;->()V PLkotlinx/serialization/descriptors/StructureKind$MAP;->()V HSPLkotlinx/serialization/descriptors/StructureKind$MAP;->()V PLkotlinx/serialization/descriptors/StructureKind$MAP;->()V Lkotlinx/serialization/descriptors/StructureKind$OBJECT; HSPLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V PLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V HSPLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V PLkotlinx/serialization/descriptors/StructureKind$OBJECT;->()V Lkotlinx/serialization/encoding/AbstractDecoder; HSPLkotlinx/serialization/encoding/AbstractDecoder;->()V PLkotlinx/serialization/encoding/AbstractDecoder;->()V HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeIntElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)I HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeIntElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)I HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeLongElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)J HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeLongElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)J HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeNullableSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeNullableSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSequentially()Z PLkotlinx/serialization/encoding/AbstractDecoder;->decodeSequentially()Z HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/serialization/encoding/AbstractDecoder;->decodeStringElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String; HPLkotlinx/serialization/encoding/AbstractDecoder;->decodeStringElement(Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String; Lkotlinx/serialization/encoding/ChunkedDecoder; Lkotlinx/serialization/encoding/CompositeDecoder; Lkotlinx/serialization/encoding/CompositeDecoder$DefaultImpls; HSPLkotlinx/serialization/encoding/CompositeDecoder$DefaultImpls;->decodeSequentially(Lkotlinx/serialization/encoding/CompositeDecoder;)Z PLkotlinx/serialization/encoding/CompositeDecoder$DefaultImpls;->decodeSequentially(Lkotlinx/serialization/encoding/CompositeDecoder;)Z HSPLkotlinx/serialization/encoding/CompositeDecoder$DefaultImpls;->decodeSerializableElement$default(Lkotlinx/serialization/encoding/CompositeDecoder;Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object; PLkotlinx/serialization/encoding/CompositeDecoder$DefaultImpls;->decodeSerializableElement$default(Lkotlinx/serialization/encoding/CompositeDecoder;Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object; Lkotlinx/serialization/encoding/Decoder; Lkotlinx/serialization/internal/AbstractCollectionSerializer; HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->()V PLkotlinx/serialization/internal/AbstractCollectionSerializer;->()V HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/internal/AbstractCollectionSerializer;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HPLkotlinx/serialization/internal/AbstractCollectionSerializer;->deserialize(Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->merge(Lkotlinx/serialization/encoding/Decoder;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/serialization/internal/AbstractCollectionSerializer;->merge(Lkotlinx/serialization/encoding/Decoder;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/serialization/internal/AbstractCollectionSerializer;->readElement$default(Lkotlinx/serialization/internal/AbstractCollectionSerializer;Lkotlinx/serialization/encoding/CompositeDecoder;ILjava/lang/Object;ZILjava/lang/Object;)V HPLkotlinx/serialization/internal/AbstractCollectionSerializer;->readElement$default(Lkotlinx/serialization/internal/AbstractCollectionSerializer;Lkotlinx/serialization/encoding/CompositeDecoder;ILjava/lang/Object;ZILjava/lang/Object;)V Lkotlinx/serialization/internal/AbstractPolymorphicSerializer; Lkotlinx/serialization/internal/ArrayListClassDesc; HSPLkotlinx/serialization/internal/ArrayListClassDesc;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/internal/ArrayListClassDesc;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V Lkotlinx/serialization/internal/ArrayListSerializer; HSPLkotlinx/serialization/internal/ArrayListSerializer;->(Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/ArrayListSerializer;->(Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/internal/ArrayListSerializer;->builder()Ljava/lang/Object; PLkotlinx/serialization/internal/ArrayListSerializer;->builder()Ljava/lang/Object; HSPLkotlinx/serialization/internal/ArrayListSerializer;->builder()Ljava/util/ArrayList; PLkotlinx/serialization/internal/ArrayListSerializer;->builder()Ljava/util/ArrayList; HSPLkotlinx/serialization/internal/ArrayListSerializer;->builderSize(Ljava/lang/Object;)I PLkotlinx/serialization/internal/ArrayListSerializer;->builderSize(Ljava/lang/Object;)I HSPLkotlinx/serialization/internal/ArrayListSerializer;->builderSize(Ljava/util/ArrayList;)I HPLkotlinx/serialization/internal/ArrayListSerializer;->builderSize(Ljava/util/ArrayList;)I HSPLkotlinx/serialization/internal/ArrayListSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; HPLkotlinx/serialization/internal/ArrayListSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/internal/ArrayListSerializer;->insert(Ljava/lang/Object;ILjava/lang/Object;)V HPLkotlinx/serialization/internal/ArrayListSerializer;->insert(Ljava/lang/Object;ILjava/lang/Object;)V HSPLkotlinx/serialization/internal/ArrayListSerializer;->insert(Ljava/util/ArrayList;ILjava/lang/Object;)V HPLkotlinx/serialization/internal/ArrayListSerializer;->insert(Ljava/util/ArrayList;ILjava/lang/Object;)V HSPLkotlinx/serialization/internal/ArrayListSerializer;->toResult(Ljava/lang/Object;)Ljava/lang/Object; PLkotlinx/serialization/internal/ArrayListSerializer;->toResult(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/serialization/internal/ArrayListSerializer;->toResult(Ljava/util/ArrayList;)Ljava/util/List; PLkotlinx/serialization/internal/ArrayListSerializer;->toResult(Ljava/util/ArrayList;)Ljava/util/List; Lkotlinx/serialization/internal/BooleanArraySerializer; HSPLkotlinx/serialization/internal/BooleanArraySerializer;->()V PLkotlinx/serialization/internal/BooleanArraySerializer;->()V HSPLkotlinx/serialization/internal/BooleanArraySerializer;->()V PLkotlinx/serialization/internal/BooleanArraySerializer;->()V Lkotlinx/serialization/internal/BooleanSerializer; HSPLkotlinx/serialization/internal/BooleanSerializer;->()V PLkotlinx/serialization/internal/BooleanSerializer;->()V HSPLkotlinx/serialization/internal/BooleanSerializer;->()V PLkotlinx/serialization/internal/BooleanSerializer;->()V HSPLkotlinx/serialization/internal/BooleanSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/BooleanSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/ByteArraySerializer; HSPLkotlinx/serialization/internal/ByteArraySerializer;->()V PLkotlinx/serialization/internal/ByteArraySerializer;->()V HSPLkotlinx/serialization/internal/ByteArraySerializer;->()V PLkotlinx/serialization/internal/ByteArraySerializer;->()V Lkotlinx/serialization/internal/ByteSerializer; HSPLkotlinx/serialization/internal/ByteSerializer;->()V PLkotlinx/serialization/internal/ByteSerializer;->()V HSPLkotlinx/serialization/internal/ByteSerializer;->()V PLkotlinx/serialization/internal/ByteSerializer;->()V HSPLkotlinx/serialization/internal/ByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/ByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/CachedNames; Lkotlinx/serialization/internal/CharArraySerializer; HSPLkotlinx/serialization/internal/CharArraySerializer;->()V PLkotlinx/serialization/internal/CharArraySerializer;->()V HSPLkotlinx/serialization/internal/CharArraySerializer;->()V PLkotlinx/serialization/internal/CharArraySerializer;->()V Lkotlinx/serialization/internal/CharSerializer; HSPLkotlinx/serialization/internal/CharSerializer;->()V PLkotlinx/serialization/internal/CharSerializer;->()V HSPLkotlinx/serialization/internal/CharSerializer;->()V PLkotlinx/serialization/internal/CharSerializer;->()V HSPLkotlinx/serialization/internal/CharSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/CharSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/CollectionLikeSerializer; HSPLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/internal/CollectionLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/internal/CollectionLikeSerializer;->readElement(Lkotlinx/serialization/encoding/CompositeDecoder;ILjava/lang/Object;Z)V HPLkotlinx/serialization/internal/CollectionLikeSerializer;->readElement(Lkotlinx/serialization/encoding/CompositeDecoder;ILjava/lang/Object;Z)V Lkotlinx/serialization/internal/CollectionSerializer; HSPLkotlinx/serialization/internal/CollectionSerializer;->(Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/CollectionSerializer;->(Lkotlinx/serialization/KSerializer;)V Lkotlinx/serialization/internal/DoubleArraySerializer; HSPLkotlinx/serialization/internal/DoubleArraySerializer;->()V PLkotlinx/serialization/internal/DoubleArraySerializer;->()V HSPLkotlinx/serialization/internal/DoubleArraySerializer;->()V PLkotlinx/serialization/internal/DoubleArraySerializer;->()V Lkotlinx/serialization/internal/DoubleSerializer; HSPLkotlinx/serialization/internal/DoubleSerializer;->()V PLkotlinx/serialization/internal/DoubleSerializer;->()V HSPLkotlinx/serialization/internal/DoubleSerializer;->()V PLkotlinx/serialization/internal/DoubleSerializer;->()V HSPLkotlinx/serialization/internal/DoubleSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/DoubleSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/DurationSerializer; HSPLkotlinx/serialization/internal/DurationSerializer;->()V PLkotlinx/serialization/internal/DurationSerializer;->()V HSPLkotlinx/serialization/internal/DurationSerializer;->()V PLkotlinx/serialization/internal/DurationSerializer;->()V Lkotlinx/serialization/internal/ElementMarker; HSPLkotlinx/serialization/internal/ElementMarker;->()V PLkotlinx/serialization/internal/ElementMarker;->()V HSPLkotlinx/serialization/internal/ElementMarker;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function2;)V HPLkotlinx/serialization/internal/ElementMarker;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function2;)V HSPLkotlinx/serialization/internal/ElementMarker;->mark(I)V PLkotlinx/serialization/internal/ElementMarker;->mark(I)V HSPLkotlinx/serialization/internal/ElementMarker;->nextUnmarkedIndex()I HPLkotlinx/serialization/internal/ElementMarker;->nextUnmarkedIndex()I Lkotlinx/serialization/internal/ElementMarker$Companion; HSPLkotlinx/serialization/internal/ElementMarker$Companion;->()V PLkotlinx/serialization/internal/ElementMarker$Companion;->()V HSPLkotlinx/serialization/internal/ElementMarker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/internal/ElementMarker$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/internal/FloatArraySerializer; HSPLkotlinx/serialization/internal/FloatArraySerializer;->()V PLkotlinx/serialization/internal/FloatArraySerializer;->()V HSPLkotlinx/serialization/internal/FloatArraySerializer;->()V PLkotlinx/serialization/internal/FloatArraySerializer;->()V Lkotlinx/serialization/internal/FloatSerializer; HSPLkotlinx/serialization/internal/FloatSerializer;->()V PLkotlinx/serialization/internal/FloatSerializer;->()V HSPLkotlinx/serialization/internal/FloatSerializer;->()V PLkotlinx/serialization/internal/FloatSerializer;->()V HSPLkotlinx/serialization/internal/FloatSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/FloatSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/GeneratedSerializer; Lkotlinx/serialization/internal/GeneratedSerializer$DefaultImpls; HSPLkotlinx/serialization/internal/GeneratedSerializer$DefaultImpls;->typeParametersSerializers(Lkotlinx/serialization/internal/GeneratedSerializer;)[Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/internal/GeneratedSerializer$DefaultImpls;->typeParametersSerializers(Lkotlinx/serialization/internal/GeneratedSerializer;)[Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/internal/InlineClassDescriptor; HSPLkotlinx/serialization/internal/InlineClassDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V PLkotlinx/serialization/internal/InlineClassDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V Lkotlinx/serialization/internal/InlineClassDescriptorKt; HSPLkotlinx/serialization/internal/InlineClassDescriptorKt;->InlinePrimitiveDescriptor(Ljava/lang/String;Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/InlineClassDescriptorKt;->InlinePrimitiveDescriptor(Ljava/lang/String;Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1; HSPLkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1;->(Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/InlineClassDescriptorKt$InlinePrimitiveDescriptor$1;->(Lkotlinx/serialization/KSerializer;)V Lkotlinx/serialization/internal/IntArraySerializer; HSPLkotlinx/serialization/internal/IntArraySerializer;->()V PLkotlinx/serialization/internal/IntArraySerializer;->()V HSPLkotlinx/serialization/internal/IntArraySerializer;->()V PLkotlinx/serialization/internal/IntArraySerializer;->()V Lkotlinx/serialization/internal/IntSerializer; HSPLkotlinx/serialization/internal/IntSerializer;->()V PLkotlinx/serialization/internal/IntSerializer;->()V HSPLkotlinx/serialization/internal/IntSerializer;->()V PLkotlinx/serialization/internal/IntSerializer;->()V HSPLkotlinx/serialization/internal/IntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/IntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/LinkedHashMapClassDesc; HSPLkotlinx/serialization/internal/LinkedHashMapClassDesc;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/internal/LinkedHashMapClassDesc;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;)V Lkotlinx/serialization/internal/LinkedHashMapSerializer; HSPLkotlinx/serialization/internal/LinkedHashMapSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/LinkedHashMapSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/internal/LinkedHashMapSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/LinkedHashMapSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/ListLikeDescriptor; HSPLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/internal/ListLikeDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/internal/ListLikeDescriptor;->getElementsCount()I PLkotlinx/serialization/internal/ListLikeDescriptor;->getElementsCount()I HSPLkotlinx/serialization/internal/ListLikeDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; PLkotlinx/serialization/internal/ListLikeDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; HSPLkotlinx/serialization/internal/ListLikeDescriptor;->isNullable()Z PLkotlinx/serialization/internal/ListLikeDescriptor;->isNullable()Z Lkotlinx/serialization/internal/LongArraySerializer; HSPLkotlinx/serialization/internal/LongArraySerializer;->()V PLkotlinx/serialization/internal/LongArraySerializer;->()V HSPLkotlinx/serialization/internal/LongArraySerializer;->()V PLkotlinx/serialization/internal/LongArraySerializer;->()V Lkotlinx/serialization/internal/LongSerializer; HSPLkotlinx/serialization/internal/LongSerializer;->()V PLkotlinx/serialization/internal/LongSerializer;->()V HSPLkotlinx/serialization/internal/LongSerializer;->()V PLkotlinx/serialization/internal/LongSerializer;->()V HSPLkotlinx/serialization/internal/LongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/LongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/MapLikeDescriptor; HSPLkotlinx/serialization/internal/MapLikeDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/internal/MapLikeDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/internal/MapLikeDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/internal/MapLikeDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/internal/MapLikeSerializer; HSPLkotlinx/serialization/internal/MapLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/MapLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/internal/MapLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/internal/MapLikeSerializer;->(Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/internal/NothingSerialDescriptor; HSPLkotlinx/serialization/internal/NothingSerialDescriptor;->()V PLkotlinx/serialization/internal/NothingSerialDescriptor;->()V HSPLkotlinx/serialization/internal/NothingSerialDescriptor;->()V PLkotlinx/serialization/internal/NothingSerialDescriptor;->()V Lkotlinx/serialization/internal/NothingSerializer; HSPLkotlinx/serialization/internal/NothingSerializer;->()V PLkotlinx/serialization/internal/NothingSerializer;->()V HSPLkotlinx/serialization/internal/NothingSerializer;->()V PLkotlinx/serialization/internal/NothingSerializer;->()V Lkotlinx/serialization/internal/ObjectSerializer; HSPLkotlinx/serialization/internal/ObjectSerializer;->(Ljava/lang/String;Ljava/lang/Object;)V PLkotlinx/serialization/internal/ObjectSerializer;->(Ljava/lang/String;Ljava/lang/Object;)V Lkotlinx/serialization/internal/ObjectSerializer$descriptor$2; HSPLkotlinx/serialization/internal/ObjectSerializer$descriptor$2;->(Ljava/lang/String;Lkotlinx/serialization/internal/ObjectSerializer;)V PLkotlinx/serialization/internal/ObjectSerializer$descriptor$2;->(Ljava/lang/String;Lkotlinx/serialization/internal/ObjectSerializer;)V Lkotlinx/serialization/internal/Platform_commonKt; HSPLkotlinx/serialization/internal/Platform_commonKt;->()V PLkotlinx/serialization/internal/Platform_commonKt;->()V HSPLkotlinx/serialization/internal/Platform_commonKt;->compactArray(Ljava/util/List;)[Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/Platform_commonKt;->compactArray(Ljava/util/List;)[Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/PluginExceptionsKt; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->access$getGeneratedSerializer$p(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)Lkotlinx/serialization/internal/GeneratedSerializer; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->access$getGeneratedSerializer$p(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)Lkotlinx/serialization/internal/GeneratedSerializer; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->addElement(Ljava/lang/String;Z)V PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->addElement(Ljava/lang/String;Z)V HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->buildIndices()Ljava/util/Map; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->buildIndices()Ljava/util/Map; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getChildSerializers()[Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getChildSerializers()[Lkotlinx/serialization/KSerializer; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementAnnotations(I)Ljava/util/List; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementAnnotations(I)Ljava/util/List; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementDescriptor(I)Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementDescriptor(I)Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementIndex(Ljava/lang/String;)I HPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementIndex(Ljava/lang/String;)I HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementsCount()I PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getElementsCount()I HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getSerialName()Ljava/lang/String; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getSerialName()Ljava/lang/String; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getTypeParameterDescriptors$kotlinx_serialization_core()[Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->getTypeParameterDescriptors$kotlinx_serialization_core()[Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->get_hashCode()I HPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->get_hashCode()I HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->hashCode()I HPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;->hashCode()I Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->invoke()Ljava/lang/Integer; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->invoke()Ljava/lang/Integer; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->invoke()Ljava/lang/Object; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$_hashCode$2;->invoke()Ljava/lang/Object; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->invoke()Ljava/lang/Object; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->invoke()Ljava/lang/Object; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->invoke()[Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$childSerializers$2;->invoke()[Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->(Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptor;)V HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->invoke()Ljava/lang/Object; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->invoke()Ljava/lang/Object; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->invoke()[Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptor$typeParameterDescriptors$2;->invoke()[Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/PluginGeneratedSerialDescriptorKt; HSPLkotlinx/serialization/internal/PluginGeneratedSerialDescriptorKt;->hashCodeImpl(Lkotlinx/serialization/descriptors/SerialDescriptor;[Lkotlinx/serialization/descriptors/SerialDescriptor;)I PLkotlinx/serialization/internal/PluginGeneratedSerialDescriptorKt;->hashCodeImpl(Lkotlinx/serialization/descriptors/SerialDescriptor;[Lkotlinx/serialization/descriptors/SerialDescriptor;)I Lkotlinx/serialization/internal/PluginHelperInterfacesKt; HSPLkotlinx/serialization/internal/PluginHelperInterfacesKt;->()V PLkotlinx/serialization/internal/PluginHelperInterfacesKt;->()V Lkotlinx/serialization/internal/PrimitiveArrayDescriptor; HSPLkotlinx/serialization/internal/PrimitiveArrayDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V PLkotlinx/serialization/internal/PrimitiveArrayDescriptor;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V Lkotlinx/serialization/internal/PrimitiveArraySerializer; HSPLkotlinx/serialization/internal/PrimitiveArraySerializer;->(Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/internal/PrimitiveArraySerializer;->(Lkotlinx/serialization/KSerializer;)V Lkotlinx/serialization/internal/PrimitiveSerialDescriptor; HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)V PLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)V HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/PrimitiveKind; PLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/PrimitiveKind; HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; PLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getKind()Lkotlinx/serialization/descriptors/SerialKind; HSPLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getSerialName()Ljava/lang/String; PLkotlinx/serialization/internal/PrimitiveSerialDescriptor;->getSerialName()Ljava/lang/String; Lkotlinx/serialization/internal/PrimitivesKt; HSPLkotlinx/serialization/internal/PrimitivesKt;->()V PLkotlinx/serialization/internal/PrimitivesKt;->()V HSPLkotlinx/serialization/internal/PrimitivesKt;->PrimitiveDescriptorSafe(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/PrimitivesKt;->PrimitiveDescriptorSafe(Ljava/lang/String;Lkotlinx/serialization/descriptors/PrimitiveKind;)Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLkotlinx/serialization/internal/PrimitivesKt;->capitalize(Ljava/lang/String;)Ljava/lang/String; PLkotlinx/serialization/internal/PrimitivesKt;->capitalize(Ljava/lang/String;)Ljava/lang/String; HSPLkotlinx/serialization/internal/PrimitivesKt;->checkName(Ljava/lang/String;)V PLkotlinx/serialization/internal/PrimitivesKt;->checkName(Ljava/lang/String;)V Lkotlinx/serialization/internal/ShortArraySerializer; HSPLkotlinx/serialization/internal/ShortArraySerializer;->()V PLkotlinx/serialization/internal/ShortArraySerializer;->()V HSPLkotlinx/serialization/internal/ShortArraySerializer;->()V PLkotlinx/serialization/internal/ShortArraySerializer;->()V Lkotlinx/serialization/internal/ShortSerializer; HSPLkotlinx/serialization/internal/ShortSerializer;->()V PLkotlinx/serialization/internal/ShortSerializer;->()V HSPLkotlinx/serialization/internal/ShortSerializer;->()V PLkotlinx/serialization/internal/ShortSerializer;->()V HSPLkotlinx/serialization/internal/ShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/ShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/StringSerializer; HSPLkotlinx/serialization/internal/StringSerializer;->()V PLkotlinx/serialization/internal/StringSerializer;->()V HSPLkotlinx/serialization/internal/StringSerializer;->()V PLkotlinx/serialization/internal/StringSerializer;->()V HSPLkotlinx/serialization/internal/StringSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/StringSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/UByteArraySerializer; HSPLkotlinx/serialization/internal/UByteArraySerializer;->()V PLkotlinx/serialization/internal/UByteArraySerializer;->()V HSPLkotlinx/serialization/internal/UByteArraySerializer;->()V PLkotlinx/serialization/internal/UByteArraySerializer;->()V Lkotlinx/serialization/internal/UByteSerializer; HSPLkotlinx/serialization/internal/UByteSerializer;->()V PLkotlinx/serialization/internal/UByteSerializer;->()V HSPLkotlinx/serialization/internal/UByteSerializer;->()V PLkotlinx/serialization/internal/UByteSerializer;->()V HSPLkotlinx/serialization/internal/UByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/UByteSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/UIntArraySerializer; HSPLkotlinx/serialization/internal/UIntArraySerializer;->()V PLkotlinx/serialization/internal/UIntArraySerializer;->()V HSPLkotlinx/serialization/internal/UIntArraySerializer;->()V PLkotlinx/serialization/internal/UIntArraySerializer;->()V Lkotlinx/serialization/internal/UIntSerializer; HSPLkotlinx/serialization/internal/UIntSerializer;->()V PLkotlinx/serialization/internal/UIntSerializer;->()V HSPLkotlinx/serialization/internal/UIntSerializer;->()V PLkotlinx/serialization/internal/UIntSerializer;->()V HSPLkotlinx/serialization/internal/UIntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/UIntSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/ULongArraySerializer; HSPLkotlinx/serialization/internal/ULongArraySerializer;->()V PLkotlinx/serialization/internal/ULongArraySerializer;->()V HSPLkotlinx/serialization/internal/ULongArraySerializer;->()V PLkotlinx/serialization/internal/ULongArraySerializer;->()V Lkotlinx/serialization/internal/ULongSerializer; HSPLkotlinx/serialization/internal/ULongSerializer;->()V PLkotlinx/serialization/internal/ULongSerializer;->()V HSPLkotlinx/serialization/internal/ULongSerializer;->()V PLkotlinx/serialization/internal/ULongSerializer;->()V HSPLkotlinx/serialization/internal/ULongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/ULongSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/UShortArraySerializer; HSPLkotlinx/serialization/internal/UShortArraySerializer;->()V PLkotlinx/serialization/internal/UShortArraySerializer;->()V HSPLkotlinx/serialization/internal/UShortArraySerializer;->()V PLkotlinx/serialization/internal/UShortArraySerializer;->()V Lkotlinx/serialization/internal/UShortSerializer; HSPLkotlinx/serialization/internal/UShortSerializer;->()V PLkotlinx/serialization/internal/UShortSerializer;->()V HSPLkotlinx/serialization/internal/UShortSerializer;->()V PLkotlinx/serialization/internal/UShortSerializer;->()V HSPLkotlinx/serialization/internal/UShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLkotlinx/serialization/internal/UShortSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lkotlinx/serialization/internal/UnitSerializer; HSPLkotlinx/serialization/internal/UnitSerializer;->()V PLkotlinx/serialization/internal/UnitSerializer;->()V HSPLkotlinx/serialization/internal/UnitSerializer;->()V PLkotlinx/serialization/internal/UnitSerializer;->()V Lkotlinx/serialization/json/Json; HSPLkotlinx/serialization/json/Json;->()V PLkotlinx/serialization/json/Json;->()V HSPLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V PLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V HSPLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/json/Json;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/json/Json;->getConfiguration()Lkotlinx/serialization/json/JsonConfiguration; PLkotlinx/serialization/json/Json;->getConfiguration()Lkotlinx/serialization/json/JsonConfiguration; HSPLkotlinx/serialization/json/Json;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; PLkotlinx/serialization/json/Json;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; HSPLkotlinx/serialization/json/Json;->get_schemaCache$kotlinx_serialization_json()Lkotlinx/serialization/json/internal/DescriptorSchemaCache; PLkotlinx/serialization/json/Json;->get_schemaCache$kotlinx_serialization_json()Lkotlinx/serialization/json/internal/DescriptorSchemaCache; Lkotlinx/serialization/json/Json$Default; HSPLkotlinx/serialization/json/Json$Default;->()V PLkotlinx/serialization/json/Json$Default;->()V HSPLkotlinx/serialization/json/Json$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/json/Json$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/json/JsonBuilder; HSPLkotlinx/serialization/json/JsonBuilder;->(Lkotlinx/serialization/json/Json;)V PLkotlinx/serialization/json/JsonBuilder;->(Lkotlinx/serialization/json/Json;)V HSPLkotlinx/serialization/json/JsonBuilder;->build$kotlinx_serialization_json()Lkotlinx/serialization/json/JsonConfiguration; PLkotlinx/serialization/json/JsonBuilder;->build$kotlinx_serialization_json()Lkotlinx/serialization/json/JsonConfiguration; HSPLkotlinx/serialization/json/JsonBuilder;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; PLkotlinx/serialization/json/JsonBuilder;->getSerializersModule()Lkotlinx/serialization/modules/SerializersModule; HSPLkotlinx/serialization/json/JsonBuilder;->setExplicitNulls(Z)V PLkotlinx/serialization/json/JsonBuilder;->setExplicitNulls(Z)V HSPLkotlinx/serialization/json/JsonBuilder;->setIgnoreUnknownKeys(Z)V PLkotlinx/serialization/json/JsonBuilder;->setIgnoreUnknownKeys(Z)V Lkotlinx/serialization/json/JsonConfiguration; HSPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;)V PLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;)V HSPLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/json/JsonConfiguration;->(ZZZZZZLjava/lang/String;ZZLjava/lang/String;ZZLkotlinx/serialization/json/JsonNamingStrategy;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/json/JsonConfiguration;->getAllowSpecialFloatingPointValues()Z PLkotlinx/serialization/json/JsonConfiguration;->getAllowSpecialFloatingPointValues()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getAllowStructuredMapKeys()Z PLkotlinx/serialization/json/JsonConfiguration;->getAllowStructuredMapKeys()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getClassDiscriminator()Ljava/lang/String; PLkotlinx/serialization/json/JsonConfiguration;->getClassDiscriminator()Ljava/lang/String; HSPLkotlinx/serialization/json/JsonConfiguration;->getCoerceInputValues()Z PLkotlinx/serialization/json/JsonConfiguration;->getCoerceInputValues()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getEncodeDefaults()Z PLkotlinx/serialization/json/JsonConfiguration;->getEncodeDefaults()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getExplicitNulls()Z PLkotlinx/serialization/json/JsonConfiguration;->getExplicitNulls()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getIgnoreUnknownKeys()Z PLkotlinx/serialization/json/JsonConfiguration;->getIgnoreUnknownKeys()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getNamingStrategy()Lkotlinx/serialization/json/JsonNamingStrategy; PLkotlinx/serialization/json/JsonConfiguration;->getNamingStrategy()Lkotlinx/serialization/json/JsonNamingStrategy; HSPLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrint()Z PLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrint()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrintIndent()Ljava/lang/String; PLkotlinx/serialization/json/JsonConfiguration;->getPrettyPrintIndent()Ljava/lang/String; HSPLkotlinx/serialization/json/JsonConfiguration;->getUseAlternativeNames()Z PLkotlinx/serialization/json/JsonConfiguration;->getUseAlternativeNames()Z HSPLkotlinx/serialization/json/JsonConfiguration;->getUseArrayPolymorphism()Z PLkotlinx/serialization/json/JsonConfiguration;->getUseArrayPolymorphism()Z HSPLkotlinx/serialization/json/JsonConfiguration;->isLenient()Z HPLkotlinx/serialization/json/JsonConfiguration;->isLenient()Z Lkotlinx/serialization/json/JsonDecoder; Lkotlinx/serialization/json/JsonImpl; HSPLkotlinx/serialization/json/JsonImpl;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V PLkotlinx/serialization/json/JsonImpl;->(Lkotlinx/serialization/json/JsonConfiguration;Lkotlinx/serialization/modules/SerializersModule;)V HSPLkotlinx/serialization/json/JsonImpl;->validateConfiguration()V PLkotlinx/serialization/json/JsonImpl;->validateConfiguration()V Lkotlinx/serialization/json/JsonKt; HSPLkotlinx/serialization/json/JsonKt;->Json$default(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/serialization/json/Json; PLkotlinx/serialization/json/JsonKt;->Json$default(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/serialization/json/Json; HSPLkotlinx/serialization/json/JsonKt;->Json(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/Json; PLkotlinx/serialization/json/JsonKt;->Json(Lkotlinx/serialization/json/Json;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/Json; Lkotlinx/serialization/json/JsonNames; Lkotlinx/serialization/json/JsonSchemaCacheKt; HSPLkotlinx/serialization/json/JsonSchemaCacheKt;->getSchemaCache(Lkotlinx/serialization/json/Json;)Lkotlinx/serialization/json/internal/DescriptorSchemaCache; PLkotlinx/serialization/json/JsonSchemaCacheKt;->getSchemaCache(Lkotlinx/serialization/json/Json;)Lkotlinx/serialization/json/internal/DescriptorSchemaCache; Lkotlinx/serialization/json/internal/AbstractJsonLexer; HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->()V PLkotlinx/serialization/json/internal/AbstractJsonLexer;->()V HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeNextToken(C)V HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeNextToken(C)V HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeNumericLiteral()J HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeNumericLiteral()J HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeString()Ljava/lang/String; HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeString()Ljava/lang/String; HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeStringLenient()Ljava/lang/String; HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->consumeStringLenient()Ljava/lang/String; HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->expectEof()V PLkotlinx/serialization/json/internal/AbstractJsonLexer;->expectEof()V HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->isValidValueStart(C)Z HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->isValidValueStart(C)Z HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->peekNextToken()B HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->peekNextToken()B HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->skipElement(Z)V HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->skipElement(Z)V HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->skipWhitespaces()I HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->skipWhitespaces()I HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull$default(Lkotlinx/serialization/json/internal/AbstractJsonLexer;ZILjava/lang/Object;)Z PLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull$default(Lkotlinx/serialization/json/internal/AbstractJsonLexer;ZILjava/lang/Object;)Z HSPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull(Z)Z HPLkotlinx/serialization/json/internal/AbstractJsonLexer;->tryConsumeNull(Z)Z Lkotlinx/serialization/json/internal/AbstractJsonLexerKt; HSPLkotlinx/serialization/json/internal/AbstractJsonLexerKt;->charToTokenClass(C)B PLkotlinx/serialization/json/internal/AbstractJsonLexerKt;->charToTokenClass(C)B Lkotlinx/serialization/json/internal/ArrayAsSequence; HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->([C)V PLkotlinx/serialization/json/internal/ArrayAsSequence;->([C)V HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->access$getBuffer$p(Lkotlinx/serialization/json/internal/ArrayAsSequence;)[C PLkotlinx/serialization/json/internal/ArrayAsSequence;->access$getBuffer$p(Lkotlinx/serialization/json/internal/ArrayAsSequence;)[C HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->charAt(I)C HPLkotlinx/serialization/json/internal/ArrayAsSequence;->charAt(I)C HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->get(I)C HPLkotlinx/serialization/json/internal/ArrayAsSequence;->get(I)C HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->getLength()I HPLkotlinx/serialization/json/internal/ArrayAsSequence;->getLength()I HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->length()I HPLkotlinx/serialization/json/internal/ArrayAsSequence;->length()I HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->setLength(I)V PLkotlinx/serialization/json/internal/ArrayAsSequence;->setLength(I)V HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->substring(II)Ljava/lang/String; HPLkotlinx/serialization/json/internal/ArrayAsSequence;->substring(II)Ljava/lang/String; HSPLkotlinx/serialization/json/internal/ArrayAsSequence;->trim(I)V PLkotlinx/serialization/json/internal/ArrayAsSequence;->trim(I)V Lkotlinx/serialization/json/internal/ArrayPoolsKt; HSPLkotlinx/serialization/json/internal/ArrayPoolsKt;->()V PLkotlinx/serialization/json/internal/ArrayPoolsKt;->()V HSPLkotlinx/serialization/json/internal/ArrayPoolsKt;->access$getMAX_CHARS_IN_POOL$p()I PLkotlinx/serialization/json/internal/ArrayPoolsKt;->access$getMAX_CHARS_IN_POOL$p()I Lkotlinx/serialization/json/internal/CharArrayPoolBase; HSPLkotlinx/serialization/json/internal/CharArrayPoolBase;->()V PLkotlinx/serialization/json/internal/CharArrayPoolBase;->()V HSPLkotlinx/serialization/json/internal/CharArrayPoolBase;->releaseImpl([C)V PLkotlinx/serialization/json/internal/CharArrayPoolBase;->releaseImpl([C)V HSPLkotlinx/serialization/json/internal/CharArrayPoolBase;->take(I)[C PLkotlinx/serialization/json/internal/CharArrayPoolBase;->take(I)[C Lkotlinx/serialization/json/internal/CharArrayPoolBatchSize; HSPLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->()V PLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->()V HSPLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->()V PLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->()V HSPLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->release([C)V PLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->release([C)V HSPLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->take()[C PLkotlinx/serialization/json/internal/CharArrayPoolBatchSize;->take()[C Lkotlinx/serialization/json/internal/CharMappings; HSPLkotlinx/serialization/json/internal/CharMappings;->()V PLkotlinx/serialization/json/internal/CharMappings;->()V HSPLkotlinx/serialization/json/internal/CharMappings;->()V PLkotlinx/serialization/json/internal/CharMappings;->()V HSPLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(CC)V PLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(CC)V HSPLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(IC)V PLkotlinx/serialization/json/internal/CharMappings;->initC2ESC(IC)V HSPLkotlinx/serialization/json/internal/CharMappings;->initC2TC(CB)V PLkotlinx/serialization/json/internal/CharMappings;->initC2TC(CB)V HSPLkotlinx/serialization/json/internal/CharMappings;->initC2TC(IB)V PLkotlinx/serialization/json/internal/CharMappings;->initC2TC(IB)V HSPLkotlinx/serialization/json/internal/CharMappings;->initCharToToken()V PLkotlinx/serialization/json/internal/CharMappings;->initCharToToken()V HSPLkotlinx/serialization/json/internal/CharMappings;->initEscape()V PLkotlinx/serialization/json/internal/CharMappings;->initEscape()V Lkotlinx/serialization/json/internal/CreateMapForCacheKt; HSPLkotlinx/serialization/json/internal/CreateMapForCacheKt;->createMapForCache(I)Ljava/util/Map; PLkotlinx/serialization/json/internal/CreateMapForCacheKt;->createMapForCache(I)Ljava/util/Map; Lkotlinx/serialization/json/internal/DescriptorSchemaCache; HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->()V PLkotlinx/serialization/json/internal/DescriptorSchemaCache;->()V HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->get(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;)Ljava/lang/Object; HPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->get(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;)Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->getOrPut(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->getOrPut(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache;->set(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;Ljava/lang/Object;)V PLkotlinx/serialization/json/internal/DescriptorSchemaCache;->set(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;Ljava/lang/Object;)V Lkotlinx/serialization/json/internal/DescriptorSchemaCache$Key; HSPLkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;->()V PLkotlinx/serialization/json/internal/DescriptorSchemaCache$Key;->()V Lkotlinx/serialization/json/internal/JsonElementMarker; HSPLkotlinx/serialization/json/internal/JsonElementMarker;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HPLkotlinx/serialization/json/internal/JsonElementMarker;->(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/json/internal/JsonElementMarker;->isUnmarkedNull$kotlinx_serialization_json()Z PLkotlinx/serialization/json/internal/JsonElementMarker;->isUnmarkedNull$kotlinx_serialization_json()Z HSPLkotlinx/serialization/json/internal/JsonElementMarker;->mark$kotlinx_serialization_json(I)V PLkotlinx/serialization/json/internal/JsonElementMarker;->mark$kotlinx_serialization_json(I)V HSPLkotlinx/serialization/json/internal/JsonElementMarker;->nextUnmarkedIndex$kotlinx_serialization_json()I PLkotlinx/serialization/json/internal/JsonElementMarker;->nextUnmarkedIndex$kotlinx_serialization_json()I Lkotlinx/serialization/json/internal/JsonElementMarker$origin$1; HSPLkotlinx/serialization/json/internal/JsonElementMarker$origin$1;->(Ljava/lang/Object;)V PLkotlinx/serialization/json/internal/JsonElementMarker$origin$1;->(Ljava/lang/Object;)V Lkotlinx/serialization/json/internal/JsonExceptionsKt; Lkotlinx/serialization/json/internal/JsonNamesMapKt; HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->()V PLkotlinx/serialization/json/internal/JsonNamesMapKt;->()V HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->access$buildDeserializationNamesMap(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)Ljava/util/Map; PLkotlinx/serialization/json/internal/JsonNamesMapKt;->access$buildDeserializationNamesMap(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)Ljava/util/Map; HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->buildDeserializationNamesMap(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)Ljava/util/Map; PLkotlinx/serialization/json/internal/JsonNamesMapKt;->buildDeserializationNamesMap(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)Ljava/util/Map; HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->deserializationNamesMap(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/util/Map; PLkotlinx/serialization/json/internal/JsonNamesMapKt;->deserializationNamesMap(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/descriptors/SerialDescriptor;)Ljava/util/Map; HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->getJsonNameIndex$getJsonNameIndexSlowPath(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/descriptors/SerialDescriptor;Ljava/lang/String;)I PLkotlinx/serialization/json/internal/JsonNamesMapKt;->getJsonNameIndex$getJsonNameIndexSlowPath(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/descriptors/SerialDescriptor;Ljava/lang/String;)I HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->getJsonNameIndex(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;Ljava/lang/String;)I HPLkotlinx/serialization/json/internal/JsonNamesMapKt;->getJsonNameIndex(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;Ljava/lang/String;)I HSPLkotlinx/serialization/json/internal/JsonNamesMapKt;->namingStrategy(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)Lkotlinx/serialization/json/JsonNamingStrategy; HPLkotlinx/serialization/json/internal/JsonNamesMapKt;->namingStrategy(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)Lkotlinx/serialization/json/JsonNamingStrategy; Lkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1; HSPLkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)V PLkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1;->(Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/Json;)V HSPLkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1;->invoke()Ljava/lang/Object; PLkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1;->invoke()Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1;->invoke()Ljava/util/Map; PLkotlinx/serialization/json/internal/JsonNamesMapKt$deserializationNamesMap$1;->invoke()Ljava/util/Map; Lkotlinx/serialization/json/internal/JsonPath; HSPLkotlinx/serialization/json/internal/JsonPath;->()V PLkotlinx/serialization/json/internal/JsonPath;->()V HSPLkotlinx/serialization/json/internal/JsonPath;->popDescriptor()V PLkotlinx/serialization/json/internal/JsonPath;->popDescriptor()V HSPLkotlinx/serialization/json/internal/JsonPath;->pushDescriptor(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HPLkotlinx/serialization/json/internal/JsonPath;->pushDescriptor(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/json/internal/JsonPath;->updateDescriptorIndex(I)V PLkotlinx/serialization/json/internal/JsonPath;->updateDescriptorIndex(I)V Lkotlinx/serialization/json/internal/JsonPath$Tombstone; Lkotlinx/serialization/json/internal/JsonStreamsKt; HSPLkotlinx/serialization/json/internal/JsonStreamsKt;->decodeByReader(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/DeserializationStrategy;Lkotlinx/serialization/json/internal/SerialReader;)Ljava/lang/Object; PLkotlinx/serialization/json/internal/JsonStreamsKt;->decodeByReader(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/DeserializationStrategy;Lkotlinx/serialization/json/internal/SerialReader;)Ljava/lang/Object; Lkotlinx/serialization/json/internal/PolymorphicKt; Lkotlinx/serialization/json/internal/ReaderJsonLexer; HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->(Lkotlinx/serialization/json/internal/SerialReader;[C)V PLkotlinx/serialization/json/internal/ReaderJsonLexer;->(Lkotlinx/serialization/json/internal/SerialReader;[C)V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->(Lkotlinx/serialization/json/internal/SerialReader;[CILkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/json/internal/ReaderJsonLexer;->(Lkotlinx/serialization/json/internal/SerialReader;[CILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->canConsumeValue()Z HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->canConsumeValue()Z HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->consumeKeyString()Ljava/lang/String; HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->consumeKeyString()Ljava/lang/String; HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->consumeNextToken()B PLkotlinx/serialization/json/internal/ReaderJsonLexer;->consumeNextToken()B HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->ensureHaveChars()V HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->ensureHaveChars()V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->getSource()Ljava/lang/CharSequence; HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->getSource()Ljava/lang/CharSequence; HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->getSource()Lkotlinx/serialization/json/internal/ArrayAsSequence; HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->getSource()Lkotlinx/serialization/json/internal/ArrayAsSequence; HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->indexOf(CI)I HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->indexOf(CI)I HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->prefetchOrEof(I)I HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->prefetchOrEof(I)I HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->preload(I)V PLkotlinx/serialization/json/internal/ReaderJsonLexer;->preload(I)V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->release()V PLkotlinx/serialization/json/internal/ReaderJsonLexer;->release()V HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->substring(II)Ljava/lang/String; HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->substring(II)Ljava/lang/String; HSPLkotlinx/serialization/json/internal/ReaderJsonLexer;->tryConsumeComma()Z HPLkotlinx/serialization/json/internal/ReaderJsonLexer;->tryConsumeComma()Z Lkotlinx/serialization/json/internal/SerialReader; Lkotlinx/serialization/json/internal/StreamingJsonDecoder; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/WriteMode;Lkotlinx/serialization/json/internal/AbstractJsonLexer;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder;)V HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/json/internal/WriteMode;Lkotlinx/serialization/json/internal/AbstractJsonLexer;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder;)V HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->beginStructure(Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder; HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->beginStructure(Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->checkLeadingComma()V PLkotlinx/serialization/json/internal/StreamingJsonDecoder;->checkLeadingComma()V HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeElementIndex(Lkotlinx/serialization/descriptors/SerialDescriptor;)I HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeElementIndex(Lkotlinx/serialization/descriptors/SerialDescriptor;)I HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeInt()I HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeInt()I HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeListIndex()I HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeListIndex()I HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeLong()J HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeLong()J HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeNotNullMark()Z PLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeNotNullMark()Z HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeObjectIndex(Lkotlinx/serialization/descriptors/SerialDescriptor;)I HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeObjectIndex(Lkotlinx/serialization/descriptors/SerialDescriptor;)I HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableElement(Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object; HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeSerializableValue(Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeString()Ljava/lang/String; HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeString()Ljava/lang/String; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeStringKey()Ljava/lang/String; HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->decodeStringKey()Ljava/lang/String; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->endStructure(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->endStructure(Lkotlinx/serialization/descriptors/SerialDescriptor;)V HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->handleUnknown(Ljava/lang/String;)Z HPLkotlinx/serialization/json/internal/StreamingJsonDecoder;->handleUnknown(Ljava/lang/String;)Z Lkotlinx/serialization/json/internal/StreamingJsonDecoder$DiscriminatorHolder; Lkotlinx/serialization/json/internal/StreamingJsonDecoder$WhenMappings; HSPLkotlinx/serialization/json/internal/StreamingJsonDecoder$WhenMappings;->()V PLkotlinx/serialization/json/internal/StreamingJsonDecoder$WhenMappings;->()V Lkotlinx/serialization/json/internal/WriteMode; HSPLkotlinx/serialization/json/internal/WriteMode;->$values()[Lkotlinx/serialization/json/internal/WriteMode; PLkotlinx/serialization/json/internal/WriteMode;->$values()[Lkotlinx/serialization/json/internal/WriteMode; HSPLkotlinx/serialization/json/internal/WriteMode;->()V PLkotlinx/serialization/json/internal/WriteMode;->()V HSPLkotlinx/serialization/json/internal/WriteMode;->(Ljava/lang/String;ICC)V PLkotlinx/serialization/json/internal/WriteMode;->(Ljava/lang/String;ICC)V HSPLkotlinx/serialization/json/internal/WriteMode;->values()[Lkotlinx/serialization/json/internal/WriteMode; PLkotlinx/serialization/json/internal/WriteMode;->values()[Lkotlinx/serialization/json/internal/WriteMode; Lkotlinx/serialization/json/internal/WriteModeKt; HSPLkotlinx/serialization/json/internal/WriteModeKt;->switchMode(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/json/internal/WriteMode; HPLkotlinx/serialization/json/internal/WriteModeKt;->switchMode(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/json/internal/WriteMode; Lkotlinx/serialization/json/okio/OkioStreamsKt; HSPLkotlinx/serialization/json/okio/OkioStreamsKt;->decodeFromBufferedSource(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/DeserializationStrategy;Lokio/BufferedSource;)Ljava/lang/Object; PLkotlinx/serialization/json/okio/OkioStreamsKt;->decodeFromBufferedSource(Lkotlinx/serialization/json/Json;Lkotlinx/serialization/DeserializationStrategy;Lokio/BufferedSource;)Ljava/lang/Object; Lkotlinx/serialization/json/okio/internal/OkioSerialReader; HSPLkotlinx/serialization/json/okio/internal/OkioSerialReader;->(Lokio/BufferedSource;)V PLkotlinx/serialization/json/okio/internal/OkioSerialReader;->(Lokio/BufferedSource;)V HSPLkotlinx/serialization/json/okio/internal/OkioSerialReader;->read([CII)I HPLkotlinx/serialization/json/okio/internal/OkioSerialReader;->read([CII)I Lkotlinx/serialization/modules/ContextualProvider; HSPLkotlinx/serialization/modules/ContextualProvider;->()V PLkotlinx/serialization/modules/ContextualProvider;->()V HSPLkotlinx/serialization/modules/ContextualProvider;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/modules/ContextualProvider;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/modules/ContextualProvider$Argless; HSPLkotlinx/serialization/modules/ContextualProvider$Argless;->(Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/modules/ContextualProvider$Argless;->(Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/modules/ContextualProvider$Argless;->getSerializer()Lkotlinx/serialization/KSerializer; PLkotlinx/serialization/modules/ContextualProvider$Argless;->getSerializer()Lkotlinx/serialization/KSerializer; Lkotlinx/serialization/modules/SerialModuleImpl; HSPLkotlinx/serialization/modules/SerialModuleImpl;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V PLkotlinx/serialization/modules/SerialModuleImpl;->(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V HSPLkotlinx/serialization/modules/SerialModuleImpl;->dumpTo(Lkotlinx/serialization/modules/SerializersModuleCollector;)V PLkotlinx/serialization/modules/SerialModuleImpl;->dumpTo(Lkotlinx/serialization/modules/SerializersModuleCollector;)V Lkotlinx/serialization/modules/SerializersModule; HSPLkotlinx/serialization/modules/SerializersModule;->()V PLkotlinx/serialization/modules/SerializersModule;->()V HSPLkotlinx/serialization/modules/SerializersModule;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLkotlinx/serialization/modules/SerializersModule;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lkotlinx/serialization/modules/SerializersModuleBuilder; HSPLkotlinx/serialization/modules/SerializersModuleBuilder;->()V PLkotlinx/serialization/modules/SerializersModuleBuilder;->()V HSPLkotlinx/serialization/modules/SerializersModuleBuilder;->build()Lkotlinx/serialization/modules/SerializersModule; PLkotlinx/serialization/modules/SerializersModuleBuilder;->build()Lkotlinx/serialization/modules/SerializersModule; HSPLkotlinx/serialization/modules/SerializersModuleBuilder;->contextual(Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V PLkotlinx/serialization/modules/SerializersModuleBuilder;->contextual(Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V HSPLkotlinx/serialization/modules/SerializersModuleBuilder;->include(Lkotlinx/serialization/modules/SerializersModule;)V PLkotlinx/serialization/modules/SerializersModuleBuilder;->include(Lkotlinx/serialization/modules/SerializersModule;)V HSPLkotlinx/serialization/modules/SerializersModuleBuilder;->registerSerializer$default(Lkotlinx/serialization/modules/SerializersModuleBuilder;Lkotlin/reflect/KClass;Lkotlinx/serialization/modules/ContextualProvider;ZILjava/lang/Object;)V PLkotlinx/serialization/modules/SerializersModuleBuilder;->registerSerializer$default(Lkotlinx/serialization/modules/SerializersModuleBuilder;Lkotlin/reflect/KClass;Lkotlinx/serialization/modules/ContextualProvider;ZILjava/lang/Object;)V HSPLkotlinx/serialization/modules/SerializersModuleBuilder;->registerSerializer(Lkotlin/reflect/KClass;Lkotlinx/serialization/modules/ContextualProvider;Z)V PLkotlinx/serialization/modules/SerializersModuleBuilder;->registerSerializer(Lkotlin/reflect/KClass;Lkotlinx/serialization/modules/ContextualProvider;Z)V Lkotlinx/serialization/modules/SerializersModuleBuildersKt; HSPLkotlinx/serialization/modules/SerializersModuleBuildersKt;->EmptySerializersModule()Lkotlinx/serialization/modules/SerializersModule; PLkotlinx/serialization/modules/SerializersModuleBuildersKt;->EmptySerializersModule()Lkotlinx/serialization/modules/SerializersModule; Lkotlinx/serialization/modules/SerializersModuleCollector; Lkotlinx/serialization/modules/SerializersModuleKt; HSPLkotlinx/serialization/modules/SerializersModuleKt;->()V PLkotlinx/serialization/modules/SerializersModuleKt;->()V HSPLkotlinx/serialization/modules/SerializersModuleKt;->getEmptySerializersModule()Lkotlinx/serialization/modules/SerializersModule; PLkotlinx/serialization/modules/SerializersModuleKt;->getEmptySerializersModule()Lkotlinx/serialization/modules/SerializersModule; HSPLkotlinx/serialization/modules/SerializersModuleKt;->plus(Lkotlinx/serialization/modules/SerializersModule;Lkotlinx/serialization/modules/SerializersModule;)Lkotlinx/serialization/modules/SerializersModule; PLkotlinx/serialization/modules/SerializersModuleKt;->plus(Lkotlinx/serialization/modules/SerializersModule;Lkotlinx/serialization/modules/SerializersModule;)Lkotlinx/serialization/modules/SerializersModule; Lleakcanary/AndroidLeakFixes; HSPLleakcanary/AndroidLeakFixes;->()V PLleakcanary/AndroidLeakFixes;->()V HSPLleakcanary/AndroidLeakFixes;->(Ljava/lang/String;I)V PLleakcanary/AndroidLeakFixes;->(Ljava/lang/String;I)V HSPLleakcanary/AndroidLeakFixes;->access$getApplied$p(Lleakcanary/AndroidLeakFixes;)Z PLleakcanary/AndroidLeakFixes;->access$getApplied$p(Lleakcanary/AndroidLeakFixes;)Z HSPLleakcanary/AndroidLeakFixes;->access$getBackgroundHandler$cp()Lkotlin/Lazy; PLleakcanary/AndroidLeakFixes;->access$getBackgroundHandler$cp()Lkotlin/Lazy; HSPLleakcanary/AndroidLeakFixes;->access$setApplied$p(Lleakcanary/AndroidLeakFixes;)V PLleakcanary/AndroidLeakFixes;->access$setApplied$p(Lleakcanary/AndroidLeakFixes;)V HSPLleakcanary/AndroidLeakFixes;->values()[Lleakcanary/AndroidLeakFixes; PLleakcanary/AndroidLeakFixes;->values()[Lleakcanary/AndroidLeakFixes; Lleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO; HSPLleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO;->()V PLleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO;->()V HSPLleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$ACCESSIBILITY_NODE_INFO;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER; HSPLleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER;->()V PLleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER;->()V HSPLleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$ACTIVITY_MANAGER;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$BUBBLE_POPUP; HSPLleakcanary/AndroidLeakFixes$BUBBLE_POPUP;->()V PLleakcanary/AndroidLeakFixes$BUBBLE_POPUP;->()V HSPLleakcanary/AndroidLeakFixes$BUBBLE_POPUP;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$BUBBLE_POPUP;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER; HSPLleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER;->()V PLleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER;->()V HSPLleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$CONNECTIVITY_MANAGER;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2; HSPLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->()V PLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->()V HSPLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->()V PLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->()V HSPLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->invoke()Ljava/lang/Object; PLleakcanary/AndroidLeakFixes$Companion$backgroundHandler$2;->invoke()Ljava/lang/Object; Lleakcanary/AndroidLeakFixes$Companion$onEachIdle$1$1; HSPLleakcanary/AndroidLeakFixes$Companion$onEachIdle$1$1;->(Lleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1;)V PLleakcanary/AndroidLeakFixes$Companion$onEachIdle$1$1;->(Lleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1;)V HSPLleakcanary/AndroidLeakFixes$Companion$onEachIdle$1$1;->queueIdle()Z PLleakcanary/AndroidLeakFixes$Companion$onEachIdle$1$1;->queueIdle()Z Lleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS; HSPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS;->()V PLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS;->()V HSPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1; HSPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1;->(Ljava/lang/Object;I)V PLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1;->(Ljava/lang/Object;I)V HSPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1;->run()V HPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1;->run()V Lleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1$run$1$3; HSPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1$run$1$3;->(Landroid/os/HandlerThread;Lkotlin/jvm/internal/Ref$BooleanRef;Landroid/os/Handler;)V PLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1$run$1$3;->(Landroid/os/HandlerThread;Lkotlin/jvm/internal/Ref$BooleanRef;Landroid/os/Handler;)V HSPLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1$run$1$3;->invoke()Ljava/lang/Object; PLleakcanary/AndroidLeakFixes$FLUSH_HANDLER_THREADS$apply$flushNewHandlerThread$1$run$1$3;->invoke()Ljava/lang/Object; Lleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW; HSPLleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW;->()V PLleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW;->()V HSPLleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$IMM_CUR_ROOT_VIEW;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW; HSPLleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW;->()V PLleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW;->()V HSPLleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$IMM_FOCUSED_VIEW;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW; HSPLleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW;->()V PLleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW;->()V HSPLleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$LAST_HOVERED_VIEW;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER; HSPLleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER;->()V PLleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER;->()V HSPLleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$MEDIA_SESSION_LEGACY_HELPER;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER; HSPLleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER;->()V PLleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER;->()V HSPLleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$SAMSUNG_CLIPBOARD_MANAGER;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$SPELL_CHECKER; HSPLleakcanary/AndroidLeakFixes$SPELL_CHECKER;->()V PLleakcanary/AndroidLeakFixes$SPELL_CHECKER;->()V HSPLleakcanary/AndroidLeakFixes$SPELL_CHECKER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$SPELL_CHECKER;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$TEXT_LINE_POOL; HSPLleakcanary/AndroidLeakFixes$TEXT_LINE_POOL;->()V PLleakcanary/AndroidLeakFixes$TEXT_LINE_POOL;->()V HSPLleakcanary/AndroidLeakFixes$TEXT_LINE_POOL;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$TEXT_LINE_POOL;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$USER_MANAGER; HSPLleakcanary/AndroidLeakFixes$USER_MANAGER;->()V PLleakcanary/AndroidLeakFixes$USER_MANAGER;->()V HSPLleakcanary/AndroidLeakFixes$USER_MANAGER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$USER_MANAGER;->apply(Landroid/app/Application;)V Lleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER; HSPLleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER;->()V PLleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER;->()V HSPLleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER;->apply(Landroid/app/Application;)V PLleakcanary/AndroidLeakFixes$VIEW_LOCATION_HOLDER;->apply(Landroid/app/Application;)V Lleakcanary/ViewLocationHolderLeakFix; HSPLleakcanary/ViewLocationHolderLeakFix;->()V PLleakcanary/ViewLocationHolderLeakFix;->()V HSPLleakcanary/ViewLocationHolderLeakFix;->()V PLleakcanary/ViewLocationHolderLeakFix;->()V HSPLleakcanary/ViewLocationHolderLeakFix;->applyFixes$default(Landroid/app/Application;)V PLleakcanary/ViewLocationHolderLeakFix;->applyFixes$default(Landroid/app/Application;)V Lleakcanary/internal/HandlersKt; HSPLleakcanary/internal/HandlersKt;->()V PLleakcanary/internal/HandlersKt;->()V Lleakcanary/internal/HandlersKt$mainHandler$2; HSPLleakcanary/internal/HandlersKt$mainHandler$2;->()V PLleakcanary/internal/HandlersKt$mainHandler$2;->()V HSPLleakcanary/internal/HandlersKt$mainHandler$2;->(I)V PLleakcanary/internal/HandlersKt$mainHandler$2;->(I)V Lleakcanary/internal/PlumberInstaller; HSPLleakcanary/internal/PlumberInstaller;->()V PLleakcanary/internal/PlumberInstaller;->()V HSPLleakcanary/internal/PlumberInstaller;->onCreate()Z PLleakcanary/internal/PlumberInstaller;->onCreate()Z Llogcat/AndroidLogcatLogger; HSPLlogcat/AndroidLogcatLogger;->()V PLlogcat/AndroidLogcatLogger;->()V Llogcat/LogPriority; HSPLlogcat/LogPriority;->()V PLlogcat/LogPriority;->()V HSPLlogcat/LogPriority;->(Ljava/lang/String;II)V PLlogcat/LogPriority;->(Ljava/lang/String;II)V HSPLlogcat/LogPriority;->getPriorityInt()I PLlogcat/LogPriority;->getPriorityInt()I Llogcat/LogcatLogger; HSPLlogcat/LogcatLogger;->()V PLlogcat/LogcatLogger;->()V Llogcat/LogcatLogger$Companion; HSPLlogcat/LogcatLogger$Companion;->()V PLlogcat/LogcatLogger$Companion;->()V HSPLlogcat/LogcatLogger$Companion;->()V PLlogcat/LogcatLogger$Companion;->()V HSPLlogcat/LogcatLogger$Companion;->install(Llogcat/AndroidLogcatLogger;)V PLlogcat/LogcatLogger$Companion;->install(Llogcat/AndroidLogcatLogger;)V HSPLlogcat/LogcatLogger$Companion;->isInstalled()Z PLlogcat/LogcatLogger$Companion;->isInstalled()Z Llogcat/LogcatLogger$NoLog; HSPLlogcat/LogcatLogger$NoLog;->()V PLlogcat/LogcatLogger$NoLog;->()V HSPLlogcat/LogcatLogger$NoLog;->()V PLlogcat/LogcatLogger$NoLog;->()V Lnl/adaptivity/xmlutil/Namespace; HSPLnl/adaptivity/xmlutil/Namespace;->()V PLnl/adaptivity/xmlutil/Namespace;->()V Lnl/adaptivity/xmlutil/Namespace$Companion; HSPLnl/adaptivity/xmlutil/Namespace$Companion;->()V PLnl/adaptivity/xmlutil/Namespace$Companion;->()V HSPLnl/adaptivity/xmlutil/Namespace$Companion;->()V PLnl/adaptivity/xmlutil/Namespace$Companion;->()V HSPLnl/adaptivity/xmlutil/Namespace$Companion;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLnl/adaptivity/xmlutil/Namespace$Companion;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; Lnl/adaptivity/xmlutil/QNameSerializer; HSPLnl/adaptivity/xmlutil/QNameSerializer;->()V PLnl/adaptivity/xmlutil/QNameSerializer;->()V HSPLnl/adaptivity/xmlutil/QNameSerializer;->()V PLnl/adaptivity/xmlutil/QNameSerializer;->()V Lnl/adaptivity/xmlutil/QNameSerializer$descriptor$1; HSPLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->()V PLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->()V HSPLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->(I)V PLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->(I)V HSPLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->invoke(Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;)V PLnl/adaptivity/xmlutil/QNameSerializer$descriptor$1;->invoke(Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;)V Lnl/adaptivity/xmlutil/XmlDeclMode; HSPLnl/adaptivity/xmlutil/XmlDeclMode;->()V PLnl/adaptivity/xmlutil/XmlDeclMode;->()V HSPLnl/adaptivity/xmlutil/XmlDeclMode;->(Ljava/lang/String;I)V PLnl/adaptivity/xmlutil/XmlDeclMode;->(Ljava/lang/String;I)V Lnl/adaptivity/xmlutil/XmlException; Lnl/adaptivity/xmlutil/core/XmlVersion; HSPLnl/adaptivity/xmlutil/core/XmlVersion;->()V PLnl/adaptivity/xmlutil/core/XmlVersion;->()V HSPLnl/adaptivity/xmlutil/core/XmlVersion;->(Ljava/lang/String;ILjava/lang/String;)V PLnl/adaptivity/xmlutil/core/XmlVersion;->(Ljava/lang/String;ILjava/lang/String;)V Lnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer; HSPLnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer;->()V PLnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer;->()V PLnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer;->access$getNamespacesSerializer$p()Lkotlinx/serialization/KSerializer; PLnl/adaptivity/xmlutil/serialization/CompactFragmentSerializer;->access$getNamespacesSerializer$p()Lkotlinx/serialization/KSerializer; Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy; HSPLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;->(ZZLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Ljavax/xml/namespace/QName;I)V PLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;->(ZZLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Ljavax/xml/namespace/QName;I)V HSPLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;->(ZZLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Ljavax/xml/namespace/QName;Z)V PLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;->(ZZLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Ljavax/xml/namespace/QName;Z)V HSPLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;->copy$default(Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;Z)Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy; PLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;->copy$default(Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy;Z)Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy; Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder; HSPLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder;->(ZZLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Ljavax/xml/namespace/QName;Z)V PLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder;->(ZZLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Ljavax/xml/namespace/QName;Z)V HSPLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder;->build()Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy; PLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder;->build()Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy; HSPLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder;->ignoreUnknownChildren()V PLnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder;->ignoreUnknownChildren()V Lnl/adaptivity/xmlutil/serialization/ElementSerializer; HSPLnl/adaptivity/xmlutil/serialization/ElementSerializer;->()V PLnl/adaptivity/xmlutil/serialization/ElementSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/ElementSerializer;->()V PLnl/adaptivity/xmlutil/serialization/ElementSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/ElementSerializer;->access$getAttrSerializer$p()Lkotlinx/serialization/KSerializer; PLnl/adaptivity/xmlutil/serialization/ElementSerializer;->access$getAttrSerializer$p()Lkotlinx/serialization/KSerializer; Lnl/adaptivity/xmlutil/serialization/NodeSerializer; HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer;->()V PLnl/adaptivity/xmlutil/serialization/NodeSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer;->()V PLnl/adaptivity/xmlutil/serialization/NodeSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; PLnl/adaptivity/xmlutil/serialization/NodeSerializer;->getDescriptor()Lkotlinx/serialization/descriptors/SerialDescriptor; HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer;->getEd()Lkotlinx/serialization/descriptors/SerialDescriptor; PLnl/adaptivity/xmlutil/serialization/NodeSerializer;->getEd()Lkotlinx/serialization/descriptors/SerialDescriptor; Lnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1; HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1;->()V PLnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1;->()V HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1;->()V PLnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1;->()V HSPLnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLnl/adaptivity/xmlutil/serialization/NodeSerializer$ed$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler; Lnl/adaptivity/xmlutil/serialization/XML; HSPLnl/adaptivity/xmlutil/serialization/XML;->()V PLnl/adaptivity/xmlutil/serialization/XML;->()V HSPLnl/adaptivity/xmlutil/serialization/XML;->(Lkotlin/jvm/functions/Function1;)V PLnl/adaptivity/xmlutil/serialization/XML;->(Lkotlin/jvm/functions/Function1;)V Lnl/adaptivity/xmlutil/serialization/XML$1; HSPLnl/adaptivity/xmlutil/serialization/XML$1;->()V PLnl/adaptivity/xmlutil/serialization/XML$1;->()V HSPLnl/adaptivity/xmlutil/serialization/XML$1;->(I)V PLnl/adaptivity/xmlutil/serialization/XML$1;->(I)V HSPLnl/adaptivity/xmlutil/serialization/XML$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLnl/adaptivity/xmlutil/serialization/XML$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLnl/adaptivity/xmlutil/serialization/XML$1;->invoke(Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;)V PLnl/adaptivity/xmlutil/serialization/XML$1;->invoke(Lkotlinx/serialization/descriptors/ClassSerialDescriptorBuilder;)V Lnl/adaptivity/xmlutil/serialization/XMLKt; HSPLnl/adaptivity/xmlutil/serialization/XMLKt;->()V PLnl/adaptivity/xmlutil/serialization/XMLKt;->()V HSPLnl/adaptivity/xmlutil/serialization/XMLKt;->access$getDefaultXmlModule$p()Lkotlinx/serialization/modules/SerializersModule; PLnl/adaptivity/xmlutil/serialization/XMLKt;->access$getDefaultXmlModule$p()Lkotlinx/serialization/modules/SerializersModule; Lnl/adaptivity/xmlutil/serialization/XmlConfig; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig;->()V PLnl/adaptivity/xmlutil/serialization/XmlConfig;->()V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig;->(Lnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;)V PLnl/adaptivity/xmlutil/serialization/XmlConfig;->(Lnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;)V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig;->access$getDEFAULT_UNKNOWN_CHILD_HANDLER$cp()Lcoil/EventListener$Factory$$ExternalSyntheticLambda0; PLnl/adaptivity/xmlutil/serialization/XmlConfig;->access$getDEFAULT_UNKNOWN_CHILD_HANDLER$cp()Lcoil/EventListener$Factory$$ExternalSyntheticLambda0; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig;->access$getIGNORING_UNKNOWN_CHILD_HANDLER$cp()Lcoil/EventListener$Factory$$ExternalSyntheticLambda0; PLnl/adaptivity/xmlutil/serialization/XmlConfig;->access$getIGNORING_UNKNOWN_CHILD_HANDLER$cp()Lcoil/EventListener$Factory$$ExternalSyntheticLambda0; Lnl/adaptivity/xmlutil/serialization/XmlConfig$Builder; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->(ZLnl/adaptivity/xmlutil/XmlDeclMode;Ljava/lang/String;Ljava/lang/Boolean;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy;)V PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->(ZLnl/adaptivity/xmlutil/XmlDeclMode;Ljava/lang/String;Ljava/lang/Boolean;Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler;Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy;)V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getAutoPolymorphic()Ljava/lang/Boolean; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getAutoPolymorphic()Ljava/lang/Boolean; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getEncodeDefault()Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getEncodeDefault()Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getIndentString()Ljava/lang/String; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getIndentString()Ljava/lang/String; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getNilAttribute()Lkotlin/Pair; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getNilAttribute()Lkotlin/Pair; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getPolicy()Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getPolicy()Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getRepairNamespaces()Z PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getRepairNamespaces()Z HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getUnknownChildHandler()Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getUnknownChildHandler()Lnl/adaptivity/xmlutil/serialization/UnknownChildHandler; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getXmlDeclMode()Lnl/adaptivity/xmlutil/XmlDeclMode; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getXmlDeclMode()Lnl/adaptivity/xmlutil/XmlDeclMode; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getXmlVersion()Lnl/adaptivity/xmlutil/core/XmlVersion; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->getXmlVersion()Lnl/adaptivity/xmlutil/core/XmlVersion; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->isCollectingNSAttributes()Z PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->isCollectingNSAttributes()Z HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->isInlineCollapsed()Z PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->isInlineCollapsed()Z HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->policyBuilder()Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder; PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->policyBuilder()Lnl/adaptivity/xmlutil/serialization/DefaultXmlSerializationPolicy$Builder; HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setAutoPolymorphic(Ljava/lang/Boolean;)V PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setAutoPolymorphic(Ljava/lang/Boolean;)V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setIndent()V PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setIndent()V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setPolicy(Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy;)V PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setPolicy(Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy;)V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setXmlDeclMode()V PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setXmlDeclMode()V HSPLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setXmlVersion()V PLnl/adaptivity/xmlutil/serialization/XmlConfig$Builder;->setXmlVersion()V Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy; Lnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault; HSPLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;->()V PLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;->()V HSPLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;->(Ljava/lang/String;I)V PLnl/adaptivity/xmlutil/serialization/XmlSerializationPolicy$XmlEncodeDefault;->(Ljava/lang/String;I)V Lnl/adaptivity/xmlutil/serialization/impl/XmlQNameSerializer; HSPLnl/adaptivity/xmlutil/serialization/impl/XmlQNameSerializer;->()V PLnl/adaptivity/xmlutil/serialization/impl/XmlQNameSerializer;->()V HSPLnl/adaptivity/xmlutil/serialization/impl/XmlQNameSerializer;->()V PLnl/adaptivity/xmlutil/serialization/impl/XmlQNameSerializer;->()V Lnl/adaptivity/xmlutil/util/CompactFragment; Lnl/adaptivity/xmlutil/util/ICompactFragment; Lokhttp3/Address; HSPLokhttp3/Address;->(Ljava/lang/String;ILokhttp3/Dns;Ljavax/net/SocketFactory;Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/HostnameVerifier;Lokhttp3/CertificatePinner;Lokhttp3/Authenticator;Ljava/net/Proxy;Ljava/util/List;Ljava/util/List;Ljava/net/ProxySelector;)V PLokhttp3/Address;->(Ljava/lang/String;ILokhttp3/Dns;Ljavax/net/SocketFactory;Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/HostnameVerifier;Lokhttp3/CertificatePinner;Lokhttp3/Authenticator;Ljava/net/Proxy;Ljava/util/List;Ljava/util/List;Ljava/net/ProxySelector;)V HSPLokhttp3/Address;->certificatePinner()Lokhttp3/CertificatePinner; PLokhttp3/Address;->certificatePinner()Lokhttp3/CertificatePinner; HSPLokhttp3/Address;->connectionSpecs()Ljava/util/List; PLokhttp3/Address;->connectionSpecs()Ljava/util/List; HSPLokhttp3/Address;->dns()Lokhttp3/Dns; PLokhttp3/Address;->dns()Lokhttp3/Dns; HSPLokhttp3/Address;->hashCode()I PLokhttp3/Address;->hashCode()I HSPLokhttp3/Address;->hostnameVerifier()Ljavax/net/ssl/HostnameVerifier; PLokhttp3/Address;->hostnameVerifier()Ljavax/net/ssl/HostnameVerifier; HSPLokhttp3/Address;->protocols()Ljava/util/List; PLokhttp3/Address;->protocols()Ljava/util/List; HSPLokhttp3/Address;->proxy()Ljava/net/Proxy; PLokhttp3/Address;->proxy()Ljava/net/Proxy; HSPLokhttp3/Address;->proxySelector()Ljava/net/ProxySelector; PLokhttp3/Address;->proxySelector()Ljava/net/ProxySelector; HSPLokhttp3/Address;->socketFactory()Ljavax/net/SocketFactory; PLokhttp3/Address;->socketFactory()Ljavax/net/SocketFactory; HSPLokhttp3/Address;->sslSocketFactory()Ljavax/net/ssl/SSLSocketFactory; PLokhttp3/Address;->sslSocketFactory()Ljavax/net/ssl/SSLSocketFactory; HSPLokhttp3/Address;->url()Lokhttp3/HttpUrl; PLokhttp3/Address;->url()Lokhttp3/HttpUrl; Lokhttp3/Authenticator; HSPLokhttp3/Authenticator;->()V PLokhttp3/Authenticator;->()V Lokhttp3/Authenticator$Companion; HSPLokhttp3/Authenticator$Companion;->()V PLokhttp3/Authenticator$Companion;->()V HSPLokhttp3/Authenticator$Companion;->()V PLokhttp3/Authenticator$Companion;->()V Lokhttp3/Authenticator$Companion$AuthenticatorNone; HSPLokhttp3/Authenticator$Companion$AuthenticatorNone;->()V PLokhttp3/Authenticator$Companion$AuthenticatorNone;->()V Lokhttp3/Cache; HSPLokhttp3/Cache;->()V PLokhttp3/Cache;->()V HSPLokhttp3/Cache;->(Ljava/io/File;J)V PLokhttp3/Cache;->(Ljava/io/File;J)V HSPLokhttp3/Cache;->(Lokio/Path;JLokio/FileSystem;)V PLokhttp3/Cache;->(Lokio/Path;JLokio/FileSystem;)V HSPLokhttp3/Cache;->get$okhttp(Lokhttp3/Request;)Lokhttp3/Response; PLokhttp3/Cache;->get$okhttp(Lokhttp3/Request;)Lokhttp3/Response; HSPLokhttp3/Cache;->getWriteSuccessCount$okhttp()I PLokhttp3/Cache;->getWriteSuccessCount$okhttp()I HSPLokhttp3/Cache;->put$okhttp(Lokhttp3/Response;)Lokhttp3/internal/cache/CacheRequest; PLokhttp3/Cache;->put$okhttp(Lokhttp3/Response;)Lokhttp3/internal/cache/CacheRequest; HSPLokhttp3/Cache;->setWriteSuccessCount$okhttp(I)V PLokhttp3/Cache;->setWriteSuccessCount$okhttp(I)V HSPLokhttp3/Cache;->trackResponse$okhttp(Lokhttp3/internal/cache/CacheStrategy;)V PLokhttp3/Cache;->trackResponse$okhttp(Lokhttp3/internal/cache/CacheStrategy;)V Lokhttp3/Cache$Companion; HSPLokhttp3/Cache$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/Cache$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/Cache$Companion;->hasVaryAll(Lokhttp3/Response;)Z PLokhttp3/Cache$Companion;->hasVaryAll(Lokhttp3/Response;)Z HSPLokhttp3/Cache$Companion;->key(Lokhttp3/HttpUrl;)Ljava/lang/String; PLokhttp3/Cache$Companion;->key(Lokhttp3/HttpUrl;)Ljava/lang/String; HSPLokhttp3/Cache$Companion;->varyFields(Lokhttp3/Headers;)Ljava/util/Set; PLokhttp3/Cache$Companion;->varyFields(Lokhttp3/Headers;)Ljava/util/Set; HSPLokhttp3/Cache$Companion;->varyHeaders(Lokhttp3/Response;)Lokhttp3/Headers; PLokhttp3/Cache$Companion;->varyHeaders(Lokhttp3/Response;)Lokhttp3/Headers; Lokhttp3/Cache$Entry; HSPLokhttp3/Cache$Entry;->()V PLokhttp3/Cache$Entry;->()V HSPLokhttp3/Cache$Entry;->(Lokhttp3/Response;)V PLokhttp3/Cache$Entry;->(Lokhttp3/Response;)V HSPLokhttp3/Cache$Entry;->writeCertList(Lokio/BufferedSink;Ljava/util/List;)V PLokhttp3/Cache$Entry;->writeCertList(Lokio/BufferedSink;Ljava/util/List;)V HSPLokhttp3/Cache$Entry;->writeTo(Lokhttp3/internal/cache/DiskLruCache$Editor;)V PLokhttp3/Cache$Entry;->writeTo(Lokhttp3/internal/cache/DiskLruCache$Editor;)V Lokhttp3/Cache$Entry$Companion; HSPLokhttp3/Cache$Entry$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/Cache$Entry$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/Cache$RealCacheRequest; HSPLokhttp3/Cache$RealCacheRequest;->(Lokhttp3/Cache;Lokhttp3/internal/cache/DiskLruCache$Editor;)V PLokhttp3/Cache$RealCacheRequest;->(Lokhttp3/Cache;Lokhttp3/internal/cache/DiskLruCache$Editor;)V HSPLokhttp3/Cache$RealCacheRequest;->access$getEditor$p(Lokhttp3/Cache$RealCacheRequest;)Lokhttp3/internal/cache/DiskLruCache$Editor; PLokhttp3/Cache$RealCacheRequest;->access$getEditor$p(Lokhttp3/Cache$RealCacheRequest;)Lokhttp3/internal/cache/DiskLruCache$Editor; HSPLokhttp3/Cache$RealCacheRequest;->body()Lokio/Sink; PLokhttp3/Cache$RealCacheRequest;->body()Lokio/Sink; HSPLokhttp3/Cache$RealCacheRequest;->getDone()Z PLokhttp3/Cache$RealCacheRequest;->getDone()Z HSPLokhttp3/Cache$RealCacheRequest;->setDone(Z)V PLokhttp3/Cache$RealCacheRequest;->setDone(Z)V Lokhttp3/Cache$RealCacheRequest$1; HSPLokhttp3/Cache$RealCacheRequest$1;->(Lokhttp3/Cache;Lokhttp3/Cache$RealCacheRequest;Lokio/Sink;)V PLokhttp3/Cache$RealCacheRequest$1;->(Lokhttp3/Cache;Lokhttp3/Cache$RealCacheRequest;Lokio/Sink;)V HSPLokhttp3/Cache$RealCacheRequest$1;->close()V PLokhttp3/Cache$RealCacheRequest$1;->close()V Lokhttp3/CacheControl; HSPLokhttp3/CacheControl;->()V PLokhttp3/CacheControl;->()V HSPLokhttp3/CacheControl;->(ZZIIZZZIIZZZLjava/lang/String;)V PLokhttp3/CacheControl;->(ZZIIZZZIIZZZLjava/lang/String;)V HSPLokhttp3/CacheControl;->getHeaderValue$okhttp()Ljava/lang/String; PLokhttp3/CacheControl;->getHeaderValue$okhttp()Ljava/lang/String; HSPLokhttp3/CacheControl;->immutable()Z PLokhttp3/CacheControl;->immutable()Z HSPLokhttp3/CacheControl;->isPrivate()Z PLokhttp3/CacheControl;->isPrivate()Z HSPLokhttp3/CacheControl;->isPublic()Z PLokhttp3/CacheControl;->isPublic()Z HSPLokhttp3/CacheControl;->maxAgeSeconds()I PLokhttp3/CacheControl;->maxAgeSeconds()I HSPLokhttp3/CacheControl;->maxStaleSeconds()I PLokhttp3/CacheControl;->maxStaleSeconds()I HSPLokhttp3/CacheControl;->minFreshSeconds()I PLokhttp3/CacheControl;->minFreshSeconds()I HSPLokhttp3/CacheControl;->mustRevalidate()Z PLokhttp3/CacheControl;->mustRevalidate()Z HSPLokhttp3/CacheControl;->noCache()Z PLokhttp3/CacheControl;->noCache()Z HSPLokhttp3/CacheControl;->noStore()Z PLokhttp3/CacheControl;->noStore()Z HSPLokhttp3/CacheControl;->noTransform()Z PLokhttp3/CacheControl;->noTransform()Z HSPLokhttp3/CacheControl;->onlyIfCached()Z PLokhttp3/CacheControl;->onlyIfCached()Z HSPLokhttp3/CacheControl;->sMaxAgeSeconds()I PLokhttp3/CacheControl;->sMaxAgeSeconds()I HSPLokhttp3/CacheControl;->setHeaderValue$okhttp(Ljava/lang/String;)V PLokhttp3/CacheControl;->setHeaderValue$okhttp(Ljava/lang/String;)V Lokhttp3/CacheControl$Builder; HSPLokhttp3/CacheControl$Builder;->()V PLokhttp3/CacheControl$Builder;->()V HSPLokhttp3/CacheControl$Builder;->getImmutable$okhttp()Z PLokhttp3/CacheControl$Builder;->getImmutable$okhttp()Z HSPLokhttp3/CacheControl$Builder;->getMaxAgeSeconds$okhttp()I PLokhttp3/CacheControl$Builder;->getMaxAgeSeconds$okhttp()I HSPLokhttp3/CacheControl$Builder;->getMaxStaleSeconds$okhttp()I PLokhttp3/CacheControl$Builder;->getMaxStaleSeconds$okhttp()I HSPLokhttp3/CacheControl$Builder;->getMinFreshSeconds$okhttp()I PLokhttp3/CacheControl$Builder;->getMinFreshSeconds$okhttp()I HSPLokhttp3/CacheControl$Builder;->getNoCache$okhttp()Z PLokhttp3/CacheControl$Builder;->getNoCache$okhttp()Z HSPLokhttp3/CacheControl$Builder;->getNoStore$okhttp()Z PLokhttp3/CacheControl$Builder;->getNoStore$okhttp()Z HSPLokhttp3/CacheControl$Builder;->getNoTransform$okhttp()Z PLokhttp3/CacheControl$Builder;->getNoTransform$okhttp()Z HSPLokhttp3/CacheControl$Builder;->getOnlyIfCached$okhttp()Z PLokhttp3/CacheControl$Builder;->getOnlyIfCached$okhttp()Z HSPLokhttp3/CacheControl$Builder;->maxAge(ILjava/util/concurrent/TimeUnit;)Lokhttp3/CacheControl$Builder; PLokhttp3/CacheControl$Builder;->maxAge(ILjava/util/concurrent/TimeUnit;)Lokhttp3/CacheControl$Builder; HSPLokhttp3/CacheControl$Builder;->maxStale(ILkotlin/time/DurationUnit;)Lokhttp3/CacheControl$Builder; PLokhttp3/CacheControl$Builder;->maxStale(ILkotlin/time/DurationUnit;)Lokhttp3/CacheControl$Builder; HSPLokhttp3/CacheControl$Builder;->setMaxStaleSeconds$okhttp(I)V PLokhttp3/CacheControl$Builder;->setMaxStaleSeconds$okhttp(I)V HSPLokhttp3/CacheControl$Builder;->setNoCache$okhttp(Z)V PLokhttp3/CacheControl$Builder;->setNoCache$okhttp(Z)V HSPLokhttp3/CacheControl$Builder;->setOnlyIfCached$okhttp(Z)V PLokhttp3/CacheControl$Builder;->setOnlyIfCached$okhttp(Z)V Lokhttp3/CacheControl$Companion; HSPLokhttp3/CacheControl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/CacheControl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/CacheControl$Companion;->parse(Lokhttp3/Headers;)Lokhttp3/CacheControl; PLokhttp3/CacheControl$Companion;->parse(Lokhttp3/Headers;)Lokhttp3/CacheControl; Lokhttp3/Call; Lokhttp3/Call$Factory; Lokhttp3/Callback; Lokhttp3/CertificatePinner; HSPLokhttp3/CertificatePinner;->()V PLokhttp3/CertificatePinner;->()V HSPLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;)V PLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;)V HSPLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/CertificatePinner;->(Ljava/util/Set;Lokhttp3/internal/tls/CertificateChainCleaner;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/CertificatePinner;->check$okhttp(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V PLokhttp3/CertificatePinner;->check$okhttp(Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V HSPLokhttp3/CertificatePinner;->findMatchingPins(Ljava/lang/String;)Ljava/util/List; PLokhttp3/CertificatePinner;->findMatchingPins(Ljava/lang/String;)Ljava/util/List; HSPLokhttp3/CertificatePinner;->getCertificateChainCleaner$okhttp()Lokhttp3/internal/tls/CertificateChainCleaner; PLokhttp3/CertificatePinner;->getCertificateChainCleaner$okhttp()Lokhttp3/internal/tls/CertificateChainCleaner; HSPLokhttp3/CertificatePinner;->hashCode()I PLokhttp3/CertificatePinner;->hashCode()I HSPLokhttp3/CertificatePinner;->withCertificateChainCleaner$okhttp(Lokhttp3/internal/tls/CertificateChainCleaner;)Lokhttp3/CertificatePinner; PLokhttp3/CertificatePinner;->withCertificateChainCleaner$okhttp(Lokhttp3/internal/tls/CertificateChainCleaner;)Lokhttp3/CertificatePinner; Lokhttp3/CertificatePinner$Builder; HSPLokhttp3/CertificatePinner$Builder;->()V PLokhttp3/CertificatePinner$Builder;->()V HSPLokhttp3/CertificatePinner$Builder;->build()Lokhttp3/CertificatePinner; PLokhttp3/CertificatePinner$Builder;->build()Lokhttp3/CertificatePinner; Lokhttp3/CertificatePinner$Companion; HSPLokhttp3/CertificatePinner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/CertificatePinner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/CipherSuite; HSPLokhttp3/CipherSuite;->()V PLokhttp3/CipherSuite;->()V HSPLokhttp3/CipherSuite;->(Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/CipherSuite;->(Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/CipherSuite;->access$getINSTANCES$cp()Ljava/util/Map; PLokhttp3/CipherSuite;->access$getINSTANCES$cp()Ljava/util/Map; HSPLokhttp3/CipherSuite;->access$getORDER_BY_NAME$cp()Ljava/util/Comparator; PLokhttp3/CipherSuite;->access$getORDER_BY_NAME$cp()Ljava/util/Comparator; HSPLokhttp3/CipherSuite;->javaName()Ljava/lang/String; PLokhttp3/CipherSuite;->javaName()Ljava/lang/String; Lokhttp3/CipherSuite$Companion; HSPLokhttp3/CipherSuite$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/CipherSuite$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/CipherSuite$Companion;->access$init(Lokhttp3/CipherSuite$Companion;Ljava/lang/String;I)Lokhttp3/CipherSuite; PLokhttp3/CipherSuite$Companion;->access$init(Lokhttp3/CipherSuite$Companion;Ljava/lang/String;I)Lokhttp3/CipherSuite; HSPLokhttp3/CipherSuite$Companion;->forJavaName(Ljava/lang/String;)Lokhttp3/CipherSuite; PLokhttp3/CipherSuite$Companion;->forJavaName(Ljava/lang/String;)Lokhttp3/CipherSuite; Lokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1; HSPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->()V PLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->()V HSPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I PLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->compare(Ljava/lang/String;Ljava/lang/String;)I HPLokhttp3/CipherSuite$Companion$ORDER_BY_NAME$1;->compare(Ljava/lang/String;Ljava/lang/String;)I Lokhttp3/Connection; Lokhttp3/ConnectionPool; HSPLokhttp3/ConnectionPool;->()V PLokhttp3/ConnectionPool;->()V HSPLokhttp3/ConnectionPool;->(IJLjava/util/concurrent/TimeUnit;)V PLokhttp3/ConnectionPool;->(IJLjava/util/concurrent/TimeUnit;)V HSPLokhttp3/ConnectionPool;->(Lokhttp3/internal/connection/RealConnectionPool;)V PLokhttp3/ConnectionPool;->(Lokhttp3/internal/connection/RealConnectionPool;)V HSPLokhttp3/ConnectionPool;->getDelegate$okhttp()Lokhttp3/internal/connection/RealConnectionPool; PLokhttp3/ConnectionPool;->getDelegate$okhttp()Lokhttp3/internal/connection/RealConnectionPool; Lokhttp3/ConnectionSpec; HSPLokhttp3/ConnectionSpec;->()V PLokhttp3/ConnectionSpec;->()V HSPLokhttp3/ConnectionSpec;->(ZZ[Ljava/lang/String;[Ljava/lang/String;)V PLokhttp3/ConnectionSpec;->(ZZ[Ljava/lang/String;[Ljava/lang/String;)V HSPLokhttp3/ConnectionSpec;->access$getTlsVersionsAsString$p(Lokhttp3/ConnectionSpec;)[Ljava/lang/String; PLokhttp3/ConnectionSpec;->access$getTlsVersionsAsString$p(Lokhttp3/ConnectionSpec;)[Ljava/lang/String; HSPLokhttp3/ConnectionSpec;->apply$okhttp(Ljavax/net/ssl/SSLSocket;Z)V PLokhttp3/ConnectionSpec;->apply$okhttp(Ljavax/net/ssl/SSLSocket;Z)V HSPLokhttp3/ConnectionSpec;->cipherSuites()Ljava/util/List; PLokhttp3/ConnectionSpec;->cipherSuites()Ljava/util/List; HSPLokhttp3/ConnectionSpec;->getCipherSuitesAsString$okhttp()[Ljava/lang/String; PLokhttp3/ConnectionSpec;->getCipherSuitesAsString$okhttp()[Ljava/lang/String; HSPLokhttp3/ConnectionSpec;->hashCode()I PLokhttp3/ConnectionSpec;->hashCode()I HSPLokhttp3/ConnectionSpec;->isCompatible(Ljavax/net/ssl/SSLSocket;)Z PLokhttp3/ConnectionSpec;->isCompatible(Ljavax/net/ssl/SSLSocket;)Z HSPLokhttp3/ConnectionSpec;->isTls()Z PLokhttp3/ConnectionSpec;->isTls()Z HSPLokhttp3/ConnectionSpec;->supportsTlsExtensions()Z PLokhttp3/ConnectionSpec;->supportsTlsExtensions()Z HSPLokhttp3/ConnectionSpec;->tlsVersions()Ljava/util/List; PLokhttp3/ConnectionSpec;->tlsVersions()Ljava/util/List; Lokhttp3/ConnectionSpec$Builder; HSPLokhttp3/ConnectionSpec$Builder;->(Lokhttp3/ConnectionSpec;)V PLokhttp3/ConnectionSpec$Builder;->(Lokhttp3/ConnectionSpec;)V HSPLokhttp3/ConnectionSpec$Builder;->(Z)V PLokhttp3/ConnectionSpec$Builder;->(Z)V HSPLokhttp3/ConnectionSpec$Builder;->build()Lokhttp3/ConnectionSpec; PLokhttp3/ConnectionSpec$Builder;->build()Lokhttp3/ConnectionSpec; HSPLokhttp3/ConnectionSpec$Builder;->cipherSuites([Ljava/lang/String;)Lokhttp3/ConnectionSpec$Builder; PLokhttp3/ConnectionSpec$Builder;->cipherSuites([Ljava/lang/String;)Lokhttp3/ConnectionSpec$Builder; HSPLokhttp3/ConnectionSpec$Builder;->cipherSuites([Lokhttp3/CipherSuite;)Lokhttp3/ConnectionSpec$Builder; PLokhttp3/ConnectionSpec$Builder;->cipherSuites([Lokhttp3/CipherSuite;)Lokhttp3/ConnectionSpec$Builder; HSPLokhttp3/ConnectionSpec$Builder;->supportsTlsExtensions(Z)Lokhttp3/ConnectionSpec$Builder; PLokhttp3/ConnectionSpec$Builder;->supportsTlsExtensions(Z)Lokhttp3/ConnectionSpec$Builder; HSPLokhttp3/ConnectionSpec$Builder;->tlsVersions([Ljava/lang/String;)Lokhttp3/ConnectionSpec$Builder; PLokhttp3/ConnectionSpec$Builder;->tlsVersions([Ljava/lang/String;)Lokhttp3/ConnectionSpec$Builder; HSPLokhttp3/ConnectionSpec$Builder;->tlsVersions([Lokhttp3/TlsVersion;)Lokhttp3/ConnectionSpec$Builder; PLokhttp3/ConnectionSpec$Builder;->tlsVersions([Lokhttp3/TlsVersion;)Lokhttp3/ConnectionSpec$Builder; Lokhttp3/ConnectionSpec$Companion; HSPLokhttp3/ConnectionSpec$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/ConnectionSpec$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/Cookie; HSPLokhttp3/Cookie;->()V PLokhttp3/Cookie;->()V Lokhttp3/Cookie$Companion; HSPLokhttp3/Cookie$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/Cookie$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/Cookie$Companion;->parseAll(Lokhttp3/HttpUrl;Lokhttp3/Headers;)Ljava/util/List; PLokhttp3/Cookie$Companion;->parseAll(Lokhttp3/HttpUrl;Lokhttp3/Headers;)Ljava/util/List; Lokhttp3/CookieJar; HSPLokhttp3/CookieJar;->()V PLokhttp3/CookieJar;->()V Lokhttp3/CookieJar$Companion; HSPLokhttp3/CookieJar$Companion;->()V PLokhttp3/CookieJar$Companion;->()V HSPLokhttp3/CookieJar$Companion;->()V PLokhttp3/CookieJar$Companion;->()V Lokhttp3/CookieJar$Companion$NoCookies; HSPLokhttp3/CookieJar$Companion$NoCookies;->()V PLokhttp3/CookieJar$Companion$NoCookies;->()V Lokhttp3/Dispatcher; HSPLokhttp3/Dispatcher;->()V PLokhttp3/Dispatcher;->()V HSPLokhttp3/Dispatcher;->enqueue$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V PLokhttp3/Dispatcher;->enqueue$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V HSPLokhttp3/Dispatcher;->executorService()Ljava/util/concurrent/ExecutorService; PLokhttp3/Dispatcher;->executorService()Ljava/util/concurrent/ExecutorService; HSPLokhttp3/Dispatcher;->finished$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V PLokhttp3/Dispatcher;->finished$okhttp(Lokhttp3/internal/connection/RealCall$AsyncCall;)V HSPLokhttp3/Dispatcher;->finished(Ljava/util/ArrayDeque;Ljava/lang/Object;)V PLokhttp3/Dispatcher;->finished(Ljava/util/ArrayDeque;Ljava/lang/Object;)V HSPLokhttp3/Dispatcher;->promoteAndExecute()Z PLokhttp3/Dispatcher;->promoteAndExecute()Z HSPLokhttp3/Dispatcher;->runningCallsCount()I PLokhttp3/Dispatcher;->runningCallsCount()I Lokhttp3/Dns; HSPLokhttp3/Dns;->()V PLokhttp3/Dns;->()V Lokhttp3/Dns$Companion; HSPLokhttp3/Dns$Companion;->()V PLokhttp3/Dns$Companion;->()V HSPLokhttp3/Dns$Companion;->()V PLokhttp3/Dns$Companion;->()V Lokhttp3/Dns$Companion$DnsSystem; HSPLokhttp3/Dns$Companion$DnsSystem;->()V PLokhttp3/Dns$Companion$DnsSystem;->()V HSPLokhttp3/Dns$Companion$DnsSystem;->lookup(Ljava/lang/String;)Ljava/util/List; PLokhttp3/Dns$Companion$DnsSystem;->lookup(Ljava/lang/String;)Ljava/util/List; Lokhttp3/EventListener; HSPLokhttp3/EventListener;->()V PLokhttp3/EventListener;->()V HSPLokhttp3/EventListener;->()V PLokhttp3/EventListener;->()V HSPLokhttp3/EventListener;->cacheMiss(Lokhttp3/Call;)V PLokhttp3/EventListener;->cacheMiss(Lokhttp3/Call;)V HSPLokhttp3/EventListener;->callEnd(Lokhttp3/Call;)V PLokhttp3/EventListener;->callEnd(Lokhttp3/Call;)V HSPLokhttp3/EventListener;->callStart(Lokhttp3/Call;)V PLokhttp3/EventListener;->callStart(Lokhttp3/Call;)V HSPLokhttp3/EventListener;->connectEnd(Lokhttp3/Call;Ljava/net/InetSocketAddress;Ljava/net/Proxy;Lokhttp3/Protocol;)V PLokhttp3/EventListener;->connectEnd(Lokhttp3/Call;Ljava/net/InetSocketAddress;Ljava/net/Proxy;Lokhttp3/Protocol;)V HSPLokhttp3/EventListener;->connectFailed(Lokhttp3/Call;Ljava/net/InetSocketAddress;Ljava/net/Proxy;Lokhttp3/Protocol;Ljava/io/IOException;)V PLokhttp3/EventListener;->connectFailed(Lokhttp3/Call;Ljava/net/InetSocketAddress;Ljava/net/Proxy;Lokhttp3/Protocol;Ljava/io/IOException;)V HSPLokhttp3/EventListener;->connectStart(Lokhttp3/Call;Ljava/net/InetSocketAddress;Ljava/net/Proxy;)V PLokhttp3/EventListener;->connectStart(Lokhttp3/Call;Ljava/net/InetSocketAddress;Ljava/net/Proxy;)V HSPLokhttp3/EventListener;->connectionAcquired(Lokhttp3/Call;Lokhttp3/Connection;)V PLokhttp3/EventListener;->connectionAcquired(Lokhttp3/Call;Lokhttp3/Connection;)V HSPLokhttp3/EventListener;->connectionReleased(Lokhttp3/Call;Lokhttp3/Connection;)V PLokhttp3/EventListener;->connectionReleased(Lokhttp3/Call;Lokhttp3/Connection;)V HSPLokhttp3/EventListener;->dnsEnd(Lokhttp3/Call;Ljava/lang/String;Ljava/util/List;)V PLokhttp3/EventListener;->dnsEnd(Lokhttp3/Call;Ljava/lang/String;Ljava/util/List;)V HSPLokhttp3/EventListener;->dnsStart(Lokhttp3/Call;Ljava/lang/String;)V PLokhttp3/EventListener;->dnsStart(Lokhttp3/Call;Ljava/lang/String;)V HSPLokhttp3/EventListener;->proxySelectEnd(Lokhttp3/Call;Lokhttp3/HttpUrl;Ljava/util/List;)V PLokhttp3/EventListener;->proxySelectEnd(Lokhttp3/Call;Lokhttp3/HttpUrl;Ljava/util/List;)V HSPLokhttp3/EventListener;->proxySelectStart(Lokhttp3/Call;Lokhttp3/HttpUrl;)V PLokhttp3/EventListener;->proxySelectStart(Lokhttp3/Call;Lokhttp3/HttpUrl;)V HSPLokhttp3/EventListener;->requestHeadersEnd(Lokhttp3/Call;Lokhttp3/Request;)V PLokhttp3/EventListener;->requestHeadersEnd(Lokhttp3/Call;Lokhttp3/Request;)V HSPLokhttp3/EventListener;->requestHeadersStart(Lokhttp3/Call;)V PLokhttp3/EventListener;->requestHeadersStart(Lokhttp3/Call;)V HSPLokhttp3/EventListener;->responseBodyEnd(Lokhttp3/Call;J)V PLokhttp3/EventListener;->responseBodyEnd(Lokhttp3/Call;J)V HSPLokhttp3/EventListener;->responseBodyStart(Lokhttp3/Call;)V PLokhttp3/EventListener;->responseBodyStart(Lokhttp3/Call;)V HSPLokhttp3/EventListener;->responseHeadersEnd(Lokhttp3/Call;Lokhttp3/Response;)V PLokhttp3/EventListener;->responseHeadersEnd(Lokhttp3/Call;Lokhttp3/Response;)V HSPLokhttp3/EventListener;->responseHeadersStart(Lokhttp3/Call;)V PLokhttp3/EventListener;->responseHeadersStart(Lokhttp3/Call;)V HSPLokhttp3/EventListener;->secureConnectEnd(Lokhttp3/Call;Lokhttp3/Handshake;)V PLokhttp3/EventListener;->secureConnectEnd(Lokhttp3/Call;Lokhttp3/Handshake;)V HSPLokhttp3/EventListener;->secureConnectStart(Lokhttp3/Call;)V PLokhttp3/EventListener;->secureConnectStart(Lokhttp3/Call;)V Lokhttp3/EventListener$Companion; HSPLokhttp3/EventListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/EventListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/EventListener$Companion$NONE$1; HSPLokhttp3/EventListener$Companion$NONE$1;->()V PLokhttp3/EventListener$Companion$NONE$1;->()V Lokhttp3/EventListener$Factory; Lokhttp3/FormBody; HSPLokhttp3/FormBody;->()V PLokhttp3/FormBody;->()V HSPLokhttp3/FormBody;->(Ljava/util/List;Ljava/util/List;)V PLokhttp3/FormBody;->(Ljava/util/List;Ljava/util/List;)V Lokhttp3/FormBody$Builder; HSPLokhttp3/FormBody$Builder;->(Ljava/nio/charset/Charset;)V PLokhttp3/FormBody$Builder;->(Ljava/nio/charset/Charset;)V HSPLokhttp3/FormBody$Builder;->(Ljava/nio/charset/Charset;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/FormBody$Builder;->(Ljava/nio/charset/Charset;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/FormBody$Builder;->build()Lokhttp3/FormBody; PLokhttp3/FormBody$Builder;->build()Lokhttp3/FormBody; Lokhttp3/FormBody$Companion; HSPLokhttp3/FormBody$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/FormBody$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/Handshake; HSPLokhttp3/Handshake;->()V PLokhttp3/Handshake;->()V HSPLokhttp3/Handshake;->(Lokhttp3/TlsVersion;Lokhttp3/CipherSuite;Ljava/util/List;Lkotlin/jvm/functions/Function0;)V PLokhttp3/Handshake;->(Lokhttp3/TlsVersion;Lokhttp3/CipherSuite;Ljava/util/List;Lkotlin/jvm/functions/Function0;)V HSPLokhttp3/Handshake;->cipherSuite()Lokhttp3/CipherSuite; PLokhttp3/Handshake;->cipherSuite()Lokhttp3/CipherSuite; HSPLokhttp3/Handshake;->localCertificates()Ljava/util/List; PLokhttp3/Handshake;->localCertificates()Ljava/util/List; HSPLokhttp3/Handshake;->peerCertificates()Ljava/util/List; PLokhttp3/Handshake;->peerCertificates()Ljava/util/List; HSPLokhttp3/Handshake;->tlsVersion()Lokhttp3/TlsVersion; PLokhttp3/Handshake;->tlsVersion()Lokhttp3/TlsVersion; Lokhttp3/Handshake$Companion; HSPLokhttp3/Handshake$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/Handshake$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/Handshake$Companion;->get(Ljavax/net/ssl/SSLSession;)Lokhttp3/Handshake; PLokhttp3/Handshake$Companion;->get(Ljavax/net/ssl/SSLSession;)Lokhttp3/Handshake; Lokhttp3/Handshake$Companion$handshake$1; HSPLokhttp3/Handshake$Companion$handshake$1;->(Ljava/util/List;)V PLokhttp3/Handshake$Companion$handshake$1;->(Ljava/util/List;)V HSPLokhttp3/Handshake$Companion$handshake$1;->invoke()Ljava/lang/Object; PLokhttp3/Handshake$Companion$handshake$1;->invoke()Ljava/lang/Object; Lokhttp3/Handshake$peerCertificates$2; HSPLokhttp3/Handshake$peerCertificates$2;->(Lkotlin/jvm/functions/Function0;)V PLokhttp3/Handshake$peerCertificates$2;->(Lkotlin/jvm/functions/Function0;)V HSPLokhttp3/Handshake$peerCertificates$2;->invoke()Ljava/lang/Object; PLokhttp3/Handshake$peerCertificates$2;->invoke()Ljava/lang/Object; HSPLokhttp3/Handshake$peerCertificates$2;->invoke()Ljava/util/List; PLokhttp3/Handshake$peerCertificates$2;->invoke()Ljava/util/List; Lokhttp3/Headers; HSPLokhttp3/Headers;->()V PLokhttp3/Headers;->()V HSPLokhttp3/Headers;->([Ljava/lang/String;)V PLokhttp3/Headers;->([Ljava/lang/String;)V HSPLokhttp3/Headers;->get(Ljava/lang/String;)Ljava/lang/String; PLokhttp3/Headers;->get(Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/Headers;->getNamesAndValues$okhttp()[Ljava/lang/String; PLokhttp3/Headers;->getNamesAndValues$okhttp()[Ljava/lang/String; HSPLokhttp3/Headers;->size()I PLokhttp3/Headers;->size()I HSPLokhttp3/Headers;->values(Ljava/lang/String;)Ljava/util/List; PLokhttp3/Headers;->values(Ljava/lang/String;)Ljava/util/List; Lokhttp3/Headers$Builder; HSPLokhttp3/Headers$Builder;->()V PLokhttp3/Headers$Builder;->()V HSPLokhttp3/Headers$Builder;->add(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/Headers$Builder;->add(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/Headers$Builder;->addLenient$okhttp(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/Headers$Builder;->addLenient$okhttp(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/Headers$Builder;->getNamesAndValues$okhttp()Ljava/util/List; PLokhttp3/Headers$Builder;->getNamesAndValues$okhttp()Ljava/util/List; HSPLokhttp3/Headers$Builder;->removeAll(Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/Headers$Builder;->removeAll(Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/Headers$Builder;->set(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/Headers$Builder;->set(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; Lokhttp3/Headers$Companion; HSPLokhttp3/Headers$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/Headers$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/Headers$Companion;->of([Ljava/lang/String;)Lokhttp3/Headers; PLokhttp3/Headers$Companion;->of([Ljava/lang/String;)Lokhttp3/Headers; Lokhttp3/HttpUrl; HSPLokhttp3/HttpUrl;->()V PLokhttp3/HttpUrl;->()V HSPLokhttp3/HttpUrl;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)V PLokhttp3/HttpUrl;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)V HSPLokhttp3/HttpUrl;->encodedFragment()Ljava/lang/String; PLokhttp3/HttpUrl;->encodedFragment()Ljava/lang/String; HSPLokhttp3/HttpUrl;->encodedPassword()Ljava/lang/String; PLokhttp3/HttpUrl;->encodedPassword()Ljava/lang/String; HSPLokhttp3/HttpUrl;->encodedPath()Ljava/lang/String; PLokhttp3/HttpUrl;->encodedPath()Ljava/lang/String; HSPLokhttp3/HttpUrl;->encodedPathSegments()Ljava/util/List; PLokhttp3/HttpUrl;->encodedPathSegments()Ljava/util/List; HSPLokhttp3/HttpUrl;->encodedQuery()Ljava/lang/String; PLokhttp3/HttpUrl;->encodedQuery()Ljava/lang/String; HSPLokhttp3/HttpUrl;->encodedUsername()Ljava/lang/String; PLokhttp3/HttpUrl;->encodedUsername()Ljava/lang/String; HSPLokhttp3/HttpUrl;->hashCode()I PLokhttp3/HttpUrl;->hashCode()I HSPLokhttp3/HttpUrl;->host()Ljava/lang/String; PLokhttp3/HttpUrl;->host()Ljava/lang/String; HSPLokhttp3/HttpUrl;->isHttps()Z PLokhttp3/HttpUrl;->isHttps()Z HSPLokhttp3/HttpUrl;->newBuilder()Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl;->newBuilder()Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl;->newBuilder(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl;->newBuilder(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl;->port()I PLokhttp3/HttpUrl;->port()I HSPLokhttp3/HttpUrl;->redact()Ljava/lang/String; PLokhttp3/HttpUrl;->redact()Ljava/lang/String; HSPLokhttp3/HttpUrl;->scheme()Ljava/lang/String; PLokhttp3/HttpUrl;->scheme()Ljava/lang/String; HSPLokhttp3/HttpUrl;->toString()Ljava/lang/String; PLokhttp3/HttpUrl;->toString()Ljava/lang/String; HSPLokhttp3/HttpUrl;->uri()Ljava/net/URI; PLokhttp3/HttpUrl;->uri()Ljava/net/URI; Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->()V PLokhttp3/HttpUrl$Builder;->()V HSPLokhttp3/HttpUrl$Builder;->()V PLokhttp3/HttpUrl$Builder;->()V HSPLokhttp3/HttpUrl$Builder;->build()Lokhttp3/HttpUrl; PLokhttp3/HttpUrl$Builder;->build()Lokhttp3/HttpUrl; HSPLokhttp3/HttpUrl$Builder;->encodedQuery(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->encodedQuery(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->getEncodedPathSegments$okhttp()Ljava/util/List; PLokhttp3/HttpUrl$Builder;->getEncodedPathSegments$okhttp()Ljava/util/List; HSPLokhttp3/HttpUrl$Builder;->host(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->host(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->isDot(Ljava/lang/String;)Z PLokhttp3/HttpUrl$Builder;->isDot(Ljava/lang/String;)Z HSPLokhttp3/HttpUrl$Builder;->isDotDot(Ljava/lang/String;)Z PLokhttp3/HttpUrl$Builder;->isDotDot(Ljava/lang/String;)Z HSPLokhttp3/HttpUrl$Builder;->parse$okhttp(Lokhttp3/HttpUrl;Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->parse$okhttp(Lokhttp3/HttpUrl;Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->password(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->password(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->port(I)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->port(I)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->push(Ljava/lang/String;IIZZ)V PLokhttp3/HttpUrl$Builder;->push(Ljava/lang/String;IIZZ)V HSPLokhttp3/HttpUrl$Builder;->reencodeForUri$okhttp()Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->reencodeForUri$okhttp()Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->resolvePath(IILjava/lang/String;)V PLokhttp3/HttpUrl$Builder;->resolvePath(IILjava/lang/String;)V HSPLokhttp3/HttpUrl$Builder;->scheme(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->scheme(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; HSPLokhttp3/HttpUrl$Builder;->setEncodedFragment$okhttp(Ljava/lang/String;)V PLokhttp3/HttpUrl$Builder;->setEncodedFragment$okhttp(Ljava/lang/String;)V HSPLokhttp3/HttpUrl$Builder;->setEncodedPassword$okhttp(Ljava/lang/String;)V PLokhttp3/HttpUrl$Builder;->setEncodedPassword$okhttp(Ljava/lang/String;)V HSPLokhttp3/HttpUrl$Builder;->setEncodedUsername$okhttp(Ljava/lang/String;)V PLokhttp3/HttpUrl$Builder;->setEncodedUsername$okhttp(Ljava/lang/String;)V HSPLokhttp3/HttpUrl$Builder;->setHost$okhttp(Ljava/lang/String;)V PLokhttp3/HttpUrl$Builder;->setHost$okhttp(Ljava/lang/String;)V HSPLokhttp3/HttpUrl$Builder;->setPort$okhttp(I)V PLokhttp3/HttpUrl$Builder;->setPort$okhttp(I)V HSPLokhttp3/HttpUrl$Builder;->setScheme$okhttp(Ljava/lang/String;)V PLokhttp3/HttpUrl$Builder;->setScheme$okhttp(Ljava/lang/String;)V HSPLokhttp3/HttpUrl$Builder;->toString()Ljava/lang/String; PLokhttp3/HttpUrl$Builder;->toString()Ljava/lang/String; HSPLokhttp3/HttpUrl$Builder;->username(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; PLokhttp3/HttpUrl$Builder;->username(Ljava/lang/String;)Lokhttp3/HttpUrl$Builder; Lokhttp3/HttpUrl$Builder$Companion; HSPLokhttp3/HttpUrl$Builder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/HttpUrl$Builder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/HttpUrl$Builder$Companion;->access$portColonOffset(Lokhttp3/HttpUrl$Builder$Companion;Ljava/lang/String;II)I PLokhttp3/HttpUrl$Builder$Companion;->access$portColonOffset(Lokhttp3/HttpUrl$Builder$Companion;Ljava/lang/String;II)I HSPLokhttp3/HttpUrl$Builder$Companion;->access$schemeDelimiterOffset(Lokhttp3/HttpUrl$Builder$Companion;Ljava/lang/String;II)I PLokhttp3/HttpUrl$Builder$Companion;->access$schemeDelimiterOffset(Lokhttp3/HttpUrl$Builder$Companion;Ljava/lang/String;II)I HSPLokhttp3/HttpUrl$Builder$Companion;->access$slashCount(Lokhttp3/HttpUrl$Builder$Companion;Ljava/lang/String;II)I PLokhttp3/HttpUrl$Builder$Companion;->access$slashCount(Lokhttp3/HttpUrl$Builder$Companion;Ljava/lang/String;II)I Lokhttp3/HttpUrl$Companion; HSPLokhttp3/HttpUrl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/HttpUrl$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/HttpUrl$Companion;->canonicalize$okhttp$default(Lokhttp3/HttpUrl$Companion;Ljava/lang/String;IILjava/lang/String;ZZZZLjava/nio/charset/Charset;ILjava/lang/Object;)Ljava/lang/String; PLokhttp3/HttpUrl$Companion;->canonicalize$okhttp$default(Lokhttp3/HttpUrl$Companion;Ljava/lang/String;IILjava/lang/String;ZZZZLjava/nio/charset/Charset;ILjava/lang/Object;)Ljava/lang/String; HSPLokhttp3/HttpUrl$Companion;->canonicalize$okhttp(Ljava/lang/String;IILjava/lang/String;ZZZZLjava/nio/charset/Charset;)Ljava/lang/String; PLokhttp3/HttpUrl$Companion;->canonicalize$okhttp(Ljava/lang/String;IILjava/lang/String;ZZZZLjava/nio/charset/Charset;)Ljava/lang/String; HSPLokhttp3/HttpUrl$Companion;->defaultPort(Ljava/lang/String;)I PLokhttp3/HttpUrl$Companion;->defaultPort(Ljava/lang/String;)I HSPLokhttp3/HttpUrl$Companion;->get(Ljava/lang/String;)Lokhttp3/HttpUrl; PLokhttp3/HttpUrl$Companion;->get(Ljava/lang/String;)Lokhttp3/HttpUrl; HSPLokhttp3/HttpUrl$Companion;->percentDecode$okhttp$default(Lokhttp3/HttpUrl$Companion;Ljava/lang/String;IIZILjava/lang/Object;)Ljava/lang/String; PLokhttp3/HttpUrl$Companion;->percentDecode$okhttp$default(Lokhttp3/HttpUrl$Companion;Ljava/lang/String;IIZILjava/lang/Object;)Ljava/lang/String; HSPLokhttp3/HttpUrl$Companion;->percentDecode$okhttp(Ljava/lang/String;IIZ)Ljava/lang/String; PLokhttp3/HttpUrl$Companion;->percentDecode$okhttp(Ljava/lang/String;IIZ)Ljava/lang/String; HSPLokhttp3/HttpUrl$Companion;->toPathString$okhttp(Ljava/util/List;Ljava/lang/StringBuilder;)V PLokhttp3/HttpUrl$Companion;->toPathString$okhttp(Ljava/util/List;Ljava/lang/StringBuilder;)V Lokhttp3/Interceptor; Lokhttp3/Interceptor$Chain; Lokhttp3/MediaType; HSPLokhttp3/MediaType;->()V PLokhttp3/MediaType;->()V HSPLokhttp3/MediaType;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V PLokhttp3/MediaType;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V Lokhttp3/MediaType$Companion; HSPLokhttp3/MediaType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/MediaType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/MediaType$Companion;->get(Ljava/lang/String;)Lokhttp3/MediaType; PLokhttp3/MediaType$Companion;->get(Ljava/lang/String;)Lokhttp3/MediaType; HSPLokhttp3/MediaType$Companion;->parse(Ljava/lang/String;)Lokhttp3/MediaType; PLokhttp3/MediaType$Companion;->parse(Ljava/lang/String;)Lokhttp3/MediaType; Lokhttp3/OkHttpClient; HSPLokhttp3/OkHttpClient;->()V PLokhttp3/OkHttpClient;->()V HSPLokhttp3/OkHttpClient;->(Lokhttp3/OkHttpClient$Builder;)V PLokhttp3/OkHttpClient;->(Lokhttp3/OkHttpClient$Builder;)V HSPLokhttp3/OkHttpClient;->access$getDEFAULT_CONNECTION_SPECS$cp()Ljava/util/List; PLokhttp3/OkHttpClient;->access$getDEFAULT_CONNECTION_SPECS$cp()Ljava/util/List; HSPLokhttp3/OkHttpClient;->access$getDEFAULT_PROTOCOLS$cp()Ljava/util/List; PLokhttp3/OkHttpClient;->access$getDEFAULT_PROTOCOLS$cp()Ljava/util/List; HSPLokhttp3/OkHttpClient;->access$getSslSocketFactoryOrNull$p(Lokhttp3/OkHttpClient;)Ljavax/net/ssl/SSLSocketFactory; PLokhttp3/OkHttpClient;->access$getSslSocketFactoryOrNull$p(Lokhttp3/OkHttpClient;)Ljavax/net/ssl/SSLSocketFactory; HSPLokhttp3/OkHttpClient;->authenticator()Lokhttp3/Authenticator; PLokhttp3/OkHttpClient;->authenticator()Lokhttp3/Authenticator; HSPLokhttp3/OkHttpClient;->cache()Lokhttp3/Cache; PLokhttp3/OkHttpClient;->cache()Lokhttp3/Cache; HSPLokhttp3/OkHttpClient;->callTimeoutMillis()I PLokhttp3/OkHttpClient;->callTimeoutMillis()I HSPLokhttp3/OkHttpClient;->certificateChainCleaner()Lokhttp3/internal/tls/CertificateChainCleaner; PLokhttp3/OkHttpClient;->certificateChainCleaner()Lokhttp3/internal/tls/CertificateChainCleaner; HSPLokhttp3/OkHttpClient;->certificatePinner()Lokhttp3/CertificatePinner; PLokhttp3/OkHttpClient;->certificatePinner()Lokhttp3/CertificatePinner; HSPLokhttp3/OkHttpClient;->connectTimeoutMillis()I PLokhttp3/OkHttpClient;->connectTimeoutMillis()I HSPLokhttp3/OkHttpClient;->connectionPool()Lokhttp3/ConnectionPool; PLokhttp3/OkHttpClient;->connectionPool()Lokhttp3/ConnectionPool; HSPLokhttp3/OkHttpClient;->connectionSpecs()Ljava/util/List; PLokhttp3/OkHttpClient;->connectionSpecs()Ljava/util/List; HSPLokhttp3/OkHttpClient;->cookieJar()Lokhttp3/CookieJar; PLokhttp3/OkHttpClient;->cookieJar()Lokhttp3/CookieJar; HSPLokhttp3/OkHttpClient;->dispatcher()Lokhttp3/Dispatcher; PLokhttp3/OkHttpClient;->dispatcher()Lokhttp3/Dispatcher; HSPLokhttp3/OkHttpClient;->dns()Lokhttp3/Dns; PLokhttp3/OkHttpClient;->dns()Lokhttp3/Dns; HSPLokhttp3/OkHttpClient;->eventListenerFactory()Lokhttp3/EventListener$Factory; PLokhttp3/OkHttpClient;->eventListenerFactory()Lokhttp3/EventListener$Factory; HSPLokhttp3/OkHttpClient;->fastFallback()Z PLokhttp3/OkHttpClient;->fastFallback()Z HSPLokhttp3/OkHttpClient;->followRedirects()Z PLokhttp3/OkHttpClient;->followRedirects()Z HSPLokhttp3/OkHttpClient;->followSslRedirects()Z PLokhttp3/OkHttpClient;->followSslRedirects()Z HSPLokhttp3/OkHttpClient;->getRouteDatabase$okhttp()Lokhttp3/internal/connection/RouteDatabase; PLokhttp3/OkHttpClient;->getRouteDatabase$okhttp()Lokhttp3/internal/connection/RouteDatabase; HSPLokhttp3/OkHttpClient;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; PLokhttp3/OkHttpClient;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; HSPLokhttp3/OkHttpClient;->hostnameVerifier()Ljavax/net/ssl/HostnameVerifier; PLokhttp3/OkHttpClient;->hostnameVerifier()Ljavax/net/ssl/HostnameVerifier; HSPLokhttp3/OkHttpClient;->interceptors()Ljava/util/List; PLokhttp3/OkHttpClient;->interceptors()Ljava/util/List; HSPLokhttp3/OkHttpClient;->minWebSocketMessageToCompress()J PLokhttp3/OkHttpClient;->minWebSocketMessageToCompress()J HSPLokhttp3/OkHttpClient;->networkInterceptors()Ljava/util/List; PLokhttp3/OkHttpClient;->networkInterceptors()Ljava/util/List; HSPLokhttp3/OkHttpClient;->newCall(Lokhttp3/Request;)Lokhttp3/Call; PLokhttp3/OkHttpClient;->newCall(Lokhttp3/Request;)Lokhttp3/Call; HSPLokhttp3/OkHttpClient;->pingIntervalMillis()I PLokhttp3/OkHttpClient;->pingIntervalMillis()I HSPLokhttp3/OkHttpClient;->protocols()Ljava/util/List; PLokhttp3/OkHttpClient;->protocols()Ljava/util/List; HSPLokhttp3/OkHttpClient;->proxy()Ljava/net/Proxy; PLokhttp3/OkHttpClient;->proxy()Ljava/net/Proxy; HSPLokhttp3/OkHttpClient;->proxyAuthenticator()Lokhttp3/Authenticator; PLokhttp3/OkHttpClient;->proxyAuthenticator()Lokhttp3/Authenticator; HSPLokhttp3/OkHttpClient;->proxySelector()Ljava/net/ProxySelector; PLokhttp3/OkHttpClient;->proxySelector()Ljava/net/ProxySelector; HSPLokhttp3/OkHttpClient;->readTimeoutMillis()I PLokhttp3/OkHttpClient;->readTimeoutMillis()I HSPLokhttp3/OkHttpClient;->retryOnConnectionFailure()Z PLokhttp3/OkHttpClient;->retryOnConnectionFailure()Z HSPLokhttp3/OkHttpClient;->socketFactory()Ljavax/net/SocketFactory; PLokhttp3/OkHttpClient;->socketFactory()Ljavax/net/SocketFactory; HSPLokhttp3/OkHttpClient;->sslSocketFactory()Ljavax/net/ssl/SSLSocketFactory; PLokhttp3/OkHttpClient;->sslSocketFactory()Ljavax/net/ssl/SSLSocketFactory; HSPLokhttp3/OkHttpClient;->writeTimeoutMillis()I PLokhttp3/OkHttpClient;->writeTimeoutMillis()I HSPLokhttp3/OkHttpClient;->x509TrustManager()Ljavax/net/ssl/X509TrustManager; PLokhttp3/OkHttpClient;->x509TrustManager()Ljavax/net/ssl/X509TrustManager; Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->()V PLokhttp3/OkHttpClient$Builder;->()V HSPLokhttp3/OkHttpClient$Builder;->(Lokhttp3/OkHttpClient;)V PLokhttp3/OkHttpClient$Builder;->(Lokhttp3/OkHttpClient;)V HSPLokhttp3/OkHttpClient$Builder;->addInterceptor(Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->addInterceptor(Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->addNetworkInterceptor(Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->addNetworkInterceptor(Lokhttp3/Interceptor;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->cache(Lokhttp3/Cache;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->cache(Lokhttp3/Cache;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->callTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->callTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->connectTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->connectTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->cookieJar(Lokhttp3/CookieJar;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->cookieJar(Lokhttp3/CookieJar;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->dns(Lokhttp3/Dns;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->dns(Lokhttp3/Dns;)Lokhttp3/OkHttpClient$Builder; HSPLokhttp3/OkHttpClient$Builder;->getAuthenticator$okhttp()Lokhttp3/Authenticator; PLokhttp3/OkHttpClient$Builder;->getAuthenticator$okhttp()Lokhttp3/Authenticator; HSPLokhttp3/OkHttpClient$Builder;->getCache$okhttp()Lokhttp3/Cache; PLokhttp3/OkHttpClient$Builder;->getCache$okhttp()Lokhttp3/Cache; HSPLokhttp3/OkHttpClient$Builder;->getCallTimeout$okhttp()I PLokhttp3/OkHttpClient$Builder;->getCallTimeout$okhttp()I HSPLokhttp3/OkHttpClient$Builder;->getCertificateChainCleaner$okhttp()Lokhttp3/internal/tls/CertificateChainCleaner; PLokhttp3/OkHttpClient$Builder;->getCertificateChainCleaner$okhttp()Lokhttp3/internal/tls/CertificateChainCleaner; HSPLokhttp3/OkHttpClient$Builder;->getCertificatePinner$okhttp()Lokhttp3/CertificatePinner; PLokhttp3/OkHttpClient$Builder;->getCertificatePinner$okhttp()Lokhttp3/CertificatePinner; HSPLokhttp3/OkHttpClient$Builder;->getConnectTimeout$okhttp()I PLokhttp3/OkHttpClient$Builder;->getConnectTimeout$okhttp()I HSPLokhttp3/OkHttpClient$Builder;->getConnectionPool$okhttp()Lokhttp3/ConnectionPool; PLokhttp3/OkHttpClient$Builder;->getConnectionPool$okhttp()Lokhttp3/ConnectionPool; HSPLokhttp3/OkHttpClient$Builder;->getConnectionSpecs$okhttp()Ljava/util/List; PLokhttp3/OkHttpClient$Builder;->getConnectionSpecs$okhttp()Ljava/util/List; HSPLokhttp3/OkHttpClient$Builder;->getCookieJar$okhttp()Lokhttp3/CookieJar; PLokhttp3/OkHttpClient$Builder;->getCookieJar$okhttp()Lokhttp3/CookieJar; HSPLokhttp3/OkHttpClient$Builder;->getDispatcher$okhttp()Lokhttp3/Dispatcher; PLokhttp3/OkHttpClient$Builder;->getDispatcher$okhttp()Lokhttp3/Dispatcher; HSPLokhttp3/OkHttpClient$Builder;->getDns$okhttp()Lokhttp3/Dns; PLokhttp3/OkHttpClient$Builder;->getDns$okhttp()Lokhttp3/Dns; HSPLokhttp3/OkHttpClient$Builder;->getEventListenerFactory$okhttp()Lokhttp3/EventListener$Factory; PLokhttp3/OkHttpClient$Builder;->getEventListenerFactory$okhttp()Lokhttp3/EventListener$Factory; HSPLokhttp3/OkHttpClient$Builder;->getFastFallback$okhttp()Z PLokhttp3/OkHttpClient$Builder;->getFastFallback$okhttp()Z HSPLokhttp3/OkHttpClient$Builder;->getFollowRedirects$okhttp()Z PLokhttp3/OkHttpClient$Builder;->getFollowRedirects$okhttp()Z HSPLokhttp3/OkHttpClient$Builder;->getFollowSslRedirects$okhttp()Z PLokhttp3/OkHttpClient$Builder;->getFollowSslRedirects$okhttp()Z HSPLokhttp3/OkHttpClient$Builder;->getHostnameVerifier$okhttp()Ljavax/net/ssl/HostnameVerifier; PLokhttp3/OkHttpClient$Builder;->getHostnameVerifier$okhttp()Ljavax/net/ssl/HostnameVerifier; HSPLokhttp3/OkHttpClient$Builder;->getInterceptors$okhttp()Ljava/util/List; PLokhttp3/OkHttpClient$Builder;->getInterceptors$okhttp()Ljava/util/List; HSPLokhttp3/OkHttpClient$Builder;->getMinWebSocketMessageToCompress$okhttp()J PLokhttp3/OkHttpClient$Builder;->getMinWebSocketMessageToCompress$okhttp()J HSPLokhttp3/OkHttpClient$Builder;->getNetworkInterceptors$okhttp()Ljava/util/List; PLokhttp3/OkHttpClient$Builder;->getNetworkInterceptors$okhttp()Ljava/util/List; HSPLokhttp3/OkHttpClient$Builder;->getPingInterval$okhttp()I PLokhttp3/OkHttpClient$Builder;->getPingInterval$okhttp()I HSPLokhttp3/OkHttpClient$Builder;->getProtocols$okhttp()Ljava/util/List; PLokhttp3/OkHttpClient$Builder;->getProtocols$okhttp()Ljava/util/List; HSPLokhttp3/OkHttpClient$Builder;->getProxy$okhttp()Ljava/net/Proxy; PLokhttp3/OkHttpClient$Builder;->getProxy$okhttp()Ljava/net/Proxy; HSPLokhttp3/OkHttpClient$Builder;->getProxyAuthenticator$okhttp()Lokhttp3/Authenticator; PLokhttp3/OkHttpClient$Builder;->getProxyAuthenticator$okhttp()Lokhttp3/Authenticator; HSPLokhttp3/OkHttpClient$Builder;->getProxySelector$okhttp()Ljava/net/ProxySelector; PLokhttp3/OkHttpClient$Builder;->getProxySelector$okhttp()Ljava/net/ProxySelector; HSPLokhttp3/OkHttpClient$Builder;->getReadTimeout$okhttp()I PLokhttp3/OkHttpClient$Builder;->getReadTimeout$okhttp()I HSPLokhttp3/OkHttpClient$Builder;->getRetryOnConnectionFailure$okhttp()Z PLokhttp3/OkHttpClient$Builder;->getRetryOnConnectionFailure$okhttp()Z HSPLokhttp3/OkHttpClient$Builder;->getRouteDatabase$okhttp()Lokhttp3/internal/connection/RouteDatabase; PLokhttp3/OkHttpClient$Builder;->getRouteDatabase$okhttp()Lokhttp3/internal/connection/RouteDatabase; HSPLokhttp3/OkHttpClient$Builder;->getSocketFactory$okhttp()Ljavax/net/SocketFactory; PLokhttp3/OkHttpClient$Builder;->getSocketFactory$okhttp()Ljavax/net/SocketFactory; HSPLokhttp3/OkHttpClient$Builder;->getSslSocketFactoryOrNull$okhttp()Ljavax/net/ssl/SSLSocketFactory; PLokhttp3/OkHttpClient$Builder;->getSslSocketFactoryOrNull$okhttp()Ljavax/net/ssl/SSLSocketFactory; HSPLokhttp3/OkHttpClient$Builder;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; PLokhttp3/OkHttpClient$Builder;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; HSPLokhttp3/OkHttpClient$Builder;->getWriteTimeout$okhttp()I PLokhttp3/OkHttpClient$Builder;->getWriteTimeout$okhttp()I HSPLokhttp3/OkHttpClient$Builder;->getX509TrustManagerOrNull$okhttp()Ljavax/net/ssl/X509TrustManager; PLokhttp3/OkHttpClient$Builder;->getX509TrustManagerOrNull$okhttp()Ljavax/net/ssl/X509TrustManager; HSPLokhttp3/OkHttpClient$Builder;->readTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; PLokhttp3/OkHttpClient$Builder;->readTimeout(JLjava/util/concurrent/TimeUnit;)Lokhttp3/OkHttpClient$Builder; Lokhttp3/OkHttpClient$Companion; HSPLokhttp3/OkHttpClient$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/OkHttpClient$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/Protocol; HSPLokhttp3/Protocol;->()V PLokhttp3/Protocol;->()V HSPLokhttp3/Protocol;->(Ljava/lang/String;ILjava/lang/String;)V PLokhttp3/Protocol;->(Ljava/lang/String;ILjava/lang/String;)V HSPLokhttp3/Protocol;->access$getProtocol$p(Lokhttp3/Protocol;)Ljava/lang/String; PLokhttp3/Protocol;->access$getProtocol$p(Lokhttp3/Protocol;)Ljava/lang/String; HSPLokhttp3/Protocol;->toString()Ljava/lang/String; PLokhttp3/Protocol;->toString()Ljava/lang/String; Lokhttp3/Protocol$Companion; HSPLokhttp3/Protocol$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/Protocol$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/Protocol$Companion;->get(Ljava/lang/String;)Lokhttp3/Protocol; PLokhttp3/Protocol$Companion;->get(Ljava/lang/String;)Lokhttp3/Protocol; Lokhttp3/Request; HSPLokhttp3/Request;->(Lokhttp3/Request$Builder;)V PLokhttp3/Request;->(Lokhttp3/Request$Builder;)V HSPLokhttp3/Request;->body()Lokhttp3/RequestBody; PLokhttp3/Request;->body()Lokhttp3/RequestBody; HSPLokhttp3/Request;->cacheControl()Lokhttp3/CacheControl; PLokhttp3/Request;->cacheControl()Lokhttp3/CacheControl; HSPLokhttp3/Request;->getTags$okhttp()Ljava/util/Map; PLokhttp3/Request;->getTags$okhttp()Ljava/util/Map; HSPLokhttp3/Request;->header(Ljava/lang/String;)Ljava/lang/String; PLokhttp3/Request;->header(Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/Request;->headers()Lokhttp3/Headers; PLokhttp3/Request;->headers()Lokhttp3/Headers; HSPLokhttp3/Request;->method()Ljava/lang/String; PLokhttp3/Request;->method()Ljava/lang/String; HSPLokhttp3/Request;->url()Lokhttp3/HttpUrl; PLokhttp3/Request;->url()Lokhttp3/HttpUrl; Lokhttp3/Request$Builder; HSPLokhttp3/Request$Builder;->()V PLokhttp3/Request$Builder;->()V HSPLokhttp3/Request$Builder;->(Lokhttp3/Request;)V PLokhttp3/Request$Builder;->(Lokhttp3/Request;)V HSPLokhttp3/Request$Builder;->addHeader(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; PLokhttp3/Request$Builder;->addHeader(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; HSPLokhttp3/Request$Builder;->cacheControl(Lokhttp3/CacheControl;)Lokhttp3/Request$Builder; PLokhttp3/Request$Builder;->cacheControl(Lokhttp3/CacheControl;)Lokhttp3/Request$Builder; HSPLokhttp3/Request$Builder;->getBody$okhttp()Lokhttp3/RequestBody; PLokhttp3/Request$Builder;->getBody$okhttp()Lokhttp3/RequestBody; HSPLokhttp3/Request$Builder;->getHeaders$okhttp()Lokhttp3/Headers$Builder; PLokhttp3/Request$Builder;->getHeaders$okhttp()Lokhttp3/Headers$Builder; HSPLokhttp3/Request$Builder;->getMethod$okhttp()Ljava/lang/String; PLokhttp3/Request$Builder;->getMethod$okhttp()Ljava/lang/String; HSPLokhttp3/Request$Builder;->getTags$okhttp()Ljava/util/Map; PLokhttp3/Request$Builder;->getTags$okhttp()Ljava/util/Map; HSPLokhttp3/Request$Builder;->getUrl$okhttp()Lokhttp3/HttpUrl; PLokhttp3/Request$Builder;->getUrl$okhttp()Lokhttp3/HttpUrl; HSPLokhttp3/Request$Builder;->header(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; PLokhttp3/Request$Builder;->header(Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; HSPLokhttp3/Request$Builder;->headers(Lokhttp3/Headers;)Lokhttp3/Request$Builder; PLokhttp3/Request$Builder;->headers(Lokhttp3/Headers;)Lokhttp3/Request$Builder; HSPLokhttp3/Request$Builder;->removeHeader(Ljava/lang/String;)Lokhttp3/Request$Builder; PLokhttp3/Request$Builder;->removeHeader(Ljava/lang/String;)Lokhttp3/Request$Builder; HSPLokhttp3/Request$Builder;->setHeaders$okhttp(Lokhttp3/Headers$Builder;)V PLokhttp3/Request$Builder;->setHeaders$okhttp(Lokhttp3/Headers$Builder;)V HSPLokhttp3/Request$Builder;->url(Lokhttp3/HttpUrl;)Lokhttp3/Request$Builder; PLokhttp3/Request$Builder;->url(Lokhttp3/HttpUrl;)Lokhttp3/Request$Builder; Lokhttp3/RequestBody; HSPLokhttp3/RequestBody;->()V PLokhttp3/RequestBody;->()V HSPLokhttp3/RequestBody;->()V PLokhttp3/RequestBody;->()V Lokhttp3/RequestBody$Companion; HSPLokhttp3/RequestBody$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/RequestBody$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/RequestBody$Companion;->create$default(Lokhttp3/RequestBody$Companion;[BLokhttp3/MediaType;IIILjava/lang/Object;)Lokhttp3/RequestBody; PLokhttp3/RequestBody$Companion;->create$default(Lokhttp3/RequestBody$Companion;[BLokhttp3/MediaType;IIILjava/lang/Object;)Lokhttp3/RequestBody; HSPLokhttp3/RequestBody$Companion;->create([BLokhttp3/MediaType;II)Lokhttp3/RequestBody; PLokhttp3/RequestBody$Companion;->create([BLokhttp3/MediaType;II)Lokhttp3/RequestBody; Lokhttp3/Response; HSPLokhttp3/Response;->(Lokhttp3/Request;Lokhttp3/Protocol;Ljava/lang/String;ILokhttp3/Handshake;Lokhttp3/Headers;Lokhttp3/ResponseBody;Lokhttp3/Response;Lokhttp3/Response;Lokhttp3/Response;JJLokhttp3/internal/connection/Exchange;Lkotlin/jvm/functions/Function0;)V PLokhttp3/Response;->(Lokhttp3/Request;Lokhttp3/Protocol;Ljava/lang/String;ILokhttp3/Handshake;Lokhttp3/Headers;Lokhttp3/ResponseBody;Lokhttp3/Response;Lokhttp3/Response;Lokhttp3/Response;JJLokhttp3/internal/connection/Exchange;Lkotlin/jvm/functions/Function0;)V HSPLokhttp3/Response;->access$getTrailersFn$p(Lokhttp3/Response;)Lkotlin/jvm/functions/Function0; PLokhttp3/Response;->access$getTrailersFn$p(Lokhttp3/Response;)Lkotlin/jvm/functions/Function0; HSPLokhttp3/Response;->body()Lokhttp3/ResponseBody; PLokhttp3/Response;->body()Lokhttp3/ResponseBody; HSPLokhttp3/Response;->cacheResponse()Lokhttp3/Response; PLokhttp3/Response;->cacheResponse()Lokhttp3/Response; HSPLokhttp3/Response;->code()I PLokhttp3/Response;->code()I HSPLokhttp3/Response;->exchange()Lokhttp3/internal/connection/Exchange; PLokhttp3/Response;->exchange()Lokhttp3/internal/connection/Exchange; HSPLokhttp3/Response;->getLazyCacheControl$okhttp()Lokhttp3/CacheControl; PLokhttp3/Response;->getLazyCacheControl$okhttp()Lokhttp3/CacheControl; HSPLokhttp3/Response;->handshake()Lokhttp3/Handshake; PLokhttp3/Response;->handshake()Lokhttp3/Handshake; HSPLokhttp3/Response;->header$default(Lokhttp3/Response;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; PLokhttp3/Response;->header$default(Lokhttp3/Response;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; HSPLokhttp3/Response;->header(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLokhttp3/Response;->header(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/Response;->headers()Lokhttp3/Headers; PLokhttp3/Response;->headers()Lokhttp3/Headers; HSPLokhttp3/Response;->isSuccessful()Z PLokhttp3/Response;->isSuccessful()Z HSPLokhttp3/Response;->message()Ljava/lang/String; PLokhttp3/Response;->message()Ljava/lang/String; HSPLokhttp3/Response;->networkResponse()Lokhttp3/Response; PLokhttp3/Response;->networkResponse()Lokhttp3/Response; HSPLokhttp3/Response;->priorResponse()Lokhttp3/Response; PLokhttp3/Response;->priorResponse()Lokhttp3/Response; HSPLokhttp3/Response;->protocol()Lokhttp3/Protocol; PLokhttp3/Response;->protocol()Lokhttp3/Protocol; HSPLokhttp3/Response;->receivedResponseAtMillis()J PLokhttp3/Response;->receivedResponseAtMillis()J HSPLokhttp3/Response;->request()Lokhttp3/Request; PLokhttp3/Response;->request()Lokhttp3/Request; HSPLokhttp3/Response;->sentRequestAtMillis()J PLokhttp3/Response;->sentRequestAtMillis()J HSPLokhttp3/Response;->setLazyCacheControl$okhttp(Lokhttp3/CacheControl;)V PLokhttp3/Response;->setLazyCacheControl$okhttp(Lokhttp3/CacheControl;)V Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->()V PLokhttp3/Response$Builder;->()V HSPLokhttp3/Response$Builder;->(Lokhttp3/Response;)V PLokhttp3/Response$Builder;->(Lokhttp3/Response;)V HSPLokhttp3/Response$Builder;->body(Lokhttp3/ResponseBody;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->body(Lokhttp3/ResponseBody;)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->build()Lokhttp3/Response; PLokhttp3/Response$Builder;->build()Lokhttp3/Response; HSPLokhttp3/Response$Builder;->handshake(Lokhttp3/Handshake;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->handshake(Lokhttp3/Handshake;)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->headers(Lokhttp3/Headers;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->headers(Lokhttp3/Headers;)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->initExchange$okhttp(Lokhttp3/internal/connection/Exchange;)V PLokhttp3/Response$Builder;->initExchange$okhttp(Lokhttp3/internal/connection/Exchange;)V HSPLokhttp3/Response$Builder;->message(Ljava/lang/String;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->message(Ljava/lang/String;)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->protocol(Lokhttp3/Protocol;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->protocol(Lokhttp3/Protocol;)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->receivedResponseAtMillis(J)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->receivedResponseAtMillis(J)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->request(Lokhttp3/Request;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->request(Lokhttp3/Request;)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->sentRequestAtMillis(J)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->sentRequestAtMillis(J)Lokhttp3/Response$Builder; HSPLokhttp3/Response$Builder;->setBody$okhttp(Lokhttp3/ResponseBody;)V PLokhttp3/Response$Builder;->setBody$okhttp(Lokhttp3/ResponseBody;)V HSPLokhttp3/Response$Builder;->setCacheResponse$okhttp(Lokhttp3/Response;)V PLokhttp3/Response$Builder;->setCacheResponse$okhttp(Lokhttp3/Response;)V HSPLokhttp3/Response$Builder;->setCode$okhttp(I)V PLokhttp3/Response$Builder;->setCode$okhttp(I)V HSPLokhttp3/Response$Builder;->setHeaders$okhttp(Lokhttp3/Headers$Builder;)V PLokhttp3/Response$Builder;->setHeaders$okhttp(Lokhttp3/Headers$Builder;)V HSPLokhttp3/Response$Builder;->setMessage$okhttp(Ljava/lang/String;)V PLokhttp3/Response$Builder;->setMessage$okhttp(Ljava/lang/String;)V HSPLokhttp3/Response$Builder;->setNetworkResponse$okhttp(Lokhttp3/Response;)V PLokhttp3/Response$Builder;->setNetworkResponse$okhttp(Lokhttp3/Response;)V HSPLokhttp3/Response$Builder;->setPriorResponse$okhttp(Lokhttp3/Response;)V PLokhttp3/Response$Builder;->setPriorResponse$okhttp(Lokhttp3/Response;)V HSPLokhttp3/Response$Builder;->setProtocol$okhttp(Lokhttp3/Protocol;)V PLokhttp3/Response$Builder;->setProtocol$okhttp(Lokhttp3/Protocol;)V HSPLokhttp3/Response$Builder;->setRequest$okhttp(Lokhttp3/Request;)V PLokhttp3/Response$Builder;->setRequest$okhttp(Lokhttp3/Request;)V HSPLokhttp3/Response$Builder;->setTrailersFn$okhttp(Lkotlin/jvm/functions/Function0;)V PLokhttp3/Response$Builder;->setTrailersFn$okhttp(Lkotlin/jvm/functions/Function0;)V HSPLokhttp3/Response$Builder;->trailers(Lkotlin/jvm/functions/Function0;)Lokhttp3/Response$Builder; PLokhttp3/Response$Builder;->trailers(Lkotlin/jvm/functions/Function0;)Lokhttp3/Response$Builder; Lokhttp3/Response$Builder$initExchange$1; HSPLokhttp3/Response$Builder$initExchange$1;->(Lokhttp3/internal/connection/Exchange;)V PLokhttp3/Response$Builder$initExchange$1;->(Lokhttp3/internal/connection/Exchange;)V Lokhttp3/Response$Builder$trailersFn$1; HSPLokhttp3/Response$Builder$trailersFn$1;->()V PLokhttp3/Response$Builder$trailersFn$1;->()V HSPLokhttp3/Response$Builder$trailersFn$1;->()V PLokhttp3/Response$Builder$trailersFn$1;->()V Lokhttp3/ResponseBody; HSPLokhttp3/ResponseBody;->()V PLokhttp3/ResponseBody;->()V HSPLokhttp3/ResponseBody;->()V PLokhttp3/ResponseBody;->()V Lokhttp3/ResponseBody$Companion; HSPLokhttp3/ResponseBody$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/ResponseBody$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/ResponseBody$Companion;->create$default(Lokhttp3/ResponseBody$Companion;[BLokhttp3/MediaType;ILjava/lang/Object;)Lokhttp3/ResponseBody; PLokhttp3/ResponseBody$Companion;->create$default(Lokhttp3/ResponseBody$Companion;[BLokhttp3/MediaType;ILjava/lang/Object;)Lokhttp3/ResponseBody; HSPLokhttp3/ResponseBody$Companion;->create(Lokio/BufferedSource;Lokhttp3/MediaType;J)Lokhttp3/ResponseBody; PLokhttp3/ResponseBody$Companion;->create(Lokio/BufferedSource;Lokhttp3/MediaType;J)Lokhttp3/ResponseBody; HSPLokhttp3/ResponseBody$Companion;->create([BLokhttp3/MediaType;)Lokhttp3/ResponseBody; PLokhttp3/ResponseBody$Companion;->create([BLokhttp3/MediaType;)Lokhttp3/ResponseBody; Lokhttp3/Route; HSPLokhttp3/Route;->(Lokhttp3/Address;Ljava/net/Proxy;Ljava/net/InetSocketAddress;)V PLokhttp3/Route;->(Lokhttp3/Address;Ljava/net/Proxy;Ljava/net/InetSocketAddress;)V HSPLokhttp3/Route;->address()Lokhttp3/Address; PLokhttp3/Route;->address()Lokhttp3/Address; HSPLokhttp3/Route;->hashCode()I PLokhttp3/Route;->hashCode()I HSPLokhttp3/Route;->proxy()Ljava/net/Proxy; PLokhttp3/Route;->proxy()Ljava/net/Proxy; HSPLokhttp3/Route;->requiresTunnel()Z PLokhttp3/Route;->requiresTunnel()Z HSPLokhttp3/Route;->socketAddress()Ljava/net/InetSocketAddress; PLokhttp3/Route;->socketAddress()Ljava/net/InetSocketAddress; Lokhttp3/TlsVersion; HSPLokhttp3/TlsVersion;->()V PLokhttp3/TlsVersion;->()V HSPLokhttp3/TlsVersion;->(Ljava/lang/String;ILjava/lang/String;)V PLokhttp3/TlsVersion;->(Ljava/lang/String;ILjava/lang/String;)V HSPLokhttp3/TlsVersion;->javaName()Ljava/lang/String; PLokhttp3/TlsVersion;->javaName()Ljava/lang/String; Lokhttp3/TlsVersion$Companion; HSPLokhttp3/TlsVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/TlsVersion$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/TlsVersion$Companion;->forJavaName(Ljava/lang/String;)Lokhttp3/TlsVersion; PLokhttp3/TlsVersion$Companion;->forJavaName(Ljava/lang/String;)Lokhttp3/TlsVersion; Lokhttp3/WebSocket$Factory; Lokhttp3/internal/Internal; HSPLokhttp3/internal/Internal;->effectiveCipherSuites(Lokhttp3/ConnectionSpec;[Ljava/lang/String;)[Ljava/lang/String; PLokhttp3/internal/Internal;->effectiveCipherSuites(Lokhttp3/ConnectionSpec;[Ljava/lang/String;)[Ljava/lang/String; Lokhttp3/internal/UnreadableResponseBody; HSPLokhttp3/internal/UnreadableResponseBody;->(Lokhttp3/MediaType;J)V PLokhttp3/internal/UnreadableResponseBody;->(Lokhttp3/MediaType;J)V Lokhttp3/internal/_CacheControlCommonKt; HSPLokhttp3/internal/_CacheControlCommonKt;->commonBuild(Lokhttp3/CacheControl$Builder;)Lokhttp3/CacheControl; PLokhttp3/internal/_CacheControlCommonKt;->commonBuild(Lokhttp3/CacheControl$Builder;)Lokhttp3/CacheControl; HSPLokhttp3/internal/_CacheControlCommonKt;->commonClampToInt(J)I PLokhttp3/internal/_CacheControlCommonKt;->commonClampToInt(J)I HSPLokhttp3/internal/_CacheControlCommonKt;->commonForceCache(Lokhttp3/CacheControl$Companion;)Lokhttp3/CacheControl; PLokhttp3/internal/_CacheControlCommonKt;->commonForceCache(Lokhttp3/CacheControl$Companion;)Lokhttp3/CacheControl; HSPLokhttp3/internal/_CacheControlCommonKt;->commonForceNetwork(Lokhttp3/CacheControl$Companion;)Lokhttp3/CacheControl; PLokhttp3/internal/_CacheControlCommonKt;->commonForceNetwork(Lokhttp3/CacheControl$Companion;)Lokhttp3/CacheControl; HSPLokhttp3/internal/_CacheControlCommonKt;->commonMaxStale(Lokhttp3/CacheControl$Builder;ILkotlin/time/DurationUnit;)Lokhttp3/CacheControl$Builder; PLokhttp3/internal/_CacheControlCommonKt;->commonMaxStale(Lokhttp3/CacheControl$Builder;ILkotlin/time/DurationUnit;)Lokhttp3/CacheControl$Builder; HSPLokhttp3/internal/_CacheControlCommonKt;->commonNoCache(Lokhttp3/CacheControl$Builder;)Lokhttp3/CacheControl$Builder; PLokhttp3/internal/_CacheControlCommonKt;->commonNoCache(Lokhttp3/CacheControl$Builder;)Lokhttp3/CacheControl$Builder; HSPLokhttp3/internal/_CacheControlCommonKt;->commonOnlyIfCached(Lokhttp3/CacheControl$Builder;)Lokhttp3/CacheControl$Builder; PLokhttp3/internal/_CacheControlCommonKt;->commonOnlyIfCached(Lokhttp3/CacheControl$Builder;)Lokhttp3/CacheControl$Builder; HSPLokhttp3/internal/_CacheControlCommonKt;->commonParse(Lokhttp3/CacheControl$Companion;Lokhttp3/Headers;)Lokhttp3/CacheControl; PLokhttp3/internal/_CacheControlCommonKt;->commonParse(Lokhttp3/CacheControl$Companion;Lokhttp3/Headers;)Lokhttp3/CacheControl; HSPLokhttp3/internal/_CacheControlCommonKt;->commonToString(Lokhttp3/CacheControl;)Ljava/lang/String; PLokhttp3/internal/_CacheControlCommonKt;->commonToString(Lokhttp3/CacheControl;)Ljava/lang/String; Lokhttp3/internal/_HeadersCommonKt; HSPLokhttp3/internal/_HeadersCommonKt;->commonAdd(Lokhttp3/Headers$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/internal/_HeadersCommonKt;->commonAdd(Lokhttp3/Headers$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/internal/_HeadersCommonKt;->commonAddLenient(Lokhttp3/Headers$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/internal/_HeadersCommonKt;->commonAddLenient(Lokhttp3/Headers$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/internal/_HeadersCommonKt;->commonBuild(Lokhttp3/Headers$Builder;)Lokhttp3/Headers; PLokhttp3/internal/_HeadersCommonKt;->commonBuild(Lokhttp3/Headers$Builder;)Lokhttp3/Headers; HSPLokhttp3/internal/_HeadersCommonKt;->commonHeadersGet([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLokhttp3/internal/_HeadersCommonKt;->commonHeadersGet([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/internal/_HeadersCommonKt;->commonHeadersOf([Ljava/lang/String;)Lokhttp3/Headers; PLokhttp3/internal/_HeadersCommonKt;->commonHeadersOf([Ljava/lang/String;)Lokhttp3/Headers; HSPLokhttp3/internal/_HeadersCommonKt;->commonName(Lokhttp3/Headers;I)Ljava/lang/String; PLokhttp3/internal/_HeadersCommonKt;->commonName(Lokhttp3/Headers;I)Ljava/lang/String; HSPLokhttp3/internal/_HeadersCommonKt;->commonNewBuilder(Lokhttp3/Headers;)Lokhttp3/Headers$Builder; PLokhttp3/internal/_HeadersCommonKt;->commonNewBuilder(Lokhttp3/Headers;)Lokhttp3/Headers$Builder; HSPLokhttp3/internal/_HeadersCommonKt;->commonRemoveAll(Lokhttp3/Headers$Builder;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/internal/_HeadersCommonKt;->commonRemoveAll(Lokhttp3/Headers$Builder;Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/internal/_HeadersCommonKt;->commonSet(Lokhttp3/Headers$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; PLokhttp3/internal/_HeadersCommonKt;->commonSet(Lokhttp3/Headers$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Headers$Builder; HSPLokhttp3/internal/_HeadersCommonKt;->commonValue(Lokhttp3/Headers;I)Ljava/lang/String; PLokhttp3/internal/_HeadersCommonKt;->commonValue(Lokhttp3/Headers;I)Ljava/lang/String; HSPLokhttp3/internal/_HeadersCommonKt;->commonValues(Lokhttp3/Headers;Ljava/lang/String;)Ljava/util/List; PLokhttp3/internal/_HeadersCommonKt;->commonValues(Lokhttp3/Headers;Ljava/lang/String;)Ljava/util/List; HSPLokhttp3/internal/_HeadersCommonKt;->headersCheckName(Ljava/lang/String;)V PLokhttp3/internal/_HeadersCommonKt;->headersCheckName(Ljava/lang/String;)V HSPLokhttp3/internal/_HeadersCommonKt;->headersCheckValue(Ljava/lang/String;Ljava/lang/String;)V PLokhttp3/internal/_HeadersCommonKt;->headersCheckValue(Ljava/lang/String;Ljava/lang/String;)V Lokhttp3/internal/_HostnamesCommonKt; HSPLokhttp3/internal/_HostnamesCommonKt;->()V PLokhttp3/internal/_HostnamesCommonKt;->()V HSPLokhttp3/internal/_HostnamesCommonKt;->canParseAsIpAddress(Ljava/lang/String;)Z PLokhttp3/internal/_HostnamesCommonKt;->canParseAsIpAddress(Ljava/lang/String;)Z HSPLokhttp3/internal/_HostnamesCommonKt;->containsInvalidHostnameAsciiCodes(Ljava/lang/String;)Z PLokhttp3/internal/_HostnamesCommonKt;->containsInvalidHostnameAsciiCodes(Ljava/lang/String;)Z HSPLokhttp3/internal/_HostnamesCommonKt;->containsInvalidLabelLengths(Ljava/lang/String;)Z PLokhttp3/internal/_HostnamesCommonKt;->containsInvalidLabelLengths(Ljava/lang/String;)Z Lokhttp3/internal/_HostnamesJvmKt; HSPLokhttp3/internal/_HostnamesJvmKt;->toCanonicalHost(Ljava/lang/String;)Ljava/lang/String; PLokhttp3/internal/_HostnamesJvmKt;->toCanonicalHost(Ljava/lang/String;)Ljava/lang/String; Lokhttp3/internal/_MediaTypeCommonKt; HSPLokhttp3/internal/_MediaTypeCommonKt;->()V PLokhttp3/internal/_MediaTypeCommonKt;->()V HSPLokhttp3/internal/_MediaTypeCommonKt;->commonToMediaType(Ljava/lang/String;)Lokhttp3/MediaType; PLokhttp3/internal/_MediaTypeCommonKt;->commonToMediaType(Ljava/lang/String;)Lokhttp3/MediaType; HSPLokhttp3/internal/_MediaTypeCommonKt;->commonToMediaTypeOrNull(Ljava/lang/String;)Lokhttp3/MediaType; PLokhttp3/internal/_MediaTypeCommonKt;->commonToMediaTypeOrNull(Ljava/lang/String;)Lokhttp3/MediaType; Lokhttp3/internal/_RequestBodyCommonKt; HSPLokhttp3/internal/_RequestBodyCommonKt;->commonToRequestBody([BLokhttp3/MediaType;II)Lokhttp3/RequestBody; PLokhttp3/internal/_RequestBodyCommonKt;->commonToRequestBody([BLokhttp3/MediaType;II)Lokhttp3/RequestBody; Lokhttp3/internal/_RequestBodyCommonKt$commonToRequestBody$1; HSPLokhttp3/internal/_RequestBodyCommonKt$commonToRequestBody$1;->(Lokhttp3/MediaType;[BII)V PLokhttp3/internal/_RequestBodyCommonKt$commonToRequestBody$1;->(Lokhttp3/MediaType;[BII)V Lokhttp3/internal/_RequestCommonKt; HSPLokhttp3/internal/_RequestCommonKt;->commonAddHeader(Lokhttp3/Request$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; PLokhttp3/internal/_RequestCommonKt;->commonAddHeader(Lokhttp3/Request$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; HSPLokhttp3/internal/_RequestCommonKt;->commonCacheControl(Lokhttp3/Request$Builder;Lokhttp3/CacheControl;)Lokhttp3/Request$Builder; PLokhttp3/internal/_RequestCommonKt;->commonCacheControl(Lokhttp3/Request$Builder;Lokhttp3/CacheControl;)Lokhttp3/Request$Builder; HSPLokhttp3/internal/_RequestCommonKt;->commonHeader(Lokhttp3/Request$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; PLokhttp3/internal/_RequestCommonKt;->commonHeader(Lokhttp3/Request$Builder;Ljava/lang/String;Ljava/lang/String;)Lokhttp3/Request$Builder; HSPLokhttp3/internal/_RequestCommonKt;->commonHeader(Lokhttp3/Request;Ljava/lang/String;)Ljava/lang/String; PLokhttp3/internal/_RequestCommonKt;->commonHeader(Lokhttp3/Request;Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/internal/_RequestCommonKt;->commonHeaders(Lokhttp3/Request$Builder;Lokhttp3/Headers;)Lokhttp3/Request$Builder; PLokhttp3/internal/_RequestCommonKt;->commonHeaders(Lokhttp3/Request$Builder;Lokhttp3/Headers;)Lokhttp3/Request$Builder; HSPLokhttp3/internal/_RequestCommonKt;->commonRemoveHeader(Lokhttp3/Request$Builder;Ljava/lang/String;)Lokhttp3/Request$Builder; PLokhttp3/internal/_RequestCommonKt;->commonRemoveHeader(Lokhttp3/Request$Builder;Ljava/lang/String;)Lokhttp3/Request$Builder; Lokhttp3/internal/_ResponseBodyCommonKt; HSPLokhttp3/internal/_ResponseBodyCommonKt;->commonAsResponseBody(Lokio/BufferedSource;Lokhttp3/MediaType;J)Lokhttp3/ResponseBody; PLokhttp3/internal/_ResponseBodyCommonKt;->commonAsResponseBody(Lokio/BufferedSource;Lokhttp3/MediaType;J)Lokhttp3/ResponseBody; HSPLokhttp3/internal/_ResponseBodyCommonKt;->commonToResponseBody([BLokhttp3/MediaType;)Lokhttp3/ResponseBody; PLokhttp3/internal/_ResponseBodyCommonKt;->commonToResponseBody([BLokhttp3/MediaType;)Lokhttp3/ResponseBody; Lokhttp3/internal/_ResponseBodyCommonKt$commonAsResponseBody$1; HSPLokhttp3/internal/_ResponseBodyCommonKt$commonAsResponseBody$1;->(Lokhttp3/MediaType;JLokio/BufferedSource;)V PLokhttp3/internal/_ResponseBodyCommonKt$commonAsResponseBody$1;->(Lokhttp3/MediaType;JLokio/BufferedSource;)V Lokhttp3/internal/_ResponseCommonKt; HSPLokhttp3/internal/_ResponseCommonKt;->checkSupportResponse(Lokhttp3/Response;Ljava/lang/String;)V PLokhttp3/internal/_ResponseCommonKt;->checkSupportResponse(Lokhttp3/Response;Ljava/lang/String;)V HSPLokhttp3/internal/_ResponseCommonKt;->commonBody(Lokhttp3/Response$Builder;Lokhttp3/ResponseBody;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonBody(Lokhttp3/Response$Builder;Lokhttp3/ResponseBody;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonCacheResponse(Lokhttp3/Response$Builder;Lokhttp3/Response;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonCacheResponse(Lokhttp3/Response$Builder;Lokhttp3/Response;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonCode(Lokhttp3/Response$Builder;I)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonCode(Lokhttp3/Response$Builder;I)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonHeader(Lokhttp3/Response;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; PLokhttp3/internal/_ResponseCommonKt;->commonHeader(Lokhttp3/Response;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLokhttp3/internal/_ResponseCommonKt;->commonHeaders(Lokhttp3/Response$Builder;Lokhttp3/Headers;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonHeaders(Lokhttp3/Response$Builder;Lokhttp3/Headers;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonMessage(Lokhttp3/Response$Builder;Ljava/lang/String;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonMessage(Lokhttp3/Response$Builder;Ljava/lang/String;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonNetworkResponse(Lokhttp3/Response$Builder;Lokhttp3/Response;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonNetworkResponse(Lokhttp3/Response$Builder;Lokhttp3/Response;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonNewBuilder(Lokhttp3/Response;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonNewBuilder(Lokhttp3/Response;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonPriorResponse(Lokhttp3/Response$Builder;Lokhttp3/Response;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonPriorResponse(Lokhttp3/Response$Builder;Lokhttp3/Response;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonProtocol(Lokhttp3/Response$Builder;Lokhttp3/Protocol;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonProtocol(Lokhttp3/Response$Builder;Lokhttp3/Protocol;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonRequest(Lokhttp3/Response$Builder;Lokhttp3/Request;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonRequest(Lokhttp3/Response$Builder;Lokhttp3/Request;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->commonTrailers(Lokhttp3/Response$Builder;Lkotlin/jvm/functions/Function0;)Lokhttp3/Response$Builder; PLokhttp3/internal/_ResponseCommonKt;->commonTrailers(Lokhttp3/Response$Builder;Lkotlin/jvm/functions/Function0;)Lokhttp3/Response$Builder; HSPLokhttp3/internal/_ResponseCommonKt;->getCommonCacheControl(Lokhttp3/Response;)Lokhttp3/CacheControl; PLokhttp3/internal/_ResponseCommonKt;->getCommonCacheControl(Lokhttp3/Response;)Lokhttp3/CacheControl; HSPLokhttp3/internal/_ResponseCommonKt;->getCommonIsRedirect(Lokhttp3/Response;)Z PLokhttp3/internal/_ResponseCommonKt;->getCommonIsRedirect(Lokhttp3/Response;)Z HSPLokhttp3/internal/_ResponseCommonKt;->getCommonIsSuccessful(Lokhttp3/Response;)Z PLokhttp3/internal/_ResponseCommonKt;->getCommonIsSuccessful(Lokhttp3/Response;)Z HSPLokhttp3/internal/_ResponseCommonKt;->stripBody(Lokhttp3/Response;)Lokhttp3/Response; PLokhttp3/internal/_ResponseCommonKt;->stripBody(Lokhttp3/Response;)Lokhttp3/Response; Lokhttp3/internal/_UtilCommonKt; HSPLokhttp3/internal/_UtilCommonKt;->()V PLokhttp3/internal/_UtilCommonKt;->()V HSPLokhttp3/internal/_UtilCommonKt;->addIfAbsent(Ljava/util/List;Ljava/lang/Object;)V PLokhttp3/internal/_UtilCommonKt;->addIfAbsent(Ljava/util/List;Ljava/lang/Object;)V HSPLokhttp3/internal/_UtilCommonKt;->checkOffsetAndCount(JJJ)V PLokhttp3/internal/_UtilCommonKt;->checkOffsetAndCount(JJJ)V HSPLokhttp3/internal/_UtilCommonKt;->delimiterOffset(Ljava/lang/String;CII)I PLokhttp3/internal/_UtilCommonKt;->delimiterOffset(Ljava/lang/String;CII)I HSPLokhttp3/internal/_UtilCommonKt;->delimiterOffset(Ljava/lang/String;Ljava/lang/String;II)I PLokhttp3/internal/_UtilCommonKt;->delimiterOffset(Ljava/lang/String;Ljava/lang/String;II)I HSPLokhttp3/internal/_UtilCommonKt;->getCommonEmptyHeaders()Lokhttp3/Headers; PLokhttp3/internal/_UtilCommonKt;->getCommonEmptyHeaders()Lokhttp3/Headers; HSPLokhttp3/internal/_UtilCommonKt;->getCommonEmptyRequestBody()Lokhttp3/RequestBody; PLokhttp3/internal/_UtilCommonKt;->getCommonEmptyRequestBody()Lokhttp3/RequestBody; HSPLokhttp3/internal/_UtilCommonKt;->getCommonEmptyResponse()Lokhttp3/ResponseBody; PLokhttp3/internal/_UtilCommonKt;->getCommonEmptyResponse()Lokhttp3/ResponseBody; HSPLokhttp3/internal/_UtilCommonKt;->hasIntersection([Ljava/lang/String;[Ljava/lang/String;Ljava/util/Comparator;)Z PLokhttp3/internal/_UtilCommonKt;->hasIntersection([Ljava/lang/String;[Ljava/lang/String;Ljava/util/Comparator;)Z HSPLokhttp3/internal/_UtilCommonKt;->indexOf([Ljava/lang/String;Ljava/lang/String;Ljava/util/Comparator;)I PLokhttp3/internal/_UtilCommonKt;->indexOf([Ljava/lang/String;Ljava/lang/String;Ljava/util/Comparator;)I HSPLokhttp3/internal/_UtilCommonKt;->indexOfFirstNonAsciiWhitespace$default(Ljava/lang/String;IIILjava/lang/Object;)I PLokhttp3/internal/_UtilCommonKt;->indexOfFirstNonAsciiWhitespace$default(Ljava/lang/String;IIILjava/lang/Object;)I HSPLokhttp3/internal/_UtilCommonKt;->indexOfFirstNonAsciiWhitespace(Ljava/lang/String;II)I PLokhttp3/internal/_UtilCommonKt;->indexOfFirstNonAsciiWhitespace(Ljava/lang/String;II)I HSPLokhttp3/internal/_UtilCommonKt;->indexOfLastNonAsciiWhitespace$default(Ljava/lang/String;IIILjava/lang/Object;)I PLokhttp3/internal/_UtilCommonKt;->indexOfLastNonAsciiWhitespace$default(Ljava/lang/String;IIILjava/lang/Object;)I HSPLokhttp3/internal/_UtilCommonKt;->indexOfLastNonAsciiWhitespace(Ljava/lang/String;II)I PLokhttp3/internal/_UtilCommonKt;->indexOfLastNonAsciiWhitespace(Ljava/lang/String;II)I HSPLokhttp3/internal/_UtilCommonKt;->indexOfNonWhitespace(Ljava/lang/String;I)I PLokhttp3/internal/_UtilCommonKt;->indexOfNonWhitespace(Ljava/lang/String;I)I HSPLokhttp3/internal/_UtilCommonKt;->interleave(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/List; PLokhttp3/internal/_UtilCommonKt;->interleave(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/List; HSPLokhttp3/internal/_UtilCommonKt;->intersect([Ljava/lang/String;[Ljava/lang/String;Ljava/util/Comparator;)[Ljava/lang/String; PLokhttp3/internal/_UtilCommonKt;->intersect([Ljava/lang/String;[Ljava/lang/String;Ljava/util/Comparator;)[Ljava/lang/String; HSPLokhttp3/internal/_UtilCommonKt;->isCivilized(Lokio/FileSystem;Lokio/Path;)Z PLokhttp3/internal/_UtilCommonKt;->isCivilized(Lokio/FileSystem;Lokio/Path;)Z HSPLokhttp3/internal/_UtilCommonKt;->matchAtPolyfill(Lkotlin/text/Regex;Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; PLokhttp3/internal/_UtilCommonKt;->matchAtPolyfill(Lkotlin/text/Regex;Ljava/lang/CharSequence;I)Lkotlin/text/MatchResult; HSPLokhttp3/internal/_UtilCommonKt;->readMedium(Lokio/BufferedSource;)I PLokhttp3/internal/_UtilCommonKt;->readMedium(Lokio/BufferedSource;)I HSPLokhttp3/internal/_UtilCommonKt;->toLongOrDefault(Ljava/lang/String;J)J PLokhttp3/internal/_UtilCommonKt;->toLongOrDefault(Ljava/lang/String;J)J HSPLokhttp3/internal/_UtilCommonKt;->toNonNegativeInt(Ljava/lang/String;I)I PLokhttp3/internal/_UtilCommonKt;->toNonNegativeInt(Ljava/lang/String;I)I HSPLokhttp3/internal/_UtilCommonKt;->writeMedium(Lokio/BufferedSink;I)V PLokhttp3/internal/_UtilCommonKt;->writeMedium(Lokio/BufferedSink;I)V Lokhttp3/internal/_UtilJvmKt; HSPLokhttp3/internal/_UtilJvmKt;->()V PLokhttp3/internal/_UtilJvmKt;->()V HSPLokhttp3/internal/_UtilJvmKt;->asFactory(Lokhttp3/EventListener;)Lokhttp3/EventListener$Factory; PLokhttp3/internal/_UtilJvmKt;->asFactory(Lokhttp3/EventListener;)Lokhttp3/EventListener$Factory; HSPLokhttp3/internal/_UtilJvmKt;->checkDuration(Ljava/lang/String;JLjava/util/concurrent/TimeUnit;)I PLokhttp3/internal/_UtilJvmKt;->checkDuration(Ljava/lang/String;JLjava/util/concurrent/TimeUnit;)I HSPLokhttp3/internal/_UtilJvmKt;->closeQuietly(Ljava/net/Socket;)V PLokhttp3/internal/_UtilJvmKt;->closeQuietly(Ljava/net/Socket;)V HSPLokhttp3/internal/_UtilJvmKt;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; HPLokhttp3/internal/_UtilJvmKt;->format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; HSPLokhttp3/internal/_UtilJvmKt;->headersContentLength(Lokhttp3/Response;)J PLokhttp3/internal/_UtilJvmKt;->headersContentLength(Lokhttp3/Response;)J HSPLokhttp3/internal/_UtilJvmKt;->immutableListOf([Ljava/lang/Object;)Ljava/util/List; PLokhttp3/internal/_UtilJvmKt;->immutableListOf([Ljava/lang/Object;)Ljava/util/List; HSPLokhttp3/internal/_UtilJvmKt;->threadFactory(Ljava/lang/String;Z)Ljava/util/concurrent/ThreadFactory; PLokhttp3/internal/_UtilJvmKt;->threadFactory(Ljava/lang/String;Z)Ljava/util/concurrent/ThreadFactory; HSPLokhttp3/internal/_UtilJvmKt;->toHeaders(Ljava/util/List;)Lokhttp3/Headers; PLokhttp3/internal/_UtilJvmKt;->toHeaders(Ljava/util/List;)Lokhttp3/Headers; HSPLokhttp3/internal/_UtilJvmKt;->toHostHeader$default(Lokhttp3/HttpUrl;ZILjava/lang/Object;)Ljava/lang/String; PLokhttp3/internal/_UtilJvmKt;->toHostHeader$default(Lokhttp3/HttpUrl;ZILjava/lang/Object;)Ljava/lang/String; HSPLokhttp3/internal/_UtilJvmKt;->toHostHeader(Lokhttp3/HttpUrl;Z)Ljava/lang/String; PLokhttp3/internal/_UtilJvmKt;->toHostHeader(Lokhttp3/HttpUrl;Z)Ljava/lang/String; HSPLokhttp3/internal/_UtilJvmKt;->toImmutableList(Ljava/util/List;)Ljava/util/List; PLokhttp3/internal/_UtilJvmKt;->toImmutableList(Ljava/util/List;)Ljava/util/List; Lokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0; HSPLokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0;->(Ljava/lang/String;Z)V PLokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0;->(Ljava/lang/String;Z)V HSPLokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; PLokhttp3/internal/_UtilJvmKt$$ExternalSyntheticLambda0;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; Lokhttp3/internal/authenticator/JavaNetAuthenticator; HSPLokhttp3/internal/authenticator/JavaNetAuthenticator;->(Lokhttp3/Dns;)V PLokhttp3/internal/authenticator/JavaNetAuthenticator;->(Lokhttp3/Dns;)V HSPLokhttp3/internal/authenticator/JavaNetAuthenticator;->(Lokhttp3/Dns;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/authenticator/JavaNetAuthenticator;->(Lokhttp3/Dns;ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/cache/CacheInterceptor; HSPLokhttp3/internal/cache/CacheInterceptor;->()V PLokhttp3/internal/cache/CacheInterceptor;->()V HSPLokhttp3/internal/cache/CacheInterceptor;->(Lokhttp3/Cache;)V PLokhttp3/internal/cache/CacheInterceptor;->(Lokhttp3/Cache;)V HSPLokhttp3/internal/cache/CacheInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLokhttp3/internal/cache/CacheInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Lokhttp3/internal/cache/CacheInterceptor$Companion; HSPLokhttp3/internal/cache/CacheInterceptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/cache/CacheInterceptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1; HSPLokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1;->(Lokio/BufferedSource;Lokhttp3/internal/cache/CacheRequest;Lokio/BufferedSink;)V PLokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1;->(Lokio/BufferedSource;Lokhttp3/internal/cache/CacheRequest;Lokio/BufferedSink;)V HSPLokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1;->close()V PLokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1;->close()V HSPLokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1;->read(Lokio/Buffer;J)J PLokhttp3/internal/cache/CacheInterceptor$cacheWritingResponse$cacheWritingSource$1;->read(Lokio/Buffer;J)J Lokhttp3/internal/cache/CacheRequest; Lokhttp3/internal/cache/CacheStrategy; HSPLokhttp3/internal/cache/CacheStrategy;->()V PLokhttp3/internal/cache/CacheStrategy;->()V HSPLokhttp3/internal/cache/CacheStrategy;->(Lokhttp3/Request;Lokhttp3/Response;)V PLokhttp3/internal/cache/CacheStrategy;->(Lokhttp3/Request;Lokhttp3/Response;)V HSPLokhttp3/internal/cache/CacheStrategy;->getCacheResponse()Lokhttp3/Response; PLokhttp3/internal/cache/CacheStrategy;->getCacheResponse()Lokhttp3/Response; HSPLokhttp3/internal/cache/CacheStrategy;->getNetworkRequest()Lokhttp3/Request; PLokhttp3/internal/cache/CacheStrategy;->getNetworkRequest()Lokhttp3/Request; Lokhttp3/internal/cache/CacheStrategy$Companion; HSPLokhttp3/internal/cache/CacheStrategy$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/cache/CacheStrategy$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/cache/CacheStrategy$Companion;->isCacheable(Lokhttp3/Response;Lokhttp3/Request;)Z PLokhttp3/internal/cache/CacheStrategy$Companion;->isCacheable(Lokhttp3/Response;Lokhttp3/Request;)Z Lokhttp3/internal/cache/CacheStrategy$Factory; HSPLokhttp3/internal/cache/CacheStrategy$Factory;->(JLokhttp3/Request;Lokhttp3/Response;)V PLokhttp3/internal/cache/CacheStrategy$Factory;->(JLokhttp3/Request;Lokhttp3/Response;)V HSPLokhttp3/internal/cache/CacheStrategy$Factory;->compute()Lokhttp3/internal/cache/CacheStrategy; PLokhttp3/internal/cache/CacheStrategy$Factory;->compute()Lokhttp3/internal/cache/CacheStrategy; Lokhttp3/internal/cache/DiskLruCache; HSPLokhttp3/internal/cache/DiskLruCache;->()V PLokhttp3/internal/cache/DiskLruCache;->()V HSPLokhttp3/internal/cache/DiskLruCache;->(Lokio/FileSystem;Lokio/Path;IIJLokhttp3/internal/concurrent/TaskRunner;)V PLokhttp3/internal/cache/DiskLruCache;->(Lokio/FileSystem;Lokio/Path;IIJLokhttp3/internal/concurrent/TaskRunner;)V HSPLokhttp3/internal/cache/DiskLruCache;->checkNotClosed()V PLokhttp3/internal/cache/DiskLruCache;->checkNotClosed()V HSPLokhttp3/internal/cache/DiskLruCache;->completeEdit$okhttp(Lokhttp3/internal/cache/DiskLruCache$Editor;Z)V PLokhttp3/internal/cache/DiskLruCache;->completeEdit$okhttp(Lokhttp3/internal/cache/DiskLruCache$Editor;Z)V HSPLokhttp3/internal/cache/DiskLruCache;->edit$default(Lokhttp3/internal/cache/DiskLruCache;Ljava/lang/String;JILjava/lang/Object;)Lokhttp3/internal/cache/DiskLruCache$Editor; PLokhttp3/internal/cache/DiskLruCache;->edit$default(Lokhttp3/internal/cache/DiskLruCache;Ljava/lang/String;JILjava/lang/Object;)Lokhttp3/internal/cache/DiskLruCache$Editor; HSPLokhttp3/internal/cache/DiskLruCache;->edit(Ljava/lang/String;J)Lokhttp3/internal/cache/DiskLruCache$Editor; PLokhttp3/internal/cache/DiskLruCache;->edit(Ljava/lang/String;J)Lokhttp3/internal/cache/DiskLruCache$Editor; HSPLokhttp3/internal/cache/DiskLruCache;->get(Ljava/lang/String;)Lokhttp3/internal/cache/DiskLruCache$Snapshot; PLokhttp3/internal/cache/DiskLruCache;->get(Ljava/lang/String;)Lokhttp3/internal/cache/DiskLruCache$Snapshot; HSPLokhttp3/internal/cache/DiskLruCache;->getDirectory()Lokio/Path; PLokhttp3/internal/cache/DiskLruCache;->getDirectory()Lokio/Path; HSPLokhttp3/internal/cache/DiskLruCache;->getFileSystem$okhttp()Lokio/FileSystem; PLokhttp3/internal/cache/DiskLruCache;->getFileSystem$okhttp()Lokio/FileSystem; HSPLokhttp3/internal/cache/DiskLruCache;->getValueCount$okhttp()I PLokhttp3/internal/cache/DiskLruCache;->getValueCount$okhttp()I HSPLokhttp3/internal/cache/DiskLruCache;->initialize()V PLokhttp3/internal/cache/DiskLruCache;->initialize()V HSPLokhttp3/internal/cache/DiskLruCache;->journalRebuildRequired()Z PLokhttp3/internal/cache/DiskLruCache;->journalRebuildRequired()Z HSPLokhttp3/internal/cache/DiskLruCache;->rebuildJournal$okhttp()V PLokhttp3/internal/cache/DiskLruCache;->rebuildJournal$okhttp()V HSPLokhttp3/internal/cache/DiskLruCache;->validateKey(Ljava/lang/String;)V PLokhttp3/internal/cache/DiskLruCache;->validateKey(Ljava/lang/String;)V Lokhttp3/internal/cache/DiskLruCache$Companion; HSPLokhttp3/internal/cache/DiskLruCache$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/cache/DiskLruCache$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/cache/DiskLruCache$Editor; HSPLokhttp3/internal/cache/DiskLruCache$Editor;->(Lokhttp3/internal/cache/DiskLruCache;Lokhttp3/internal/cache/DiskLruCache$Entry;)V PLokhttp3/internal/cache/DiskLruCache$Editor;->(Lokhttp3/internal/cache/DiskLruCache;Lokhttp3/internal/cache/DiskLruCache$Entry;)V HSPLokhttp3/internal/cache/DiskLruCache$Editor;->commit()V PLokhttp3/internal/cache/DiskLruCache$Editor;->commit()V HSPLokhttp3/internal/cache/DiskLruCache$Editor;->getEntry$okhttp()Lokhttp3/internal/cache/DiskLruCache$Entry; PLokhttp3/internal/cache/DiskLruCache$Editor;->getEntry$okhttp()Lokhttp3/internal/cache/DiskLruCache$Entry; HSPLokhttp3/internal/cache/DiskLruCache$Editor;->getWritten$okhttp()[Z PLokhttp3/internal/cache/DiskLruCache$Editor;->getWritten$okhttp()[Z HSPLokhttp3/internal/cache/DiskLruCache$Editor;->newSink(I)Lokio/Sink; PLokhttp3/internal/cache/DiskLruCache$Editor;->newSink(I)Lokio/Sink; Lokhttp3/internal/cache/DiskLruCache$Editor$newSink$1$1; HSPLokhttp3/internal/cache/DiskLruCache$Editor$newSink$1$1;->(Lokhttp3/internal/cache/DiskLruCache;Lokhttp3/internal/cache/DiskLruCache$Editor;)V PLokhttp3/internal/cache/DiskLruCache$Editor$newSink$1$1;->(Lokhttp3/internal/cache/DiskLruCache;Lokhttp3/internal/cache/DiskLruCache$Editor;)V Lokhttp3/internal/cache/DiskLruCache$Entry; HSPLokhttp3/internal/cache/DiskLruCache$Entry;->(Lokhttp3/internal/cache/DiskLruCache;Ljava/lang/String;)V PLokhttp3/internal/cache/DiskLruCache$Entry;->(Lokhttp3/internal/cache/DiskLruCache;Ljava/lang/String;)V HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getCleanFiles$okhttp()Ljava/util/List; PLokhttp3/internal/cache/DiskLruCache$Entry;->getCleanFiles$okhttp()Ljava/util/List; HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getCurrentEditor$okhttp()Lokhttp3/internal/cache/DiskLruCache$Editor; PLokhttp3/internal/cache/DiskLruCache$Entry;->getCurrentEditor$okhttp()Lokhttp3/internal/cache/DiskLruCache$Editor; HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getDirtyFiles$okhttp()Ljava/util/List; PLokhttp3/internal/cache/DiskLruCache$Entry;->getDirtyFiles$okhttp()Ljava/util/List; HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getKey$okhttp()Ljava/lang/String; PLokhttp3/internal/cache/DiskLruCache$Entry;->getKey$okhttp()Ljava/lang/String; HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getLengths$okhttp()[J PLokhttp3/internal/cache/DiskLruCache$Entry;->getLengths$okhttp()[J HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getReadable$okhttp()Z PLokhttp3/internal/cache/DiskLruCache$Entry;->getReadable$okhttp()Z HSPLokhttp3/internal/cache/DiskLruCache$Entry;->getZombie$okhttp()Z PLokhttp3/internal/cache/DiskLruCache$Entry;->getZombie$okhttp()Z HSPLokhttp3/internal/cache/DiskLruCache$Entry;->setCurrentEditor$okhttp(Lokhttp3/internal/cache/DiskLruCache$Editor;)V PLokhttp3/internal/cache/DiskLruCache$Entry;->setCurrentEditor$okhttp(Lokhttp3/internal/cache/DiskLruCache$Editor;)V HSPLokhttp3/internal/cache/DiskLruCache$Entry;->setReadable$okhttp(Z)V PLokhttp3/internal/cache/DiskLruCache$Entry;->setReadable$okhttp(Z)V HSPLokhttp3/internal/cache/DiskLruCache$Entry;->setSequenceNumber$okhttp(J)V PLokhttp3/internal/cache/DiskLruCache$Entry;->setSequenceNumber$okhttp(J)V HSPLokhttp3/internal/cache/DiskLruCache$Entry;->writeLengths$okhttp(Lokio/BufferedSink;)V PLokhttp3/internal/cache/DiskLruCache$Entry;->writeLengths$okhttp(Lokio/BufferedSink;)V Lokhttp3/internal/cache/DiskLruCache$cleanupTask$1; HSPLokhttp3/internal/cache/DiskLruCache$cleanupTask$1;->(Lokhttp3/internal/cache/DiskLruCache;Ljava/lang/String;)V PLokhttp3/internal/cache/DiskLruCache$cleanupTask$1;->(Lokhttp3/internal/cache/DiskLruCache;Ljava/lang/String;)V Lokhttp3/internal/cache/DiskLruCache$fileSystem$1; HSPLokhttp3/internal/cache/DiskLruCache$fileSystem$1;->(Lokio/FileSystem;)V PLokhttp3/internal/cache/DiskLruCache$fileSystem$1;->(Lokio/FileSystem;)V HSPLokhttp3/internal/cache/DiskLruCache$fileSystem$1;->sink(Lokio/Path;Z)Lokio/Sink; PLokhttp3/internal/cache/DiskLruCache$fileSystem$1;->sink(Lokio/Path;Z)Lokio/Sink; Lokhttp3/internal/cache/DiskLruCache$newJournalWriter$faultHidingSink$1; HSPLokhttp3/internal/cache/DiskLruCache$newJournalWriter$faultHidingSink$1;->(Lokhttp3/internal/cache/DiskLruCache;)V PLokhttp3/internal/cache/DiskLruCache$newJournalWriter$faultHidingSink$1;->(Lokhttp3/internal/cache/DiskLruCache;)V Lokhttp3/internal/cache/FaultHidingSink; HSPLokhttp3/internal/cache/FaultHidingSink;->(Lokio/Sink;Lkotlin/jvm/functions/Function1;)V PLokhttp3/internal/cache/FaultHidingSink;->(Lokio/Sink;Lkotlin/jvm/functions/Function1;)V HSPLokhttp3/internal/cache/FaultHidingSink;->close()V PLokhttp3/internal/cache/FaultHidingSink;->close()V HSPLokhttp3/internal/cache/FaultHidingSink;->flush()V PLokhttp3/internal/cache/FaultHidingSink;->flush()V HSPLokhttp3/internal/cache/FaultHidingSink;->write(Lokio/Buffer;J)V PLokhttp3/internal/cache/FaultHidingSink;->write(Lokio/Buffer;J)V Lokhttp3/internal/concurrent/Task; HSPLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;Z)V PLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;Z)V HSPLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/concurrent/Task;->(Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/concurrent/Task;->getName()Ljava/lang/String; PLokhttp3/internal/concurrent/Task;->getName()Ljava/lang/String; HSPLokhttp3/internal/concurrent/Task;->getNextExecuteNanoTime$okhttp()J PLokhttp3/internal/concurrent/Task;->getNextExecuteNanoTime$okhttp()J HSPLokhttp3/internal/concurrent/Task;->getQueue$okhttp()Lokhttp3/internal/concurrent/TaskQueue; PLokhttp3/internal/concurrent/Task;->getQueue$okhttp()Lokhttp3/internal/concurrent/TaskQueue; HSPLokhttp3/internal/concurrent/Task;->initQueue$okhttp(Lokhttp3/internal/concurrent/TaskQueue;)V PLokhttp3/internal/concurrent/Task;->initQueue$okhttp(Lokhttp3/internal/concurrent/TaskQueue;)V HSPLokhttp3/internal/concurrent/Task;->setNextExecuteNanoTime$okhttp(J)V PLokhttp3/internal/concurrent/Task;->setNextExecuteNanoTime$okhttp(J)V Lokhttp3/internal/concurrent/TaskQueue; HSPLokhttp3/internal/concurrent/TaskQueue;->(Lokhttp3/internal/concurrent/TaskRunner;Ljava/lang/String;)V PLokhttp3/internal/concurrent/TaskQueue;->(Lokhttp3/internal/concurrent/TaskRunner;Ljava/lang/String;)V HSPLokhttp3/internal/concurrent/TaskQueue;->execute$default(Lokhttp3/internal/concurrent/TaskQueue;Ljava/lang/String;JZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)V PLokhttp3/internal/concurrent/TaskQueue;->execute$default(Lokhttp3/internal/concurrent/TaskQueue;Ljava/lang/String;JZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)V HSPLokhttp3/internal/concurrent/TaskQueue;->execute(Ljava/lang/String;JZLkotlin/jvm/functions/Function0;)V PLokhttp3/internal/concurrent/TaskQueue;->execute(Ljava/lang/String;JZLkotlin/jvm/functions/Function0;)V HSPLokhttp3/internal/concurrent/TaskQueue;->getActiveTask$okhttp()Lokhttp3/internal/concurrent/Task; PLokhttp3/internal/concurrent/TaskQueue;->getActiveTask$okhttp()Lokhttp3/internal/concurrent/Task; HSPLokhttp3/internal/concurrent/TaskQueue;->getCancelActiveTask$okhttp()Z PLokhttp3/internal/concurrent/TaskQueue;->getCancelActiveTask$okhttp()Z HSPLokhttp3/internal/concurrent/TaskQueue;->getFutureTasks$okhttp()Ljava/util/List; PLokhttp3/internal/concurrent/TaskQueue;->getFutureTasks$okhttp()Ljava/util/List; HSPLokhttp3/internal/concurrent/TaskQueue;->getShutdown$okhttp()Z PLokhttp3/internal/concurrent/TaskQueue;->getShutdown$okhttp()Z HSPLokhttp3/internal/concurrent/TaskQueue;->schedule$default(Lokhttp3/internal/concurrent/TaskQueue;Lokhttp3/internal/concurrent/Task;JILjava/lang/Object;)V PLokhttp3/internal/concurrent/TaskQueue;->schedule$default(Lokhttp3/internal/concurrent/TaskQueue;Lokhttp3/internal/concurrent/Task;JILjava/lang/Object;)V HSPLokhttp3/internal/concurrent/TaskQueue;->schedule(Lokhttp3/internal/concurrent/Task;J)V PLokhttp3/internal/concurrent/TaskQueue;->schedule(Lokhttp3/internal/concurrent/Task;J)V HSPLokhttp3/internal/concurrent/TaskQueue;->scheduleAndDecide$okhttp(Lokhttp3/internal/concurrent/Task;JZ)Z PLokhttp3/internal/concurrent/TaskQueue;->scheduleAndDecide$okhttp(Lokhttp3/internal/concurrent/Task;JZ)Z HSPLokhttp3/internal/concurrent/TaskQueue;->setActiveTask$okhttp(Lokhttp3/internal/concurrent/Task;)V PLokhttp3/internal/concurrent/TaskQueue;->setActiveTask$okhttp(Lokhttp3/internal/concurrent/Task;)V HSPLokhttp3/internal/concurrent/TaskQueue;->setCancelActiveTask$okhttp(Z)V PLokhttp3/internal/concurrent/TaskQueue;->setCancelActiveTask$okhttp(Z)V Lokhttp3/internal/concurrent/TaskQueue$execute$1; HSPLokhttp3/internal/concurrent/TaskQueue$execute$1;->(Ljava/lang/String;ZLkotlin/jvm/functions/Function0;)V PLokhttp3/internal/concurrent/TaskQueue$execute$1;->(Ljava/lang/String;ZLkotlin/jvm/functions/Function0;)V HSPLokhttp3/internal/concurrent/TaskQueue$execute$1;->runOnce()J PLokhttp3/internal/concurrent/TaskQueue$execute$1;->runOnce()J Lokhttp3/internal/concurrent/TaskRunner; HSPLokhttp3/internal/concurrent/TaskRunner;->()V PLokhttp3/internal/concurrent/TaskRunner;->()V HSPLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$Backend;Ljava/util/logging/Logger;)V PLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$Backend;Ljava/util/logging/Logger;)V HSPLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$Backend;Ljava/util/logging/Logger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/concurrent/TaskRunner;->(Lokhttp3/internal/concurrent/TaskRunner$Backend;Ljava/util/logging/Logger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/concurrent/TaskRunner;->access$runTask(Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/concurrent/Task;)V PLokhttp3/internal/concurrent/TaskRunner;->access$runTask(Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/concurrent/Task;)V HSPLokhttp3/internal/concurrent/TaskRunner;->afterRun(Lokhttp3/internal/concurrent/Task;J)V PLokhttp3/internal/concurrent/TaskRunner;->afterRun(Lokhttp3/internal/concurrent/Task;J)V HSPLokhttp3/internal/concurrent/TaskRunner;->awaitTaskToRun()Lokhttp3/internal/concurrent/Task; PLokhttp3/internal/concurrent/TaskRunner;->awaitTaskToRun()Lokhttp3/internal/concurrent/Task; HSPLokhttp3/internal/concurrent/TaskRunner;->getBackend()Lokhttp3/internal/concurrent/TaskRunner$Backend; PLokhttp3/internal/concurrent/TaskRunner;->getBackend()Lokhttp3/internal/concurrent/TaskRunner$Backend; HSPLokhttp3/internal/concurrent/TaskRunner;->getLogger$okhttp()Ljava/util/logging/Logger; PLokhttp3/internal/concurrent/TaskRunner;->getLogger$okhttp()Ljava/util/logging/Logger; HSPLokhttp3/internal/concurrent/TaskRunner;->kickCoordinator$okhttp(Lokhttp3/internal/concurrent/TaskQueue;)V PLokhttp3/internal/concurrent/TaskRunner;->kickCoordinator$okhttp(Lokhttp3/internal/concurrent/TaskQueue;)V HSPLokhttp3/internal/concurrent/TaskRunner;->newQueue()Lokhttp3/internal/concurrent/TaskQueue; PLokhttp3/internal/concurrent/TaskRunner;->newQueue()Lokhttp3/internal/concurrent/TaskQueue; Lokhttp3/internal/concurrent/TaskRunner$Backend; Lokhttp3/internal/concurrent/TaskRunner$Companion; HSPLokhttp3/internal/concurrent/TaskRunner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/concurrent/TaskRunner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/concurrent/TaskRunner$RealBackend; HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->(Ljava/util/concurrent/ThreadFactory;)V PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->(Ljava/util/concurrent/ThreadFactory;)V HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorNotify(Lokhttp3/internal/concurrent/TaskRunner;)V PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorNotify(Lokhttp3/internal/concurrent/TaskRunner;)V HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorWait(Lokhttp3/internal/concurrent/TaskRunner;J)V PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->coordinatorWait(Lokhttp3/internal/concurrent/TaskRunner;J)V HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->decorate(Ljava/util/concurrent/BlockingQueue;)Ljava/util/concurrent/BlockingQueue; PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->decorate(Ljava/util/concurrent/BlockingQueue;)Ljava/util/concurrent/BlockingQueue; HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->execute(Lokhttp3/internal/concurrent/TaskRunner;Ljava/lang/Runnable;)V PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->execute(Lokhttp3/internal/concurrent/TaskRunner;Ljava/lang/Runnable;)V HSPLokhttp3/internal/concurrent/TaskRunner$RealBackend;->nanoTime()J PLokhttp3/internal/concurrent/TaskRunner$RealBackend;->nanoTime()J Lokhttp3/internal/concurrent/TaskRunner$runnable$1; HSPLokhttp3/internal/concurrent/TaskRunner$runnable$1;->(Lokhttp3/internal/concurrent/TaskRunner;)V PLokhttp3/internal/concurrent/TaskRunner$runnable$1;->(Lokhttp3/internal/concurrent/TaskRunner;)V HSPLokhttp3/internal/concurrent/TaskRunner$runnable$1;->run()V PLokhttp3/internal/concurrent/TaskRunner$runnable$1;->run()V Lokhttp3/internal/connection/ConnectInterceptor; HSPLokhttp3/internal/connection/ConnectInterceptor;->()V PLokhttp3/internal/connection/ConnectInterceptor;->()V HSPLokhttp3/internal/connection/ConnectInterceptor;->()V PLokhttp3/internal/connection/ConnectInterceptor;->()V HSPLokhttp3/internal/connection/ConnectInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLokhttp3/internal/connection/ConnectInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Lokhttp3/internal/connection/ConnectPlan; HSPLokhttp3/internal/connection/ConnectPlan;->()V PLokhttp3/internal/connection/ConnectPlan;->()V HSPLokhttp3/internal/connection/ConnectPlan;->(Lokhttp3/OkHttpClient;Lokhttp3/internal/connection/RealCall;Lokhttp3/internal/connection/RealRoutePlanner;Lokhttp3/Route;Ljava/util/List;ILokhttp3/Request;IZ)V PLokhttp3/internal/connection/ConnectPlan;->(Lokhttp3/OkHttpClient;Lokhttp3/internal/connection/RealCall;Lokhttp3/internal/connection/RealRoutePlanner;Lokhttp3/Route;Ljava/util/List;ILokhttp3/Request;IZ)V HSPLokhttp3/internal/connection/ConnectPlan;->connectSocket()V PLokhttp3/internal/connection/ConnectPlan;->connectSocket()V HSPLokhttp3/internal/connection/ConnectPlan;->connectTcp()Lokhttp3/internal/connection/RoutePlanner$ConnectResult; PLokhttp3/internal/connection/ConnectPlan;->connectTcp()Lokhttp3/internal/connection/RoutePlanner$ConnectResult; HSPLokhttp3/internal/connection/ConnectPlan;->connectTls(Ljavax/net/ssl/SSLSocket;Lokhttp3/ConnectionSpec;)V PLokhttp3/internal/connection/ConnectPlan;->connectTls(Ljavax/net/ssl/SSLSocket;Lokhttp3/ConnectionSpec;)V HSPLokhttp3/internal/connection/ConnectPlan;->connectTlsEtc()Lokhttp3/internal/connection/RoutePlanner$ConnectResult; PLokhttp3/internal/connection/ConnectPlan;->connectTlsEtc()Lokhttp3/internal/connection/RoutePlanner$ConnectResult; HSPLokhttp3/internal/connection/ConnectPlan;->copy$default(Lokhttp3/internal/connection/ConnectPlan;ILokhttp3/Request;IZI)Lokhttp3/internal/connection/ConnectPlan; PLokhttp3/internal/connection/ConnectPlan;->copy$default(Lokhttp3/internal/connection/ConnectPlan;ILokhttp3/Request;IZI)Lokhttp3/internal/connection/ConnectPlan; HSPLokhttp3/internal/connection/ConnectPlan;->getRoutes$okhttp()Ljava/util/List; PLokhttp3/internal/connection/ConnectPlan;->getRoutes$okhttp()Ljava/util/List; HSPLokhttp3/internal/connection/ConnectPlan;->handleSuccess()Lokhttp3/internal/connection/RealConnection; PLokhttp3/internal/connection/ConnectPlan;->handleSuccess()Lokhttp3/internal/connection/RealConnection; HSPLokhttp3/internal/connection/ConnectPlan;->isReady()Z PLokhttp3/internal/connection/ConnectPlan;->isReady()Z HSPLokhttp3/internal/connection/ConnectPlan;->nextConnectionSpec$okhttp(Ljava/util/List;Ljavax/net/ssl/SSLSocket;)Lokhttp3/internal/connection/ConnectPlan; PLokhttp3/internal/connection/ConnectPlan;->nextConnectionSpec$okhttp(Ljava/util/List;Ljavax/net/ssl/SSLSocket;)Lokhttp3/internal/connection/ConnectPlan; HSPLokhttp3/internal/connection/ConnectPlan;->planWithCurrentOrInitialConnectionSpec$okhttp(Ljava/util/List;Ljavax/net/ssl/SSLSocket;)Lokhttp3/internal/connection/ConnectPlan; PLokhttp3/internal/connection/ConnectPlan;->planWithCurrentOrInitialConnectionSpec$okhttp(Ljava/util/List;Ljavax/net/ssl/SSLSocket;)Lokhttp3/internal/connection/ConnectPlan; Lokhttp3/internal/connection/ConnectPlan$Companion; HSPLokhttp3/internal/connection/ConnectPlan$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/connection/ConnectPlan$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/connection/ConnectPlan$WhenMappings; HSPLokhttp3/internal/connection/ConnectPlan$WhenMappings;->()V PLokhttp3/internal/connection/ConnectPlan$WhenMappings;->()V Lokhttp3/internal/connection/ConnectPlan$connectTls$1; HSPLokhttp3/internal/connection/ConnectPlan$connectTls$1;->(Lokhttp3/Handshake;)V PLokhttp3/internal/connection/ConnectPlan$connectTls$1;->(Lokhttp3/Handshake;)V Lokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1; HSPLokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1;->(Lokhttp3/CertificatePinner;Lokhttp3/Handshake;Lokhttp3/Address;)V PLokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1;->(Lokhttp3/CertificatePinner;Lokhttp3/Handshake;Lokhttp3/Address;)V HSPLokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1;->invoke()Ljava/lang/Object; PLokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1;->invoke()Ljava/lang/Object; HSPLokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1;->invoke()Ljava/util/List; PLokhttp3/internal/connection/ConnectPlan$connectTls$handshake$1;->invoke()Ljava/util/List; Lokhttp3/internal/connection/Exchange; HSPLokhttp3/internal/connection/Exchange;->(Lokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;Lokhttp3/internal/connection/ExchangeFinder;Lokhttp3/internal/http/ExchangeCodec;)V PLokhttp3/internal/connection/Exchange;->(Lokhttp3/internal/connection/RealCall;Lokhttp3/EventListener;Lokhttp3/internal/connection/ExchangeFinder;Lokhttp3/internal/http/ExchangeCodec;)V HSPLokhttp3/internal/connection/Exchange;->bodyComplete(JZZLjava/io/IOException;)Ljava/io/IOException; PLokhttp3/internal/connection/Exchange;->bodyComplete(JZZLjava/io/IOException;)Ljava/io/IOException; HSPLokhttp3/internal/connection/Exchange;->finishRequest()V PLokhttp3/internal/connection/Exchange;->finishRequest()V HSPLokhttp3/internal/connection/Exchange;->getCall$okhttp()Lokhttp3/internal/connection/RealCall; PLokhttp3/internal/connection/Exchange;->getCall$okhttp()Lokhttp3/internal/connection/RealCall; HSPLokhttp3/internal/connection/Exchange;->getConnection$okhttp()Lokhttp3/internal/connection/RealConnection; PLokhttp3/internal/connection/Exchange;->getConnection$okhttp()Lokhttp3/internal/connection/RealConnection; HSPLokhttp3/internal/connection/Exchange;->getEventListener$okhttp()Lokhttp3/EventListener; PLokhttp3/internal/connection/Exchange;->getEventListener$okhttp()Lokhttp3/EventListener; HSPLokhttp3/internal/connection/Exchange;->getFinder$okhttp()Lokhttp3/internal/connection/ExchangeFinder; PLokhttp3/internal/connection/Exchange;->getFinder$okhttp()Lokhttp3/internal/connection/ExchangeFinder; HSPLokhttp3/internal/connection/Exchange;->isDuplex$okhttp()Z PLokhttp3/internal/connection/Exchange;->isDuplex$okhttp()Z HSPLokhttp3/internal/connection/Exchange;->noRequestBody()V PLokhttp3/internal/connection/Exchange;->noRequestBody()V HSPLokhttp3/internal/connection/Exchange;->openResponseBody(Lokhttp3/Response;)Lokhttp3/ResponseBody; PLokhttp3/internal/connection/Exchange;->openResponseBody(Lokhttp3/Response;)Lokhttp3/ResponseBody; HSPLokhttp3/internal/connection/Exchange;->readResponseHeaders(Z)Lokhttp3/Response$Builder; PLokhttp3/internal/connection/Exchange;->readResponseHeaders(Z)Lokhttp3/Response$Builder; HSPLokhttp3/internal/connection/Exchange;->responseHeadersEnd(Lokhttp3/Response;)V PLokhttp3/internal/connection/Exchange;->responseHeadersEnd(Lokhttp3/Response;)V HSPLokhttp3/internal/connection/Exchange;->responseHeadersStart()V PLokhttp3/internal/connection/Exchange;->responseHeadersStart()V HSPLokhttp3/internal/connection/Exchange;->writeRequestHeaders(Lokhttp3/Request;)V PLokhttp3/internal/connection/Exchange;->writeRequestHeaders(Lokhttp3/Request;)V Lokhttp3/internal/connection/Exchange$ResponseBodySource; HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->(Lokhttp3/internal/connection/Exchange;Lokio/Source;J)V PLokhttp3/internal/connection/Exchange$ResponseBodySource;->(Lokhttp3/internal/connection/Exchange;Lokio/Source;J)V HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->close()V PLokhttp3/internal/connection/Exchange$ResponseBodySource;->close()V HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->complete(Ljava/io/IOException;)Ljava/io/IOException; PLokhttp3/internal/connection/Exchange$ResponseBodySource;->complete(Ljava/io/IOException;)Ljava/io/IOException; HSPLokhttp3/internal/connection/Exchange$ResponseBodySource;->read(Lokio/Buffer;J)J PLokhttp3/internal/connection/Exchange$ResponseBodySource;->read(Lokio/Buffer;J)J Lokhttp3/internal/connection/ExchangeFinder; Lokhttp3/internal/connection/FailedPlan; Lokhttp3/internal/connection/FastFallbackExchangeFinder; HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->(Lokhttp3/internal/connection/RoutePlanner;Lokhttp3/internal/concurrent/TaskRunner;)V PLokhttp3/internal/connection/FastFallbackExchangeFinder;->(Lokhttp3/internal/connection/RoutePlanner;Lokhttp3/internal/concurrent/TaskRunner;)V HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->access$getConnectResults$p(Lokhttp3/internal/connection/FastFallbackExchangeFinder;)Ljava/util/concurrent/BlockingQueue; PLokhttp3/internal/connection/FastFallbackExchangeFinder;->access$getConnectResults$p(Lokhttp3/internal/connection/FastFallbackExchangeFinder;)Ljava/util/concurrent/BlockingQueue; HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->access$getTcpConnectsInFlight$p(Lokhttp3/internal/connection/FastFallbackExchangeFinder;)Ljava/util/concurrent/CopyOnWriteArrayList; PLokhttp3/internal/connection/FastFallbackExchangeFinder;->access$getTcpConnectsInFlight$p(Lokhttp3/internal/connection/FastFallbackExchangeFinder;)Ljava/util/concurrent/CopyOnWriteArrayList; HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->cancelInFlightConnects()V PLokhttp3/internal/connection/FastFallbackExchangeFinder;->cancelInFlightConnects()V HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->find()Lokhttp3/internal/connection/RealConnection; PLokhttp3/internal/connection/FastFallbackExchangeFinder;->find()Lokhttp3/internal/connection/RealConnection; HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->getRoutePlanner()Lokhttp3/internal/connection/RoutePlanner; PLokhttp3/internal/connection/FastFallbackExchangeFinder;->getRoutePlanner()Lokhttp3/internal/connection/RoutePlanner; HSPLokhttp3/internal/connection/FastFallbackExchangeFinder;->launchTcpConnect()Lokhttp3/internal/connection/RoutePlanner$ConnectResult; PLokhttp3/internal/connection/FastFallbackExchangeFinder;->launchTcpConnect()Lokhttp3/internal/connection/RoutePlanner$ConnectResult; Lokhttp3/internal/connection/FastFallbackExchangeFinder$launchTcpConnect$1; HSPLokhttp3/internal/connection/FastFallbackExchangeFinder$launchTcpConnect$1;->(Ljava/lang/String;Lokhttp3/internal/connection/RoutePlanner$Plan;Lokhttp3/internal/connection/FastFallbackExchangeFinder;)V PLokhttp3/internal/connection/FastFallbackExchangeFinder$launchTcpConnect$1;->(Ljava/lang/String;Lokhttp3/internal/connection/RoutePlanner$Plan;Lokhttp3/internal/connection/FastFallbackExchangeFinder;)V HSPLokhttp3/internal/connection/FastFallbackExchangeFinder$launchTcpConnect$1;->runOnce()J PLokhttp3/internal/connection/FastFallbackExchangeFinder$launchTcpConnect$1;->runOnce()J Lokhttp3/internal/connection/InetAddressOrderKt; HSPLokhttp3/internal/connection/InetAddressOrderKt;->reorderForHappyEyeballs(Ljava/util/List;)Ljava/util/List; PLokhttp3/internal/connection/InetAddressOrderKt;->reorderForHappyEyeballs(Ljava/util/List;)Ljava/util/List; Lokhttp3/internal/connection/RealCall; HSPLokhttp3/internal/connection/RealCall;->(Lokhttp3/OkHttpClient;Lokhttp3/Request;Z)V PLokhttp3/internal/connection/RealCall;->(Lokhttp3/OkHttpClient;Lokhttp3/Request;Z)V HSPLokhttp3/internal/connection/RealCall;->access$getTimeout$p(Lokhttp3/internal/connection/RealCall;)Lokhttp3/internal/connection/RealCall$timeout$1; PLokhttp3/internal/connection/RealCall;->access$getTimeout$p(Lokhttp3/internal/connection/RealCall;)Lokhttp3/internal/connection/RealCall$timeout$1; HSPLokhttp3/internal/connection/RealCall;->acquireConnectionNoEvents(Lokhttp3/internal/connection/RealConnection;)V PLokhttp3/internal/connection/RealCall;->acquireConnectionNoEvents(Lokhttp3/internal/connection/RealConnection;)V HSPLokhttp3/internal/connection/RealCall;->callDone(Ljava/io/IOException;)Ljava/io/IOException; PLokhttp3/internal/connection/RealCall;->callDone(Ljava/io/IOException;)Ljava/io/IOException; HSPLokhttp3/internal/connection/RealCall;->enqueue(Lokhttp3/Callback;)V PLokhttp3/internal/connection/RealCall;->enqueue(Lokhttp3/Callback;)V HSPLokhttp3/internal/connection/RealCall;->enterNetworkInterceptorExchange(Lokhttp3/Request;ZLokhttp3/internal/http/RealInterceptorChain;)V PLokhttp3/internal/connection/RealCall;->enterNetworkInterceptorExchange(Lokhttp3/Request;ZLokhttp3/internal/http/RealInterceptorChain;)V HSPLokhttp3/internal/connection/RealCall;->exitNetworkInterceptorExchange$okhttp(Z)V PLokhttp3/internal/connection/RealCall;->exitNetworkInterceptorExchange$okhttp(Z)V HSPLokhttp3/internal/connection/RealCall;->getClient()Lokhttp3/OkHttpClient; PLokhttp3/internal/connection/RealCall;->getClient()Lokhttp3/OkHttpClient; HSPLokhttp3/internal/connection/RealCall;->getConnection()Lokhttp3/internal/connection/RealConnection; PLokhttp3/internal/connection/RealCall;->getConnection()Lokhttp3/internal/connection/RealConnection; HSPLokhttp3/internal/connection/RealCall;->getEventListener$okhttp()Lokhttp3/EventListener; PLokhttp3/internal/connection/RealCall;->getEventListener$okhttp()Lokhttp3/EventListener; HSPLokhttp3/internal/connection/RealCall;->getForWebSocket()Z PLokhttp3/internal/connection/RealCall;->getForWebSocket()Z HSPLokhttp3/internal/connection/RealCall;->getInterceptorScopedExchange$okhttp()Lokhttp3/internal/connection/Exchange; PLokhttp3/internal/connection/RealCall;->getInterceptorScopedExchange$okhttp()Lokhttp3/internal/connection/Exchange; HSPLokhttp3/internal/connection/RealCall;->getOriginalRequest()Lokhttp3/Request; PLokhttp3/internal/connection/RealCall;->getOriginalRequest()Lokhttp3/Request; HSPLokhttp3/internal/connection/RealCall;->getPlansToCancel$okhttp()Ljava/util/concurrent/CopyOnWriteArrayList; PLokhttp3/internal/connection/RealCall;->getPlansToCancel$okhttp()Ljava/util/concurrent/CopyOnWriteArrayList; HSPLokhttp3/internal/connection/RealCall;->getResponseWithInterceptorChain$okhttp()Lokhttp3/Response; PLokhttp3/internal/connection/RealCall;->getResponseWithInterceptorChain$okhttp()Lokhttp3/Response; HSPLokhttp3/internal/connection/RealCall;->initExchange$okhttp(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/internal/connection/Exchange; PLokhttp3/internal/connection/RealCall;->initExchange$okhttp(Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/internal/connection/Exchange; HSPLokhttp3/internal/connection/RealCall;->isCanceled()Z PLokhttp3/internal/connection/RealCall;->isCanceled()Z HSPLokhttp3/internal/connection/RealCall;->messageDone$okhttp(Lokhttp3/internal/connection/Exchange;ZZLjava/io/IOException;)Ljava/io/IOException; PLokhttp3/internal/connection/RealCall;->messageDone$okhttp(Lokhttp3/internal/connection/Exchange;ZZLjava/io/IOException;)Ljava/io/IOException; HSPLokhttp3/internal/connection/RealCall;->noMoreExchanges$okhttp(Ljava/io/IOException;)Ljava/io/IOException; PLokhttp3/internal/connection/RealCall;->noMoreExchanges$okhttp(Ljava/io/IOException;)Ljava/io/IOException; HSPLokhttp3/internal/connection/RealCall;->redactedUrl$okhttp()Ljava/lang/String; PLokhttp3/internal/connection/RealCall;->redactedUrl$okhttp()Ljava/lang/String; HSPLokhttp3/internal/connection/RealCall;->releaseConnectionNoEvents$okhttp()Ljava/net/Socket; PLokhttp3/internal/connection/RealCall;->releaseConnectionNoEvents$okhttp()Ljava/net/Socket; Lokhttp3/internal/connection/RealCall$AsyncCall; HSPLokhttp3/internal/connection/RealCall$AsyncCall;->(Lokhttp3/internal/connection/RealCall;Lokhttp3/Callback;)V PLokhttp3/internal/connection/RealCall$AsyncCall;->(Lokhttp3/internal/connection/RealCall;Lokhttp3/Callback;)V HSPLokhttp3/internal/connection/RealCall$AsyncCall;->executeOn(Ljava/util/concurrent/ExecutorService;)V PLokhttp3/internal/connection/RealCall$AsyncCall;->executeOn(Ljava/util/concurrent/ExecutorService;)V HSPLokhttp3/internal/connection/RealCall$AsyncCall;->getCall()Lokhttp3/internal/connection/RealCall; PLokhttp3/internal/connection/RealCall$AsyncCall;->getCall()Lokhttp3/internal/connection/RealCall; HSPLokhttp3/internal/connection/RealCall$AsyncCall;->getCallsPerHost()Ljava/util/concurrent/atomic/AtomicInteger; PLokhttp3/internal/connection/RealCall$AsyncCall;->getCallsPerHost()Ljava/util/concurrent/atomic/AtomicInteger; HSPLokhttp3/internal/connection/RealCall$AsyncCall;->getHost()Ljava/lang/String; PLokhttp3/internal/connection/RealCall$AsyncCall;->getHost()Ljava/lang/String; HSPLokhttp3/internal/connection/RealCall$AsyncCall;->reuseCallsPerHostFrom(Lokhttp3/internal/connection/RealCall$AsyncCall;)V PLokhttp3/internal/connection/RealCall$AsyncCall;->reuseCallsPerHostFrom(Lokhttp3/internal/connection/RealCall$AsyncCall;)V HSPLokhttp3/internal/connection/RealCall$AsyncCall;->run()V PLokhttp3/internal/connection/RealCall$AsyncCall;->run()V Lokhttp3/internal/connection/RealCall$CallReference; HSPLokhttp3/internal/connection/RealCall$CallReference;->(Lokhttp3/internal/connection/RealCall;Ljava/lang/Object;)V PLokhttp3/internal/connection/RealCall$CallReference;->(Lokhttp3/internal/connection/RealCall;Ljava/lang/Object;)V Lokhttp3/internal/connection/RealCall$timeout$1; HSPLokhttp3/internal/connection/RealCall$timeout$1;->(Lokhttp3/internal/connection/RealCall;)V PLokhttp3/internal/connection/RealCall$timeout$1;->(Lokhttp3/internal/connection/RealCall;)V Lokhttp3/internal/connection/RealConnection; HSPLokhttp3/internal/connection/RealConnection;->()V PLokhttp3/internal/connection/RealConnection;->()V HSPLokhttp3/internal/connection/RealConnection;->(Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/connection/RealConnectionPool;Lokhttp3/Route;Ljava/net/Socket;Ljava/net/Socket;Lokhttp3/Handshake;Lokhttp3/Protocol;Lokio/BufferedSource;Lokio/BufferedSink;I)V PLokhttp3/internal/connection/RealConnection;->(Lokhttp3/internal/concurrent/TaskRunner;Lokhttp3/internal/connection/RealConnectionPool;Lokhttp3/Route;Ljava/net/Socket;Ljava/net/Socket;Lokhttp3/Handshake;Lokhttp3/Protocol;Lokio/BufferedSource;Lokio/BufferedSink;I)V HSPLokhttp3/internal/connection/RealConnection;->getCalls()Ljava/util/List; PLokhttp3/internal/connection/RealConnection;->getCalls()Ljava/util/List; HSPLokhttp3/internal/connection/RealConnection;->getIdleAtNs()J PLokhttp3/internal/connection/RealConnection;->getIdleAtNs()J HSPLokhttp3/internal/connection/RealConnection;->getNoNewExchanges()Z PLokhttp3/internal/connection/RealConnection;->getNoNewExchanges()Z HSPLokhttp3/internal/connection/RealConnection;->handshake()Lokhttp3/Handshake; PLokhttp3/internal/connection/RealConnection;->handshake()Lokhttp3/Handshake; HSPLokhttp3/internal/connection/RealConnection;->incrementSuccessCount$okhttp()V PLokhttp3/internal/connection/RealConnection;->incrementSuccessCount$okhttp()V HSPLokhttp3/internal/connection/RealConnection;->newCodec$okhttp(Lokhttp3/OkHttpClient;Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/internal/http/ExchangeCodec; PLokhttp3/internal/connection/RealConnection;->newCodec$okhttp(Lokhttp3/OkHttpClient;Lokhttp3/internal/http/RealInterceptorChain;)Lokhttp3/internal/http/ExchangeCodec; HSPLokhttp3/internal/connection/RealConnection;->onSettings(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Settings;)V PLokhttp3/internal/connection/RealConnection;->onSettings(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/connection/RealConnection;->protocol()Lokhttp3/Protocol; PLokhttp3/internal/connection/RealConnection;->protocol()Lokhttp3/Protocol; HSPLokhttp3/internal/connection/RealConnection;->route()Lokhttp3/Route; PLokhttp3/internal/connection/RealConnection;->route()Lokhttp3/Route; HSPLokhttp3/internal/connection/RealConnection;->setIdleAtNs(J)V PLokhttp3/internal/connection/RealConnection;->setIdleAtNs(J)V HSPLokhttp3/internal/connection/RealConnection;->start()V PLokhttp3/internal/connection/RealConnection;->start()V Lokhttp3/internal/connection/RealConnection$Companion; HSPLokhttp3/internal/connection/RealConnection$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/connection/RealConnection$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/connection/RealConnectionPool; HSPLokhttp3/internal/connection/RealConnectionPool;->()V PLokhttp3/internal/connection/RealConnectionPool;->()V HSPLokhttp3/internal/connection/RealConnectionPool;->(Lokhttp3/internal/concurrent/TaskRunner;IJLjava/util/concurrent/TimeUnit;)V PLokhttp3/internal/connection/RealConnectionPool;->(Lokhttp3/internal/concurrent/TaskRunner;IJLjava/util/concurrent/TimeUnit;)V HSPLokhttp3/internal/connection/RealConnectionPool;->callAcquirePooledConnection(ZLokhttp3/Address;Lokhttp3/internal/connection/RealCall;Ljava/util/List;Z)Lokhttp3/internal/connection/RealConnection; PLokhttp3/internal/connection/RealConnectionPool;->callAcquirePooledConnection(ZLokhttp3/Address;Lokhttp3/internal/connection/RealCall;Ljava/util/List;Z)Lokhttp3/internal/connection/RealConnection; HSPLokhttp3/internal/connection/RealConnectionPool;->cleanup(J)J PLokhttp3/internal/connection/RealConnectionPool;->cleanup(J)J HSPLokhttp3/internal/connection/RealConnectionPool;->connectionBecameIdle(Lokhttp3/internal/connection/RealConnection;)Z PLokhttp3/internal/connection/RealConnectionPool;->connectionBecameIdle(Lokhttp3/internal/connection/RealConnection;)Z HSPLokhttp3/internal/connection/RealConnectionPool;->pruneAndGetAllocationCount(Lokhttp3/internal/connection/RealConnection;J)I PLokhttp3/internal/connection/RealConnectionPool;->pruneAndGetAllocationCount(Lokhttp3/internal/connection/RealConnection;J)I HSPLokhttp3/internal/connection/RealConnectionPool;->put(Lokhttp3/internal/connection/RealConnection;)V PLokhttp3/internal/connection/RealConnectionPool;->put(Lokhttp3/internal/connection/RealConnection;)V Lokhttp3/internal/connection/RealConnectionPool$Companion; HSPLokhttp3/internal/connection/RealConnectionPool$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/connection/RealConnectionPool$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/connection/RealConnectionPool$cleanupTask$1; HSPLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->(Lokhttp3/internal/connection/RealConnectionPool;Ljava/lang/String;)V PLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->(Lokhttp3/internal/connection/RealConnectionPool;Ljava/lang/String;)V HSPLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->runOnce()J PLokhttp3/internal/connection/RealConnectionPool$cleanupTask$1;->runOnce()J Lokhttp3/internal/connection/RealRoutePlanner; HSPLokhttp3/internal/connection/RealRoutePlanner;->(Lokhttp3/OkHttpClient;Lokhttp3/Address;Lokhttp3/internal/connection/RealCall;Lokhttp3/internal/http/RealInterceptorChain;)V PLokhttp3/internal/connection/RealRoutePlanner;->(Lokhttp3/OkHttpClient;Lokhttp3/Address;Lokhttp3/internal/connection/RealCall;Lokhttp3/internal/http/RealInterceptorChain;)V HSPLokhttp3/internal/connection/RealRoutePlanner;->getAddress()Lokhttp3/Address; PLokhttp3/internal/connection/RealRoutePlanner;->getAddress()Lokhttp3/Address; HSPLokhttp3/internal/connection/RealRoutePlanner;->hasNext(Lokhttp3/internal/connection/RealConnection;)Z PLokhttp3/internal/connection/RealRoutePlanner;->hasNext(Lokhttp3/internal/connection/RealConnection;)Z HSPLokhttp3/internal/connection/RealRoutePlanner;->isCanceled()Z PLokhttp3/internal/connection/RealRoutePlanner;->isCanceled()Z HSPLokhttp3/internal/connection/RealRoutePlanner;->plan()Lokhttp3/internal/connection/RoutePlanner$Plan; PLokhttp3/internal/connection/RealRoutePlanner;->plan()Lokhttp3/internal/connection/RoutePlanner$Plan; HSPLokhttp3/internal/connection/RealRoutePlanner;->planConnectToRoute$okhttp$default(Lokhttp3/internal/connection/RealRoutePlanner;Lokhttp3/Route;Ljava/util/List;ILjava/lang/Object;)Lokhttp3/internal/connection/ConnectPlan; PLokhttp3/internal/connection/RealRoutePlanner;->planConnectToRoute$okhttp$default(Lokhttp3/internal/connection/RealRoutePlanner;Lokhttp3/Route;Ljava/util/List;ILjava/lang/Object;)Lokhttp3/internal/connection/ConnectPlan; HSPLokhttp3/internal/connection/RealRoutePlanner;->planConnectToRoute$okhttp(Lokhttp3/Route;Ljava/util/List;)Lokhttp3/internal/connection/ConnectPlan; PLokhttp3/internal/connection/RealRoutePlanner;->planConnectToRoute$okhttp(Lokhttp3/Route;Ljava/util/List;)Lokhttp3/internal/connection/ConnectPlan; HSPLokhttp3/internal/connection/RealRoutePlanner;->planReusePooledConnection$okhttp$default(Lokhttp3/internal/connection/RealRoutePlanner;Lokhttp3/internal/connection/ConnectPlan;Ljava/util/List;ILjava/lang/Object;)Lokhttp3/internal/connection/ReusePlan; PLokhttp3/internal/connection/RealRoutePlanner;->planReusePooledConnection$okhttp$default(Lokhttp3/internal/connection/RealRoutePlanner;Lokhttp3/internal/connection/ConnectPlan;Ljava/util/List;ILjava/lang/Object;)Lokhttp3/internal/connection/ReusePlan; HSPLokhttp3/internal/connection/RealRoutePlanner;->planReusePooledConnection$okhttp(Lokhttp3/internal/connection/ConnectPlan;Ljava/util/List;)Lokhttp3/internal/connection/ReusePlan; PLokhttp3/internal/connection/RealRoutePlanner;->planReusePooledConnection$okhttp(Lokhttp3/internal/connection/ConnectPlan;Ljava/util/List;)Lokhttp3/internal/connection/ReusePlan; HSPLokhttp3/internal/connection/RealRoutePlanner;->sameHostAndPort(Lokhttp3/HttpUrl;)Z PLokhttp3/internal/connection/RealRoutePlanner;->sameHostAndPort(Lokhttp3/HttpUrl;)Z Lokhttp3/internal/connection/RouteDatabase; HSPLokhttp3/internal/connection/RouteDatabase;->()V PLokhttp3/internal/connection/RouteDatabase;->()V HSPLokhttp3/internal/connection/RouteDatabase;->connected(Lokhttp3/Route;)V PLokhttp3/internal/connection/RouteDatabase;->connected(Lokhttp3/Route;)V HSPLokhttp3/internal/connection/RouteDatabase;->shouldPostpone(Lokhttp3/Route;)Z PLokhttp3/internal/connection/RouteDatabase;->shouldPostpone(Lokhttp3/Route;)Z Lokhttp3/internal/connection/RoutePlanner; HSPLokhttp3/internal/connection/RoutePlanner;->hasNext$default(Lokhttp3/internal/connection/RoutePlanner;Lokhttp3/internal/connection/RealConnection;ILjava/lang/Object;)Z PLokhttp3/internal/connection/RoutePlanner;->hasNext$default(Lokhttp3/internal/connection/RoutePlanner;Lokhttp3/internal/connection/RealConnection;ILjava/lang/Object;)Z Lokhttp3/internal/connection/RoutePlanner$ConnectResult; HSPLokhttp3/internal/connection/RoutePlanner$ConnectResult;->(Lokhttp3/internal/connection/RoutePlanner$Plan;Lokhttp3/internal/connection/RoutePlanner$Plan;Ljava/lang/Throwable;)V PLokhttp3/internal/connection/RoutePlanner$ConnectResult;->(Lokhttp3/internal/connection/RoutePlanner$Plan;Lokhttp3/internal/connection/RoutePlanner$Plan;Ljava/lang/Throwable;)V HSPLokhttp3/internal/connection/RoutePlanner$ConnectResult;->(Lokhttp3/internal/connection/RoutePlanner$Plan;Lokhttp3/internal/connection/RoutePlanner$Plan;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/connection/RoutePlanner$ConnectResult;->(Lokhttp3/internal/connection/RoutePlanner$Plan;Lokhttp3/internal/connection/RoutePlanner$Plan;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/connection/RoutePlanner$ConnectResult;->getNextPlan()Lokhttp3/internal/connection/RoutePlanner$Plan; PLokhttp3/internal/connection/RoutePlanner$ConnectResult;->getNextPlan()Lokhttp3/internal/connection/RoutePlanner$Plan; HSPLokhttp3/internal/connection/RoutePlanner$ConnectResult;->getPlan()Lokhttp3/internal/connection/RoutePlanner$Plan; PLokhttp3/internal/connection/RoutePlanner$ConnectResult;->getPlan()Lokhttp3/internal/connection/RoutePlanner$Plan; HSPLokhttp3/internal/connection/RoutePlanner$ConnectResult;->getThrowable()Ljava/lang/Throwable; PLokhttp3/internal/connection/RoutePlanner$ConnectResult;->getThrowable()Ljava/lang/Throwable; HSPLokhttp3/internal/connection/RoutePlanner$ConnectResult;->isSuccess()Z PLokhttp3/internal/connection/RoutePlanner$ConnectResult;->isSuccess()Z Lokhttp3/internal/connection/RoutePlanner$Plan; Lokhttp3/internal/connection/RouteSelector; HSPLokhttp3/internal/connection/RouteSelector;->()V PLokhttp3/internal/connection/RouteSelector;->()V HSPLokhttp3/internal/connection/RouteSelector;->(Lokhttp3/Address;Lokhttp3/internal/connection/RouteDatabase;Lokhttp3/Call;ZLokhttp3/EventListener;)V PLokhttp3/internal/connection/RouteSelector;->(Lokhttp3/Address;Lokhttp3/internal/connection/RouteDatabase;Lokhttp3/Call;ZLokhttp3/EventListener;)V HSPLokhttp3/internal/connection/RouteSelector;->hasNext()Z PLokhttp3/internal/connection/RouteSelector;->hasNext()Z HSPLokhttp3/internal/connection/RouteSelector;->next()Lokhttp3/internal/connection/RouteSelector$Selection; PLokhttp3/internal/connection/RouteSelector;->next()Lokhttp3/internal/connection/RouteSelector$Selection; Lokhttp3/internal/connection/RouteSelector$Companion; HSPLokhttp3/internal/connection/RouteSelector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/connection/RouteSelector$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/connection/RouteSelector$Selection; HSPLokhttp3/internal/connection/RouteSelector$Selection;->(Ljava/util/List;)V PLokhttp3/internal/connection/RouteSelector$Selection;->(Ljava/util/List;)V HSPLokhttp3/internal/connection/RouteSelector$Selection;->getRoutes()Ljava/util/List; PLokhttp3/internal/connection/RouteSelector$Selection;->getRoutes()Ljava/util/List; HSPLokhttp3/internal/connection/RouteSelector$Selection;->hasNext()Z PLokhttp3/internal/connection/RouteSelector$Selection;->hasNext()Z HSPLokhttp3/internal/connection/RouteSelector$Selection;->next()Lokhttp3/Route; PLokhttp3/internal/connection/RouteSelector$Selection;->next()Lokhttp3/Route; Lokhttp3/internal/http/BridgeInterceptor; HSPLokhttp3/internal/http/BridgeInterceptor;->(Lokhttp3/CookieJar;)V PLokhttp3/internal/http/BridgeInterceptor;->(Lokhttp3/CookieJar;)V HSPLokhttp3/internal/http/BridgeInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLokhttp3/internal/http/BridgeInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Lokhttp3/internal/http/CallServerInterceptor; HSPLokhttp3/internal/http/CallServerInterceptor;->(Z)V PLokhttp3/internal/http/CallServerInterceptor;->(Z)V HSPLokhttp3/internal/http/CallServerInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLokhttp3/internal/http/CallServerInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Lokhttp3/internal/http/ExchangeCodec; Lokhttp3/internal/http/ExchangeCodec$Carrier; Lokhttp3/internal/http/HttpHeaders; HSPLokhttp3/internal/http/HttpHeaders;->()V PLokhttp3/internal/http/HttpHeaders;->()V HSPLokhttp3/internal/http/HttpHeaders;->promisesBody(Lokhttp3/Response;)Z PLokhttp3/internal/http/HttpHeaders;->promisesBody(Lokhttp3/Response;)Z HSPLokhttp3/internal/http/HttpHeaders;->receiveHeaders(Lokhttp3/CookieJar;Lokhttp3/HttpUrl;Lokhttp3/Headers;)V PLokhttp3/internal/http/HttpHeaders;->receiveHeaders(Lokhttp3/CookieJar;Lokhttp3/HttpUrl;Lokhttp3/Headers;)V Lokhttp3/internal/http/HttpMethod; HSPLokhttp3/internal/http/HttpMethod;->()V PLokhttp3/internal/http/HttpMethod;->()V HSPLokhttp3/internal/http/HttpMethod;->()V PLokhttp3/internal/http/HttpMethod;->()V HSPLokhttp3/internal/http/HttpMethod;->invalidatesCache(Ljava/lang/String;)Z PLokhttp3/internal/http/HttpMethod;->invalidatesCache(Ljava/lang/String;)Z HSPLokhttp3/internal/http/HttpMethod;->permitsRequestBody(Ljava/lang/String;)Z PLokhttp3/internal/http/HttpMethod;->permitsRequestBody(Ljava/lang/String;)Z Lokhttp3/internal/http/RealInterceptorChain; HSPLokhttp3/internal/http/RealInterceptorChain;->(Lokhttp3/internal/connection/RealCall;Ljava/util/List;ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;III)V PLokhttp3/internal/http/RealInterceptorChain;->(Lokhttp3/internal/connection/RealCall;Ljava/util/List;ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;III)V HSPLokhttp3/internal/http/RealInterceptorChain;->call()Lokhttp3/Call; PLokhttp3/internal/http/RealInterceptorChain;->call()Lokhttp3/Call; HSPLokhttp3/internal/http/RealInterceptorChain;->connection()Lokhttp3/Connection; PLokhttp3/internal/http/RealInterceptorChain;->connection()Lokhttp3/Connection; HSPLokhttp3/internal/http/RealInterceptorChain;->copy$okhttp$default(Lokhttp3/internal/http/RealInterceptorChain;ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;IIIILjava/lang/Object;)Lokhttp3/internal/http/RealInterceptorChain; PLokhttp3/internal/http/RealInterceptorChain;->copy$okhttp$default(Lokhttp3/internal/http/RealInterceptorChain;ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;IIIILjava/lang/Object;)Lokhttp3/internal/http/RealInterceptorChain; HSPLokhttp3/internal/http/RealInterceptorChain;->copy$okhttp(ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;III)Lokhttp3/internal/http/RealInterceptorChain; PLokhttp3/internal/http/RealInterceptorChain;->copy$okhttp(ILokhttp3/internal/connection/Exchange;Lokhttp3/Request;III)Lokhttp3/internal/http/RealInterceptorChain; HSPLokhttp3/internal/http/RealInterceptorChain;->getCall$okhttp()Lokhttp3/internal/connection/RealCall; PLokhttp3/internal/http/RealInterceptorChain;->getCall$okhttp()Lokhttp3/internal/connection/RealCall; HSPLokhttp3/internal/http/RealInterceptorChain;->getExchange$okhttp()Lokhttp3/internal/connection/Exchange; PLokhttp3/internal/http/RealInterceptorChain;->getExchange$okhttp()Lokhttp3/internal/connection/Exchange; HSPLokhttp3/internal/http/RealInterceptorChain;->getReadTimeoutMillis$okhttp()I PLokhttp3/internal/http/RealInterceptorChain;->getReadTimeoutMillis$okhttp()I HSPLokhttp3/internal/http/RealInterceptorChain;->getRequest$okhttp()Lokhttp3/Request; PLokhttp3/internal/http/RealInterceptorChain;->getRequest$okhttp()Lokhttp3/Request; HSPLokhttp3/internal/http/RealInterceptorChain;->getWriteTimeoutMillis$okhttp()I PLokhttp3/internal/http/RealInterceptorChain;->getWriteTimeoutMillis$okhttp()I HSPLokhttp3/internal/http/RealInterceptorChain;->proceed(Lokhttp3/Request;)Lokhttp3/Response; PLokhttp3/internal/http/RealInterceptorChain;->proceed(Lokhttp3/Request;)Lokhttp3/Response; HSPLokhttp3/internal/http/RealInterceptorChain;->request()Lokhttp3/Request; PLokhttp3/internal/http/RealInterceptorChain;->request()Lokhttp3/Request; Lokhttp3/internal/http/RealResponseBody; HSPLokhttp3/internal/http/RealResponseBody;->(Ljava/lang/String;JLokio/BufferedSource;)V PLokhttp3/internal/http/RealResponseBody;->(Ljava/lang/String;JLokio/BufferedSource;)V HSPLokhttp3/internal/http/RealResponseBody;->contentLength()J PLokhttp3/internal/http/RealResponseBody;->contentLength()J HSPLokhttp3/internal/http/RealResponseBody;->contentType()Lokhttp3/MediaType; PLokhttp3/internal/http/RealResponseBody;->contentType()Lokhttp3/MediaType; HSPLokhttp3/internal/http/RealResponseBody;->source()Lokio/BufferedSource; PLokhttp3/internal/http/RealResponseBody;->source()Lokio/BufferedSource; Lokhttp3/internal/http/RequestLine; HSPLokhttp3/internal/http/RequestLine;->()V PLokhttp3/internal/http/RequestLine;->()V HSPLokhttp3/internal/http/RequestLine;->()V PLokhttp3/internal/http/RequestLine;->()V HSPLokhttp3/internal/http/RequestLine;->requestPath(Lokhttp3/HttpUrl;)Ljava/lang/String; PLokhttp3/internal/http/RequestLine;->requestPath(Lokhttp3/HttpUrl;)Ljava/lang/String; Lokhttp3/internal/http/RetryAndFollowUpInterceptor; HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->()V PLokhttp3/internal/http/RetryAndFollowUpInterceptor;->()V HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->(Lokhttp3/OkHttpClient;)V PLokhttp3/internal/http/RetryAndFollowUpInterceptor;->(Lokhttp3/OkHttpClient;)V HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->followUpRequest(Lokhttp3/Response;Lokhttp3/internal/connection/Exchange;)Lokhttp3/Request; PLokhttp3/internal/http/RetryAndFollowUpInterceptor;->followUpRequest(Lokhttp3/Response;Lokhttp3/internal/connection/Exchange;)Lokhttp3/Request; HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLokhttp3/internal/http/RetryAndFollowUpInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; Lokhttp3/internal/http/RetryAndFollowUpInterceptor$Companion; HSPLokhttp3/internal/http/RetryAndFollowUpInterceptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http/RetryAndFollowUpInterceptor$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http/StatusLine; HSPLokhttp3/internal/http/StatusLine;->()V PLokhttp3/internal/http/StatusLine;->()V HSPLokhttp3/internal/http/StatusLine;->(Lokhttp3/Protocol;ILjava/lang/String;)V PLokhttp3/internal/http/StatusLine;->(Lokhttp3/Protocol;ILjava/lang/String;)V HSPLokhttp3/internal/http/StatusLine;->toString()Ljava/lang/String; PLokhttp3/internal/http/StatusLine;->toString()Ljava/lang/String; Lokhttp3/internal/http/StatusLine$Companion; HSPLokhttp3/internal/http/StatusLine$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http/StatusLine$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/http/StatusLine$Companion;->parse(Ljava/lang/String;)Lokhttp3/internal/http/StatusLine; PLokhttp3/internal/http/StatusLine$Companion;->parse(Ljava/lang/String;)Lokhttp3/internal/http/StatusLine; Lokhttp3/internal/http2/ErrorCode; HSPLokhttp3/internal/http2/ErrorCode;->()V PLokhttp3/internal/http2/ErrorCode;->()V HSPLokhttp3/internal/http2/ErrorCode;->(Ljava/lang/String;II)V PLokhttp3/internal/http2/ErrorCode;->(Ljava/lang/String;II)V Lokhttp3/internal/http2/ErrorCode$Companion; HSPLokhttp3/internal/http2/ErrorCode$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/ErrorCode$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http2/Header; HSPLokhttp3/internal/http2/Header;->()V PLokhttp3/internal/http2/Header;->()V HSPLokhttp3/internal/http2/Header;->(Ljava/lang/String;Ljava/lang/String;)V PLokhttp3/internal/http2/Header;->(Ljava/lang/String;Ljava/lang/String;)V HSPLokhttp3/internal/http2/Header;->(Lokio/ByteString;Ljava/lang/String;)V PLokhttp3/internal/http2/Header;->(Lokio/ByteString;Ljava/lang/String;)V HSPLokhttp3/internal/http2/Header;->(Lokio/ByteString;Lokio/ByteString;)V PLokhttp3/internal/http2/Header;->(Lokio/ByteString;Lokio/ByteString;)V Lokhttp3/internal/http2/Header$Companion; HSPLokhttp3/internal/http2/Header$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Header$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http2/Hpack; HSPLokhttp3/internal/http2/Hpack;->()V PLokhttp3/internal/http2/Hpack;->()V HSPLokhttp3/internal/http2/Hpack;->()V PLokhttp3/internal/http2/Hpack;->()V HSPLokhttp3/internal/http2/Hpack;->checkLowercase(Lokio/ByteString;)Lokio/ByteString; PLokhttp3/internal/http2/Hpack;->checkLowercase(Lokio/ByteString;)Lokio/ByteString; HSPLokhttp3/internal/http2/Hpack;->getNAME_TO_FIRST_INDEX()Ljava/util/Map; PLokhttp3/internal/http2/Hpack;->getNAME_TO_FIRST_INDEX()Ljava/util/Map; HSPLokhttp3/internal/http2/Hpack;->getSTATIC_HEADER_TABLE()[Lokhttp3/internal/http2/Header; PLokhttp3/internal/http2/Hpack;->getSTATIC_HEADER_TABLE()[Lokhttp3/internal/http2/Header; Lokhttp3/internal/http2/Hpack$Reader; HSPLokhttp3/internal/http2/Hpack$Reader;->(Lokio/Source;II)V PLokhttp3/internal/http2/Hpack$Reader;->(Lokio/Source;II)V HSPLokhttp3/internal/http2/Hpack$Reader;->(Lokio/Source;IIILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Hpack$Reader;->(Lokio/Source;IIILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/http2/Hpack$Reader;->evictToRecoverBytes(I)I PLokhttp3/internal/http2/Hpack$Reader;->evictToRecoverBytes(I)I HSPLokhttp3/internal/http2/Hpack$Reader;->getAndResetHeaderList()Ljava/util/List; PLokhttp3/internal/http2/Hpack$Reader;->getAndResetHeaderList()Ljava/util/List; HSPLokhttp3/internal/http2/Hpack$Reader;->getName(I)Lokio/ByteString; PLokhttp3/internal/http2/Hpack$Reader;->getName(I)Lokio/ByteString; HSPLokhttp3/internal/http2/Hpack$Reader;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V PLokhttp3/internal/http2/Hpack$Reader;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V HSPLokhttp3/internal/http2/Hpack$Reader;->readByteString()Lokio/ByteString; PLokhttp3/internal/http2/Hpack$Reader;->readByteString()Lokio/ByteString; HSPLokhttp3/internal/http2/Hpack$Reader;->readHeaders()V PLokhttp3/internal/http2/Hpack$Reader;->readHeaders()V HSPLokhttp3/internal/http2/Hpack$Reader;->readInt(II)I PLokhttp3/internal/http2/Hpack$Reader;->readInt(II)I Lokhttp3/internal/http2/Hpack$Writer; HSPLokhttp3/internal/http2/Hpack$Writer;->(IZLokio/Buffer;)V PLokhttp3/internal/http2/Hpack$Writer;->(IZLokio/Buffer;)V HSPLokhttp3/internal/http2/Hpack$Writer;->(IZLokio/Buffer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Hpack$Writer;->(IZLokio/Buffer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/http2/Hpack$Writer;->evictToRecoverBytes(I)V PLokhttp3/internal/http2/Hpack$Writer;->evictToRecoverBytes(I)V HSPLokhttp3/internal/http2/Hpack$Writer;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V PLokhttp3/internal/http2/Hpack$Writer;->insertIntoDynamicTable(Lokhttp3/internal/http2/Header;)V HSPLokhttp3/internal/http2/Hpack$Writer;->writeByteString(Lokio/ByteString;)V PLokhttp3/internal/http2/Hpack$Writer;->writeByteString(Lokio/ByteString;)V HSPLokhttp3/internal/http2/Hpack$Writer;->writeHeaders(Ljava/util/List;)V PLokhttp3/internal/http2/Hpack$Writer;->writeHeaders(Ljava/util/List;)V HSPLokhttp3/internal/http2/Hpack$Writer;->writeInt(III)V PLokhttp3/internal/http2/Hpack$Writer;->writeInt(III)V Lokhttp3/internal/http2/Http2; HSPLokhttp3/internal/http2/Http2;->()V PLokhttp3/internal/http2/Http2;->()V HSPLokhttp3/internal/http2/Http2;->()V PLokhttp3/internal/http2/Http2;->()V Lokhttp3/internal/http2/Http2Connection; HSPLokhttp3/internal/http2/Http2Connection;->()V PLokhttp3/internal/http2/Http2Connection;->()V HSPLokhttp3/internal/http2/Http2Connection;->(Lokhttp3/internal/http2/Http2Connection$Builder;)V PLokhttp3/internal/http2/Http2Connection;->(Lokhttp3/internal/http2/Http2Connection$Builder;)V HSPLokhttp3/internal/http2/Http2Connection;->access$getDEFAULT_SETTINGS$cp()Lokhttp3/internal/http2/Settings; PLokhttp3/internal/http2/Http2Connection;->access$getDEFAULT_SETTINGS$cp()Lokhttp3/internal/http2/Settings; HSPLokhttp3/internal/http2/Http2Connection;->access$getSettingsListenerQueue$p(Lokhttp3/internal/http2/Http2Connection;)Lokhttp3/internal/concurrent/TaskQueue; PLokhttp3/internal/http2/Http2Connection;->access$getSettingsListenerQueue$p(Lokhttp3/internal/http2/Http2Connection;)Lokhttp3/internal/concurrent/TaskQueue; HSPLokhttp3/internal/http2/Http2Connection;->access$getWriterQueue$p(Lokhttp3/internal/http2/Http2Connection;)Lokhttp3/internal/concurrent/TaskQueue; PLokhttp3/internal/http2/Http2Connection;->access$getWriterQueue$p(Lokhttp3/internal/http2/Http2Connection;)Lokhttp3/internal/concurrent/TaskQueue; HSPLokhttp3/internal/http2/Http2Connection;->access$setWriteBytesMaximum$p(Lokhttp3/internal/http2/Http2Connection;J)V PLokhttp3/internal/http2/Http2Connection;->access$setWriteBytesMaximum$p(Lokhttp3/internal/http2/Http2Connection;J)V HSPLokhttp3/internal/http2/Http2Connection;->flush()V PLokhttp3/internal/http2/Http2Connection;->flush()V HSPLokhttp3/internal/http2/Http2Connection;->getClient$okhttp()Z PLokhttp3/internal/http2/Http2Connection;->getClient$okhttp()Z HSPLokhttp3/internal/http2/Http2Connection;->getConnectionName$okhttp()Ljava/lang/String; PLokhttp3/internal/http2/Http2Connection;->getConnectionName$okhttp()Ljava/lang/String; HSPLokhttp3/internal/http2/Http2Connection;->getListener$okhttp()Lokhttp3/internal/http2/Http2Connection$Listener; PLokhttp3/internal/http2/Http2Connection;->getListener$okhttp()Lokhttp3/internal/http2/Http2Connection$Listener; HSPLokhttp3/internal/http2/Http2Connection;->getOkHttpSettings()Lokhttp3/internal/http2/Settings; PLokhttp3/internal/http2/Http2Connection;->getOkHttpSettings()Lokhttp3/internal/http2/Settings; HSPLokhttp3/internal/http2/Http2Connection;->getPeerSettings()Lokhttp3/internal/http2/Settings; PLokhttp3/internal/http2/Http2Connection;->getPeerSettings()Lokhttp3/internal/http2/Settings; HSPLokhttp3/internal/http2/Http2Connection;->getStream(I)Lokhttp3/internal/http2/Http2Stream; PLokhttp3/internal/http2/Http2Connection;->getStream(I)Lokhttp3/internal/http2/Http2Stream; HSPLokhttp3/internal/http2/Http2Connection;->getWriteBytesMaximum()J PLokhttp3/internal/http2/Http2Connection;->getWriteBytesMaximum()J HSPLokhttp3/internal/http2/Http2Connection;->getWriter()Lokhttp3/internal/http2/Http2Writer; PLokhttp3/internal/http2/Http2Connection;->getWriter()Lokhttp3/internal/http2/Http2Writer; HSPLokhttp3/internal/http2/Http2Connection;->newStream(ILjava/util/List;Z)Lokhttp3/internal/http2/Http2Stream; PLokhttp3/internal/http2/Http2Connection;->newStream(ILjava/util/List;Z)Lokhttp3/internal/http2/Http2Stream; HSPLokhttp3/internal/http2/Http2Connection;->newStream(Ljava/util/List;Z)Lokhttp3/internal/http2/Http2Stream; PLokhttp3/internal/http2/Http2Connection;->newStream(Ljava/util/List;Z)Lokhttp3/internal/http2/Http2Stream; HSPLokhttp3/internal/http2/Http2Connection;->pushedStream$okhttp(I)Z PLokhttp3/internal/http2/Http2Connection;->pushedStream$okhttp(I)Z HSPLokhttp3/internal/http2/Http2Connection;->removeStream$okhttp(I)Lokhttp3/internal/http2/Http2Stream; PLokhttp3/internal/http2/Http2Connection;->removeStream$okhttp(I)Lokhttp3/internal/http2/Http2Stream; HSPLokhttp3/internal/http2/Http2Connection;->setPeerSettings(Lokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Http2Connection;->setPeerSettings(Lokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Http2Connection;->start$default(Lokhttp3/internal/http2/Http2Connection;ZILjava/lang/Object;)V PLokhttp3/internal/http2/Http2Connection;->start$default(Lokhttp3/internal/http2/Http2Connection;ZILjava/lang/Object;)V HSPLokhttp3/internal/http2/Http2Connection;->start(Z)V PLokhttp3/internal/http2/Http2Connection;->start(Z)V HSPLokhttp3/internal/http2/Http2Connection;->updateConnectionFlowControl$okhttp(J)V PLokhttp3/internal/http2/Http2Connection;->updateConnectionFlowControl$okhttp(J)V Lokhttp3/internal/http2/Http2Connection$Builder; HSPLokhttp3/internal/http2/Http2Connection$Builder;->(ZLokhttp3/internal/concurrent/TaskRunner;)V PLokhttp3/internal/http2/Http2Connection$Builder;->(ZLokhttp3/internal/concurrent/TaskRunner;)V HSPLokhttp3/internal/http2/Http2Connection$Builder;->getClient$okhttp()Z PLokhttp3/internal/http2/Http2Connection$Builder;->getClient$okhttp()Z HSPLokhttp3/internal/http2/Http2Connection$Builder;->getConnectionName$okhttp()Ljava/lang/String; PLokhttp3/internal/http2/Http2Connection$Builder;->getConnectionName$okhttp()Ljava/lang/String; HSPLokhttp3/internal/http2/Http2Connection$Builder;->getListener$okhttp()Lokhttp3/internal/http2/Http2Connection$Listener; PLokhttp3/internal/http2/Http2Connection$Builder;->getListener$okhttp()Lokhttp3/internal/http2/Http2Connection$Listener; HSPLokhttp3/internal/http2/Http2Connection$Builder;->getPingIntervalMillis$okhttp()I PLokhttp3/internal/http2/Http2Connection$Builder;->getPingIntervalMillis$okhttp()I HSPLokhttp3/internal/http2/Http2Connection$Builder;->getPushObserver$okhttp()Lokhttp3/internal/http2/PushObserver; PLokhttp3/internal/http2/Http2Connection$Builder;->getPushObserver$okhttp()Lokhttp3/internal/http2/PushObserver; HSPLokhttp3/internal/http2/Http2Connection$Builder;->getSink$okhttp()Lokio/BufferedSink; PLokhttp3/internal/http2/Http2Connection$Builder;->getSink$okhttp()Lokio/BufferedSink; HSPLokhttp3/internal/http2/Http2Connection$Builder;->getSocket$okhttp()Ljava/net/Socket; PLokhttp3/internal/http2/Http2Connection$Builder;->getSocket$okhttp()Ljava/net/Socket; HSPLokhttp3/internal/http2/Http2Connection$Builder;->getSource$okhttp()Lokio/BufferedSource; PLokhttp3/internal/http2/Http2Connection$Builder;->getSource$okhttp()Lokio/BufferedSource; HSPLokhttp3/internal/http2/Http2Connection$Builder;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; PLokhttp3/internal/http2/Http2Connection$Builder;->getTaskRunner$okhttp()Lokhttp3/internal/concurrent/TaskRunner; HSPLokhttp3/internal/http2/Http2Connection$Builder;->listener(Lokhttp3/internal/http2/Http2Connection$Listener;)Lokhttp3/internal/http2/Http2Connection$Builder; PLokhttp3/internal/http2/Http2Connection$Builder;->listener(Lokhttp3/internal/http2/Http2Connection$Listener;)Lokhttp3/internal/http2/Http2Connection$Builder; HSPLokhttp3/internal/http2/Http2Connection$Builder;->pingIntervalMillis(I)Lokhttp3/internal/http2/Http2Connection$Builder; PLokhttp3/internal/http2/Http2Connection$Builder;->pingIntervalMillis(I)Lokhttp3/internal/http2/Http2Connection$Builder; HSPLokhttp3/internal/http2/Http2Connection$Builder;->setConnectionName$okhttp(Ljava/lang/String;)V PLokhttp3/internal/http2/Http2Connection$Builder;->setConnectionName$okhttp(Ljava/lang/String;)V HSPLokhttp3/internal/http2/Http2Connection$Builder;->setSink$okhttp(Lokio/BufferedSink;)V PLokhttp3/internal/http2/Http2Connection$Builder;->setSink$okhttp(Lokio/BufferedSink;)V HSPLokhttp3/internal/http2/Http2Connection$Builder;->setSocket$okhttp(Ljava/net/Socket;)V PLokhttp3/internal/http2/Http2Connection$Builder;->setSocket$okhttp(Ljava/net/Socket;)V HSPLokhttp3/internal/http2/Http2Connection$Builder;->setSource$okhttp(Lokio/BufferedSource;)V PLokhttp3/internal/http2/Http2Connection$Builder;->setSource$okhttp(Lokio/BufferedSource;)V HSPLokhttp3/internal/http2/Http2Connection$Builder;->socket(Ljava/net/Socket;Ljava/lang/String;Lokio/BufferedSource;Lokio/BufferedSink;)Lokhttp3/internal/http2/Http2Connection$Builder; PLokhttp3/internal/http2/Http2Connection$Builder;->socket(Ljava/net/Socket;Ljava/lang/String;Lokio/BufferedSource;Lokio/BufferedSink;)Lokhttp3/internal/http2/Http2Connection$Builder; Lokhttp3/internal/http2/Http2Connection$Companion; HSPLokhttp3/internal/http2/Http2Connection$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Http2Connection$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http2/Http2Connection$Listener; HSPLokhttp3/internal/http2/Http2Connection$Listener;->()V PLokhttp3/internal/http2/Http2Connection$Listener;->()V HSPLokhttp3/internal/http2/Http2Connection$Listener;->()V PLokhttp3/internal/http2/Http2Connection$Listener;->()V Lokhttp3/internal/http2/Http2Connection$Listener$Companion; HSPLokhttp3/internal/http2/Http2Connection$Listener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Http2Connection$Listener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http2/Http2Connection$Listener$Companion$REFUSE_INCOMING_STREAMS$1; HSPLokhttp3/internal/http2/Http2Connection$Listener$Companion$REFUSE_INCOMING_STREAMS$1;->()V PLokhttp3/internal/http2/Http2Connection$Listener$Companion$REFUSE_INCOMING_STREAMS$1;->()V Lokhttp3/internal/http2/Http2Connection$ReaderRunnable; HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Http2Reader;)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->(Lokhttp3/internal/http2/Http2Connection;Lokhttp3/internal/http2/Http2Reader;)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->ackSettings()V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->ackSettings()V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->applyAndAckSettings(ZLokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->applyAndAckSettings(ZLokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->data(ZILokio/BufferedSource;I)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->data(ZILokio/BufferedSource;I)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->headers(ZIILjava/util/List;)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->headers(ZIILjava/util/List;)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->invoke()Ljava/lang/Object; PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->invoke()Ljava/lang/Object; HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->invoke()V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->invoke()V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->settings(ZLokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->settings(ZLokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->windowUpdate(IJ)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable;->windowUpdate(IJ)V Lokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2; HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2;->(Lokhttp3/internal/http2/Http2Connection;Lkotlin/jvm/internal/Ref$ObjectRef;)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2;->(Lokhttp3/internal/http2/Http2Connection;Lkotlin/jvm/internal/Ref$ObjectRef;)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2;->invoke()Ljava/lang/Object; PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2;->invoke()Ljava/lang/Object; HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2;->invoke()V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$applyAndAckSettings$1$1$2;->invoke()V Lokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1; HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1;->(Lokhttp3/internal/http2/Http2Connection$ReaderRunnable;ZLokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1;->(Lokhttp3/internal/http2/Http2Connection$ReaderRunnable;ZLokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1;->invoke()Ljava/lang/Object; PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1;->invoke()Ljava/lang/Object; HSPLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1;->invoke()V PLokhttp3/internal/http2/Http2Connection$ReaderRunnable$settings$1;->invoke()V Lokhttp3/internal/http2/Http2ExchangeCodec; HSPLokhttp3/internal/http2/Http2ExchangeCodec;->()V PLokhttp3/internal/http2/Http2ExchangeCodec;->()V HSPLokhttp3/internal/http2/Http2ExchangeCodec;->(Lokhttp3/OkHttpClient;Lokhttp3/internal/http/ExchangeCodec$Carrier;Lokhttp3/internal/http/RealInterceptorChain;Lokhttp3/internal/http2/Http2Connection;)V PLokhttp3/internal/http2/Http2ExchangeCodec;->(Lokhttp3/OkHttpClient;Lokhttp3/internal/http/ExchangeCodec$Carrier;Lokhttp3/internal/http/RealInterceptorChain;Lokhttp3/internal/http2/Http2Connection;)V HSPLokhttp3/internal/http2/Http2ExchangeCodec;->access$getHTTP_2_SKIPPED_REQUEST_HEADERS$cp()Ljava/util/List; PLokhttp3/internal/http2/Http2ExchangeCodec;->access$getHTTP_2_SKIPPED_REQUEST_HEADERS$cp()Ljava/util/List; HSPLokhttp3/internal/http2/Http2ExchangeCodec;->access$getHTTP_2_SKIPPED_RESPONSE_HEADERS$cp()Ljava/util/List; PLokhttp3/internal/http2/Http2ExchangeCodec;->access$getHTTP_2_SKIPPED_RESPONSE_HEADERS$cp()Ljava/util/List; HSPLokhttp3/internal/http2/Http2ExchangeCodec;->finishRequest()V PLokhttp3/internal/http2/Http2ExchangeCodec;->finishRequest()V HSPLokhttp3/internal/http2/Http2ExchangeCodec;->getCarrier()Lokhttp3/internal/http/ExchangeCodec$Carrier; PLokhttp3/internal/http2/Http2ExchangeCodec;->getCarrier()Lokhttp3/internal/http/ExchangeCodec$Carrier; HSPLokhttp3/internal/http2/Http2ExchangeCodec;->openResponseBodySource(Lokhttp3/Response;)Lokio/Source; PLokhttp3/internal/http2/Http2ExchangeCodec;->openResponseBodySource(Lokhttp3/Response;)Lokio/Source; HSPLokhttp3/internal/http2/Http2ExchangeCodec;->readResponseHeaders(Z)Lokhttp3/Response$Builder; PLokhttp3/internal/http2/Http2ExchangeCodec;->readResponseHeaders(Z)Lokhttp3/Response$Builder; HSPLokhttp3/internal/http2/Http2ExchangeCodec;->reportedContentLength(Lokhttp3/Response;)J PLokhttp3/internal/http2/Http2ExchangeCodec;->reportedContentLength(Lokhttp3/Response;)J HSPLokhttp3/internal/http2/Http2ExchangeCodec;->writeRequestHeaders(Lokhttp3/Request;)V PLokhttp3/internal/http2/Http2ExchangeCodec;->writeRequestHeaders(Lokhttp3/Request;)V Lokhttp3/internal/http2/Http2ExchangeCodec$Companion; HSPLokhttp3/internal/http2/Http2ExchangeCodec$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Http2ExchangeCodec$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/http2/Http2ExchangeCodec$Companion;->http2HeadersList(Lokhttp3/Request;)Ljava/util/List; PLokhttp3/internal/http2/Http2ExchangeCodec$Companion;->http2HeadersList(Lokhttp3/Request;)Ljava/util/List; HSPLokhttp3/internal/http2/Http2ExchangeCodec$Companion;->readHttp2HeadersList(Lokhttp3/Headers;Lokhttp3/Protocol;)Lokhttp3/Response$Builder; PLokhttp3/internal/http2/Http2ExchangeCodec$Companion;->readHttp2HeadersList(Lokhttp3/Headers;Lokhttp3/Protocol;)Lokhttp3/Response$Builder; Lokhttp3/internal/http2/Http2ExchangeCodec$Companion$readHttp2HeadersList$1; HSPLokhttp3/internal/http2/Http2ExchangeCodec$Companion$readHttp2HeadersList$1;->()V PLokhttp3/internal/http2/Http2ExchangeCodec$Companion$readHttp2HeadersList$1;->()V HSPLokhttp3/internal/http2/Http2ExchangeCodec$Companion$readHttp2HeadersList$1;->()V PLokhttp3/internal/http2/Http2ExchangeCodec$Companion$readHttp2HeadersList$1;->()V Lokhttp3/internal/http2/Http2Reader; HSPLokhttp3/internal/http2/Http2Reader;->()V PLokhttp3/internal/http2/Http2Reader;->()V HSPLokhttp3/internal/http2/Http2Reader;->(Lokio/BufferedSource;Z)V PLokhttp3/internal/http2/Http2Reader;->(Lokio/BufferedSource;Z)V HSPLokhttp3/internal/http2/Http2Reader;->nextFrame(ZLokhttp3/internal/http2/Http2Reader$Handler;)Z PLokhttp3/internal/http2/Http2Reader;->nextFrame(ZLokhttp3/internal/http2/Http2Reader$Handler;)Z HSPLokhttp3/internal/http2/Http2Reader;->readConnectionPreface(Lokhttp3/internal/http2/Http2Reader$Handler;)V PLokhttp3/internal/http2/Http2Reader;->readConnectionPreface(Lokhttp3/internal/http2/Http2Reader$Handler;)V HSPLokhttp3/internal/http2/Http2Reader;->readHeaderBlock(IIII)Ljava/util/List; PLokhttp3/internal/http2/Http2Reader;->readHeaderBlock(IIII)Ljava/util/List; Lokhttp3/internal/http2/Http2Reader$Companion; HSPLokhttp3/internal/http2/Http2Reader$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Http2Reader$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/http2/Http2Reader$Companion;->lengthWithoutPadding(III)I PLokhttp3/internal/http2/Http2Reader$Companion;->lengthWithoutPadding(III)I Lokhttp3/internal/http2/Http2Reader$ContinuationSource; HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->(Lokio/BufferedSource;)V PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->(Lokio/BufferedSource;)V HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->getLeft()I PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->getLeft()I HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->read(Lokio/Buffer;J)J PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->read(Lokio/Buffer;J)J HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setFlags(I)V PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setFlags(I)V HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setLeft(I)V PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setLeft(I)V HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setLength(I)V PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setLength(I)V HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setPadding(I)V PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setPadding(I)V HSPLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setStreamId(I)V PLokhttp3/internal/http2/Http2Reader$ContinuationSource;->setStreamId(I)V Lokhttp3/internal/http2/Http2Reader$Handler; Lokhttp3/internal/http2/Http2Stream; HSPLokhttp3/internal/http2/Http2Stream;->()V PLokhttp3/internal/http2/Http2Stream;->()V HSPLokhttp3/internal/http2/Http2Stream;->(ILokhttp3/internal/http2/Http2Connection;ZZLokhttp3/Headers;)V PLokhttp3/internal/http2/Http2Stream;->(ILokhttp3/internal/http2/Http2Connection;ZZLokhttp3/Headers;)V HSPLokhttp3/internal/http2/Http2Stream;->access$doReadTimeout(Lokhttp3/internal/http2/Http2Stream;)Z PLokhttp3/internal/http2/Http2Stream;->access$doReadTimeout(Lokhttp3/internal/http2/Http2Stream;)Z HSPLokhttp3/internal/http2/Http2Stream;->cancelStreamIfNecessary$okhttp()V PLokhttp3/internal/http2/Http2Stream;->cancelStreamIfNecessary$okhttp()V HSPLokhttp3/internal/http2/Http2Stream;->getConnection()Lokhttp3/internal/http2/Http2Connection; PLokhttp3/internal/http2/Http2Stream;->getConnection()Lokhttp3/internal/http2/Http2Connection; HSPLokhttp3/internal/http2/Http2Stream;->getErrorCode$okhttp()Lokhttp3/internal/http2/ErrorCode; PLokhttp3/internal/http2/Http2Stream;->getErrorCode$okhttp()Lokhttp3/internal/http2/ErrorCode; HSPLokhttp3/internal/http2/Http2Stream;->getReadBytesAcknowledged()J PLokhttp3/internal/http2/Http2Stream;->getReadBytesAcknowledged()J HSPLokhttp3/internal/http2/Http2Stream;->getReadBytesTotal()J PLokhttp3/internal/http2/Http2Stream;->getReadBytesTotal()J HSPLokhttp3/internal/http2/Http2Stream;->getReadTimeout$okhttp()Lokhttp3/internal/http2/Http2Stream$StreamTimeout; PLokhttp3/internal/http2/Http2Stream;->getReadTimeout$okhttp()Lokhttp3/internal/http2/Http2Stream$StreamTimeout; HSPLokhttp3/internal/http2/Http2Stream;->getSink$okhttp()Lokhttp3/internal/http2/Http2Stream$FramingSink; PLokhttp3/internal/http2/Http2Stream;->getSink$okhttp()Lokhttp3/internal/http2/Http2Stream$FramingSink; HSPLokhttp3/internal/http2/Http2Stream;->getSink()Lokio/Sink; PLokhttp3/internal/http2/Http2Stream;->getSink()Lokio/Sink; HSPLokhttp3/internal/http2/Http2Stream;->getSource$okhttp()Lokhttp3/internal/http2/Http2Stream$FramingSource; PLokhttp3/internal/http2/Http2Stream;->getSource$okhttp()Lokhttp3/internal/http2/Http2Stream$FramingSource; HSPLokhttp3/internal/http2/Http2Stream;->isLocallyInitiated()Z PLokhttp3/internal/http2/Http2Stream;->isLocallyInitiated()Z HSPLokhttp3/internal/http2/Http2Stream;->isOpen()Z PLokhttp3/internal/http2/Http2Stream;->isOpen()Z HSPLokhttp3/internal/http2/Http2Stream;->readTimeout()Lokio/Timeout; PLokhttp3/internal/http2/Http2Stream;->readTimeout()Lokio/Timeout; HSPLokhttp3/internal/http2/Http2Stream;->receiveData(Lokio/BufferedSource;I)V PLokhttp3/internal/http2/Http2Stream;->receiveData(Lokio/BufferedSource;I)V HSPLokhttp3/internal/http2/Http2Stream;->receiveHeaders(Lokhttp3/Headers;Z)V PLokhttp3/internal/http2/Http2Stream;->receiveHeaders(Lokhttp3/Headers;Z)V HSPLokhttp3/internal/http2/Http2Stream;->setReadBytesTotal$okhttp(J)V PLokhttp3/internal/http2/Http2Stream;->setReadBytesTotal$okhttp(J)V HSPLokhttp3/internal/http2/Http2Stream;->takeHeaders(Z)Lokhttp3/Headers; PLokhttp3/internal/http2/Http2Stream;->takeHeaders(Z)Lokhttp3/Headers; HSPLokhttp3/internal/http2/Http2Stream;->waitForIo$okhttp()V PLokhttp3/internal/http2/Http2Stream;->waitForIo$okhttp()V HSPLokhttp3/internal/http2/Http2Stream;->writeTimeout()Lokio/Timeout; PLokhttp3/internal/http2/Http2Stream;->writeTimeout()Lokio/Timeout; Lokhttp3/internal/http2/Http2Stream$Companion; HSPLokhttp3/internal/http2/Http2Stream$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Http2Stream$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http2/Http2Stream$FramingSink; HSPLokhttp3/internal/http2/Http2Stream$FramingSink;->(Lokhttp3/internal/http2/Http2Stream;Z)V PLokhttp3/internal/http2/Http2Stream$FramingSink;->(Lokhttp3/internal/http2/Http2Stream;Z)V HSPLokhttp3/internal/http2/Http2Stream$FramingSink;->close()V PLokhttp3/internal/http2/Http2Stream$FramingSink;->close()V HSPLokhttp3/internal/http2/Http2Stream$FramingSink;->getClosed()Z PLokhttp3/internal/http2/Http2Stream$FramingSink;->getClosed()Z HSPLokhttp3/internal/http2/Http2Stream$FramingSink;->getFinished()Z PLokhttp3/internal/http2/Http2Stream$FramingSink;->getFinished()Z Lokhttp3/internal/http2/Http2Stream$FramingSource; HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->(Lokhttp3/internal/http2/Http2Stream;JZ)V PLokhttp3/internal/http2/Http2Stream$FramingSource;->(Lokhttp3/internal/http2/Http2Stream;JZ)V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->close()V PLokhttp3/internal/http2/Http2Stream$FramingSource;->close()V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->getClosed$okhttp()Z PLokhttp3/internal/http2/Http2Stream$FramingSource;->getClosed$okhttp()Z HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->getFinished$okhttp()Z PLokhttp3/internal/http2/Http2Stream$FramingSource;->getFinished$okhttp()Z HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->read(Lokio/Buffer;J)J PLokhttp3/internal/http2/Http2Stream$FramingSource;->read(Lokio/Buffer;J)J HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->receive$okhttp(Lokio/BufferedSource;J)V PLokhttp3/internal/http2/Http2Stream$FramingSource;->receive$okhttp(Lokio/BufferedSource;J)V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->setFinished$okhttp(Z)V PLokhttp3/internal/http2/Http2Stream$FramingSource;->setFinished$okhttp(Z)V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->setTrailers(Lokhttp3/Headers;)V PLokhttp3/internal/http2/Http2Stream$FramingSource;->setTrailers(Lokhttp3/Headers;)V HSPLokhttp3/internal/http2/Http2Stream$FramingSource;->updateConnectionFlowControl(J)V PLokhttp3/internal/http2/Http2Stream$FramingSource;->updateConnectionFlowControl(J)V Lokhttp3/internal/http2/Http2Stream$StreamTimeout; HSPLokhttp3/internal/http2/Http2Stream$StreamTimeout;->(Lokhttp3/internal/http2/Http2Stream;)V PLokhttp3/internal/http2/Http2Stream$StreamTimeout;->(Lokhttp3/internal/http2/Http2Stream;)V HSPLokhttp3/internal/http2/Http2Stream$StreamTimeout;->exitAndThrowIfTimedOut()V PLokhttp3/internal/http2/Http2Stream$StreamTimeout;->exitAndThrowIfTimedOut()V Lokhttp3/internal/http2/Http2Writer; HSPLokhttp3/internal/http2/Http2Writer;->()V PLokhttp3/internal/http2/Http2Writer;->()V HSPLokhttp3/internal/http2/Http2Writer;->(Lokio/BufferedSink;Z)V PLokhttp3/internal/http2/Http2Writer;->(Lokio/BufferedSink;Z)V HSPLokhttp3/internal/http2/Http2Writer;->applyAndAckSettings(Lokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Http2Writer;->applyAndAckSettings(Lokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Http2Writer;->connectionPreface()V PLokhttp3/internal/http2/Http2Writer;->connectionPreface()V HSPLokhttp3/internal/http2/Http2Writer;->flush()V PLokhttp3/internal/http2/Http2Writer;->flush()V HSPLokhttp3/internal/http2/Http2Writer;->frameHeader(IIII)V PLokhttp3/internal/http2/Http2Writer;->frameHeader(IIII)V HSPLokhttp3/internal/http2/Http2Writer;->headers(ZILjava/util/List;)V PLokhttp3/internal/http2/Http2Writer;->headers(ZILjava/util/List;)V HSPLokhttp3/internal/http2/Http2Writer;->settings(Lokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Http2Writer;->settings(Lokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Http2Writer;->windowUpdate(IJ)V PLokhttp3/internal/http2/Http2Writer;->windowUpdate(IJ)V Lokhttp3/internal/http2/Http2Writer$Companion; HSPLokhttp3/internal/http2/Http2Writer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Http2Writer$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/http2/Huffman; HSPLokhttp3/internal/http2/Huffman;->()V PLokhttp3/internal/http2/Huffman;->()V HSPLokhttp3/internal/http2/Huffman;->()V PLokhttp3/internal/http2/Huffman;->()V HSPLokhttp3/internal/http2/Huffman;->addCode(III)V PLokhttp3/internal/http2/Huffman;->addCode(III)V HSPLokhttp3/internal/http2/Huffman;->decode(Lokio/BufferedSource;JLokio/BufferedSink;)V HPLokhttp3/internal/http2/Huffman;->decode(Lokio/BufferedSource;JLokio/BufferedSink;)V HSPLokhttp3/internal/http2/Huffman;->encode(Lokio/ByteString;Lokio/BufferedSink;)V PLokhttp3/internal/http2/Huffman;->encode(Lokio/ByteString;Lokio/BufferedSink;)V HSPLokhttp3/internal/http2/Huffman;->encodedLength(Lokio/ByteString;)I PLokhttp3/internal/http2/Huffman;->encodedLength(Lokio/ByteString;)I Lokhttp3/internal/http2/Huffman$Node; HSPLokhttp3/internal/http2/Huffman$Node;->()V PLokhttp3/internal/http2/Huffman$Node;->()V HSPLokhttp3/internal/http2/Huffman$Node;->(II)V PLokhttp3/internal/http2/Huffman$Node;->(II)V HSPLokhttp3/internal/http2/Huffman$Node;->getChildren()[Lokhttp3/internal/http2/Huffman$Node; PLokhttp3/internal/http2/Huffman$Node;->getChildren()[Lokhttp3/internal/http2/Huffman$Node; HSPLokhttp3/internal/http2/Huffman$Node;->getSymbol()I PLokhttp3/internal/http2/Huffman$Node;->getSymbol()I HSPLokhttp3/internal/http2/Huffman$Node;->getTerminalBitCount()I PLokhttp3/internal/http2/Huffman$Node;->getTerminalBitCount()I Lokhttp3/internal/http2/PushObserver; HSPLokhttp3/internal/http2/PushObserver;->()V PLokhttp3/internal/http2/PushObserver;->()V Lokhttp3/internal/http2/PushObserver$Companion; HSPLokhttp3/internal/http2/PushObserver$Companion;->()V PLokhttp3/internal/http2/PushObserver$Companion;->()V HSPLokhttp3/internal/http2/PushObserver$Companion;->()V PLokhttp3/internal/http2/PushObserver$Companion;->()V Lokhttp3/internal/http2/PushObserver$Companion$PushObserverCancel; HSPLokhttp3/internal/http2/PushObserver$Companion$PushObserverCancel;->()V PLokhttp3/internal/http2/PushObserver$Companion$PushObserverCancel;->()V Lokhttp3/internal/http2/Settings; HSPLokhttp3/internal/http2/Settings;->()V PLokhttp3/internal/http2/Settings;->()V HSPLokhttp3/internal/http2/Settings;->()V PLokhttp3/internal/http2/Settings;->()V HSPLokhttp3/internal/http2/Settings;->get(I)I PLokhttp3/internal/http2/Settings;->get(I)I HSPLokhttp3/internal/http2/Settings;->getHeaderTableSize()I PLokhttp3/internal/http2/Settings;->getHeaderTableSize()I HSPLokhttp3/internal/http2/Settings;->getInitialWindowSize()I PLokhttp3/internal/http2/Settings;->getInitialWindowSize()I HSPLokhttp3/internal/http2/Settings;->getMaxConcurrentStreams()I PLokhttp3/internal/http2/Settings;->getMaxConcurrentStreams()I HSPLokhttp3/internal/http2/Settings;->getMaxFrameSize(I)I PLokhttp3/internal/http2/Settings;->getMaxFrameSize(I)I HSPLokhttp3/internal/http2/Settings;->isSet(I)Z PLokhttp3/internal/http2/Settings;->isSet(I)Z HSPLokhttp3/internal/http2/Settings;->merge(Lokhttp3/internal/http2/Settings;)V PLokhttp3/internal/http2/Settings;->merge(Lokhttp3/internal/http2/Settings;)V HSPLokhttp3/internal/http2/Settings;->set(II)Lokhttp3/internal/http2/Settings; PLokhttp3/internal/http2/Settings;->set(II)Lokhttp3/internal/http2/Settings; HSPLokhttp3/internal/http2/Settings;->size()I PLokhttp3/internal/http2/Settings;->size()I Lokhttp3/internal/http2/Settings$Companion; HSPLokhttp3/internal/http2/Settings$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/http2/Settings$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/platform/Android10Platform; HSPLokhttp3/internal/platform/Android10Platform;->()V PLokhttp3/internal/platform/Android10Platform;->()V HSPLokhttp3/internal/platform/Android10Platform;->()V PLokhttp3/internal/platform/Android10Platform;->()V HSPLokhttp3/internal/platform/Android10Platform;->access$isSupported$cp()Z PLokhttp3/internal/platform/Android10Platform;->access$isSupported$cp()Z HSPLokhttp3/internal/platform/Android10Platform;->buildCertificateChainCleaner(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; PLokhttp3/internal/platform/Android10Platform;->buildCertificateChainCleaner(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; HSPLokhttp3/internal/platform/Android10Platform;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V PLokhttp3/internal/platform/Android10Platform;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V HSPLokhttp3/internal/platform/Android10Platform;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; PLokhttp3/internal/platform/Android10Platform;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; HSPLokhttp3/internal/platform/Android10Platform;->getStackTraceForCloseable(Ljava/lang/String;)Ljava/lang/Object; PLokhttp3/internal/platform/Android10Platform;->getStackTraceForCloseable(Ljava/lang/String;)Ljava/lang/Object; Lokhttp3/internal/platform/Android10Platform$Companion; HSPLokhttp3/internal/platform/Android10Platform$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/Android10Platform$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/platform/Android10Platform$Companion;->buildIfSupported()Lokhttp3/internal/platform/Platform; PLokhttp3/internal/platform/Android10Platform$Companion;->buildIfSupported()Lokhttp3/internal/platform/Platform; Lokhttp3/internal/platform/Platform; HSPLokhttp3/internal/platform/Platform;->()V PLokhttp3/internal/platform/Platform;->()V HSPLokhttp3/internal/platform/Platform;->()V PLokhttp3/internal/platform/Platform;->()V HSPLokhttp3/internal/platform/Platform;->access$getPlatform$cp()Lokhttp3/internal/platform/Platform; PLokhttp3/internal/platform/Platform;->access$getPlatform$cp()Lokhttp3/internal/platform/Platform; HSPLokhttp3/internal/platform/Platform;->afterHandshake(Ljavax/net/ssl/SSLSocket;)V PLokhttp3/internal/platform/Platform;->afterHandshake(Ljavax/net/ssl/SSLSocket;)V HSPLokhttp3/internal/platform/Platform;->connectSocket(Ljava/net/Socket;Ljava/net/InetSocketAddress;I)V PLokhttp3/internal/platform/Platform;->connectSocket(Ljava/net/Socket;Ljava/net/InetSocketAddress;I)V HSPLokhttp3/internal/platform/Platform;->getPrefix()Ljava/lang/String; PLokhttp3/internal/platform/Platform;->getPrefix()Ljava/lang/String; HSPLokhttp3/internal/platform/Platform;->log$default(Lokhttp3/internal/platform/Platform;Ljava/lang/String;ILjava/lang/Throwable;ILjava/lang/Object;)V PLokhttp3/internal/platform/Platform;->log$default(Lokhttp3/internal/platform/Platform;Ljava/lang/String;ILjava/lang/Throwable;ILjava/lang/Object;)V HSPLokhttp3/internal/platform/Platform;->log(Ljava/lang/String;ILjava/lang/Throwable;)V PLokhttp3/internal/platform/Platform;->log(Ljava/lang/String;ILjava/lang/Throwable;)V HSPLokhttp3/internal/platform/Platform;->newSSLContext()Ljavax/net/ssl/SSLContext; PLokhttp3/internal/platform/Platform;->newSSLContext()Ljavax/net/ssl/SSLContext; HSPLokhttp3/internal/platform/Platform;->newSslSocketFactory(Ljavax/net/ssl/X509TrustManager;)Ljavax/net/ssl/SSLSocketFactory; PLokhttp3/internal/platform/Platform;->newSslSocketFactory(Ljavax/net/ssl/X509TrustManager;)Ljavax/net/ssl/SSLSocketFactory; HSPLokhttp3/internal/platform/Platform;->platformTrustManager()Ljavax/net/ssl/X509TrustManager; PLokhttp3/internal/platform/Platform;->platformTrustManager()Ljavax/net/ssl/X509TrustManager; Lokhttp3/internal/platform/Platform$Companion; HSPLokhttp3/internal/platform/Platform$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/Platform$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/platform/Platform$Companion;->access$findPlatform(Lokhttp3/internal/platform/Platform$Companion;)Lokhttp3/internal/platform/Platform; PLokhttp3/internal/platform/Platform$Companion;->access$findPlatform(Lokhttp3/internal/platform/Platform$Companion;)Lokhttp3/internal/platform/Platform; HSPLokhttp3/internal/platform/Platform$Companion;->alpnProtocolNames(Ljava/util/List;)Ljava/util/List; PLokhttp3/internal/platform/Platform$Companion;->alpnProtocolNames(Ljava/util/List;)Ljava/util/List; HSPLokhttp3/internal/platform/Platform$Companion;->findPlatform()Lokhttp3/internal/platform/Platform; PLokhttp3/internal/platform/Platform$Companion;->findPlatform()Lokhttp3/internal/platform/Platform; HSPLokhttp3/internal/platform/Platform$Companion;->isAndroid()Z PLokhttp3/internal/platform/Platform$Companion;->isAndroid()Z Lokhttp3/internal/platform/android/Android10SocketAdapter; HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->()V PLokhttp3/internal/platform/android/Android10SocketAdapter;->()V HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->()V PLokhttp3/internal/platform/android/Android10SocketAdapter;->()V HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V PLokhttp3/internal/platform/android/Android10SocketAdapter;->configureTlsExtensions(Ljavax/net/ssl/SSLSocket;Ljava/lang/String;Ljava/util/List;)V HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; PLokhttp3/internal/platform/android/Android10SocketAdapter;->getSelectedProtocol(Ljavax/net/ssl/SSLSocket;)Ljava/lang/String; HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->isSupported()Z PLokhttp3/internal/platform/android/Android10SocketAdapter;->isSupported()Z HSPLokhttp3/internal/platform/android/Android10SocketAdapter;->matchesSocket(Ljavax/net/ssl/SSLSocket;)Z PLokhttp3/internal/platform/android/Android10SocketAdapter;->matchesSocket(Ljavax/net/ssl/SSLSocket;)Z Lokhttp3/internal/platform/android/Android10SocketAdapter$Companion; HSPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->buildIfSupported()Lokhttp3/internal/platform/android/SocketAdapter; PLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->buildIfSupported()Lokhttp3/internal/platform/android/SocketAdapter; HSPLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->isSupported()Z PLokhttp3/internal/platform/android/Android10SocketAdapter$Companion;->isSupported()Z Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner; HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->()V PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->()V HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->(Ljavax/net/ssl/X509TrustManager;Landroid/net/http/X509TrustManagerExtensions;)V PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->(Ljavax/net/ssl/X509TrustManager;Landroid/net/http/X509TrustManagerExtensions;)V HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->clean(Ljava/util/List;Ljava/lang/String;)Ljava/util/List; PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->clean(Ljava/util/List;Ljava/lang/String;)Ljava/util/List; HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->equals(Ljava/lang/Object;)Z PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->equals(Ljava/lang/Object;)Z HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->hashCode()I PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner;->hashCode()I Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion; HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->buildIfSupported(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner; PLokhttp3/internal/platform/android/AndroidCertificateChainCleaner$Companion;->buildIfSupported(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/platform/android/AndroidCertificateChainCleaner; Lokhttp3/internal/platform/android/AndroidLog; HSPLokhttp3/internal/platform/android/AndroidLog;->()V PLokhttp3/internal/platform/android/AndroidLog;->()V HSPLokhttp3/internal/platform/android/AndroidLog;->()V PLokhttp3/internal/platform/android/AndroidLog;->()V HSPLokhttp3/internal/platform/android/AndroidLog;->androidLog$okhttp(Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V PLokhttp3/internal/platform/android/AndroidLog;->androidLog$okhttp(Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V HSPLokhttp3/internal/platform/android/AndroidLog;->enable()V PLokhttp3/internal/platform/android/AndroidLog;->enable()V Lokhttp3/internal/platform/android/AndroidLogHandler; HSPLokhttp3/internal/platform/android/AndroidLogHandler;->()V PLokhttp3/internal/platform/android/AndroidLogHandler;->()V HSPLokhttp3/internal/platform/android/AndroidLogHandler;->()V PLokhttp3/internal/platform/android/AndroidLogHandler;->()V HSPLokhttp3/internal/platform/android/AndroidLogHandler;->publish(Ljava/util/logging/LogRecord;)V PLokhttp3/internal/platform/android/AndroidLogHandler;->publish(Ljava/util/logging/LogRecord;)V Lokhttp3/internal/platform/android/AndroidLogKt; HSPLokhttp3/internal/platform/android/AndroidLogKt;->access$getAndroidLevel(Ljava/util/logging/LogRecord;)I PLokhttp3/internal/platform/android/AndroidLogKt;->access$getAndroidLevel(Ljava/util/logging/LogRecord;)I Lokhttp3/internal/platform/android/AndroidSocketAdapter; HSPLokhttp3/internal/platform/android/AndroidSocketAdapter;->()V PLokhttp3/internal/platform/android/AndroidSocketAdapter;->()V HSPLokhttp3/internal/platform/android/AndroidSocketAdapter;->access$getPlayProviderFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; PLokhttp3/internal/platform/android/AndroidSocketAdapter;->access$getPlayProviderFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; Lokhttp3/internal/platform/android/AndroidSocketAdapter$Companion; HSPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->factory(Ljava/lang/String;)Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; PLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion;->factory(Ljava/lang/String;)Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; Lokhttp3/internal/platform/android/AndroidSocketAdapter$Companion$factory$1; HSPLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion$factory$1;->(Ljava/lang/String;)V PLokhttp3/internal/platform/android/AndroidSocketAdapter$Companion$factory$1;->(Ljava/lang/String;)V Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter; HSPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->()V PLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->()V HSPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->access$getFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; PLokhttp3/internal/platform/android/BouncyCastleSocketAdapter;->access$getFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion; HSPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion$factory$1; HSPLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion$factory$1;->()V PLokhttp3/internal/platform/android/BouncyCastleSocketAdapter$Companion$factory$1;->()V Lokhttp3/internal/platform/android/ConscryptSocketAdapter; HSPLokhttp3/internal/platform/android/ConscryptSocketAdapter;->()V PLokhttp3/internal/platform/android/ConscryptSocketAdapter;->()V HSPLokhttp3/internal/platform/android/ConscryptSocketAdapter;->access$getFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; PLokhttp3/internal/platform/android/ConscryptSocketAdapter;->access$getFactory$cp()Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; Lokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion; HSPLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion$factory$1; HSPLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion$factory$1;->()V PLokhttp3/internal/platform/android/ConscryptSocketAdapter$Companion$factory$1;->()V Lokhttp3/internal/platform/android/DeferredSocketAdapter; HSPLokhttp3/internal/platform/android/DeferredSocketAdapter;->(Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory;)V PLokhttp3/internal/platform/android/DeferredSocketAdapter;->(Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory;)V HSPLokhttp3/internal/platform/android/DeferredSocketAdapter;->isSupported()Z PLokhttp3/internal/platform/android/DeferredSocketAdapter;->isSupported()Z Lokhttp3/internal/platform/android/DeferredSocketAdapter$Factory; Lokhttp3/internal/platform/android/SocketAdapter; Lokhttp3/internal/tls/CertificateChainCleaner; HSPLokhttp3/internal/tls/CertificateChainCleaner;->()V PLokhttp3/internal/tls/CertificateChainCleaner;->()V HSPLokhttp3/internal/tls/CertificateChainCleaner;->()V PLokhttp3/internal/tls/CertificateChainCleaner;->()V Lokhttp3/internal/tls/CertificateChainCleaner$Companion; HSPLokhttp3/internal/tls/CertificateChainCleaner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/internal/tls/CertificateChainCleaner$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/internal/tls/CertificateChainCleaner$Companion;->get(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; PLokhttp3/internal/tls/CertificateChainCleaner$Companion;->get(Ljavax/net/ssl/X509TrustManager;)Lokhttp3/internal/tls/CertificateChainCleaner; Lokhttp3/internal/tls/OkHostnameVerifier; HSPLokhttp3/internal/tls/OkHostnameVerifier;->()V PLokhttp3/internal/tls/OkHostnameVerifier;->()V HSPLokhttp3/internal/tls/OkHostnameVerifier;->()V PLokhttp3/internal/tls/OkHostnameVerifier;->()V HSPLokhttp3/internal/tls/OkHostnameVerifier;->getSubjectAltNames(Ljava/security/cert/X509Certificate;I)Ljava/util/List; PLokhttp3/internal/tls/OkHostnameVerifier;->getSubjectAltNames(Ljava/security/cert/X509Certificate;I)Ljava/util/List; HSPLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z PLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)Z HSPLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z PLokhttp3/internal/tls/OkHostnameVerifier;->verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z Lokhttp3/logging/HttpLoggingInterceptor; HSPLokhttp3/logging/HttpLoggingInterceptor;->(Lokhttp3/logging/HttpLoggingInterceptor$Logger;)V PLokhttp3/logging/HttpLoggingInterceptor;->(Lokhttp3/logging/HttpLoggingInterceptor$Logger;)V HSPLokhttp3/logging/HttpLoggingInterceptor;->(Lokhttp3/logging/HttpLoggingInterceptor$Logger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokhttp3/logging/HttpLoggingInterceptor;->(Lokhttp3/logging/HttpLoggingInterceptor$Logger;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokhttp3/logging/HttpLoggingInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; PLokhttp3/logging/HttpLoggingInterceptor;->intercept(Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; HSPLokhttp3/logging/HttpLoggingInterceptor;->level(Lokhttp3/logging/HttpLoggingInterceptor$Level;)V PLokhttp3/logging/HttpLoggingInterceptor;->level(Lokhttp3/logging/HttpLoggingInterceptor$Level;)V HSPLokhttp3/logging/HttpLoggingInterceptor;->logHeader(Lokhttp3/Headers;I)V PLokhttp3/logging/HttpLoggingInterceptor;->logHeader(Lokhttp3/Headers;I)V Lokhttp3/logging/HttpLoggingInterceptor$Level; HSPLokhttp3/logging/HttpLoggingInterceptor$Level;->()V PLokhttp3/logging/HttpLoggingInterceptor$Level;->()V HSPLokhttp3/logging/HttpLoggingInterceptor$Level;->(Ljava/lang/String;I)V PLokhttp3/logging/HttpLoggingInterceptor$Level;->(Ljava/lang/String;I)V Lokhttp3/logging/HttpLoggingInterceptor$Logger; HSPLokhttp3/logging/HttpLoggingInterceptor$Logger;->()V PLokhttp3/logging/HttpLoggingInterceptor$Logger;->()V Lokhttp3/logging/HttpLoggingInterceptor$Logger$Companion; HSPLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion;->()V PLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion;->()V HSPLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion;->()V PLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion;->()V Lokhttp3/logging/HttpLoggingInterceptor$Logger$Companion$DefaultLogger; HSPLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion$DefaultLogger;->()V PLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion$DefaultLogger;->()V HSPLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion$DefaultLogger;->log(Ljava/lang/String;)V PLokhttp3/logging/HttpLoggingInterceptor$Logger$Companion$DefaultLogger;->log(Ljava/lang/String;)V Lokio/-Base64; HSPLokio/-Base64;->()V PLokio/-Base64;->()V HSPLokio/-Base64;->encodeBase64$default([B[BILjava/lang/Object;)Ljava/lang/String; PLokio/-Base64;->encodeBase64$default([B[BILjava/lang/Object;)Ljava/lang/String; HSPLokio/-Base64;->encodeBase64([B[B)Ljava/lang/String; PLokio/-Base64;->encodeBase64([B[B)Ljava/lang/String; Lokio/-SegmentedByteString; HSPLokio/-SegmentedByteString;->()V PLokio/-SegmentedByteString;->()V HSPLokio/-SegmentedByteString;->arrayRangeEquals([BI[BII)Z HPLokio/-SegmentedByteString;->arrayRangeEquals([BI[BII)Z HSPLokio/-SegmentedByteString;->checkOffsetAndCount(JJJ)V HPLokio/-SegmentedByteString;->checkOffsetAndCount(JJJ)V HSPLokio/-SegmentedByteString;->getDEFAULT__ByteString_size()I PLokio/-SegmentedByteString;->getDEFAULT__ByteString_size()I HSPLokio/-SegmentedByteString;->resolveDefaultParameter(Lokio/ByteString;I)I PLokio/-SegmentedByteString;->resolveDefaultParameter(Lokio/ByteString;I)I HSPLokio/-SegmentedByteString;->resolveDefaultParameter([BI)I PLokio/-SegmentedByteString;->resolveDefaultParameter([BI)I HSPLokio/-SegmentedByteString;->reverseBytes(I)I PLokio/-SegmentedByteString;->reverseBytes(I)I Lokio/AsyncTimeout; HSPLokio/AsyncTimeout;->()V PLokio/AsyncTimeout;->()V HSPLokio/AsyncTimeout;->()V PLokio/AsyncTimeout;->()V HSPLokio/AsyncTimeout;->access$getCondition$cp()Ljava/util/concurrent/locks/Condition; PLokio/AsyncTimeout;->access$getCondition$cp()Ljava/util/concurrent/locks/Condition; HSPLokio/AsyncTimeout;->access$getHead$cp()Lokio/AsyncTimeout; PLokio/AsyncTimeout;->access$getHead$cp()Lokio/AsyncTimeout; HSPLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_MILLIS$cp()J PLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_MILLIS$cp()J HSPLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_NANOS$cp()J PLokio/AsyncTimeout;->access$getIDLE_TIMEOUT_NANOS$cp()J HSPLokio/AsyncTimeout;->access$getInQueue$p(Lokio/AsyncTimeout;)Z PLokio/AsyncTimeout;->access$getInQueue$p(Lokio/AsyncTimeout;)Z HSPLokio/AsyncTimeout;->access$getLock$cp()Ljava/util/concurrent/locks/ReentrantLock; PLokio/AsyncTimeout;->access$getLock$cp()Ljava/util/concurrent/locks/ReentrantLock; HSPLokio/AsyncTimeout;->access$getNext$p(Lokio/AsyncTimeout;)Lokio/AsyncTimeout; PLokio/AsyncTimeout;->access$getNext$p(Lokio/AsyncTimeout;)Lokio/AsyncTimeout; HSPLokio/AsyncTimeout;->access$remainingNanos(Lokio/AsyncTimeout;J)J PLokio/AsyncTimeout;->access$remainingNanos(Lokio/AsyncTimeout;J)J HSPLokio/AsyncTimeout;->access$setHead$cp(Lokio/AsyncTimeout;)V PLokio/AsyncTimeout;->access$setHead$cp(Lokio/AsyncTimeout;)V HSPLokio/AsyncTimeout;->access$setInQueue$p(Lokio/AsyncTimeout;Z)V PLokio/AsyncTimeout;->access$setInQueue$p(Lokio/AsyncTimeout;Z)V HSPLokio/AsyncTimeout;->access$setNext$p(Lokio/AsyncTimeout;Lokio/AsyncTimeout;)V PLokio/AsyncTimeout;->access$setNext$p(Lokio/AsyncTimeout;Lokio/AsyncTimeout;)V HSPLokio/AsyncTimeout;->access$setTimeoutAt$p(Lokio/AsyncTimeout;J)V PLokio/AsyncTimeout;->access$setTimeoutAt$p(Lokio/AsyncTimeout;J)V HSPLokio/AsyncTimeout;->enter()V PLokio/AsyncTimeout;->enter()V HSPLokio/AsyncTimeout;->exit()Z PLokio/AsyncTimeout;->exit()Z HSPLokio/AsyncTimeout;->sink(Lokio/Sink;)Lokio/Sink; PLokio/AsyncTimeout;->sink(Lokio/Sink;)Lokio/Sink; HSPLokio/AsyncTimeout;->source(Lokio/Source;)Lokio/Source; PLokio/AsyncTimeout;->source(Lokio/Source;)Lokio/Source; Lokio/AsyncTimeout$Companion; HSPLokio/AsyncTimeout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/AsyncTimeout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokio/AsyncTimeout$Companion;->access$cancelScheduledTimeout(Lokio/AsyncTimeout$Companion;Lokio/AsyncTimeout;)Z PLokio/AsyncTimeout$Companion;->access$cancelScheduledTimeout(Lokio/AsyncTimeout$Companion;Lokio/AsyncTimeout;)Z HSPLokio/AsyncTimeout$Companion;->access$scheduleTimeout(Lokio/AsyncTimeout$Companion;Lokio/AsyncTimeout;JZ)V PLokio/AsyncTimeout$Companion;->access$scheduleTimeout(Lokio/AsyncTimeout$Companion;Lokio/AsyncTimeout;JZ)V HSPLokio/AsyncTimeout$Companion;->awaitTimeout$okio()Lokio/AsyncTimeout; PLokio/AsyncTimeout$Companion;->awaitTimeout$okio()Lokio/AsyncTimeout; Lokio/AsyncTimeout$Watchdog; HSPLokio/AsyncTimeout$Watchdog;->()V PLokio/AsyncTimeout$Watchdog;->()V HSPLokio/AsyncTimeout$Watchdog;->run()V PLokio/AsyncTimeout$Watchdog;->run()V Lokio/AsyncTimeout$sink$1; HSPLokio/AsyncTimeout$sink$1;->(Lokio/AsyncTimeout;Lokio/Sink;)V PLokio/AsyncTimeout$sink$1;->(Lokio/AsyncTimeout;Lokio/Sink;)V HSPLokio/AsyncTimeout$sink$1;->flush()V PLokio/AsyncTimeout$sink$1;->flush()V HSPLokio/AsyncTimeout$sink$1;->write(Lokio/Buffer;J)V PLokio/AsyncTimeout$sink$1;->write(Lokio/Buffer;J)V Lokio/AsyncTimeout$source$1; HSPLokio/AsyncTimeout$source$1;->(Lokio/AsyncTimeout;Lokio/Source;)V PLokio/AsyncTimeout$source$1;->(Lokio/AsyncTimeout;Lokio/Source;)V HSPLokio/AsyncTimeout$source$1;->read(Lokio/Buffer;J)J PLokio/AsyncTimeout$source$1;->read(Lokio/Buffer;J)J Lokio/Buffer; HSPLokio/Buffer;->()V PLokio/Buffer;->()V HSPLokio/Buffer;->clear()V PLokio/Buffer;->clear()V HSPLokio/Buffer;->completeSegmentByteCount()J PLokio/Buffer;->completeSegmentByteCount()J HSPLokio/Buffer;->copyTo(Lokio/Buffer;JJ)Lokio/Buffer; PLokio/Buffer;->copyTo(Lokio/Buffer;JJ)Lokio/Buffer; HSPLokio/Buffer;->exhausted()Z HPLokio/Buffer;->exhausted()Z HSPLokio/Buffer;->getByte(J)B HPLokio/Buffer;->getByte(J)B HSPLokio/Buffer;->indexOfElement(Lokio/ByteString;)J PLokio/Buffer;->indexOfElement(Lokio/ByteString;)J HSPLokio/Buffer;->indexOfElement(Lokio/ByteString;J)J PLokio/Buffer;->indexOfElement(Lokio/ByteString;J)J HSPLokio/Buffer;->rangeEquals(JLokio/ByteString;)Z PLokio/Buffer;->rangeEquals(JLokio/ByteString;)Z HSPLokio/Buffer;->rangeEquals(JLokio/ByteString;II)Z PLokio/Buffer;->rangeEquals(JLokio/ByteString;II)Z HSPLokio/Buffer;->read(Lokio/Buffer;J)J PLokio/Buffer;->read(Lokio/Buffer;J)J HSPLokio/Buffer;->read([BII)I PLokio/Buffer;->read([BII)I HSPLokio/Buffer;->readByte()B PLokio/Buffer;->readByte()B HSPLokio/Buffer;->readByteArray(J)[B PLokio/Buffer;->readByteArray(J)[B HSPLokio/Buffer;->readByteString()Lokio/ByteString; PLokio/Buffer;->readByteString()Lokio/ByteString; HSPLokio/Buffer;->readByteString(J)Lokio/ByteString; PLokio/Buffer;->readByteString(J)Lokio/ByteString; HSPLokio/Buffer;->readFully([B)V PLokio/Buffer;->readFully([B)V HSPLokio/Buffer;->readInt()I PLokio/Buffer;->readInt()I HSPLokio/Buffer;->readIntLe()I PLokio/Buffer;->readIntLe()I HSPLokio/Buffer;->readShort()S PLokio/Buffer;->readShort()S HSPLokio/Buffer;->readUtf8CodePoint()I HPLokio/Buffer;->readUtf8CodePoint()I HSPLokio/Buffer;->setSize$okio(J)V PLokio/Buffer;->setSize$okio(J)V HSPLokio/Buffer;->size()J HPLokio/Buffer;->size()J HSPLokio/Buffer;->skip(J)V HPLokio/Buffer;->skip(J)V HSPLokio/Buffer;->writableSegment$okio(I)Lokio/Segment; HPLokio/Buffer;->writableSegment$okio(I)Lokio/Segment; HSPLokio/Buffer;->write(Lokio/Buffer;J)V HPLokio/Buffer;->write(Lokio/Buffer;J)V HSPLokio/Buffer;->write(Lokio/ByteString;)Lokio/Buffer; PLokio/Buffer;->write(Lokio/ByteString;)Lokio/Buffer; HSPLokio/Buffer;->write([B)Lokio/Buffer; PLokio/Buffer;->write([B)Lokio/Buffer; HSPLokio/Buffer;->write([BII)Lokio/Buffer; PLokio/Buffer;->write([BII)Lokio/Buffer; HSPLokio/Buffer;->writeAll(Lokio/Source;)J PLokio/Buffer;->writeAll(Lokio/Source;)J HSPLokio/Buffer;->writeByte(I)Lokio/Buffer; PLokio/Buffer;->writeByte(I)Lokio/Buffer; HSPLokio/Buffer;->writeByte(I)Lokio/BufferedSink; PLokio/Buffer;->writeByte(I)Lokio/BufferedSink; HSPLokio/Buffer;->writeDecimalLong(J)Lokio/Buffer; PLokio/Buffer;->writeDecimalLong(J)Lokio/Buffer; HSPLokio/Buffer;->writeInt(I)Lokio/Buffer; PLokio/Buffer;->writeInt(I)Lokio/Buffer; HSPLokio/Buffer;->writeShort(I)Lokio/Buffer; PLokio/Buffer;->writeShort(I)Lokio/Buffer; HSPLokio/Buffer;->writeUtf8(Ljava/lang/String;)Lokio/Buffer; PLokio/Buffer;->writeUtf8(Ljava/lang/String;)Lokio/Buffer; HSPLokio/Buffer;->writeUtf8(Ljava/lang/String;II)Lokio/Buffer; HPLokio/Buffer;->writeUtf8(Ljava/lang/String;II)Lokio/Buffer; Lokio/Buffer$UnsafeCursor; HSPLokio/Buffer$UnsafeCursor;->()V PLokio/Buffer$UnsafeCursor;->()V Lokio/BufferedSink; Lokio/BufferedSource; Lokio/ByteString; HSPLokio/ByteString;->()V PLokio/ByteString;->()V HSPLokio/ByteString;->([B)V HPLokio/ByteString;->([B)V HSPLokio/ByteString;->base64()Ljava/lang/String; PLokio/ByteString;->base64()Ljava/lang/String; HSPLokio/ByteString;->compareTo(Ljava/lang/Object;)I PLokio/ByteString;->compareTo(Ljava/lang/Object;)I HSPLokio/ByteString;->compareTo(Lokio/ByteString;)I PLokio/ByteString;->compareTo(Lokio/ByteString;)I HSPLokio/ByteString;->digest$okio(Ljava/lang/String;)Lokio/ByteString; PLokio/ByteString;->digest$okio(Ljava/lang/String;)Lokio/ByteString; HSPLokio/ByteString;->endsWith(Lokio/ByteString;)Z PLokio/ByteString;->endsWith(Lokio/ByteString;)Z HSPLokio/ByteString;->equals(Ljava/lang/Object;)Z PLokio/ByteString;->equals(Ljava/lang/Object;)Z HSPLokio/ByteString;->getByte(I)B PLokio/ByteString;->getByte(I)B HSPLokio/ByteString;->getData$okio()[B PLokio/ByteString;->getData$okio()[B HSPLokio/ByteString;->getHashCode$okio()I PLokio/ByteString;->getHashCode$okio()I HSPLokio/ByteString;->getSize$okio()I PLokio/ByteString;->getSize$okio()I HSPLokio/ByteString;->getUtf8$okio()Ljava/lang/String; PLokio/ByteString;->getUtf8$okio()Ljava/lang/String; HSPLokio/ByteString;->hashCode()I PLokio/ByteString;->hashCode()I HSPLokio/ByteString;->hex()Ljava/lang/String; PLokio/ByteString;->hex()Ljava/lang/String; HSPLokio/ByteString;->indexOf$default(Lokio/ByteString;Lokio/ByteString;IILjava/lang/Object;)I PLokio/ByteString;->indexOf$default(Lokio/ByteString;Lokio/ByteString;IILjava/lang/Object;)I HSPLokio/ByteString;->indexOf(Lokio/ByteString;I)I PLokio/ByteString;->indexOf(Lokio/ByteString;I)I HSPLokio/ByteString;->indexOf([BI)I PLokio/ByteString;->indexOf([BI)I HSPLokio/ByteString;->internalArray$okio()[B PLokio/ByteString;->internalArray$okio()[B HSPLokio/ByteString;->internalGet$okio(I)B PLokio/ByteString;->internalGet$okio(I)B HSPLokio/ByteString;->lastIndexOf$default(Lokio/ByteString;Lokio/ByteString;IILjava/lang/Object;)I PLokio/ByteString;->lastIndexOf$default(Lokio/ByteString;Lokio/ByteString;IILjava/lang/Object;)I HSPLokio/ByteString;->lastIndexOf(Lokio/ByteString;I)I PLokio/ByteString;->lastIndexOf(Lokio/ByteString;I)I HSPLokio/ByteString;->lastIndexOf([BI)I PLokio/ByteString;->lastIndexOf([BI)I HSPLokio/ByteString;->md5()Lokio/ByteString; PLokio/ByteString;->md5()Lokio/ByteString; HSPLokio/ByteString;->rangeEquals(ILokio/ByteString;II)Z PLokio/ByteString;->rangeEquals(ILokio/ByteString;II)Z HSPLokio/ByteString;->rangeEquals(I[BII)Z PLokio/ByteString;->rangeEquals(I[BII)Z HSPLokio/ByteString;->setHashCode$okio(I)V PLokio/ByteString;->setHashCode$okio(I)V HSPLokio/ByteString;->setUtf8$okio(Ljava/lang/String;)V PLokio/ByteString;->setUtf8$okio(Ljava/lang/String;)V HSPLokio/ByteString;->size()I PLokio/ByteString;->size()I HSPLokio/ByteString;->startsWith(Lokio/ByteString;)Z PLokio/ByteString;->startsWith(Lokio/ByteString;)Z HSPLokio/ByteString;->substring$default(Lokio/ByteString;IIILjava/lang/Object;)Lokio/ByteString; PLokio/ByteString;->substring$default(Lokio/ByteString;IIILjava/lang/Object;)Lokio/ByteString; HSPLokio/ByteString;->substring(II)Lokio/ByteString; PLokio/ByteString;->substring(II)Lokio/ByteString; HSPLokio/ByteString;->toAsciiLowercase()Lokio/ByteString; PLokio/ByteString;->toAsciiLowercase()Lokio/ByteString; HSPLokio/ByteString;->utf8()Ljava/lang/String; PLokio/ByteString;->utf8()Ljava/lang/String; HSPLokio/ByteString;->write$okio(Lokio/Buffer;II)V PLokio/ByteString;->write$okio(Lokio/Buffer;II)V Lokio/ByteString$Companion; HSPLokio/ByteString$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/ByteString$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokio/ByteString$Companion;->decodeHex(Ljava/lang/String;)Lokio/ByteString; PLokio/ByteString$Companion;->decodeHex(Ljava/lang/String;)Lokio/ByteString; HSPLokio/ByteString$Companion;->encodeUtf8(Ljava/lang/String;)Lokio/ByteString; PLokio/ByteString$Companion;->encodeUtf8(Ljava/lang/String;)Lokio/ByteString; HSPLokio/ByteString$Companion;->of$default(Lokio/ByteString$Companion;[BIIILjava/lang/Object;)Lokio/ByteString; PLokio/ByteString$Companion;->of$default(Lokio/ByteString$Companion;[BIIILjava/lang/Object;)Lokio/ByteString; HSPLokio/ByteString$Companion;->of([BII)Lokio/ByteString; PLokio/ByteString$Companion;->of([BII)Lokio/ByteString; Lokio/FileMetadata; HSPLokio/FileMetadata;->(ZZLokio/Path;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/util/Map;)V PLokio/FileMetadata;->(ZZLokio/Path;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/util/Map;)V HSPLokio/FileMetadata;->(ZZLokio/Path;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/FileMetadata;->(ZZLokio/Path;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokio/FileMetadata;->getSize()Ljava/lang/Long; PLokio/FileMetadata;->getSize()Ljava/lang/Long; HSPLokio/FileMetadata;->getSymlinkTarget()Lokio/Path; PLokio/FileMetadata;->getSymlinkTarget()Lokio/Path; Lokio/FileSystem; HSPLokio/FileSystem;->()V PLokio/FileSystem;->()V HSPLokio/FileSystem;->()V PLokio/FileSystem;->()V HSPLokio/FileSystem;->appendingSink(Lokio/Path;)Lokio/Sink; PLokio/FileSystem;->appendingSink(Lokio/Path;)Lokio/Sink; HSPLokio/FileSystem;->createDirectories(Lokio/Path;)V PLokio/FileSystem;->createDirectories(Lokio/Path;)V HSPLokio/FileSystem;->createDirectories(Lokio/Path;Z)V PLokio/FileSystem;->createDirectories(Lokio/Path;Z)V HSPLokio/FileSystem;->createDirectory(Lokio/Path;)V PLokio/FileSystem;->createDirectory(Lokio/Path;)V HSPLokio/FileSystem;->delete(Lokio/Path;)V PLokio/FileSystem;->delete(Lokio/Path;)V HSPLokio/FileSystem;->exists(Lokio/Path;)Z PLokio/FileSystem;->exists(Lokio/Path;)Z HSPLokio/FileSystem;->metadata(Lokio/Path;)Lokio/FileMetadata; PLokio/FileSystem;->metadata(Lokio/Path;)Lokio/FileMetadata; HSPLokio/FileSystem;->sink(Lokio/Path;)Lokio/Sink; PLokio/FileSystem;->sink(Lokio/Path;)Lokio/Sink; Lokio/FileSystem$Companion; HSPLokio/FileSystem$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/FileSystem$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokio/ForwardingFileSystem; HSPLokio/ForwardingFileSystem;->(Lokio/FileSystem;)V PLokio/ForwardingFileSystem;->(Lokio/FileSystem;)V HSPLokio/ForwardingFileSystem;->appendingSink(Lokio/Path;Z)Lokio/Sink; PLokio/ForwardingFileSystem;->appendingSink(Lokio/Path;Z)Lokio/Sink; HSPLokio/ForwardingFileSystem;->atomicMove(Lokio/Path;Lokio/Path;)V PLokio/ForwardingFileSystem;->atomicMove(Lokio/Path;Lokio/Path;)V HSPLokio/ForwardingFileSystem;->createDirectory(Lokio/Path;Z)V PLokio/ForwardingFileSystem;->createDirectory(Lokio/Path;Z)V HSPLokio/ForwardingFileSystem;->delete(Lokio/Path;Z)V PLokio/ForwardingFileSystem;->delete(Lokio/Path;Z)V HSPLokio/ForwardingFileSystem;->metadataOrNull(Lokio/Path;)Lokio/FileMetadata; PLokio/ForwardingFileSystem;->metadataOrNull(Lokio/Path;)Lokio/FileMetadata; HSPLokio/ForwardingFileSystem;->onPathParameter(Lokio/Path;Ljava/lang/String;Ljava/lang/String;)Lokio/Path; PLokio/ForwardingFileSystem;->onPathParameter(Lokio/Path;Ljava/lang/String;Ljava/lang/String;)Lokio/Path; HSPLokio/ForwardingFileSystem;->sink(Lokio/Path;Z)Lokio/Sink; PLokio/ForwardingFileSystem;->sink(Lokio/Path;Z)Lokio/Sink; Lokio/ForwardingSink; HSPLokio/ForwardingSink;->(Lokio/Sink;)V PLokio/ForwardingSink;->(Lokio/Sink;)V HSPLokio/ForwardingSink;->close()V PLokio/ForwardingSink;->close()V HSPLokio/ForwardingSink;->flush()V PLokio/ForwardingSink;->flush()V HSPLokio/ForwardingSink;->write(Lokio/Buffer;J)V PLokio/ForwardingSink;->write(Lokio/Buffer;J)V Lokio/ForwardingSource; HSPLokio/ForwardingSource;->(Lokio/Source;)V PLokio/ForwardingSource;->(Lokio/Source;)V HSPLokio/ForwardingSource;->close()V PLokio/ForwardingSource;->close()V HSPLokio/ForwardingSource;->delegate()Lokio/Source; PLokio/ForwardingSource;->delegate()Lokio/Source; Lokio/GzipSource; HSPLokio/GzipSource;->(Lokio/Source;)V PLokio/GzipSource;->(Lokio/Source;)V HSPLokio/GzipSource;->checkEqual(IILjava/lang/String;)V PLokio/GzipSource;->checkEqual(IILjava/lang/String;)V HSPLokio/GzipSource;->close()V PLokio/GzipSource;->close()V HSPLokio/GzipSource;->read(Lokio/Buffer;J)J PLokio/GzipSource;->read(Lokio/Buffer;J)J HSPLokio/GzipSource;->updateCrc(JLokio/Buffer;J)V PLokio/GzipSource;->updateCrc(JLokio/Buffer;J)V Lokio/InflaterSource; HSPLokio/InflaterSource;->(Lokio/BufferedSource;Ljava/util/zip/Inflater;)V PLokio/InflaterSource;->(Lokio/BufferedSource;Ljava/util/zip/Inflater;)V HSPLokio/InflaterSource;->close()V PLokio/InflaterSource;->close()V HSPLokio/InflaterSource;->read(Lokio/Buffer;J)J PLokio/InflaterSource;->read(Lokio/Buffer;J)J HSPLokio/InflaterSource;->readOrInflate(Lokio/Buffer;J)J PLokio/InflaterSource;->readOrInflate(Lokio/Buffer;J)J HSPLokio/InflaterSource;->refill()Z PLokio/InflaterSource;->refill()Z Lokio/InputStreamSource; HSPLokio/InputStreamSource;->(Ljava/io/InputStream;Lokio/Timeout;)V PLokio/InputStreamSource;->(Ljava/io/InputStream;Lokio/Timeout;)V HSPLokio/InputStreamSource;->read(Lokio/Buffer;J)J PLokio/InputStreamSource;->read(Lokio/Buffer;J)J Lokio/JvmSystemFileSystem; HSPLokio/JvmSystemFileSystem;->()V PLokio/JvmSystemFileSystem;->()V HSPLokio/JvmSystemFileSystem;->appendingSink(Lokio/Path;Z)Lokio/Sink; PLokio/JvmSystemFileSystem;->appendingSink(Lokio/Path;Z)Lokio/Sink; HSPLokio/JvmSystemFileSystem;->createDirectory(Lokio/Path;Z)V PLokio/JvmSystemFileSystem;->createDirectory(Lokio/Path;Z)V HSPLokio/JvmSystemFileSystem;->delete(Lokio/Path;Z)V PLokio/JvmSystemFileSystem;->delete(Lokio/Path;Z)V HSPLokio/JvmSystemFileSystem;->sink(Lokio/Path;Z)Lokio/Sink; PLokio/JvmSystemFileSystem;->sink(Lokio/Path;Z)Lokio/Sink; Lokio/JvmSystemFileSystem$$ExternalSyntheticOutline0; HSPLokio/JvmSystemFileSystem$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; PLokio/JvmSystemFileSystem$$ExternalSyntheticOutline0;->m(Ljava/lang/String;)Lcafe/adriel/voyager/core/concurrent/ThreadSafeMap; Lokio/NioSystemFileSystem; HSPLokio/NioSystemFileSystem;->()V PLokio/NioSystemFileSystem;->()V HSPLokio/NioSystemFileSystem;->atomicMove(Lokio/Path;Lokio/Path;)V PLokio/NioSystemFileSystem;->atomicMove(Lokio/Path;Lokio/Path;)V HSPLokio/NioSystemFileSystem;->metadataOrNull(Ljava/nio/file/Path;)Lokio/FileMetadata; PLokio/NioSystemFileSystem;->metadataOrNull(Ljava/nio/file/Path;)Lokio/FileMetadata; HSPLokio/NioSystemFileSystem;->metadataOrNull(Lokio/Path;)Lokio/FileMetadata; PLokio/NioSystemFileSystem;->metadataOrNull(Lokio/Path;)Lokio/FileMetadata; HSPLokio/NioSystemFileSystem;->zeroToNull(Ljava/nio/file/attribute/FileTime;)Ljava/lang/Long; PLokio/NioSystemFileSystem;->zeroToNull(Ljava/nio/file/attribute/FileTime;)Ljava/lang/Long; Lokio/Okio; HSPLokio/Okio;->buffer(Lokio/Sink;)Lokio/BufferedSink; PLokio/Okio;->buffer(Lokio/Sink;)Lokio/BufferedSink; HSPLokio/Okio;->buffer(Lokio/Source;)Lokio/BufferedSource; PLokio/Okio;->buffer(Lokio/Source;)Lokio/BufferedSource; HSPLokio/Okio;->sink(Ljava/net/Socket;)Lokio/Sink; PLokio/Okio;->sink(Ljava/net/Socket;)Lokio/Sink; HSPLokio/Okio;->source(Ljava/net/Socket;)Lokio/Source; PLokio/Okio;->source(Ljava/net/Socket;)Lokio/Source; Lokio/Okio__JvmOkioKt; HSPLokio/Okio__JvmOkioKt;->()V PLokio/Okio__JvmOkioKt;->()V HSPLokio/Okio__JvmOkioKt;->sink$default(Ljava/io/File;ZILjava/lang/Object;)Lokio/Sink; PLokio/Okio__JvmOkioKt;->sink$default(Ljava/io/File;ZILjava/lang/Object;)Lokio/Sink; HSPLokio/Okio__JvmOkioKt;->sink(Ljava/io/File;Z)Lokio/Sink; PLokio/Okio__JvmOkioKt;->sink(Ljava/io/File;Z)Lokio/Sink; HSPLokio/Okio__JvmOkioKt;->sink(Ljava/io/OutputStream;)Lokio/Sink; PLokio/Okio__JvmOkioKt;->sink(Ljava/io/OutputStream;)Lokio/Sink; HSPLokio/Okio__JvmOkioKt;->sink(Ljava/net/Socket;)Lokio/Sink; PLokio/Okio__JvmOkioKt;->sink(Ljava/net/Socket;)Lokio/Sink; HSPLokio/Okio__JvmOkioKt;->source(Ljava/net/Socket;)Lokio/Source; PLokio/Okio__JvmOkioKt;->source(Ljava/net/Socket;)Lokio/Source; Lokio/Okio__OkioKt; HSPLokio/Okio__OkioKt;->buffer(Lokio/Sink;)Lokio/BufferedSink; PLokio/Okio__OkioKt;->buffer(Lokio/Sink;)Lokio/BufferedSink; HSPLokio/Okio__OkioKt;->buffer(Lokio/Source;)Lokio/BufferedSource; PLokio/Okio__OkioKt;->buffer(Lokio/Source;)Lokio/BufferedSource; Lokio/Options; HSPLokio/Options;->()V PLokio/Options;->()V HSPLokio/Options;->([Lokio/ByteString;[ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/Options;->([Lokio/ByteString;[ILkotlin/jvm/internal/DefaultConstructorMarker;)V Lokio/Options$Companion; HSPLokio/Options$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/Options$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokio/Options$Companion;->buildTrieRecursive(JLokio/Buffer;ILjava/util/List;IILjava/util/List;)V PLokio/Options$Companion;->buildTrieRecursive(JLokio/Buffer;ILjava/util/List;IILjava/util/List;)V HSPLokio/Options$Companion;->of([Lokio/ByteString;)Lokio/Options; PLokio/Options$Companion;->of([Lokio/ByteString;)Lokio/Options; Lokio/OutputStreamSink; HSPLokio/OutputStreamSink;->(Ljava/io/OutputStream;Lokio/Timeout;)V PLokio/OutputStreamSink;->(Ljava/io/OutputStream;Lokio/Timeout;)V HSPLokio/OutputStreamSink;->close()V PLokio/OutputStreamSink;->close()V HSPLokio/OutputStreamSink;->flush()V PLokio/OutputStreamSink;->flush()V HSPLokio/OutputStreamSink;->write(Lokio/Buffer;J)V PLokio/OutputStreamSink;->write(Lokio/Buffer;J)V Lokio/Path; HSPLokio/Path;->()V PLokio/Path;->()V HSPLokio/Path;->(Lokio/ByteString;)V PLokio/Path;->(Lokio/ByteString;)V HSPLokio/Path;->getBytes$okio()Lokio/ByteString; PLokio/Path;->getBytes$okio()Lokio/ByteString; HSPLokio/Path;->isAbsolute()Z PLokio/Path;->isAbsolute()Z HSPLokio/Path;->parent()Lokio/Path; PLokio/Path;->parent()Lokio/Path; HSPLokio/Path;->resolve(Ljava/lang/String;)Lokio/Path; PLokio/Path;->resolve(Ljava/lang/String;)Lokio/Path; HSPLokio/Path;->toFile()Ljava/io/File; PLokio/Path;->toFile()Ljava/io/File; HSPLokio/Path;->toNioPath()Ljava/nio/file/Path; PLokio/Path;->toNioPath()Ljava/nio/file/Path; HSPLokio/Path;->toString()Ljava/lang/String; PLokio/Path;->toString()Ljava/lang/String; HSPLokio/Path;->volumeLetter()Ljava/lang/Character; PLokio/Path;->volumeLetter()Ljava/lang/Character; Lokio/Path$$ExternalSyntheticApiModelOutline0; HSPLokio/Path$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path; PLokio/Path$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path; HSPLokio/Path$$ExternalSyntheticApiModelOutline0;->m(Ljava/nio/file/attribute/FileTime;)J PLokio/Path$$ExternalSyntheticApiModelOutline0;->m(Ljava/nio/file/attribute/FileTime;)J Lokio/Path$Companion; HSPLokio/Path$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/Path$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLokio/Path$Companion;->get$default(Lokio/Path$Companion;Ljava/io/File;ZILjava/lang/Object;)Lokio/Path; PLokio/Path$Companion;->get$default(Lokio/Path$Companion;Ljava/io/File;ZILjava/lang/Object;)Lokio/Path; HSPLokio/Path$Companion;->get$default(Lokio/Path$Companion;Ljava/lang/String;ZILjava/lang/Object;)Lokio/Path; PLokio/Path$Companion;->get$default(Lokio/Path$Companion;Ljava/lang/String;ZILjava/lang/Object;)Lokio/Path; HSPLokio/Path$Companion;->get(Ljava/io/File;Z)Lokio/Path; PLokio/Path$Companion;->get(Ljava/io/File;Z)Lokio/Path; HSPLokio/Path$Companion;->get(Ljava/lang/String;Z)Lokio/Path; PLokio/Path$Companion;->get(Ljava/lang/String;Z)Lokio/Path; Lokio/RealBufferedSink; HSPLokio/RealBufferedSink;->(Lokio/Sink;)V PLokio/RealBufferedSink;->(Lokio/Sink;)V HSPLokio/RealBufferedSink;->close()V PLokio/RealBufferedSink;->close()V HSPLokio/RealBufferedSink;->emitCompleteSegments()Lokio/BufferedSink; PLokio/RealBufferedSink;->emitCompleteSegments()Lokio/BufferedSink; HSPLokio/RealBufferedSink;->flush()V PLokio/RealBufferedSink;->flush()V HSPLokio/RealBufferedSink;->getBuffer()Lokio/Buffer; PLokio/RealBufferedSink;->getBuffer()Lokio/Buffer; HSPLokio/RealBufferedSink;->write(Lokio/Buffer;J)V PLokio/RealBufferedSink;->write(Lokio/Buffer;J)V HSPLokio/RealBufferedSink;->write(Lokio/ByteString;)Lokio/BufferedSink; PLokio/RealBufferedSink;->write(Lokio/ByteString;)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeByte(I)Lokio/BufferedSink; PLokio/RealBufferedSink;->writeByte(I)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeDecimalLong(J)Lokio/BufferedSink; PLokio/RealBufferedSink;->writeDecimalLong(J)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeInt(I)Lokio/BufferedSink; PLokio/RealBufferedSink;->writeInt(I)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeShort(I)Lokio/BufferedSink; PLokio/RealBufferedSink;->writeShort(I)Lokio/BufferedSink; HSPLokio/RealBufferedSink;->writeUtf8(Ljava/lang/String;)Lokio/BufferedSink; PLokio/RealBufferedSink;->writeUtf8(Ljava/lang/String;)Lokio/BufferedSink; Lokio/RealBufferedSource; HSPLokio/RealBufferedSource;->(Lokio/Source;)V PLokio/RealBufferedSource;->(Lokio/Source;)V HSPLokio/RealBufferedSource;->close()V PLokio/RealBufferedSource;->close()V HSPLokio/RealBufferedSource;->exhausted()Z HPLokio/RealBufferedSource;->exhausted()Z HSPLokio/RealBufferedSource;->getBuffer()Lokio/Buffer; PLokio/RealBufferedSource;->getBuffer()Lokio/Buffer; HSPLokio/RealBufferedSource;->read(Lokio/Buffer;J)J PLokio/RealBufferedSource;->read(Lokio/Buffer;J)J HSPLokio/RealBufferedSource;->readByte()B PLokio/RealBufferedSource;->readByte()B HSPLokio/RealBufferedSource;->readByteString(J)Lokio/ByteString; PLokio/RealBufferedSource;->readByteString(J)Lokio/ByteString; HSPLokio/RealBufferedSource;->readInt()I PLokio/RealBufferedSource;->readInt()I HSPLokio/RealBufferedSource;->readIntLe()I PLokio/RealBufferedSource;->readIntLe()I HSPLokio/RealBufferedSource;->readShort()S PLokio/RealBufferedSource;->readShort()S HSPLokio/RealBufferedSource;->readUtf8CodePoint()I HPLokio/RealBufferedSource;->readUtf8CodePoint()I HSPLokio/RealBufferedSource;->request(J)Z HPLokio/RealBufferedSource;->request(J)Z HSPLokio/RealBufferedSource;->require(J)V HPLokio/RealBufferedSource;->require(J)V HSPLokio/RealBufferedSource;->skip(J)V PLokio/RealBufferedSource;->skip(J)V Lokio/Segment; HSPLokio/Segment;->()V PLokio/Segment;->()V HSPLokio/Segment;->()V PLokio/Segment;->()V HSPLokio/Segment;->([BIIZZ)V PLokio/Segment;->([BIIZZ)V HSPLokio/Segment;->compact()V PLokio/Segment;->compact()V HSPLokio/Segment;->pop()Lokio/Segment; PLokio/Segment;->pop()Lokio/Segment; HSPLokio/Segment;->push(Lokio/Segment;)Lokio/Segment; PLokio/Segment;->push(Lokio/Segment;)Lokio/Segment; HSPLokio/Segment;->sharedCopy()Lokio/Segment; PLokio/Segment;->sharedCopy()Lokio/Segment; HSPLokio/Segment;->split(I)Lokio/Segment; PLokio/Segment;->split(I)Lokio/Segment; HSPLokio/Segment;->writeTo(Lokio/Segment;I)V PLokio/Segment;->writeTo(Lokio/Segment;I)V Lokio/Segment$Companion; HSPLokio/Segment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/Segment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokio/SegmentPool; HSPLokio/SegmentPool;->()V PLokio/SegmentPool;->()V HSPLokio/SegmentPool;->()V PLokio/SegmentPool;->()V HSPLokio/SegmentPool;->firstRef()Ljava/util/concurrent/atomic/AtomicReference; HPLokio/SegmentPool;->firstRef()Ljava/util/concurrent/atomic/AtomicReference; HSPLokio/SegmentPool;->recycle(Lokio/Segment;)V HPLokio/SegmentPool;->recycle(Lokio/Segment;)V HSPLokio/SegmentPool;->take()Lokio/Segment; HPLokio/SegmentPool;->take()Lokio/Segment; Lokio/Sink; Lokio/SocketAsyncTimeout; HSPLokio/SocketAsyncTimeout;->(Ljava/net/Socket;)V PLokio/SocketAsyncTimeout;->(Ljava/net/Socket;)V Lokio/Source; Lokio/Timeout; HSPLokio/Timeout;->()V PLokio/Timeout;->()V HSPLokio/Timeout;->()V PLokio/Timeout;->()V HSPLokio/Timeout;->hasDeadline()Z PLokio/Timeout;->hasDeadline()Z HSPLokio/Timeout;->throwIfReached()V PLokio/Timeout;->throwIfReached()V HSPLokio/Timeout;->timeout(JLjava/util/concurrent/TimeUnit;)Lokio/Timeout; PLokio/Timeout;->timeout(JLjava/util/concurrent/TimeUnit;)Lokio/Timeout; HSPLokio/Timeout;->timeoutNanos()J PLokio/Timeout;->timeoutNanos()J Lokio/Timeout$Companion; HSPLokio/Timeout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/Timeout$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokio/Timeout$Companion$NONE$1; HSPLokio/Timeout$Companion$NONE$1;->()V PLokio/Timeout$Companion$NONE$1;->()V Lokio/Utf8; HSPLokio/Utf8;->size$default(Ljava/lang/String;IIILjava/lang/Object;)J PLokio/Utf8;->size$default(Ljava/lang/String;IIILjava/lang/Object;)J HSPLokio/Utf8;->size(Ljava/lang/String;II)J PLokio/Utf8;->size(Ljava/lang/String;II)J Lokio/_JvmPlatformKt; HSPLokio/_JvmPlatformKt;->asUtf8ToByteArray(Ljava/lang/String;)[B PLokio/_JvmPlatformKt;->asUtf8ToByteArray(Ljava/lang/String;)[B HSPLokio/_JvmPlatformKt;->toUtf8String([B)Ljava/lang/String; PLokio/_JvmPlatformKt;->toUtf8String([B)Ljava/lang/String; Lokio/internal/-Buffer; HSPLokio/internal/-Buffer;->()V PLokio/internal/-Buffer;->()V HSPLokio/internal/-Buffer;->getHEX_DIGIT_BYTES()[B PLokio/internal/-Buffer;->getHEX_DIGIT_BYTES()[B Lokio/internal/-ByteString; HSPLokio/internal/-ByteString;->()V PLokio/internal/-ByteString;->()V HSPLokio/internal/-ByteString;->access$decodeHexDigit(C)I PLokio/internal/-ByteString;->access$decodeHexDigit(C)I HSPLokio/internal/-ByteString;->commonWrite(Lokio/ByteString;Lokio/Buffer;II)V PLokio/internal/-ByteString;->commonWrite(Lokio/ByteString;Lokio/Buffer;II)V HSPLokio/internal/-ByteString;->getHEX_DIGIT_CHARS()[C PLokio/internal/-ByteString;->getHEX_DIGIT_CHARS()[C Lokio/internal/-FileSystem; HSPLokio/internal/-FileSystem;->commonCreateDirectories(Lokio/FileSystem;Lokio/Path;Z)V PLokio/internal/-FileSystem;->commonCreateDirectories(Lokio/FileSystem;Lokio/Path;Z)V HSPLokio/internal/-FileSystem;->commonExists(Lokio/FileSystem;Lokio/Path;)Z PLokio/internal/-FileSystem;->commonExists(Lokio/FileSystem;Lokio/Path;)Z HSPLokio/internal/-FileSystem;->commonMetadata(Lokio/FileSystem;Lokio/Path;)Lokio/FileMetadata; PLokio/internal/-FileSystem;->commonMetadata(Lokio/FileSystem;Lokio/Path;)Lokio/FileMetadata; Lokio/internal/-Path; HSPLokio/internal/-Path;->()V PLokio/internal/-Path;->()V HSPLokio/internal/-Path;->access$getBACKSLASH$p()Lokio/ByteString; PLokio/internal/-Path;->access$getBACKSLASH$p()Lokio/ByteString; HSPLokio/internal/-Path;->access$getDOT$p()Lokio/ByteString; PLokio/internal/-Path;->access$getDOT$p()Lokio/ByteString; HSPLokio/internal/-Path;->access$getIndexOfLastSlash(Lokio/Path;)I PLokio/internal/-Path;->access$getIndexOfLastSlash(Lokio/Path;)I HSPLokio/internal/-Path;->access$getSLASH$p()Lokio/ByteString; PLokio/internal/-Path;->access$getSLASH$p()Lokio/ByteString; HSPLokio/internal/-Path;->access$lastSegmentIsDotDot(Lokio/Path;)Z PLokio/internal/-Path;->access$lastSegmentIsDotDot(Lokio/Path;)Z HSPLokio/internal/-Path;->access$rootLength(Lokio/Path;)I PLokio/internal/-Path;->access$rootLength(Lokio/Path;)I HSPLokio/internal/-Path;->commonResolve(Lokio/Path;Lokio/Path;Z)Lokio/Path; PLokio/internal/-Path;->commonResolve(Lokio/Path;Lokio/Path;Z)Lokio/Path; HSPLokio/internal/-Path;->commonToPath(Ljava/lang/String;Z)Lokio/Path; PLokio/internal/-Path;->commonToPath(Ljava/lang/String;Z)Lokio/Path; HSPLokio/internal/-Path;->getSlash(Lokio/Path;)Lokio/ByteString; PLokio/internal/-Path;->getSlash(Lokio/Path;)Lokio/ByteString; HSPLokio/internal/-Path;->toPath(Lokio/Buffer;Z)Lokio/Path; PLokio/internal/-Path;->toPath(Lokio/Buffer;Z)Lokio/Path; HSPLokio/internal/-Path;->toSlash(B)Lokio/ByteString; PLokio/internal/-Path;->toSlash(B)Lokio/ByteString; HSPLokio/internal/-Path;->toSlash(Ljava/lang/String;)Lokio/ByteString; PLokio/internal/-Path;->toSlash(Ljava/lang/String;)Lokio/ByteString; Lokio/internal/ResourceFileSystem; HSPLokio/internal/ResourceFileSystem;->()V PLokio/internal/ResourceFileSystem;->()V HSPLokio/internal/ResourceFileSystem;->(Ljava/lang/ClassLoader;Z)V PLokio/internal/ResourceFileSystem;->(Ljava/lang/ClassLoader;Z)V Lokio/internal/ResourceFileSystem$Companion; HSPLokio/internal/ResourceFileSystem$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V PLokio/internal/ResourceFileSystem$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V Lokio/internal/ResourceFileSystem$roots$2; HSPLokio/internal/ResourceFileSystem$roots$2;->(Ljava/lang/ClassLoader;)V PLokio/internal/ResourceFileSystem$roots$2;->(Ljava/lang/ClassLoader;)V Lorg/acra/builder/ReportExecutor$$ExternalSyntheticLambda0; HSPLorg/acra/builder/ReportExecutor$$ExternalSyntheticLambda0;->(ILjava/lang/Object;Ljava/lang/Object;)V PLorg/acra/builder/ReportExecutor$$ExternalSyntheticLambda0;->(ILjava/lang/Object;Ljava/lang/Object;)V HSPLorg/acra/builder/ReportExecutor$$ExternalSyntheticLambda0;->run()V PLorg/acra/builder/ReportExecutor$$ExternalSyntheticLambda0;->run()V Lorg/acra/file/CrashReportPersister; HSPLorg/acra/file/CrashReportPersister;->(I)V HPLorg/acra/file/CrashReportPersister;->(I)V HSPLorg/acra/file/CrashReportPersister;->computeScaleFactor-H7hwNQA(JJ)J HPLorg/acra/file/CrashReportPersister;->computeScaleFactor-H7hwNQA(JJ)J HSPLorg/acra/file/CrashReportPersister;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/BrushKt; HPLorg/acra/file/CrashReportPersister;->createOutline-Pq9zytI(JLandroidx/compose/ui/unit/LayoutDirection;Landroidx/compose/ui/unit/Density;)Landroidx/compose/ui/graphics/BrushKt; HSPLorg/acra/file/CrashReportPersister;->entityType-OLwlOKw()I PLorg/acra/file/CrashReportPersister;->entityType-OLwlOKw()I Lorg/acra/file/ReportLocator$special$$inlined$sortedBy$1; HSPLorg/acra/file/ReportLocator$special$$inlined$sortedBy$1;->(I)V HPLorg/acra/file/ReportLocator$special$$inlined$sortedBy$1;->(I)V HSPLorg/acra/file/ReportLocator$special$$inlined$sortedBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HPLorg/acra/file/ReportLocator$special$$inlined$sortedBy$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I Lorg/acra/log/AndroidLogDelegate; HSPLorg/acra/log/AndroidLogDelegate;->()V PLorg/acra/log/AndroidLogDelegate;->()V Lorg/acra/startup/Report; Lorg/acra/util/Installation; HSPLorg/acra/util/Installation;->()V PLorg/acra/util/Installation;->()V PLorg/acra/util/Installation;->getChromeReaderMode()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLorg/acra/util/Installation;->getCloudOff()Landroidx/compose/ui/graphics/vector/ImageVector; PLorg/acra/util/Installation;->getCloudOff()Landroidx/compose/ui/graphics/vector/ImageVector; PLorg/acra/util/Installation;->getCollectionsBookmark()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLorg/acra/util/Installation;->getDeleteSweep()Landroidx/compose/ui/graphics/vector/ImageVector; PLorg/acra/util/Installation;->getDeleteSweep()Landroidx/compose/ui/graphics/vector/ImageVector; Lorg/acra/util/StubCreator; HSPLorg/acra/util/StubCreator;->finalConstraints-tfFHcEY(JZIF)J HPLorg/acra/util/StubCreator;->finalConstraints-tfFHcEY(JZIF)J PLorg/acra/util/StubCreator;->getArrowBack()Landroidx/compose/ui/graphics/vector/ImageVector; PLorg/acra/util/StubCreator;->getCode()Landroidx/compose/ui/graphics/vector/ImageVector; Lorg/commonmark/node/SourceSpans; HSPLorg/commonmark/node/SourceSpans;->()V HPLorg/commonmark/node/SourceSpans;->()V HSPLorg/commonmark/node/SourceSpans;->(I)V PLorg/commonmark/node/SourceSpans;->(I)V HSPLorg/commonmark/node/SourceSpans;->(Ljava/util/List;)V HPLorg/commonmark/node/SourceSpans;->(Ljava/util/List;)V HSPLorg/commonmark/node/SourceSpans;->add(I)V HPLorg/commonmark/node/SourceSpans;->add(I)V HSPLorg/commonmark/node/SourceSpans;->addInitializer(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V HPLorg/commonmark/node/SourceSpans;->addInitializer(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V HSPLorg/commonmark/node/SourceSpans;->build()Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; PLorg/commonmark/node/SourceSpans;->build()Landroidx/lifecycle/viewmodel/InitializerViewModelFactory; HSPLorg/commonmark/node/SourceSpans;->isNotEmpty()Z HPLorg/commonmark/node/SourceSpans;->isNotEmpty()Z HSPLorg/commonmark/node/SourceSpans;->peek()I HPLorg/commonmark/node/SourceSpans;->peek()I HSPLorg/commonmark/node/SourceSpans;->takeMax()I HPLorg/commonmark/node/SourceSpans;->takeMax()I Lorg/jsoup/nodes/Element$$ExternalSyntheticLambda0; HSPLorg/jsoup/nodes/Element$$ExternalSyntheticLambda0;->(Ljava/lang/Object;)V PLorg/jsoup/nodes/Element$$ExternalSyntheticLambda0;->(Ljava/lang/Object;)V HSPLorg/jsoup/nodes/Element$$ExternalSyntheticLambda0;->create(Lokhttp3/Call;)Lokhttp3/EventListener; PLorg/jsoup/nodes/Element$$ExternalSyntheticLambda0;->create(Lokhttp3/Call;)Lokhttp3/EventListener; Lorg/jsoup/select/NodeFilter; Lorg/nibor/autolink/internal/Scanner; Lorg/slf4j/ILoggerFactory; Lrikka/shizuku/ShizukuProvider; HSPLrikka/shizuku/ShizukuProvider;->()V PLrikka/shizuku/ShizukuProvider;->()V HSPLrikka/shizuku/ShizukuProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V PLrikka/shizuku/ShizukuProvider;->attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V HSPLrikka/shizuku/ShizukuProvider;->onCreate()Z PLrikka/shizuku/ShizukuProvider;->onCreate()Z Lrikka/shizuku/SystemServiceHelper; HSPLrikka/shizuku/SystemServiceHelper;->()V PLrikka/shizuku/SystemServiceHelper;->()V HSPLrikka/shizuku/SystemServiceHelper;->getSystemService()Landroid/os/IBinder; PLrikka/shizuku/SystemServiceHelper;->getSystemService()Landroid/os/IBinder; Lrikka/sui/Sui; HSPLrikka/sui/Sui;->byteArrayToSetOfTriggers([B)Ljava/util/LinkedHashSet; PLrikka/sui/Sui;->byteArrayToSetOfTriggers([B)Ljava/util/LinkedHashSet; HSPLrikka/sui/Sui;->init(Ljava/lang/String;)Z PLrikka/sui/Sui;->init(Ljava/lang/String;)Z HSPLrikka/sui/Sui;->intToBackoffPolicy(I)Landroidx/work/BackoffPolicy; PLrikka/sui/Sui;->intToBackoffPolicy(I)Landroidx/work/BackoffPolicy; HSPLrikka/sui/Sui;->intToNetworkType(I)Landroidx/work/NetworkType; PLrikka/sui/Sui;->intToNetworkType(I)Landroidx/work/NetworkType; HSPLrikka/sui/Sui;->intToOutOfQuotaPolicy(I)Landroidx/work/OutOfQuotaPolicy; PLrikka/sui/Sui;->intToOutOfQuotaPolicy(I)Landroidx/work/OutOfQuotaPolicy; HSPLrikka/sui/Sui;->intToState(I)Landroidx/work/WorkInfo$State; PLrikka/sui/Sui;->intToState(I)Landroidx/work/WorkInfo$State; HSPLrikka/sui/Sui;->isEnabled()Z PLrikka/sui/Sui;->isEnabled()Z HSPLrikka/sui/Sui;->isSui()Z PLrikka/sui/Sui;->isSui()Z HSPLrikka/sui/Sui;->networkTypeToInt(Landroidx/work/NetworkType;)I PLrikka/sui/Sui;->networkTypeToInt(Landroidx/work/NetworkType;)I HSPLrikka/sui/Sui;->setOfTriggersToByteArray(Ljava/util/Set;)[B PLrikka/sui/Sui;->setOfTriggersToByteArray(Ljava/util/Set;)[B HSPLrikka/sui/Sui;->stateToInt(Landroidx/work/WorkInfo$State;)I PLrikka/sui/Sui;->stateToInt(Landroidx/work/WorkInfo$State;)I Lsoup/compose/material/motion/MotionConstants; HSPLsoup/compose/material/motion/MotionConstants;->()V PLsoup/compose/material/motion/MotionConstants;->()V HSPLsoup/compose/material/motion/MotionConstants;->getDefaultSlideDistance-D9Ej5fM()F PLsoup/compose/material/motion/MotionConstants;->getDefaultSlideDistance-D9Ej5fM()F Lsoup/compose/material/motion/animation/MaterialSharedAxisKt; HSPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->getForOutgoing$1()I PLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->getForOutgoing$1()I HSPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->materialFadeThroughIn()Landroidx/compose/animation/EnterTransition; HPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->materialFadeThroughIn()Landroidx/compose/animation/EnterTransition; HSPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->materialFadeThroughOut()Landroidx/compose/animation/ExitTransition; HPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->materialFadeThroughOut()Landroidx/compose/animation/ExitTransition; HSPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->materialSharedAxisX$default(ZI)Landroidx/compose/animation/ContentTransform; HPLsoup/compose/material/motion/animation/MaterialSharedAxisKt;->materialSharedAxisX$default(ZI)Landroidx/compose/animation/ContentTransform; Lsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1; HSPLsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1;->(IIZ)V HPLsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1;->(IIZ)V PLsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1;->invoke(I)Ljava/lang/Integer; HPLsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1;->invoke(I)Ljava/lang/Integer; PLsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLsoup/compose/material/motion/animation/MaterialSharedAxisKt$materialSharedAxisXIn$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference; HSPLtachiyomi/core/preference/AndroidPreference;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/lang/Object;)V HPLtachiyomi/core/preference/AndroidPreference;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/lang/Object;)V HSPLtachiyomi/core/preference/AndroidPreference;->access$getKey$p(Ltachiyomi/core/preference/AndroidPreference;)Ljava/lang/String; PLtachiyomi/core/preference/AndroidPreference;->access$getKey$p(Ltachiyomi/core/preference/AndroidPreference;)Ljava/lang/String; HSPLtachiyomi/core/preference/AndroidPreference;->changes()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/core/preference/AndroidPreference;->changes()Lkotlinx/coroutines/flow/Flow; HSPLtachiyomi/core/preference/AndroidPreference;->get()Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference;->get()Ljava/lang/Object; HSPLtachiyomi/core/preference/AndroidPreference;->isSet()Z PLtachiyomi/core/preference/AndroidPreference;->isSet()Z HSPLtachiyomi/core/preference/AndroidPreference;->set(Ljava/lang/Object;)V PLtachiyomi/core/preference/AndroidPreference;->set(Ljava/lang/Object;)V Ltachiyomi/core/preference/AndroidPreference$BooleanPrimitive; HSPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Z)V HPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Z)V HSPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive;->write(Ljava/lang/Object;Ljava/lang/String;)Lkotlin/jvm/functions/Function1; PLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive;->write(Ljava/lang/Object;Ljava/lang/String;)Lkotlin/jvm/functions/Function1; Ltachiyomi/core/preference/AndroidPreference$BooleanPrimitive$write$1; HSPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive$write$1;->(Ljava/lang/String;Z)V PLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive$write$1;->(Ljava/lang/String;Z)V HSPLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive$write$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$BooleanPrimitive$write$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$IntPrimitive; HSPLtachiyomi/core/preference/AndroidPreference$IntPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;I)V HPLtachiyomi/core/preference/AndroidPreference$IntPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;I)V HSPLtachiyomi/core/preference/AndroidPreference$IntPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/core/preference/AndroidPreference$IntPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/core/preference/AndroidPreference$IntPrimitive;->write(Ljava/lang/Object;Ljava/lang/String;)Lkotlin/jvm/functions/Function1; PLtachiyomi/core/preference/AndroidPreference$IntPrimitive;->write(Ljava/lang/Object;Ljava/lang/String;)Lkotlin/jvm/functions/Function1; Ltachiyomi/core/preference/AndroidPreference$IntPrimitive$write$1; HSPLtachiyomi/core/preference/AndroidPreference$IntPrimitive$write$1;->(Ljava/lang/String;I)V PLtachiyomi/core/preference/AndroidPreference$IntPrimitive$write$1;->(Ljava/lang/String;I)V HSPLtachiyomi/core/preference/AndroidPreference$IntPrimitive$write$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$IntPrimitive$write$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$LongPrimitive; HSPLtachiyomi/core/preference/AndroidPreference$LongPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;J)V PLtachiyomi/core/preference/AndroidPreference$LongPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;J)V HSPLtachiyomi/core/preference/AndroidPreference$LongPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$LongPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/core/preference/AndroidPreference$LongPrimitive;->write(Ljava/lang/Object;Ljava/lang/String;)Lkotlin/jvm/functions/Function1; PLtachiyomi/core/preference/AndroidPreference$LongPrimitive;->write(Ljava/lang/Object;Ljava/lang/String;)Lkotlin/jvm/functions/Function1; Ltachiyomi/core/preference/AndroidPreference$LongPrimitive$write$1; HSPLtachiyomi/core/preference/AndroidPreference$LongPrimitive$write$1;->(JLjava/lang/String;)V PLtachiyomi/core/preference/AndroidPreference$LongPrimitive$write$1;->(JLjava/lang/String;)V HSPLtachiyomi/core/preference/AndroidPreference$LongPrimitive$write$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$LongPrimitive$write$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$Object; HSPLtachiyomi/core/preference/AndroidPreference$Object;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HPLtachiyomi/core/preference/AndroidPreference$Object;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V HSPLtachiyomi/core/preference/AndroidPreference$Object;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/core/preference/AndroidPreference$Object;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$StringPrimitive; HSPLtachiyomi/core/preference/AndroidPreference$StringPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/lang/String;)V PLtachiyomi/core/preference/AndroidPreference$StringPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/lang/String;)V HSPLtachiyomi/core/preference/AndroidPreference$StringPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$StringPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$StringSetPrimitive; HSPLtachiyomi/core/preference/AndroidPreference$StringSetPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/util/Set;)V PLtachiyomi/core/preference/AndroidPreference$StringSetPrimitive;->(Landroid/content/SharedPreferences;Lkotlinx/coroutines/flow/Flow;Ljava/lang/String;Ljava/util/Set;)V HSPLtachiyomi/core/preference/AndroidPreference$StringSetPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$StringSetPrimitive;->read(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1; HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1;->(Lkotlinx/coroutines/flow/Flow;Ltachiyomi/core/preference/AndroidPreference;)V HPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1;->(Lkotlinx/coroutines/flow/Flow;Ltachiyomi/core/preference/AndroidPreference;)V HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2; HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Ltachiyomi/core/preference/AndroidPreference;)V HPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Ltachiyomi/core/preference/AndroidPreference;)V HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2$1; HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2$1;->(Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V PLtachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2$1;->(Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$filter$1$2;Lkotlin/coroutines/Continuation;)V Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1; HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;Ltachiyomi/core/preference/AndroidPreference;)V HPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1;->(Lkotlinx/coroutines/flow/FlowKt__EmittersKt$onStart$$inlined$unsafeFlow$1;Ltachiyomi/core/preference/AndroidPreference;)V HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2; HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Ltachiyomi/core/preference/AndroidPreference;)V HPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;Ltachiyomi/core/preference/AndroidPreference;)V HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; HPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2$1; HSPLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2$1;->(Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLtachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2$1;->(Ltachiyomi/core/preference/AndroidPreference$changes$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V Ltachiyomi/core/preference/AndroidPreference$changes$2; HSPLtachiyomi/core/preference/AndroidPreference$changes$2;->(Lkotlin/coroutines/Continuation;)V HPLtachiyomi/core/preference/AndroidPreference$changes$2;->(Lkotlin/coroutines/Continuation;)V HSPLtachiyomi/core/preference/AndroidPreference$changes$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLtachiyomi/core/preference/AndroidPreference$changes$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLtachiyomi/core/preference/AndroidPreference$changes$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreference$changes$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/core/preference/AndroidPreference$changes$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/core/preference/AndroidPreference$changes$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreferenceStore; HSPLtachiyomi/core/preference/AndroidPreferenceStore;->(Landroid/app/Application;)V PLtachiyomi/core/preference/AndroidPreferenceStore;->(Landroid/app/Application;)V HSPLtachiyomi/core/preference/AndroidPreferenceStore;->getBoolean(Ljava/lang/String;Z)Ltachiyomi/core/preference/AndroidPreference$BooleanPrimitive; HPLtachiyomi/core/preference/AndroidPreferenceStore;->getBoolean(Ljava/lang/String;Z)Ltachiyomi/core/preference/AndroidPreference$BooleanPrimitive; HSPLtachiyomi/core/preference/AndroidPreferenceStore;->getInt(ILjava/lang/String;)Ltachiyomi/core/preference/AndroidPreference$IntPrimitive; PLtachiyomi/core/preference/AndroidPreferenceStore;->getInt(ILjava/lang/String;)Ltachiyomi/core/preference/AndroidPreference$IntPrimitive; HSPLtachiyomi/core/preference/AndroidPreferenceStore;->getLong(JLjava/lang/String;)Ltachiyomi/core/preference/AndroidPreference$LongPrimitive; PLtachiyomi/core/preference/AndroidPreferenceStore;->getLong(JLjava/lang/String;)Ltachiyomi/core/preference/AndroidPreference$LongPrimitive; HSPLtachiyomi/core/preference/AndroidPreferenceStore;->getObject(Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ltachiyomi/core/preference/AndroidPreference$Object; HPLtachiyomi/core/preference/AndroidPreferenceStore;->getObject(Ljava/lang/String;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ltachiyomi/core/preference/AndroidPreference$Object; HSPLtachiyomi/core/preference/AndroidPreferenceStore;->getString(Ljava/lang/String;Ljava/lang/String;)Ltachiyomi/core/preference/AndroidPreference$StringPrimitive; PLtachiyomi/core/preference/AndroidPreferenceStore;->getString(Ljava/lang/String;Ljava/lang/String;)Ltachiyomi/core/preference/AndroidPreference$StringPrimitive; HSPLtachiyomi/core/preference/AndroidPreferenceStore;->getStringSet(Ljava/lang/String;Ljava/util/Set;)Ltachiyomi/core/preference/AndroidPreference$StringSetPrimitive; PLtachiyomi/core/preference/AndroidPreferenceStore;->getStringSet(Ljava/lang/String;Ljava/util/Set;)Ltachiyomi/core/preference/AndroidPreference$StringSetPrimitive; Ltachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1; HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->(Landroid/content/SharedPreferences;Lkotlin/coroutines/Continuation;)V PLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->(Landroid/content/SharedPreferences;Lkotlin/coroutines/Continuation;)V HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0; HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/ProducerScope;)V HPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0;->(Lkotlinx/coroutines/channels/ProducerScope;)V HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0;->onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V PLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0;->onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V Ltachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$1; HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$1;->(Landroid/content/SharedPreferences;Ltachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0;)V HPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$1;->(Landroid/content/SharedPreferences;Ltachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$$ExternalSyntheticLambda0;)V HSPLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$1;->invoke()Ljava/lang/Object; PLtachiyomi/core/preference/AndroidPreferenceStoreKt$keyFlow$1$1;->invoke()Ljava/lang/Object; Ltachiyomi/core/preference/Preference; Ltachiyomi/core/preference/PreferenceStore; Ltachiyomi/core/preference/TriState; HSPLtachiyomi/core/preference/TriState;->()V PLtachiyomi/core/preference/TriState;->()V HSPLtachiyomi/core/preference/TriState;->(Ljava/lang/String;I)V PLtachiyomi/core/preference/TriState;->(Ljava/lang/String;I)V Ltachiyomi/core/provider/AndroidBackupFolderProvider; HSPLtachiyomi/core/provider/AndroidBackupFolderProvider;->(Landroid/app/Application;)V PLtachiyomi/core/provider/AndroidBackupFolderProvider;->(Landroid/app/Application;)V Ltachiyomi/core/provider/AndroidDownloadFolderProvider; HSPLtachiyomi/core/provider/AndroidDownloadFolderProvider;->(Landroid/app/Application;)V PLtachiyomi/core/provider/AndroidDownloadFolderProvider;->(Landroid/app/Application;)V HSPLtachiyomi/core/provider/AndroidDownloadFolderProvider;->path()Ljava/lang/String; PLtachiyomi/core/provider/AndroidDownloadFolderProvider;->path()Ljava/lang/String; Ltachiyomi/core/provider/FolderProvider; Ltachiyomi/core/util/lang/CoroutinesExtensionsKt; HSPLtachiyomi/core/util/lang/CoroutinesExtensionsKt;->launchIO(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; PLtachiyomi/core/util/lang/CoroutinesExtensionsKt;->launchIO(Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; HSPLtachiyomi/core/util/lang/CoroutinesExtensionsKt;->launchNow(Lkotlin/jvm/functions/Function2;)V PLtachiyomi/core/util/lang/CoroutinesExtensionsKt;->launchNow(Lkotlin/jvm/functions/Function2;)V HSPLtachiyomi/core/util/lang/CoroutinesExtensionsKt;->withIOContext(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLtachiyomi/core/util/lang/CoroutinesExtensionsKt;->withIOContext(Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/data/AndroidDatabaseHandler; HSPLtachiyomi/data/AndroidDatabaseHandler;->(Ltachiyomi/data/Database;Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/data/AndroidDatabaseHandler;->(Ltachiyomi/data/Database;Lapp/cash/sqldelight/db/SqlDriver;)V HSPLtachiyomi/data/AndroidDatabaseHandler;->subscribeToList(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1; PLtachiyomi/data/AndroidDatabaseHandler;->subscribeToList(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/coroutines/FlowQuery$mapToOne$$inlined$map$1; Ltachiyomi/data/CategoriesQueries; HSPLtachiyomi/data/CategoriesQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/data/CategoriesQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V HSPLtachiyomi/data/CategoriesQueries;->getCategories(Lkotlin/jvm/functions/Function4;)Lapp/cash/sqldelight/Query; PLtachiyomi/data/CategoriesQueries;->getCategories(Lkotlin/jvm/functions/Function4;)Lapp/cash/sqldelight/Query; Ltachiyomi/data/CategoriesQueries$getCategories$1; HSPLtachiyomi/data/CategoriesQueries$getCategories$1;->(Lkotlin/jvm/functions/Function4;)V PLtachiyomi/data/CategoriesQueries$getCategories$1;->(Lkotlin/jvm/functions/Function4;)V HSPLtachiyomi/data/CategoriesQueries$getCategories$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/CategoriesQueries$getCategories$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/ChaptersQueries; HSPLtachiyomi/data/ChaptersQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/data/ChaptersQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V Ltachiyomi/data/Database; HSPLtachiyomi/data/Database;->()V PLtachiyomi/data/Database;->()V Ltachiyomi/data/Database$Companion; HSPLtachiyomi/data/Database$Companion;->()V PLtachiyomi/data/Database$Companion;->()V HSPLtachiyomi/data/Database$Companion;->()V PLtachiyomi/data/Database$Companion;->()V Ltachiyomi/data/DatabaseHandler; Ltachiyomi/data/DateColumnAdapter; HSPLtachiyomi/data/DateColumnAdapter;->()V PLtachiyomi/data/DateColumnAdapter;->()V HSPLtachiyomi/data/DateColumnAdapter;->()V PLtachiyomi/data/DateColumnAdapter;->()V Ltachiyomi/data/History$Adapter; HSPLtachiyomi/data/History$Adapter;->(Ltachiyomi/data/DateColumnAdapter;)V PLtachiyomi/data/History$Adapter;->(Ltachiyomi/data/DateColumnAdapter;)V Ltachiyomi/data/HistoryQueries; HSPLtachiyomi/data/HistoryQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;)V PLtachiyomi/data/HistoryQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;)V Ltachiyomi/data/Manga_syncQueries; HSPLtachiyomi/data/Manga_syncQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/data/Manga_syncQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V HSPLtachiyomi/data/Manga_syncQueries;->getTracks(Lkotlin/jvm/functions/Function13;)Lapp/cash/sqldelight/Query; PLtachiyomi/data/Manga_syncQueries;->getTracks(Lkotlin/jvm/functions/Function13;)Lapp/cash/sqldelight/Query; Ltachiyomi/data/Manga_syncQueries$getTracks$1; HSPLtachiyomi/data/Manga_syncQueries$getTracks$1;->(Lkotlin/jvm/functions/Function13;)V PLtachiyomi/data/Manga_syncQueries$getTracks$1;->(Lkotlin/jvm/functions/Function13;)V Ltachiyomi/data/Mangas$Adapter; HSPLtachiyomi/data/Mangas$Adapter;->(Ltachiyomi/data/StringListColumnAdapter;Ltachiyomi/data/UpdateStrategyColumnAdapter;)V PLtachiyomi/data/Mangas$Adapter;->(Ltachiyomi/data/StringListColumnAdapter;Ltachiyomi/data/UpdateStrategyColumnAdapter;)V Ltachiyomi/data/MangasQueries; HSPLtachiyomi/data/MangasQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/Mangas$Adapter;)V PLtachiyomi/data/MangasQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/Mangas$Adapter;)V Ltachiyomi/data/Mangas_categoriesQueries; HSPLtachiyomi/data/Mangas_categoriesQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/data/Mangas_categoriesQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V Ltachiyomi/data/SourcesQueries; HSPLtachiyomi/data/SourcesQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/data/SourcesQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V HSPLtachiyomi/data/SourcesQueries;->findAll(Lkotlin/jvm/functions/Function3;)Lapp/cash/sqldelight/Query; PLtachiyomi/data/SourcesQueries;->findAll(Lkotlin/jvm/functions/Function3;)Lapp/cash/sqldelight/Query; Ltachiyomi/data/SourcesQueries$findAll$1; HSPLtachiyomi/data/SourcesQueries$findAll$1;->(Lkotlin/jvm/functions/Function3;)V PLtachiyomi/data/SourcesQueries$findAll$1;->(Lkotlin/jvm/functions/Function3;)V Ltachiyomi/data/StringListColumnAdapter; HSPLtachiyomi/data/StringListColumnAdapter;->()V PLtachiyomi/data/StringListColumnAdapter;->()V HSPLtachiyomi/data/StringListColumnAdapter;->()V PLtachiyomi/data/StringListColumnAdapter;->()V Ltachiyomi/data/UpdateStrategyColumnAdapter; HSPLtachiyomi/data/UpdateStrategyColumnAdapter;->()V PLtachiyomi/data/UpdateStrategyColumnAdapter;->()V HSPLtachiyomi/data/UpdateStrategyColumnAdapter;->()V PLtachiyomi/data/UpdateStrategyColumnAdapter;->()V Ltachiyomi/data/category/CategoryMapperKt; HSPLtachiyomi/data/category/CategoryMapperKt;->()V PLtachiyomi/data/category/CategoryMapperKt;->()V HSPLtachiyomi/data/category/CategoryMapperKt;->getCategoryMapper()Lkotlin/jvm/functions/Function4; PLtachiyomi/data/category/CategoryMapperKt;->getCategoryMapper()Lkotlin/jvm/functions/Function4; Ltachiyomi/data/category/CategoryMapperKt$categoryMapper$1; HSPLtachiyomi/data/category/CategoryMapperKt$categoryMapper$1;->()V PLtachiyomi/data/category/CategoryMapperKt$categoryMapper$1;->()V HSPLtachiyomi/data/category/CategoryMapperKt$categoryMapper$1;->()V PLtachiyomi/data/category/CategoryMapperKt$categoryMapper$1;->()V HSPLtachiyomi/data/category/CategoryMapperKt$categoryMapper$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/category/CategoryMapperKt$categoryMapper$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/category/CategoryRepositoryImpl; HSPLtachiyomi/data/category/CategoryRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/category/CategoryRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V HSPLtachiyomi/data/category/CategoryRepositoryImpl;->getAllAsFlow()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/category/CategoryRepositoryImpl;->getAllAsFlow()Lkotlinx/coroutines/flow/Flow; Ltachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1; HSPLtachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1;->()V PLtachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1;->()V HSPLtachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1;->()V PLtachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1;->()V HSPLtachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/category/CategoryRepositoryImpl$getAllAsFlow$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/chapter/ChapterRepositoryImpl; HSPLtachiyomi/data/chapter/ChapterRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/chapter/ChapterRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V Ltachiyomi/data/data/DatabaseImpl; HSPLtachiyomi/data/data/DatabaseImpl;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;Ltachiyomi/data/Mangas$Adapter;)V PLtachiyomi/data/data/DatabaseImpl;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;Ltachiyomi/data/Mangas$Adapter;)V HSPLtachiyomi/data/data/DatabaseImpl;->getCategoriesQueries()Ltachiyomi/data/CategoriesQueries; PLtachiyomi/data/data/DatabaseImpl;->getCategoriesQueries()Ltachiyomi/data/CategoriesQueries; HSPLtachiyomi/data/data/DatabaseImpl;->getHistoryViewQueries()Ltachiyomi/view/HistoryViewQueries; PLtachiyomi/data/data/DatabaseImpl;->getHistoryViewQueries()Ltachiyomi/view/HistoryViewQueries; HSPLtachiyomi/data/data/DatabaseImpl;->getLibraryViewQueries()Ltachiyomi/view/LibraryViewQueries; PLtachiyomi/data/data/DatabaseImpl;->getLibraryViewQueries()Ltachiyomi/view/LibraryViewQueries; HSPLtachiyomi/data/data/DatabaseImpl;->getManga_syncQueries()Ltachiyomi/data/Manga_syncQueries; PLtachiyomi/data/data/DatabaseImpl;->getManga_syncQueries()Ltachiyomi/data/Manga_syncQueries; HSPLtachiyomi/data/data/DatabaseImpl;->getSourcesQueries()Ltachiyomi/data/SourcesQueries; PLtachiyomi/data/data/DatabaseImpl;->getSourcesQueries()Ltachiyomi/data/SourcesQueries; HSPLtachiyomi/data/data/DatabaseImpl;->getUpdatesViewQueries()Ltachiyomi/view/UpdatesViewQueries; PLtachiyomi/data/data/DatabaseImpl;->getUpdatesViewQueries()Ltachiyomi/view/UpdatesViewQueries; Ltachiyomi/data/data/DatabaseImpl$Schema; HSPLtachiyomi/data/data/DatabaseImpl$Schema;->()V PLtachiyomi/data/data/DatabaseImpl$Schema;->()V HSPLtachiyomi/data/data/DatabaseImpl$Schema;->()V PLtachiyomi/data/data/DatabaseImpl$Schema;->()V Ltachiyomi/data/data/DatabaseImplKt; HSPLtachiyomi/data/data/DatabaseImplKt;->newInstance(Lkotlin/reflect/KClass;Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;Ltachiyomi/data/Mangas$Adapter;)Ltachiyomi/data/Database; PLtachiyomi/data/data/DatabaseImplKt;->newInstance(Lkotlin/reflect/KClass;Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;Ltachiyomi/data/Mangas$Adapter;)Ltachiyomi/data/Database; Ltachiyomi/data/history/HistoryMapperKt; HSPLtachiyomi/data/history/HistoryMapperKt;->()V PLtachiyomi/data/history/HistoryMapperKt;->()V HSPLtachiyomi/data/history/HistoryMapperKt;->getHistoryWithRelationsMapper()Lkotlin/jvm/functions/Function11; PLtachiyomi/data/history/HistoryMapperKt;->getHistoryWithRelationsMapper()Lkotlin/jvm/functions/Function11; Ltachiyomi/data/history/HistoryMapperKt$historyMapper$1; HSPLtachiyomi/data/history/HistoryMapperKt$historyMapper$1;->()V PLtachiyomi/data/history/HistoryMapperKt$historyMapper$1;->()V HSPLtachiyomi/data/history/HistoryMapperKt$historyMapper$1;->()V PLtachiyomi/data/history/HistoryMapperKt$historyMapper$1;->()V Ltachiyomi/data/history/HistoryMapperKt$historyWithRelationsMapper$1; HSPLtachiyomi/data/history/HistoryMapperKt$historyWithRelationsMapper$1;->()V PLtachiyomi/data/history/HistoryMapperKt$historyWithRelationsMapper$1;->()V HSPLtachiyomi/data/history/HistoryMapperKt$historyWithRelationsMapper$1;->()V PLtachiyomi/data/history/HistoryMapperKt$historyWithRelationsMapper$1;->()V Ltachiyomi/data/history/HistoryRepositoryImpl; HSPLtachiyomi/data/history/HistoryRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/history/HistoryRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V HSPLtachiyomi/data/history/HistoryRepositoryImpl;->getHistory(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/history/HistoryRepositoryImpl;->getHistory(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; Ltachiyomi/data/history/HistoryRepositoryImpl$getHistory$1; HSPLtachiyomi/data/history/HistoryRepositoryImpl$getHistory$1;->(Ljava/lang/String;)V PLtachiyomi/data/history/HistoryRepositoryImpl$getHistory$1;->(Ljava/lang/String;)V HSPLtachiyomi/data/history/HistoryRepositoryImpl$getHistory$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/history/HistoryRepositoryImpl$getHistory$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/manga/MangaMapperKt; HSPLtachiyomi/data/manga/MangaMapperKt;->()V PLtachiyomi/data/manga/MangaMapperKt;->()V HSPLtachiyomi/data/manga/MangaMapperKt;->getLibraryManga()Lkotlin/jvm/functions/FunctionN; PLtachiyomi/data/manga/MangaMapperKt;->getLibraryManga()Lkotlin/jvm/functions/FunctionN; Ltachiyomi/data/manga/MangaMapperKt$libraryManga$1; HSPLtachiyomi/data/manga/MangaMapperKt$libraryManga$1;->()V PLtachiyomi/data/manga/MangaMapperKt$libraryManga$1;->()V HSPLtachiyomi/data/manga/MangaMapperKt$libraryManga$1;->()V PLtachiyomi/data/manga/MangaMapperKt$libraryManga$1;->()V Ltachiyomi/data/manga/MangaMapperKt$mangaMapper$1; HSPLtachiyomi/data/manga/MangaMapperKt$mangaMapper$1;->()V PLtachiyomi/data/manga/MangaMapperKt$mangaMapper$1;->()V HSPLtachiyomi/data/manga/MangaMapperKt$mangaMapper$1;->()V PLtachiyomi/data/manga/MangaMapperKt$mangaMapper$1;->()V Ltachiyomi/data/manga/MangaRepositoryImpl; HSPLtachiyomi/data/manga/MangaRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/manga/MangaRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V HSPLtachiyomi/data/manga/MangaRepositoryImpl;->getLibraryMangaAsFlow()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/manga/MangaRepositoryImpl;->getLibraryMangaAsFlow()Lkotlinx/coroutines/flow/Flow; Ltachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1; HSPLtachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1;->()V PLtachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1;->()V HSPLtachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1;->()V PLtachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1;->()V HSPLtachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/manga/MangaRepositoryImpl$getLibraryMangaAsFlow$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/source/SourceMapperKt; HSPLtachiyomi/data/source/SourceMapperKt;->()V PLtachiyomi/data/source/SourceMapperKt;->()V HSPLtachiyomi/data/source/SourceMapperKt;->getSourceDataMapper()Lkotlin/jvm/functions/Function3; PLtachiyomi/data/source/SourceMapperKt;->getSourceDataMapper()Lkotlin/jvm/functions/Function3; Ltachiyomi/data/source/SourceMapperKt$sourceDataMapper$1; HSPLtachiyomi/data/source/SourceMapperKt$sourceDataMapper$1;->()V PLtachiyomi/data/source/SourceMapperKt$sourceDataMapper$1;->()V HSPLtachiyomi/data/source/SourceMapperKt$sourceDataMapper$1;->()V PLtachiyomi/data/source/SourceMapperKt$sourceDataMapper$1;->()V Ltachiyomi/data/source/SourceMapperKt$sourceMapper$1; HSPLtachiyomi/data/source/SourceMapperKt$sourceMapper$1;->()V PLtachiyomi/data/source/SourceMapperKt$sourceMapper$1;->()V HSPLtachiyomi/data/source/SourceMapperKt$sourceMapper$1;->()V PLtachiyomi/data/source/SourceMapperKt$sourceMapper$1;->()V Ltachiyomi/data/source/StubSourceRepositoryImpl; HSPLtachiyomi/data/source/StubSourceRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/source/StubSourceRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V HSPLtachiyomi/data/source/StubSourceRepositoryImpl;->subscribeAll()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/source/StubSourceRepositoryImpl;->subscribeAll()Lkotlinx/coroutines/flow/Flow; Ltachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1; HSPLtachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1;->()V PLtachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1;->()V HSPLtachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1;->()V PLtachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1;->()V HSPLtachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/source/StubSourceRepositoryImpl$subscribeAll$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/track/TrackMapperKt; HSPLtachiyomi/data/track/TrackMapperKt;->()V PLtachiyomi/data/track/TrackMapperKt;->()V HSPLtachiyomi/data/track/TrackMapperKt;->getTrackMapper()Lkotlin/jvm/functions/Function13; PLtachiyomi/data/track/TrackMapperKt;->getTrackMapper()Lkotlin/jvm/functions/Function13; Ltachiyomi/data/track/TrackMapperKt$trackMapper$1; HSPLtachiyomi/data/track/TrackMapperKt$trackMapper$1;->()V PLtachiyomi/data/track/TrackMapperKt$trackMapper$1;->()V HSPLtachiyomi/data/track/TrackMapperKt$trackMapper$1;->()V PLtachiyomi/data/track/TrackMapperKt$trackMapper$1;->()V Ltachiyomi/data/track/TrackRepositoryImpl; HSPLtachiyomi/data/track/TrackRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/track/TrackRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V HSPLtachiyomi/data/track/TrackRepositoryImpl;->getTracksAsFlow()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/track/TrackRepositoryImpl;->getTracksAsFlow()Lkotlinx/coroutines/flow/Flow; Ltachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1; HSPLtachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1;->()V PLtachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1;->()V HSPLtachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1;->()V PLtachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1;->()V HSPLtachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/track/TrackRepositoryImpl$getTracksAsFlow$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/updates/UpdatesMapperKt; HSPLtachiyomi/data/updates/UpdatesMapperKt;->()V PLtachiyomi/data/updates/UpdatesMapperKt;->()V HSPLtachiyomi/data/updates/UpdatesMapperKt;->getUpdateWithRelationMapper()Lkotlin/jvm/functions/Function14; PLtachiyomi/data/updates/UpdatesMapperKt;->getUpdateWithRelationMapper()Lkotlin/jvm/functions/Function14; Ltachiyomi/data/updates/UpdatesMapperKt$updateWithRelationMapper$1; HSPLtachiyomi/data/updates/UpdatesMapperKt$updateWithRelationMapper$1;->()V PLtachiyomi/data/updates/UpdatesMapperKt$updateWithRelationMapper$1;->()V HSPLtachiyomi/data/updates/UpdatesMapperKt$updateWithRelationMapper$1;->()V PLtachiyomi/data/updates/UpdatesMapperKt$updateWithRelationMapper$1;->()V Ltachiyomi/data/updates/UpdatesRepositoryImpl; HSPLtachiyomi/data/updates/UpdatesRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V PLtachiyomi/data/updates/UpdatesRepositoryImpl;->(Ltachiyomi/data/DatabaseHandler;)V HSPLtachiyomi/data/updates/UpdatesRepositoryImpl;->subscribeAll(J)Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/updates/UpdatesRepositoryImpl;->subscribeAll(J)Lkotlinx/coroutines/flow/Flow; HSPLtachiyomi/data/updates/UpdatesRepositoryImpl;->subscribeWithRead(J)Lkotlinx/coroutines/flow/Flow; PLtachiyomi/data/updates/UpdatesRepositoryImpl;->subscribeWithRead(J)Lkotlinx/coroutines/flow/Flow; Ltachiyomi/data/updates/UpdatesRepositoryImpl$subscribeAll$1; HSPLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeAll$1;->(J)V PLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeAll$1;->(J)V HSPLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeAll$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeAll$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/data/updates/UpdatesRepositoryImpl$subscribeWithRead$1; HSPLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeWithRead$1;->(J)V PLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeWithRead$1;->(J)V HSPLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeWithRead$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/data/updates/UpdatesRepositoryImpl$subscribeWithRead$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/domain/backup/service/BackupPreferences; HSPLtachiyomi/domain/backup/service/BackupPreferences;->(Ltachiyomi/core/provider/FolderProvider;Ltachiyomi/core/preference/PreferenceStore;)V PLtachiyomi/domain/backup/service/BackupPreferences;->(Ltachiyomi/core/provider/FolderProvider;Ltachiyomi/core/preference/PreferenceStore;)V HSPLtachiyomi/domain/backup/service/BackupPreferences;->backupInterval()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/backup/service/BackupPreferences;->backupInterval()Ltachiyomi/core/preference/Preference; Ltachiyomi/domain/category/interactor/CreateCategoryWithName; Ltachiyomi/domain/category/interactor/DeleteCategory; Ltachiyomi/domain/category/interactor/GetCategories; HSPLtachiyomi/domain/category/interactor/GetCategories;->(Ltachiyomi/domain/category/repository/CategoryRepository;)V PLtachiyomi/domain/category/interactor/GetCategories;->(Ltachiyomi/domain/category/repository/CategoryRepository;)V HSPLtachiyomi/domain/category/interactor/GetCategories;->subscribe()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/domain/category/interactor/GetCategories;->subscribe()Lkotlinx/coroutines/flow/Flow; Ltachiyomi/domain/category/interactor/RenameCategory; Ltachiyomi/domain/category/interactor/ReorderCategory; Ltachiyomi/domain/category/interactor/ResetCategoryFlags; Ltachiyomi/domain/category/interactor/SetDisplayMode; HSPLtachiyomi/domain/category/interactor/SetDisplayMode;->(Ltachiyomi/domain/library/service/LibraryPreferences;)V PLtachiyomi/domain/category/interactor/SetDisplayMode;->(Ltachiyomi/domain/library/service/LibraryPreferences;)V Ltachiyomi/domain/category/interactor/SetMangaCategories; HSPLtachiyomi/domain/category/interactor/SetMangaCategories;->(Ltachiyomi/domain/manga/repository/MangaRepository;)V PLtachiyomi/domain/category/interactor/SetMangaCategories;->(Ltachiyomi/domain/manga/repository/MangaRepository;)V Ltachiyomi/domain/category/interactor/SetSortModeForCategory; HSPLtachiyomi/domain/category/interactor/SetSortModeForCategory;->(Ltachiyomi/domain/category/repository/CategoryRepository;Ltachiyomi/domain/library/service/LibraryPreferences;)V PLtachiyomi/domain/category/interactor/SetSortModeForCategory;->(Ltachiyomi/domain/category/repository/CategoryRepository;Ltachiyomi/domain/library/service/LibraryPreferences;)V Ltachiyomi/domain/category/interactor/UpdateCategory; Ltachiyomi/domain/category/model/Category; HSPLtachiyomi/domain/category/model/Category;->()V PLtachiyomi/domain/category/model/Category;->()V HSPLtachiyomi/domain/category/model/Category;->(Ljava/lang/String;JJJ)V PLtachiyomi/domain/category/model/Category;->(Ljava/lang/String;JJJ)V HSPLtachiyomi/domain/category/model/Category;->getFlags()J PLtachiyomi/domain/category/model/Category;->getFlags()J HSPLtachiyomi/domain/category/model/Category;->getId()J PLtachiyomi/domain/category/model/Category;->getId()J HSPLtachiyomi/domain/category/model/Category;->hashCode()I PLtachiyomi/domain/category/model/Category;->hashCode()I HSPLtachiyomi/domain/category/model/Category;->isSystemCategory()Z PLtachiyomi/domain/category/model/Category;->isSystemCategory()Z Ltachiyomi/domain/category/model/Category$Companion; HSPLtachiyomi/domain/category/model/Category$Companion;->()V PLtachiyomi/domain/category/model/Category$Companion;->()V HSPLtachiyomi/domain/category/model/Category$Companion;->(I)V PLtachiyomi/domain/category/model/Category$Companion;->(I)V Ltachiyomi/domain/category/repository/CategoryRepository; Ltachiyomi/domain/chapter/interactor/GetChapter; HSPLtachiyomi/domain/chapter/interactor/GetChapter;->(Ltachiyomi/domain/chapter/repository/ChapterRepository;)V PLtachiyomi/domain/chapter/interactor/GetChapter;->(Ltachiyomi/domain/chapter/repository/ChapterRepository;)V Ltachiyomi/domain/chapter/interactor/GetChapterByMangaId; HSPLtachiyomi/domain/chapter/interactor/GetChapterByMangaId;->(Ltachiyomi/domain/chapter/repository/ChapterRepository;)V PLtachiyomi/domain/chapter/interactor/GetChapterByMangaId;->(Ltachiyomi/domain/chapter/repository/ChapterRepository;)V Ltachiyomi/domain/chapter/interactor/SetMangaDefaultChapterFlags; Ltachiyomi/domain/chapter/interactor/ShouldUpdateDbChapter; Ltachiyomi/domain/chapter/interactor/UpdateChapter; HSPLtachiyomi/domain/chapter/interactor/UpdateChapter;->(Ltachiyomi/domain/chapter/repository/ChapterRepository;)V PLtachiyomi/domain/chapter/interactor/UpdateChapter;->(Ltachiyomi/domain/chapter/repository/ChapterRepository;)V Ltachiyomi/domain/chapter/repository/ChapterRepository; Ltachiyomi/domain/download/service/DownloadPreferences; HSPLtachiyomi/domain/download/service/DownloadPreferences;->(Ltachiyomi/core/provider/FolderProvider;Ltachiyomi/core/preference/PreferenceStore;)V PLtachiyomi/domain/download/service/DownloadPreferences;->(Ltachiyomi/core/provider/FolderProvider;Ltachiyomi/core/preference/PreferenceStore;)V HSPLtachiyomi/domain/download/service/DownloadPreferences;->downloadsDirectory()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/download/service/DownloadPreferences;->downloadsDirectory()Ltachiyomi/core/preference/Preference; Ltachiyomi/domain/history/interactor/GetHistory; HSPLtachiyomi/domain/history/interactor/GetHistory;->(Ltachiyomi/domain/history/repository/HistoryRepository;)V PLtachiyomi/domain/history/interactor/GetHistory;->(Ltachiyomi/domain/history/repository/HistoryRepository;)V HSPLtachiyomi/domain/history/interactor/GetHistory;->subscribe(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; PLtachiyomi/domain/history/interactor/GetHistory;->subscribe(Ljava/lang/String;)Lkotlinx/coroutines/flow/Flow; Ltachiyomi/domain/history/interactor/GetNextChapters; HSPLtachiyomi/domain/history/interactor/GetNextChapters;->(Ltachiyomi/domain/chapter/interactor/GetChapterByMangaId;Ltachiyomi/domain/manga/interactor/GetManga;Ltachiyomi/domain/history/repository/HistoryRepository;)V PLtachiyomi/domain/history/interactor/GetNextChapters;->(Ltachiyomi/domain/chapter/interactor/GetChapterByMangaId;Ltachiyomi/domain/manga/interactor/GetManga;Ltachiyomi/domain/history/repository/HistoryRepository;)V Ltachiyomi/domain/history/interactor/GetTotalReadDuration; Ltachiyomi/domain/history/interactor/RemoveHistory; HSPLtachiyomi/domain/history/interactor/RemoveHistory;->(Ltachiyomi/domain/history/repository/HistoryRepository;)V PLtachiyomi/domain/history/interactor/RemoveHistory;->(Ltachiyomi/domain/history/repository/HistoryRepository;)V Ltachiyomi/domain/history/interactor/UpsertHistory; Ltachiyomi/domain/history/repository/HistoryRepository; Ltachiyomi/domain/library/model/Flag; Ltachiyomi/domain/library/model/FlagWithMask; Ltachiyomi/domain/library/model/LibrarySort; HSPLtachiyomi/domain/library/model/LibrarySort;->()V PLtachiyomi/domain/library/model/LibrarySort;->()V HSPLtachiyomi/domain/library/model/LibrarySort;->(Ltachiyomi/domain/library/model/LibrarySort$Type;Ltachiyomi/domain/library/model/LibrarySort$Direction;)V PLtachiyomi/domain/library/model/LibrarySort;->(Ltachiyomi/domain/library/model/LibrarySort$Type;Ltachiyomi/domain/library/model/LibrarySort$Direction;)V HSPLtachiyomi/domain/library/model/LibrarySort;->access$getDirections$delegate$cp()Lkotlin/Lazy; PLtachiyomi/domain/library/model/LibrarySort;->access$getDirections$delegate$cp()Lkotlin/Lazy; HSPLtachiyomi/domain/library/model/LibrarySort;->access$getTypes$delegate$cp()Lkotlin/Lazy; PLtachiyomi/domain/library/model/LibrarySort;->access$getTypes$delegate$cp()Lkotlin/Lazy; HSPLtachiyomi/domain/library/model/LibrarySort;->isAscending()Z PLtachiyomi/domain/library/model/LibrarySort;->isAscending()Z Ltachiyomi/domain/library/model/LibrarySort$Companion; HSPLtachiyomi/domain/library/model/LibrarySort$Companion;->()V PLtachiyomi/domain/library/model/LibrarySort$Companion;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Companion;->(I)V PLtachiyomi/domain/library/model/LibrarySort$Companion;->(I)V Ltachiyomi/domain/library/model/LibrarySort$Companion$directions$2; HSPLtachiyomi/domain/library/model/LibrarySort$Companion$directions$2;->()V PLtachiyomi/domain/library/model/LibrarySort$Companion$directions$2;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Companion$directions$2;->()V PLtachiyomi/domain/library/model/LibrarySort$Companion$directions$2;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Companion$directions$2;->invoke()Ljava/lang/Object; PLtachiyomi/domain/library/model/LibrarySort$Companion$directions$2;->invoke()Ljava/lang/Object; Ltachiyomi/domain/library/model/LibrarySort$Companion$types$2; HSPLtachiyomi/domain/library/model/LibrarySort$Companion$types$2;->()V PLtachiyomi/domain/library/model/LibrarySort$Companion$types$2;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Companion$types$2;->()V PLtachiyomi/domain/library/model/LibrarySort$Companion$types$2;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Companion$types$2;->invoke()Ljava/lang/Object; PLtachiyomi/domain/library/model/LibrarySort$Companion$types$2;->invoke()Ljava/lang/Object; Ltachiyomi/domain/library/model/LibrarySort$Direction; HSPLtachiyomi/domain/library/model/LibrarySort$Direction;->()V PLtachiyomi/domain/library/model/LibrarySort$Direction;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Direction;->(J)V PLtachiyomi/domain/library/model/LibrarySort$Direction;->(J)V HSPLtachiyomi/domain/library/model/LibrarySort$Direction;->getFlag()J PLtachiyomi/domain/library/model/LibrarySort$Direction;->getFlag()J HSPLtachiyomi/domain/library/model/LibrarySort$Direction;->getMask()J PLtachiyomi/domain/library/model/LibrarySort$Direction;->getMask()J Ltachiyomi/domain/library/model/LibrarySort$Direction$Ascending; HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Ascending;->()V PLtachiyomi/domain/library/model/LibrarySort$Direction$Ascending;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Ascending;->()V PLtachiyomi/domain/library/model/LibrarySort$Direction$Ascending;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Ascending;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Direction$Ascending;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Direction$Companion; HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Companion;->()V PLtachiyomi/domain/library/model/LibrarySort$Direction$Companion;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Companion;->(I)V PLtachiyomi/domain/library/model/LibrarySort$Direction$Companion;->(I)V Ltachiyomi/domain/library/model/LibrarySort$Direction$Descending; HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->()V PLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->()V PLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->equals(Ljava/lang/Object;)Z PLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->equals(Ljava/lang/Object;)Z HSPLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Direction$Descending;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type; HSPLtachiyomi/domain/library/model/LibrarySort$Type;->()V PLtachiyomi/domain/library/model/LibrarySort$Type;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type;->(J)V PLtachiyomi/domain/library/model/LibrarySort$Type;->(J)V HSPLtachiyomi/domain/library/model/LibrarySort$Type;->getFlag()J PLtachiyomi/domain/library/model/LibrarySort$Type;->getFlag()J HSPLtachiyomi/domain/library/model/LibrarySort$Type;->getMask()J PLtachiyomi/domain/library/model/LibrarySort$Type;->getMask()J Ltachiyomi/domain/library/model/LibrarySort$Type$Alphabetical; HSPLtachiyomi/domain/library/model/LibrarySort$Type$Alphabetical;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$Alphabetical;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$Alphabetical;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$Alphabetical;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$Alphabetical;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$Alphabetical;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate; HSPLtachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$ChapterFetchDate;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$Companion; HSPLtachiyomi/domain/library/model/LibrarySort$Type$Companion;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$Companion;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$Companion;->(I)V PLtachiyomi/domain/library/model/LibrarySort$Type$Companion;->(I)V Ltachiyomi/domain/library/model/LibrarySort$Type$DateAdded; HSPLtachiyomi/domain/library/model/LibrarySort$Type$DateAdded;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$DateAdded;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$DateAdded;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$DateAdded;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$DateAdded;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$DateAdded;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$LastRead; HSPLtachiyomi/domain/library/model/LibrarySort$Type$LastRead;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$LastRead;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$LastRead;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$LastRead;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$LastRead;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$LastRead;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$LastUpdate; HSPLtachiyomi/domain/library/model/LibrarySort$Type$LastUpdate;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$LastUpdate;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$LastUpdate;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$LastUpdate;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$LastUpdate;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$LastUpdate;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$LatestChapter; HSPLtachiyomi/domain/library/model/LibrarySort$Type$LatestChapter;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$LatestChapter;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$LatestChapter;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$LatestChapter;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$LatestChapter;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$LatestChapter;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$TotalChapters; HSPLtachiyomi/domain/library/model/LibrarySort$Type$TotalChapters;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$TotalChapters;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$TotalChapters;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$TotalChapters;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$TotalChapters;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$TotalChapters;->hashCode()I Ltachiyomi/domain/library/model/LibrarySort$Type$UnreadCount; HSPLtachiyomi/domain/library/model/LibrarySort$Type$UnreadCount;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$UnreadCount;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$UnreadCount;->()V PLtachiyomi/domain/library/model/LibrarySort$Type$UnreadCount;->()V HSPLtachiyomi/domain/library/model/LibrarySort$Type$UnreadCount;->hashCode()I PLtachiyomi/domain/library/model/LibrarySort$Type$UnreadCount;->hashCode()I Ltachiyomi/domain/library/model/LibrarySortModeKt; HSPLtachiyomi/domain/library/model/LibrarySortModeKt;->getSort(Ltachiyomi/domain/category/model/Category;)Ltachiyomi/domain/library/model/LibrarySort; PLtachiyomi/domain/library/model/LibrarySortModeKt;->getSort(Ltachiyomi/domain/category/model/Category;)Ltachiyomi/domain/library/model/LibrarySort; Ltachiyomi/domain/library/model/Mask; Ltachiyomi/domain/library/service/LibraryPreferences; HSPLtachiyomi/domain/library/service/LibraryPreferences;->()V PLtachiyomi/domain/library/service/LibraryPreferences;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V PLtachiyomi/domain/library/service/LibraryPreferences;->(Ltachiyomi/core/preference/PreferenceStore;)V HSPLtachiyomi/domain/library/service/LibraryPreferences;->autoClearChapterCache()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->autoClearChapterCache()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->categoryNumberOfItems()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->categoryNumberOfItems()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->categoryTabs()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->categoryTabs()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->downloadBadge()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->downloadBadge()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->filterBookmarked()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->filterBookmarked()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->filterCompleted()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->filterCompleted()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->filterDownloaded()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->filterDownloaded()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->filterStarted()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->filterStarted()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->filterUnread()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->filterUnread()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->languageBadge()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->languageBadge()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->lastUsedCategory()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->lastUsedCategory()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->libraryUpdateInterval()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->libraryUpdateInterval()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->libraryUpdateLastTimestamp()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->libraryUpdateLastTimestamp()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->localBadge()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->localBadge()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->newShowUpdatesCount()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->newShowUpdatesCount()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->newUpdatesCount()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->newUpdatesCount()Ltachiyomi/core/preference/Preference; HSPLtachiyomi/domain/library/service/LibraryPreferences;->showContinueReadingButton()Ltachiyomi/core/preference/Preference; PLtachiyomi/domain/library/service/LibraryPreferences;->showContinueReadingButton()Ltachiyomi/core/preference/Preference; Ltachiyomi/domain/library/service/LibraryPreferences$Companion; HSPLtachiyomi/domain/library/service/LibraryPreferences$Companion;->()V PLtachiyomi/domain/library/service/LibraryPreferences$Companion;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences$Companion;->(I)V PLtachiyomi/domain/library/service/LibraryPreferences$Companion;->(I)V Ltachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$1; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$1;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$1;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$2; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$2;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterBookmarked$$inlined$getEnum$2;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$1; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$1;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$1;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$2; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$2;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterCompleted$$inlined$getEnum$2;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$1; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$1;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$1;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$2; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$2;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterDownloaded$$inlined$getEnum$2;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$1; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$1;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$1;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$2; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$2;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterStarted$$inlined$getEnum$2;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$1; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$1;->()V HSPLtachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$1;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$1;->()V Ltachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$2; HSPLtachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$2;->()V PLtachiyomi/domain/library/service/LibraryPreferences$filterUnread$$inlined$getEnum$2;->()V Ltachiyomi/domain/manga/interactor/GetDuplicateLibraryManga; Ltachiyomi/domain/manga/interactor/GetFavorites; Ltachiyomi/domain/manga/interactor/GetLibraryManga; HSPLtachiyomi/domain/manga/interactor/GetLibraryManga;->(Ltachiyomi/domain/manga/repository/MangaRepository;)V PLtachiyomi/domain/manga/interactor/GetLibraryManga;->(Ltachiyomi/domain/manga/repository/MangaRepository;)V HSPLtachiyomi/domain/manga/interactor/GetLibraryManga;->subscribe()Lkotlinx/coroutines/flow/Flow; PLtachiyomi/domain/manga/interactor/GetLibraryManga;->subscribe()Lkotlinx/coroutines/flow/Flow; Ltachiyomi/domain/manga/interactor/GetManga; HSPLtachiyomi/domain/manga/interactor/GetManga;->(Ltachiyomi/domain/manga/repository/MangaRepository;)V PLtachiyomi/domain/manga/interactor/GetManga;->(Ltachiyomi/domain/manga/repository/MangaRepository;)V Ltachiyomi/domain/manga/interactor/GetMangaWithChapters; Ltachiyomi/domain/manga/interactor/NetworkToLocalManga; Ltachiyomi/domain/manga/interactor/ResetViewerFlags; Ltachiyomi/domain/manga/interactor/SetFetchInterval; HSPLtachiyomi/domain/manga/interactor/SetFetchInterval;->(Ltachiyomi/domain/chapter/interactor/GetChapterByMangaId;)V PLtachiyomi/domain/manga/interactor/SetFetchInterval;->(Ltachiyomi/domain/chapter/interactor/GetChapterByMangaId;)V Ltachiyomi/domain/manga/interactor/SetMangaChapterFlags; Ltachiyomi/domain/manga/repository/MangaRepository; Ltachiyomi/domain/release/interactor/GetApplicationRelease; Ltachiyomi/domain/release/service/ReleaseService; Ltachiyomi/domain/source/interactor/GetRemoteManga; Ltachiyomi/domain/source/interactor/GetSourcesWithNonLibraryManga; Ltachiyomi/domain/source/repository/SourceRepository; Ltachiyomi/domain/source/repository/StubSourceRepository; Ltachiyomi/domain/source/service/SourceManager; Ltachiyomi/domain/track/interactor/DeleteTrack; Ltachiyomi/domain/track/interactor/GetTracks; Ltachiyomi/domain/track/interactor/GetTracksPerManga; HSPLtachiyomi/domain/track/interactor/GetTracksPerManga;->(Ltachiyomi/domain/track/repository/TrackRepository;)V PLtachiyomi/domain/track/interactor/GetTracksPerManga;->(Ltachiyomi/domain/track/repository/TrackRepository;)V HSPLtachiyomi/domain/track/interactor/GetTracksPerManga;->subscribe()Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1; PLtachiyomi/domain/track/interactor/GetTracksPerManga;->subscribe()Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1; Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1; HSPLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;)V PLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1;->(Lkotlinx/coroutines/flow/Flow;)V HSPLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1;->collect(Lkotlinx/coroutines/flow/FlowCollector;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2; HSPLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V PLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2;->(Lkotlinx/coroutines/flow/FlowCollector;)V HSPLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2;->emit(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2$1; HSPLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2$1;->(Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V PLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2$1;->(Ltachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2;Lkotlin/coroutines/Continuation;)V HSPLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/domain/track/interactor/GetTracksPerManga$subscribe$$inlined$map$1$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/domain/track/interactor/InsertTrack; Ltachiyomi/domain/track/repository/TrackRepository; Ltachiyomi/domain/updates/interactor/GetUpdates; HSPLtachiyomi/domain/updates/interactor/GetUpdates;->(Ltachiyomi/domain/updates/repository/UpdatesRepository;)V PLtachiyomi/domain/updates/interactor/GetUpdates;->(Ltachiyomi/domain/updates/repository/UpdatesRepository;)V HSPLtachiyomi/domain/updates/interactor/GetUpdates;->subscribe(J)Lkotlinx/coroutines/flow/Flow; PLtachiyomi/domain/updates/interactor/GetUpdates;->subscribe(J)Lkotlinx/coroutines/flow/Flow; HSPLtachiyomi/domain/updates/interactor/GetUpdates;->subscribe(Ljava/util/Calendar;)Lkotlinx/coroutines/flow/Flow; PLtachiyomi/domain/updates/interactor/GetUpdates;->subscribe(Ljava/util/Calendar;)Lkotlinx/coroutines/flow/Flow; Ltachiyomi/domain/updates/repository/UpdatesRepository; Ltachiyomi/presentation/core/components/ActionButtonKt; HSPLtachiyomi/presentation/core/components/ActionButtonKt;->ActionButton(Landroidx/compose/ui/Modifier;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V HPLtachiyomi/presentation/core/components/ActionButtonKt;->ActionButton(Landroidx/compose/ui/Modifier;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V Ltachiyomi/presentation/core/components/ActionButtonKt$ActionButton$1; HSPLtachiyomi/presentation/core/components/ActionButtonKt$ActionButton$1;->(ILandroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;)V PLtachiyomi/presentation/core/components/ActionButtonKt$ActionButton$1;->(ILandroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;)V HSPLtachiyomi/presentation/core/components/ActionButtonKt$ActionButton$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/ActionButtonKt$ActionButton$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/LazyListKt; HSPLtachiyomi/presentation/core/components/LazyListKt;->ScrollbarLazyColumn(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Horizontal;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V HPLtachiyomi/presentation/core/components/LazyListKt;->ScrollbarLazyColumn(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/layout/PaddingValues;ZLandroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/ui/Alignment$Horizontal;ZLkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V Ltachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt; HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt;->()V Ltachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1; HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1; HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1; HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-3$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1; HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-4$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1; HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1;->()V PLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1;->()V HSPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ComposableSingletons$ScaffoldKt$lambda-5$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ConstantsKt; HSPLtachiyomi/presentation/core/components/material/ConstantsKt;->()V PLtachiyomi/presentation/core/components/material/ConstantsKt;->()V HSPLtachiyomi/presentation/core/components/material/ConstantsKt;->getPadding()Ltachiyomi/presentation/core/components/material/Padding; PLtachiyomi/presentation/core/components/material/ConstantsKt;->getPadding()Ltachiyomi/presentation/core/components/material/Padding; Ltachiyomi/presentation/core/components/material/FabPosition; HSPLtachiyomi/presentation/core/components/material/FabPosition;->()V PLtachiyomi/presentation/core/components/material/FabPosition;->()V HSPLtachiyomi/presentation/core/components/material/FabPosition;->(I)V PLtachiyomi/presentation/core/components/material/FabPosition;->(I)V HSPLtachiyomi/presentation/core/components/material/FabPosition;->access$getEnd$cp()I PLtachiyomi/presentation/core/components/material/FabPosition;->access$getEnd$cp()I HSPLtachiyomi/presentation/core/components/material/FabPosition;->box-impl(I)Ltachiyomi/presentation/core/components/material/FabPosition; PLtachiyomi/presentation/core/components/material/FabPosition;->box-impl(I)Ltachiyomi/presentation/core/components/material/FabPosition; PLtachiyomi/presentation/core/components/material/FabPosition;->equals(Ljava/lang/Object;)Z Ltachiyomi/presentation/core/components/material/FabPosition$Companion; HSPLtachiyomi/presentation/core/components/material/FabPosition$Companion;->()V PLtachiyomi/presentation/core/components/material/FabPosition$Companion;->()V HSPLtachiyomi/presentation/core/components/material/FabPosition$Companion;->(I)V PLtachiyomi/presentation/core/components/material/FabPosition$Companion;->(I)V Ltachiyomi/presentation/core/components/material/NavigationBarKt; HSPLtachiyomi/presentation/core/components/material/NavigationBarKt;->NavigationBar-HsRjFd4(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V HPLtachiyomi/presentation/core/components/material/NavigationBarKt;->NavigationBar-HsRjFd4(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V Ltachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$1; HSPLtachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$1;->(Landroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;I)V PLtachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$1;->(Landroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;I)V HSPLtachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$2; HSPLtachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$2;->(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;II)V PLtachiyomi/presentation/core/components/material/NavigationBarKt$NavigationBar$2;->(Landroidx/compose/ui/Modifier;JJFLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;II)V Ltachiyomi/presentation/core/components/material/Padding; HSPLtachiyomi/presentation/core/components/material/Padding;->()V PLtachiyomi/presentation/core/components/material/Padding;->()V HSPLtachiyomi/presentation/core/components/material/Padding;->getSmall-D9Ej5fM()F PLtachiyomi/presentation/core/components/material/Padding;->getSmall-D9Ej5fM()F Ltachiyomi/presentation/core/components/material/ScaffoldKt; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt;->()V PLtachiyomi/presentation/core/components/material/ScaffoldKt;->()V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt;->Scaffold-UynuKms(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/TopAppBarScrollBehavior;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;III)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt;->Scaffold-UynuKms(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/TopAppBarScrollBehavior;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;III)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt;->access$ScaffoldLayout-sqSdXeA(ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt;->access$ScaffoldLayout-sqSdXeA(ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;I)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt;->getLocalFabPlacement()Landroidx/compose/runtime/StaticProvidableCompositionLocal; PLtachiyomi/presentation/core/components/material/ScaffoldKt;->getLocalFabPlacement()Landroidx/compose/runtime/StaticProvidableCompositionLocal; Ltachiyomi/presentation/core/components/material/ScaffoldKt$LocalFabPlacement$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$LocalFabPlacement$1;->()V PLtachiyomi/presentation/core/components/material/ScaffoldKt$LocalFabPlacement$1;->()V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$LocalFabPlacement$1;->()V PLtachiyomi/presentation/core/components/material/ScaffoldKt$LocalFabPlacement$1;->()V Ltachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$1$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$1$1;->(Landroidx/compose/foundation/layout/MutableWindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$1$1;->(Landroidx/compose/foundation/layout/MutableWindowInsets;Landroidx/compose/foundation/layout/WindowInsets;)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2;->(ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/MutableWindowInsets;Lkotlin/jvm/functions/Function2;IILkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2;->(ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/layout/MutableWindowInsets;Lkotlin/jvm/functions/Function2;IILkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2$1;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;I)V PLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2$1;->(Lkotlin/jvm/functions/Function3;Landroidx/compose/material3/TopAppBarScrollBehavior;I)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$2$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$3; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$3;->(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/TopAppBarScrollBehavior;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;III)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt$Scaffold$3;->(Landroidx/compose/ui/Modifier;Landroidx/compose/material3/TopAppBarScrollBehavior;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function3;III)V Ltachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1;->(IILandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V PLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1;->(IILandroidx/compose/foundation/layout/WindowInsets;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function3;I)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;IJJLkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function3;I)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/ArrayList;ILjava/util/ArrayList;ILkotlin/jvm/functions/Function3;I)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1;->(Landroidx/compose/foundation/layout/WindowInsets;Landroidx/compose/ui/layout/SubcomposeMeasureScope;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/ArrayList;ILjava/util/ArrayList;ILkotlin/jvm/functions/Function3;I)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bottomBarPlaceables$1; HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bottomBarPlaceables$1;->(Ltachiyomi/presentation/core/components/material/FabPlacement;Lkotlin/jvm/functions/Function2;I)V HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bottomBarPlaceables$1;->(Ltachiyomi/presentation/core/components/material/FabPlacement;Lkotlin/jvm/functions/Function2;I)V HSPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bottomBarPlaceables$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/components/material/ScaffoldKt$ScaffoldLayout$1$1$1$bottomBarPlaceables$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/components/material/ScaffoldLayoutContent; HSPLtachiyomi/presentation/core/components/material/ScaffoldLayoutContent;->()V PLtachiyomi/presentation/core/components/material/ScaffoldLayoutContent;->()V HSPLtachiyomi/presentation/core/components/material/ScaffoldLayoutContent;->(Ljava/lang/String;I)V PLtachiyomi/presentation/core/components/material/ScaffoldLayoutContent;->(Ljava/lang/String;I)V Ltachiyomi/presentation/core/screens/EmptyScreenAction; HSPLtachiyomi/presentation/core/screens/EmptyScreenAction;->(ILandroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function0;)V PLtachiyomi/presentation/core/screens/EmptyScreenAction;->(ILandroidx/compose/ui/graphics/vector/ImageVector;Lkotlin/jvm/functions/Function0;)V HSPLtachiyomi/presentation/core/screens/EmptyScreenAction;->getIcon()Landroidx/compose/ui/graphics/vector/ImageVector; PLtachiyomi/presentation/core/screens/EmptyScreenAction;->getIcon()Landroidx/compose/ui/graphics/vector/ImageVector; HSPLtachiyomi/presentation/core/screens/EmptyScreenAction;->getOnClick()Lkotlin/jvm/functions/Function0; PLtachiyomi/presentation/core/screens/EmptyScreenAction;->getOnClick()Lkotlin/jvm/functions/Function0; HSPLtachiyomi/presentation/core/screens/EmptyScreenAction;->getStringResId()I PLtachiyomi/presentation/core/screens/EmptyScreenAction;->getStringResId()I Ltachiyomi/presentation/core/screens/EmptyScreenKt; HSPLtachiyomi/presentation/core/screens/EmptyScreenKt;->()V PLtachiyomi/presentation/core/screens/EmptyScreenKt;->()V HSPLtachiyomi/presentation/core/screens/EmptyScreenKt;->EmptyScreen(ILandroidx/compose/ui/Modifier;Ljava/util/List;Landroidx/compose/runtime/Composer;II)V HPLtachiyomi/presentation/core/screens/EmptyScreenKt;->EmptyScreen(ILandroidx/compose/ui/Modifier;Ljava/util/List;Landroidx/compose/runtime/Composer;II)V HSPLtachiyomi/presentation/core/screens/EmptyScreenKt;->EmptyScreen(Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/util/List;Landroidx/compose/runtime/Composer;II)V HPLtachiyomi/presentation/core/screens/EmptyScreenKt;->EmptyScreen(Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/util/List;Landroidx/compose/runtime/Composer;II)V Ltachiyomi/presentation/core/screens/EmptyScreenKt$EmptyScreen$1; HSPLtachiyomi/presentation/core/screens/EmptyScreenKt$EmptyScreen$1;->(ILandroidx/compose/ui/Modifier;Ljava/util/List;II)V PLtachiyomi/presentation/core/screens/EmptyScreenKt$EmptyScreen$1;->(ILandroidx/compose/ui/Modifier;Ljava/util/List;II)V Ltachiyomi/presentation/core/screens/EmptyScreenKt$EmptyScreen$3; HSPLtachiyomi/presentation/core/screens/EmptyScreenKt$EmptyScreen$3;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/util/List;II)V PLtachiyomi/presentation/core/screens/EmptyScreenKt$EmptyScreen$3;->(Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/util/List;II)V Ltachiyomi/presentation/core/screens/LoadingScreenKt; HSPLtachiyomi/presentation/core/screens/LoadingScreenKt;->LoadingScreen(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V PLtachiyomi/presentation/core/screens/LoadingScreenKt;->LoadingScreen(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V Ltachiyomi/presentation/core/util/ModifierKt; HSPLtachiyomi/presentation/core/util/ModifierKt;->secondaryItemAlpha(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; HPLtachiyomi/presentation/core/util/ModifierKt;->secondaryItemAlpha(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; Ltachiyomi/presentation/core/util/PreferenceKt; HSPLtachiyomi/presentation/core/util/PreferenceKt;->collectAsState(Ltachiyomi/core/preference/Preference;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; HPLtachiyomi/presentation/core/util/PreferenceKt;->collectAsState(Ltachiyomi/core/preference/Preference;Landroidx/compose/runtime/Composer;)Landroidx/compose/runtime/MutableState; Ltachiyomi/presentation/core/util/ScrollbarKt; HSPLtachiyomi/presentation/core/util/ScrollbarKt;->()V PLtachiyomi/presentation/core/util/ScrollbarKt;->()V HSPLtachiyomi/presentation/core/util/ScrollbarKt;->drawVerticalScrollbar(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;ZF)Landroidx/compose/ui/Modifier; HPLtachiyomi/presentation/core/util/ScrollbarKt;->drawVerticalScrollbar(Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/lazy/LazyListState;ZF)Landroidx/compose/ui/Modifier; Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$1; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$1;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/gestures/Orientation;F)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$1;->(Landroidx/compose/foundation/lazy/LazyListState;Landroidx/compose/foundation/gestures/Orientation;F)V HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2;->(Landroidx/compose/foundation/gestures/Orientation;ZLkotlin/jvm/functions/Function6;)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2;->(Landroidx/compose/foundation/gestures/Orientation;ZLkotlin/jvm/functions/Function6;)V HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1;->(Lkotlinx/coroutines/flow/MutableSharedFlow;Landroidx/compose/animation/core/Animatable;Lkotlin/coroutines/Continuation;)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1;->(Lkotlinx/coroutines/flow/MutableSharedFlow;Landroidx/compose/animation/core/Animatable;Lkotlin/coroutines/Continuation;)V HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1$1; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1$1;->(Landroidx/compose/animation/core/Animatable;Lkotlin/coroutines/Continuation;)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$1$1;->(Landroidx/compose/animation/core/Animatable;Lkotlin/coroutines/Continuation;)V Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2;->(Lkotlin/jvm/functions/Function6;ZZFJLandroidx/compose/animation/core/Animatable;)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2;->(Lkotlin/jvm/functions/Function6;ZZFJLandroidx/compose/animation/core/Animatable;)V HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2$1; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2$1;->(Landroidx/compose/animation/core/Animatable;)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$2$1;->(Landroidx/compose/animation/core/Animatable;)V Ltachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$nestedScrollConnection$1$1; HSPLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$nestedScrollConnection$1$1;->(Landroidx/compose/foundation/gestures/Orientation;Lkotlinx/coroutines/flow/MutableSharedFlow;)V PLtachiyomi/presentation/core/util/ScrollbarKt$drawScrollbar$2$nestedScrollConnection$1$1;->(Landroidx/compose/foundation/gestures/Orientation;Lkotlinx/coroutines/flow/MutableSharedFlow;)V Ltachiyomi/presentation/core/util/ScrollbarKt$onDrawScrollbar$1; HSPLtachiyomi/presentation/core/util/ScrollbarKt$onDrawScrollbar$1;->(ZJJJLkotlin/jvm/functions/Function0;)V PLtachiyomi/presentation/core/util/ScrollbarKt$onDrawScrollbar$1;->(ZJJJLkotlin/jvm/functions/Function0;)V HSPLtachiyomi/presentation/core/util/ScrollbarKt$onDrawScrollbar$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HPLtachiyomi/presentation/core/util/ScrollbarKt$onDrawScrollbar$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/widget/TachiyomiWidgetManager; HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager;->(Ltachiyomi/domain/updates/interactor/GetUpdates;Leu/kanade/tachiyomi/core/security/SecurityPreferences;)V PLtachiyomi/presentation/widget/TachiyomiWidgetManager;->(Ltachiyomi/domain/updates/interactor/GetUpdates;Leu/kanade/tachiyomi/core/security/SecurityPreferences;)V HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager;->init(Landroid/content/Context;Landroidx/lifecycle/LifecycleCoroutineScopeImpl;)V PLtachiyomi/presentation/widget/TachiyomiWidgetManager;->init(Landroid/content/Context;Landroidx/lifecycle/LifecycleCoroutineScopeImpl;)V Ltachiyomi/presentation/widget/TachiyomiWidgetManager$init$1; HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$1;->(Lkotlin/coroutines/Continuation;)V PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$1;->(Lkotlin/coroutines/Continuation;)V HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$1;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/widget/TachiyomiWidgetManager$init$2; HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->(Landroid/content/Context;Lkotlin/coroutines/Continuation;)V HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/presentation/widget/TachiyomiWidgetManager$init$2;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/presentation/widget/UpdatesGridGlanceWidget; HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget;->()V HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget;->()V Ltachiyomi/presentation/widget/UpdatesGridGlanceWidget$Companion; HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$Companion;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$Companion;->()V HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$Companion;->(I)V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$Companion;->(I)V Ltachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$1; HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$1;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$1;->()V HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$1;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$1;->()V Ltachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$2; HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$2;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$2;->()V HSPLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$2;->()V PLtachiyomi/presentation/widget/UpdatesGridGlanceWidget$special$$inlined$injectLazy$2;->()V Ltachiyomi/source/local/LocalSource; HSPLtachiyomi/source/local/LocalSource;->()V PLtachiyomi/source/local/LocalSource;->()V HSPLtachiyomi/source/local/LocalSource;->(Landroid/content/Context;Ltachiyomi/source/local/io/LocalSourceFileSystem;Ltachiyomi/source/local/image/LocalCoverManager;)V PLtachiyomi/source/local/LocalSource;->(Landroid/content/Context;Ltachiyomi/source/local/io/LocalSourceFileSystem;Ltachiyomi/source/local/image/LocalCoverManager;)V Ltachiyomi/source/local/LocalSource$$ExternalSyntheticLambda0; HSPLtachiyomi/source/local/LocalSource$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function2;I)V PLtachiyomi/source/local/LocalSource$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function2;I)V Ltachiyomi/source/local/LocalSource$Companion; HSPLtachiyomi/source/local/LocalSource$Companion;->()V PLtachiyomi/source/local/LocalSource$Companion;->()V HSPLtachiyomi/source/local/LocalSource$Companion;->(I)V PLtachiyomi/source/local/LocalSource$Companion;->(I)V Ltachiyomi/source/local/LocalSource$special$$inlined$injectLazy$1; HSPLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$1;->()V PLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$1;->()V HSPLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$1;->()V PLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$1;->()V Ltachiyomi/source/local/LocalSource$special$$inlined$injectLazy$2; HSPLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$2;->()V PLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$2;->()V HSPLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$2;->()V PLtachiyomi/source/local/LocalSource$special$$inlined$injectLazy$2;->()V Ltachiyomi/source/local/filter/OrderBy; HSPLtachiyomi/source/local/filter/OrderBy;->(Landroid/content/Context;Leu/kanade/tachiyomi/source/model/Filter$Sort$Selection;)V PLtachiyomi/source/local/filter/OrderBy;->(Landroid/content/Context;Leu/kanade/tachiyomi/source/model/Filter$Sort$Selection;)V Ltachiyomi/source/local/filter/OrderBy$Latest; HSPLtachiyomi/source/local/filter/OrderBy$Latest;->(Landroid/content/Context;)V PLtachiyomi/source/local/filter/OrderBy$Latest;->(Landroid/content/Context;)V Ltachiyomi/source/local/filter/OrderBy$Popular; HSPLtachiyomi/source/local/filter/OrderBy$Popular;->(Landroid/content/Context;)V PLtachiyomi/source/local/filter/OrderBy$Popular;->(Landroid/content/Context;)V Ltachiyomi/source/local/image/LocalCoverManager; HSPLtachiyomi/source/local/image/LocalCoverManager;->(Landroid/app/Application;Ltachiyomi/source/local/io/LocalSourceFileSystem;)V PLtachiyomi/source/local/image/LocalCoverManager;->(Landroid/app/Application;Ltachiyomi/source/local/io/LocalSourceFileSystem;)V Ltachiyomi/source/local/io/Format$UnknownFormatException; Ltachiyomi/source/local/io/LocalSourceFileSystem; HSPLtachiyomi/source/local/io/LocalSourceFileSystem;->(Landroid/app/Application;)V PLtachiyomi/source/local/io/LocalSourceFileSystem;->(Landroid/app/Application;)V Ltachiyomi/view/HistoryViewQueries; HSPLtachiyomi/view/HistoryViewQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;)V PLtachiyomi/view/HistoryViewQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/History$Adapter;)V HSPLtachiyomi/view/HistoryViewQueries;->access$getDriver(Ltachiyomi/view/HistoryViewQueries;)Lapp/cash/sqldelight/db/SqlDriver; PLtachiyomi/view/HistoryViewQueries;->access$getDriver(Ltachiyomi/view/HistoryViewQueries;)Lapp/cash/sqldelight/db/SqlDriver; HSPLtachiyomi/view/HistoryViewQueries;->history(Ljava/lang/String;Lkotlin/jvm/functions/Function11;)Lapp/cash/sqldelight/Query; PLtachiyomi/view/HistoryViewQueries;->history(Ljava/lang/String;Lkotlin/jvm/functions/Function11;)Lapp/cash/sqldelight/Query; Ltachiyomi/view/HistoryViewQueries$HistoryQuery; HSPLtachiyomi/view/HistoryViewQueries$HistoryQuery;->(Ltachiyomi/view/HistoryViewQueries;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V PLtachiyomi/view/HistoryViewQueries$HistoryQuery;->(Ltachiyomi/view/HistoryViewQueries;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V HSPLtachiyomi/view/HistoryViewQueries$HistoryQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V PLtachiyomi/view/HistoryViewQueries$HistoryQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V HSPLtachiyomi/view/HistoryViewQueries$HistoryQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; PLtachiyomi/view/HistoryViewQueries$HistoryQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; HSPLtachiyomi/view/HistoryViewQueries$HistoryQuery;->getQuery()Ljava/lang/String; PLtachiyomi/view/HistoryViewQueries$HistoryQuery;->getQuery()Ljava/lang/String; Ltachiyomi/view/HistoryViewQueries$HistoryQuery$execute$1; HSPLtachiyomi/view/HistoryViewQueries$HistoryQuery$execute$1;->(Ltachiyomi/view/HistoryViewQueries$HistoryQuery;)V PLtachiyomi/view/HistoryViewQueries$HistoryQuery$execute$1;->(Ltachiyomi/view/HistoryViewQueries$HistoryQuery;)V HSPLtachiyomi/view/HistoryViewQueries$HistoryQuery$execute$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/view/HistoryViewQueries$HistoryQuery$execute$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/view/HistoryViewQueries$history$1; HSPLtachiyomi/view/HistoryViewQueries$history$1;->(Lkotlin/jvm/functions/Function11;Ltachiyomi/view/HistoryViewQueries;)V PLtachiyomi/view/HistoryViewQueries$history$1;->(Lkotlin/jvm/functions/Function11;Ltachiyomi/view/HistoryViewQueries;)V Ltachiyomi/view/LibraryViewQueries; HSPLtachiyomi/view/LibraryViewQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/Mangas$Adapter;)V PLtachiyomi/view/LibraryViewQueries;->(Lapp/cash/sqldelight/db/SqlDriver;Ltachiyomi/data/Mangas$Adapter;)V HSPLtachiyomi/view/LibraryViewQueries;->library(Lkotlin/jvm/functions/FunctionN;)Lapp/cash/sqldelight/Query; PLtachiyomi/view/LibraryViewQueries;->library(Lkotlin/jvm/functions/FunctionN;)Lapp/cash/sqldelight/Query; Ltachiyomi/view/LibraryViewQueries$library$1; HSPLtachiyomi/view/LibraryViewQueries$library$1;->(Lkotlin/jvm/functions/FunctionN;Ltachiyomi/view/LibraryViewQueries;)V PLtachiyomi/view/LibraryViewQueries$library$1;->(Lkotlin/jvm/functions/FunctionN;Ltachiyomi/view/LibraryViewQueries;)V Ltachiyomi/view/UpdatesViewQueries; HSPLtachiyomi/view/UpdatesViewQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V PLtachiyomi/view/UpdatesViewQueries;->(Lapp/cash/sqldelight/db/SqlDriver;)V HSPLtachiyomi/view/UpdatesViewQueries;->access$getDriver(Ltachiyomi/view/UpdatesViewQueries;)Lapp/cash/sqldelight/db/SqlDriver; PLtachiyomi/view/UpdatesViewQueries;->access$getDriver(Ltachiyomi/view/UpdatesViewQueries;)Lapp/cash/sqldelight/db/SqlDriver; HSPLtachiyomi/view/UpdatesViewQueries;->getRecentUpdates(JJLkotlin/jvm/functions/Function14;)Lapp/cash/sqldelight/Query; PLtachiyomi/view/UpdatesViewQueries;->getRecentUpdates(JJLkotlin/jvm/functions/Function14;)Lapp/cash/sqldelight/Query; HSPLtachiyomi/view/UpdatesViewQueries;->getUpdatesByReadStatus(ZJLkotlin/jvm/functions/Function14;)Lapp/cash/sqldelight/Query; PLtachiyomi/view/UpdatesViewQueries;->getUpdatesByReadStatus(ZJLkotlin/jvm/functions/Function14;)Lapp/cash/sqldelight/Query; Ltachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery; HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->(Ltachiyomi/view/UpdatesViewQueries;JJLkotlin/jvm/functions/Function1;)V PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->(Ltachiyomi/view/UpdatesViewQueries;JJLkotlin/jvm/functions/Function1;)V HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->getAfter()J PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->getAfter()J HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->getLimit()J PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;->getLimit()J Ltachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery$execute$1; HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery$execute$1;->(Ltachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;)V PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery$execute$1;->(Ltachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery;)V HSPLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery$execute$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/view/UpdatesViewQueries$GetRecentUpdatesQuery$execute$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery; HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->(Ltachiyomi/view/UpdatesViewQueries;ZJLkotlin/jvm/functions/Function1;)V PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->(Ltachiyomi/view/UpdatesViewQueries;ZJLkotlin/jvm/functions/Function1;)V HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->addListener(Lapp/cash/sqldelight/coroutines/FlowQuery$asFlow$1$$ExternalSyntheticLambda0;)V HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->execute(Lkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult$Value; HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->getAfter()J PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->getAfter()J HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->getRead()Z PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;->getRead()Z Ltachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery$execute$1; HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery$execute$1;->(Ltachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;)V PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery$execute$1;->(Ltachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery;)V HSPLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery$execute$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLtachiyomi/view/UpdatesViewQueries$GetUpdatesByReadStatusQuery$execute$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; Ltachiyomi/view/UpdatesViewQueries$getRecentUpdates$1; HSPLtachiyomi/view/UpdatesViewQueries$getRecentUpdates$1;->(Lkotlin/jvm/functions/Function14;)V PLtachiyomi/view/UpdatesViewQueries$getRecentUpdates$1;->(Lkotlin/jvm/functions/Function14;)V Ltachiyomi/view/UpdatesViewQueries$getUpdatesByReadStatus$1; HSPLtachiyomi/view/UpdatesViewQueries$getUpdatesByReadStatus$1;->(Lkotlin/jvm/functions/Function14;)V PLtachiyomi/view/UpdatesViewQueries$getUpdatesByReadStatus$1;->(Lkotlin/jvm/functions/Function14;)V Luy/kohesive/injekt/InjektKt; HSPLuy/kohesive/injekt/InjektKt;->()V PLuy/kohesive/injekt/InjektKt;->()V HSPLuy/kohesive/injekt/InjektKt;->getInjekt()Luy/kohesive/injekt/api/InjektScope; PLuy/kohesive/injekt/InjektKt;->getInjekt()Luy/kohesive/injekt/api/InjektScope; Luy/kohesive/injekt/api/FullTypeReference; HSPLuy/kohesive/injekt/api/FullTypeReference;->()V HPLuy/kohesive/injekt/api/FullTypeReference;->()V HSPLuy/kohesive/injekt/api/FullTypeReference;->getType()Ljava/lang/reflect/Type; PLuy/kohesive/injekt/api/FullTypeReference;->getType()Ljava/lang/reflect/Type; Luy/kohesive/injekt/api/InjektFactory; Luy/kohesive/injekt/api/InjektModule; Luy/kohesive/injekt/api/InjektModule$DefaultImpls; HSPLuy/kohesive/injekt/api/InjektModule$DefaultImpls;->registerWith(Luy/kohesive/injekt/api/InjektModule;Luy/kohesive/injekt/api/InjektRegistrar;)V PLuy/kohesive/injekt/api/InjektModule$DefaultImpls;->registerWith(Luy/kohesive/injekt/api/InjektModule;Luy/kohesive/injekt/api/InjektRegistrar;)V Luy/kohesive/injekt/api/InjektRegistrar; Luy/kohesive/injekt/api/InjektRegistrar$DefaultImpls; HSPLuy/kohesive/injekt/api/InjektRegistrar$DefaultImpls;->importModule(Luy/kohesive/injekt/api/InjektRegistrar;Luy/kohesive/injekt/api/InjektModule;)V PLuy/kohesive/injekt/api/InjektRegistrar$DefaultImpls;->importModule(Luy/kohesive/injekt/api/InjektRegistrar;Luy/kohesive/injekt/api/InjektModule;)V Luy/kohesive/injekt/api/InjektRegistry; Luy/kohesive/injekt/api/InjektScope; HSPLuy/kohesive/injekt/api/InjektScope;->(Luy/kohesive/injekt/api/InjektRegistrar;)V PLuy/kohesive/injekt/api/InjektScope;->(Luy/kohesive/injekt/api/InjektRegistrar;)V HSPLuy/kohesive/injekt/api/InjektScope;->getInstance(Ljava/lang/reflect/Type;)Ljava/lang/Object; PLuy/kohesive/injekt/api/InjektScope;->getInstance(Ljava/lang/reflect/Type;)Ljava/lang/Object; HSPLuy/kohesive/injekt/api/InjektScope;->importModule(Luy/kohesive/injekt/api/InjektModule;)V PLuy/kohesive/injekt/api/InjektScope;->importModule(Luy/kohesive/injekt/api/InjektModule;)V Luy/kohesive/injekt/api/TypeReference; Luy/kohesive/injekt/registry/default/DefaultRegistrar; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->()V PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->()V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->access$getExistingValues$p(Luy/kohesive/injekt/registry/default/DefaultRegistrar;)Ljava/util/concurrent/ConcurrentHashMap; PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->access$getExistingValues$p(Luy/kohesive/injekt/registry/default/DefaultRegistrar;)Ljava/util/concurrent/ConcurrentHashMap; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->access$getNOKEY$p(Luy/kohesive/injekt/registry/default/DefaultRegistrar;)Luy/kohesive/injekt/registry/default/DefaultRegistrar$NOKEY$1; PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->access$getNOKEY$p(Luy/kohesive/injekt/registry/default/DefaultRegistrar;)Luy/kohesive/injekt/registry/default/DefaultRegistrar$NOKEY$1; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->addFactory(Luy/kohesive/injekt/api/TypeReference;Lkotlin/jvm/functions/Function0;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->addFactory(Luy/kohesive/injekt/api/TypeReference;Lkotlin/jvm/functions/Function0;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->addSingleton(Luy/kohesive/injekt/api/TypeReference;Ljava/lang/Object;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->addSingleton(Luy/kohesive/injekt/api/TypeReference;Ljava/lang/Object;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->addSingletonFactory(Luy/kohesive/injekt/api/TypeReference;Lkotlin/jvm/functions/Function0;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->addSingletonFactory(Luy/kohesive/injekt/api/TypeReference;Lkotlin/jvm/functions/Function0;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->getInstance(Ljava/lang/reflect/Type;)Ljava/lang/Object; HPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->getInstance(Ljava/lang/reflect/Type;)Ljava/lang/Object; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar;->importModule(Luy/kohesive/injekt/api/InjektModule;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar;->importModule(Luy/kohesive/injekt/api/InjektModule;)V Luy/kohesive/injekt/registry/default/DefaultRegistrar$Instance; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$Instance;->(Ljava/lang/reflect/Type;Ljava/lang/Object;)V HPLuy/kohesive/injekt/registry/default/DefaultRegistrar$Instance;->(Ljava/lang/reflect/Type;Ljava/lang/Object;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$Instance;->equals(Ljava/lang/Object;)Z HPLuy/kohesive/injekt/registry/default/DefaultRegistrar$Instance;->equals(Ljava/lang/Object;)Z HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$Instance;->hashCode()I HPLuy/kohesive/injekt/registry/default/DefaultRegistrar$Instance;->hashCode()I Luy/kohesive/injekt/registry/default/DefaultRegistrar$NOKEY$1; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$NOKEY$1;->()V PLuy/kohesive/injekt/registry/default/DefaultRegistrar$NOKEY$1;->()V Luy/kohesive/injekt/registry/default/DefaultRegistrar$addSingleton$1; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingleton$1;->(Ljava/lang/Object;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingleton$1;->(Ljava/lang/Object;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingleton$1;->invoke()Ljava/lang/Object; PLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingleton$1;->invoke()Ljava/lang/Object; Luy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1;->(Luy/kohesive/injekt/registry/default/DefaultRegistrar;Luy/kohesive/injekt/api/TypeReference;Lkotlin/jvm/functions/Function0;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1;->(Luy/kohesive/injekt/registry/default/DefaultRegistrar;Luy/kohesive/injekt/api/TypeReference;Lkotlin/jvm/functions/Function0;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1;->invoke()Ljava/lang/Object; HPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1;->invoke()Ljava/lang/Object; Luy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1$$special$$inlined$getOrPut$lambda$1; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1$$special$$inlined$getOrPut$lambda$1;->(Luy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1;)V PLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1$$special$$inlined$getOrPut$lambda$1;->(Luy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1;)V HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1$$special$$inlined$getOrPut$lambda$1;->invoke()Ljava/lang/Object; PLuy/kohesive/injekt/registry/default/DefaultRegistrar$addSingletonFactory$1$$special$$inlined$getOrPut$lambda$1;->invoke()Ljava/lang/Object; Luy/kohesive/injekt/registry/default/DefaultRegistrar$threadedValues$1; HSPLuy/kohesive/injekt/registry/default/DefaultRegistrar$threadedValues$1;->()V PLuy/kohesive/injekt/registry/default/DefaultRegistrar$threadedValues$1;->()V ================================================ FILE: app/src/main/java/aniyomi/util/DataSaver.kt ================================================ package aniyomi.util import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences.DataSaver.BANDWIDTH_HERO import eu.kanade.domain.source.service.SourcePreferences.DataSaver.NONE import eu.kanade.domain.source.service.SourcePreferences.DataSaver.RESMUSH_IT import eu.kanade.domain.source.service.SourcePreferences.DataSaver.WSRV_NL import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource import okhttp3.OkHttpClient import okhttp3.Response import tachiyomi.core.common.preference.Preference import uy.kohesive.injekt.injectLazy import java.net.URLEncoder interface DataSaver { fun compress(imageUrl: String): String companion object { val NoOp = object : DataSaver { override fun compress(imageUrl: String): String { return imageUrl } } suspend fun HttpSource.getImage(page: Page, dataSaver: DataSaver): Response { val imageUrl = page.imageUrl ?: return getImage(page) page.imageUrl = dataSaver.compress(imageUrl) return try { getImage(page) } finally { page.imageUrl = imageUrl } } } } fun DataSaver(source: MangaSource, preferences: SourcePreferences): DataSaver { val dataSaver = preferences.dataSaver().get() if (dataSaver != NONE && source.id.toString() in preferences.dataSaverExcludedSources().get()) { return DataSaver.NoOp } return when (dataSaver) { NONE -> DataSaver.NoOp BANDWIDTH_HERO -> BandwidthHeroDataSaver(preferences) WSRV_NL -> WsrvNlDataSaver(preferences) RESMUSH_IT -> ReSmushItDataSaver(preferences) } } private class BandwidthHeroDataSaver(preferences: SourcePreferences) : DataSaver { private val dataSavedServer = preferences.dataSaverServer().get().trimEnd('/') private val ignoreJpg = preferences.dataSaverIgnoreJpeg().get() private val ignoreGif = preferences.dataSaverIgnoreGif().get() private val format = preferences.dataSaverImageFormatJpeg().toIntRepresentation() private val quality = preferences.dataSaverImageQuality().get() private val colorBW = preferences.dataSaverColorBW().toIntRepresentation() override fun compress(imageUrl: String): String { return if (dataSavedServer.isNotBlank() && !imageUrl.contains(dataSavedServer)) { when { imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) { imageUrl } else { getUrl( imageUrl, ) } imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl) else -> getUrl(imageUrl) } } else { imageUrl } } private fun getUrl(imageUrl: String): String { val escapedUrl = URLEncoder.encode(imageUrl, "utf-8") // Network Request sent for the Bandwidth Hero Proxy server return "$dataSavedServer/?jpg=$format&l=$quality&bw=$colorBW&url=$escapedUrl" } private fun Preference.toIntRepresentation() = if (get()) "1" else "0" } private class WsrvNlDataSaver(preferences: SourcePreferences) : DataSaver { private val ignoreJpg = preferences.dataSaverIgnoreJpeg().get() private val ignoreGif = preferences.dataSaverIgnoreGif().get() private val format = preferences.dataSaverImageFormatJpeg().get() private val quality = preferences.dataSaverImageQuality().get() override fun compress(imageUrl: String): String { return when { imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) { imageUrl } else { getUrl( imageUrl, ) } imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl) else -> getUrl(imageUrl) } } private fun getUrl(imageUrl: String): String { // Network Request sent to wsrv return "https://wsrv.nl/?url=$imageUrl" + if (imageUrl.contains(".webp", true) || imageUrl.contains( ".gif", true, ) ) { if (!format) { // Preserve output image extension for animated images(.webp and .gif) "&q=$quality&n=-1" } else { // Do not preserve output Extension if User asked to convert into Jpeg "&output=jpg&q=$quality&n=-1" } } else { if (format) { "&output=jpg&q=$quality" } else { "&output=webp&q=$quality" } } } } private class ReSmushItDataSaver(preferences: SourcePreferences) : DataSaver { private val network: NetworkHelper by injectLazy() private val client: OkHttpClient get() = network.client private val ignoreJpg = preferences.dataSaverIgnoreJpeg().get() private val ignoreGif = preferences.dataSaverIgnoreGif().get() private val quality = preferences.dataSaverImageQuality().get() override fun compress(imageUrl: String): String { return when { imageUrl.contains(".jpeg", true) || imageUrl.contains(".jpg", true) -> if (ignoreJpg) { imageUrl } else { getUrl( imageUrl, ) } imageUrl.contains(".gif", true) -> if (ignoreGif) imageUrl else getUrl(imageUrl) else -> getUrl(imageUrl) } } private fun getUrl(imageUrl: String): String { // Network Request sent to resmush return client.newCall(GET("http://api.resmush.it/ws.php?img=$imageUrl&qlty=$quality")).execute() .body.string().substringAfter("\"dest\":\"").substringBefore("\",") } } ================================================ FILE: app/src/main/java/eu/kanade/core/preference/CheckboxState.kt ================================================ package eu.kanade.core.preference import androidx.compose.ui.state.ToggleableState import tachiyomi.core.common.preference.CheckboxState fun CheckboxState.TriState.asToggleableState(): ToggleableState = when (this) { is CheckboxState.TriState.Exclude -> ToggleableState.Indeterminate is CheckboxState.TriState.Include -> ToggleableState.On is CheckboxState.TriState.None -> ToggleableState.Off } ================================================ FILE: app/src/main/java/eu/kanade/core/preference/PreferenceMutableState.kt ================================================ package eu.kanade.core.preference import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import tachiyomi.core.common.preference.Preference class PreferenceMutableState( private val preference: Preference, scope: CoroutineScope, ) : MutableState { private val state = mutableStateOf(preference.get()) init { preference.changes() .onEach { state.value = it } .launchIn(scope) } override var value: T get() = state.value set(value) { preference.set(value) } override fun component1(): T { return state.value } override fun component2(): (T) -> Unit { return preference::set } } fun Preference.asState(scope: CoroutineScope) = PreferenceMutableState(this, scope) ================================================ FILE: app/src/main/java/eu/kanade/core/util/AnimeSourceUtil.kt ================================================ package eu.kanade.core.util import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun ifAnimeSourcesLoaded(): Boolean { return remember { Injekt.get().isInitialized }.collectAsState().value } ================================================ FILE: app/src/main/java/eu/kanade/core/util/CollectionUtils.kt ================================================ package eu.kanade.core.util import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastForEach import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract fun List.insertSeparators( generator: (before: T?, after: T?) -> R?, ): List { if (isEmpty()) return emptyList() val newList = mutableListOf() for (i in -1..lastIndex) { val before = getOrNull(i) before?.let(newList::add) val after = getOrNull(i + 1) val separator = generator.invoke(before, after) separator?.let(newList::add) } return newList } /** * Similar to [eu.kanade.core.util.insertSeparators] but iterates from last to first element */ fun List.insertSeparatorsReversed( generator: (before: T?, after: T?) -> R?, ): List { if (isEmpty()) return emptyList() val newList = mutableListOf() for (i in size downTo 0) { val after = getOrNull(i) after?.let(newList::add) val before = getOrNull(i - 1) val separator = generator.invoke(before, after) separator?.let(newList::add) } return newList.asReversed() } fun HashSet.addOrRemove(value: E, shouldAdd: Boolean) { if (shouldAdd) { add(value) } else { remove(value) } } /** * Returns a list containing all elements not matching the given [predicate]. * * **Do not use for collections that come from public APIs**, since they may not support random * access in an efficient way, and this method may actually be a lot slower. Only use for * collections that are created by code we control and are known to support random access. */ @OptIn(ExperimentalContracts::class) inline fun List.fastFilterNot(predicate: (T) -> Boolean): List { contract { callsInPlace(predicate) } return fastFilter { !predicate(it) } } /** * Splits the original collection into pair of lists, * where *first* list contains elements for which [predicate] yielded `true`, * while *second* list contains elements for which [predicate] yielded `false`. * * **Do not use for collections that come from public APIs**, since they may not support random * access in an efficient way, and this method may actually be a lot slower. Only use for * collections that are created by code we control and are known to support random access. */ @OptIn(ExperimentalContracts::class) inline fun List.fastPartition(predicate: (T) -> Boolean): Pair, List> { contract { callsInPlace(predicate) } val first = ArrayList() val second = ArrayList() fastForEach { if (predicate(it)) { first.add(it) } else { second.add(it) } } return Pair(first, second) } /** * Returns the number of entries not matching the given [predicate]. * * **Do not use for collections that come from public APIs**, since they may not support random * access in an efficient way, and this method may actually be a lot slower. Only use for * collections that are created by code we control and are known to support random access. */ @OptIn(ExperimentalContracts::class) inline fun List.fastCountNot(predicate: (T) -> Boolean): Int { contract { callsInPlace(predicate) } var count = size fastForEach { if (predicate(it)) --count } return count } ================================================ FILE: app/src/main/java/eu/kanade/core/util/MangaSourceUtil.kt ================================================ package eu.kanade.core.util import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun ifMangaSourcesLoaded(): Boolean { return remember { Injekt.get().isInitialized }.collectAsState().value } ================================================ FILE: app/src/main/java/eu/kanade/core/util/RxJavaExtensions.kt ================================================ package eu.kanade.core.util import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import rx.Observable import rx.Observer fun Observable.asFlow(): Flow = callbackFlow { val observer = object : Observer { override fun onNext(t: T) { trySend(t) } override fun onError(e: Throwable) { close(e) } override fun onCompleted() { close() } } val subscription = subscribe(observer) awaitClose { subscription.unsubscribe() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/DomainModule.kt ================================================ package eu.kanade.domain import eu.kanade.domain.download.anime.interactor.DeleteEpisodeDownload import eu.kanade.domain.download.manga.interactor.DeleteChapterDownload import eu.kanade.domain.entries.anime.interactor.SetAnimeViewerFlags import eu.kanade.domain.entries.anime.interactor.SyncSeasonsWithSource import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.manga.interactor.GetExcludedScanlators import eu.kanade.domain.entries.manga.interactor.SetExcludedScanlators import eu.kanade.domain.entries.manga.interactor.SetMangaViewerFlags import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.extension.anime.interactor.GetAnimeExtensionLanguages import eu.kanade.domain.extension.anime.interactor.GetAnimeExtensionSources import eu.kanade.domain.extension.anime.interactor.GetAnimeExtensionsByType import eu.kanade.domain.extension.anime.interactor.TrustAnimeExtension import eu.kanade.domain.extension.manga.interactor.GetExtensionSources import eu.kanade.domain.extension.manga.interactor.GetMangaExtensionLanguages import eu.kanade.domain.extension.manga.interactor.GetMangaExtensionsByType import eu.kanade.domain.extension.manga.interactor.TrustMangaExtension import eu.kanade.domain.items.chapter.interactor.GetAvailableScanlators import eu.kanade.domain.items.chapter.interactor.SetReadStatus import eu.kanade.domain.items.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.items.episode.interactor.SetSeenStatus import eu.kanade.domain.items.episode.interactor.SyncEpisodesWithSource import eu.kanade.domain.source.anime.interactor.GetAnimeIncognitoState import eu.kanade.domain.source.anime.interactor.GetAnimeSourcesWithFavoriteCount import eu.kanade.domain.source.anime.interactor.GetEnabledAnimeSources import eu.kanade.domain.source.anime.interactor.GetLanguagesWithAnimeSources import eu.kanade.domain.source.anime.interactor.ToggleAnimeIncognito import eu.kanade.domain.source.anime.interactor.ToggleAnimeSource import eu.kanade.domain.source.anime.interactor.ToggleAnimeSourcePin import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.domain.source.interactor.ToggleLanguage import eu.kanade.domain.source.manga.interactor.GetEnabledMangaSources import eu.kanade.domain.source.manga.interactor.GetLanguagesWithMangaSources import eu.kanade.domain.source.manga.interactor.GetMangaIncognitoState import eu.kanade.domain.source.manga.interactor.GetMangaSourcesWithFavoriteCount import eu.kanade.domain.source.manga.interactor.ToggleMangaIncognito import eu.kanade.domain.source.manga.interactor.ToggleMangaSource import eu.kanade.domain.source.manga.interactor.ToggleMangaSourcePin import eu.kanade.domain.track.anime.interactor.AddAnimeTracks import eu.kanade.domain.track.anime.interactor.RefreshAnimeTracks import eu.kanade.domain.track.anime.interactor.SyncEpisodeProgressWithTrack import eu.kanade.domain.track.anime.interactor.TrackEpisode import eu.kanade.domain.track.manga.interactor.AddMangaTracks import eu.kanade.domain.track.manga.interactor.RefreshMangaTracks import eu.kanade.domain.track.manga.interactor.SyncChapterProgressWithTrack import eu.kanade.domain.track.manga.interactor.TrackChapter import eu.kanade.tachiyomi.ui.player.utils.TrackSelect import mihon.data.repository.anime.AnimeExtensionRepoRepositoryImpl import mihon.data.repository.manga.MangaExtensionRepoRepositoryImpl import mihon.domain.extensionrepo.anime.interactor.CreateAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.DeleteAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepoCount import mihon.domain.extensionrepo.anime.interactor.ReplaceAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.UpdateAnimeExtensionRepo import mihon.domain.extensionrepo.anime.repository.AnimeExtensionRepoRepository import mihon.domain.extensionrepo.manga.interactor.CreateMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.DeleteMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepoCount import mihon.domain.extensionrepo.manga.interactor.ReplaceMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.UpdateMangaExtensionRepo import mihon.domain.extensionrepo.manga.repository.MangaExtensionRepoRepository import mihon.domain.extensionrepo.service.ExtensionRepoService import mihon.domain.items.chapter.interactor.FilterChaptersForDownload import mihon.domain.items.episode.interactor.FilterEpisodesForDownload import mihon.domain.upcoming.anime.interactor.GetUpcomingAnime import mihon.domain.upcoming.manga.interactor.GetUpcomingManga import tachiyomi.data.category.anime.AnimeCategoryRepositoryImpl import tachiyomi.data.category.manga.MangaCategoryRepositoryImpl import tachiyomi.data.custombutton.CustomButtonRepositoryImpl import tachiyomi.data.entries.anime.AnimeRepositoryImpl import tachiyomi.data.entries.manga.MangaRepositoryImpl import tachiyomi.data.history.anime.AnimeHistoryRepositoryImpl import tachiyomi.data.history.manga.MangaHistoryRepositoryImpl import tachiyomi.data.items.chapter.ChapterRepositoryImpl import tachiyomi.data.items.episode.EpisodeRepositoryImpl import tachiyomi.data.release.ReleaseServiceImpl import tachiyomi.data.source.anime.AnimeSourceRepositoryImpl import tachiyomi.data.source.anime.AnimeStubSourceRepositoryImpl import tachiyomi.data.source.manga.MangaSourceRepositoryImpl import tachiyomi.data.source.manga.MangaStubSourceRepositoryImpl import tachiyomi.data.track.anime.AnimeTrackRepositoryImpl import tachiyomi.data.track.manga.MangaTrackRepositoryImpl import tachiyomi.data.updates.anime.AnimeUpdatesRepositoryImpl import tachiyomi.data.updates.manga.MangaUpdatesRepositoryImpl import tachiyomi.domain.category.anime.interactor.CreateAnimeCategoryWithName import tachiyomi.domain.category.anime.interactor.DeleteAnimeCategory import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.anime.interactor.GetVisibleAnimeCategories import tachiyomi.domain.category.anime.interactor.HideAnimeCategory import tachiyomi.domain.category.anime.interactor.RenameAnimeCategory import tachiyomi.domain.category.anime.interactor.ReorderAnimeCategory import tachiyomi.domain.category.anime.interactor.ResetAnimeCategoryFlags import tachiyomi.domain.category.anime.interactor.SetAnimeCategories import tachiyomi.domain.category.anime.interactor.SetAnimeDisplayMode import tachiyomi.domain.category.anime.interactor.SetSortModeForAnimeCategory import tachiyomi.domain.category.anime.interactor.UpdateAnimeCategory import tachiyomi.domain.category.anime.repository.AnimeCategoryRepository import tachiyomi.domain.category.manga.interactor.CreateMangaCategoryWithName import tachiyomi.domain.category.manga.interactor.DeleteMangaCategory import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.GetVisibleMangaCategories import tachiyomi.domain.category.manga.interactor.HideMangaCategory import tachiyomi.domain.category.manga.interactor.RenameMangaCategory import tachiyomi.domain.category.manga.interactor.ReorderMangaCategory import tachiyomi.domain.category.manga.interactor.ResetMangaCategoryFlags import tachiyomi.domain.category.manga.interactor.SetMangaCategories import tachiyomi.domain.category.manga.interactor.SetMangaDisplayMode import tachiyomi.domain.category.manga.interactor.SetSortModeForMangaCategory import tachiyomi.domain.category.manga.interactor.UpdateMangaCategory import tachiyomi.domain.category.manga.repository.MangaCategoryRepository import tachiyomi.domain.custombuttons.interactor.CreateCustomButton import tachiyomi.domain.custombuttons.interactor.DeleteCustomButton import tachiyomi.domain.custombuttons.interactor.GetCustomButtons import tachiyomi.domain.custombuttons.interactor.ReorderCustomButton import tachiyomi.domain.custombuttons.interactor.ToggleFavoriteCustomButton import tachiyomi.domain.custombuttons.interactor.UpdateCustomButton import tachiyomi.domain.custombuttons.repository.CustomButtonRepository import tachiyomi.domain.entries.anime.interactor.AnimeFetchInterval import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.interactor.GetAnimeByUrlAndSourceId import tachiyomi.domain.entries.anime.interactor.GetAnimeFavorites import tachiyomi.domain.entries.anime.interactor.GetAnimeWithEpisodesAndSeasons import tachiyomi.domain.entries.anime.interactor.GetDuplicateLibraryAnime import tachiyomi.domain.entries.anime.interactor.GetLibraryAnime import tachiyomi.domain.entries.anime.interactor.NetworkToLocalAnime import tachiyomi.domain.entries.anime.interactor.ResetAnimeViewerFlags import tachiyomi.domain.entries.anime.interactor.SetAnimeEpisodeFlags import tachiyomi.domain.entries.anime.interactor.SetAnimeSeasonFlags import tachiyomi.domain.entries.anime.repository.AnimeRepository import tachiyomi.domain.entries.manga.interactor.GetDuplicateLibraryManga import tachiyomi.domain.entries.manga.interactor.GetLibraryManga import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.interactor.GetMangaByUrlAndSourceId import tachiyomi.domain.entries.manga.interactor.GetMangaFavorites import tachiyomi.domain.entries.manga.interactor.GetMangaWithChapters import tachiyomi.domain.entries.manga.interactor.MangaFetchInterval import tachiyomi.domain.entries.manga.interactor.NetworkToLocalManga import tachiyomi.domain.entries.manga.interactor.ResetMangaViewerFlags import tachiyomi.domain.entries.manga.interactor.SetMangaChapterFlags import tachiyomi.domain.entries.manga.repository.MangaRepository import tachiyomi.domain.history.anime.interactor.GetAnimeHistory import tachiyomi.domain.history.anime.interactor.GetNextEpisodes import tachiyomi.domain.history.anime.interactor.RemoveAnimeHistory import tachiyomi.domain.history.anime.interactor.UpsertAnimeHistory import tachiyomi.domain.history.anime.repository.AnimeHistoryRepository import tachiyomi.domain.history.manga.interactor.GetMangaHistory import tachiyomi.domain.history.manga.interactor.GetNextChapters import tachiyomi.domain.history.manga.interactor.GetTotalReadDuration import tachiyomi.domain.history.manga.interactor.RemoveMangaHistory import tachiyomi.domain.history.manga.interactor.UpsertMangaHistory import tachiyomi.domain.history.manga.repository.MangaHistoryRepository import tachiyomi.domain.items.chapter.interactor.GetChapter import tachiyomi.domain.items.chapter.interactor.GetChapterByUrlAndMangaId import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.items.chapter.interactor.SetMangaDefaultChapterFlags import tachiyomi.domain.items.chapter.interactor.ShouldUpdateDbChapter import tachiyomi.domain.items.chapter.interactor.UpdateChapter import tachiyomi.domain.items.chapter.repository.ChapterRepository import tachiyomi.domain.items.episode.interactor.GetEpisode import tachiyomi.domain.items.episode.interactor.GetEpisodeByUrlAndAnimeId import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.SetAnimeDefaultEpisodeFlags import tachiyomi.domain.items.episode.interactor.ShouldUpdateDbEpisode import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.repository.EpisodeRepository import tachiyomi.domain.items.season.interactor.GetAnimeSeasonsByParentId import tachiyomi.domain.items.season.interactor.SetAnimeDefaultSeasonFlags import tachiyomi.domain.items.season.interactor.ShouldUpdateDbSeason import tachiyomi.domain.release.interactor.GetApplicationRelease import tachiyomi.domain.release.service.ReleaseService import tachiyomi.domain.source.anime.interactor.GetAnimeSourcesWithNonLibraryAnime import tachiyomi.domain.source.anime.interactor.GetRemoteAnime import tachiyomi.domain.source.anime.repository.AnimeSourceRepository import tachiyomi.domain.source.anime.repository.AnimeStubSourceRepository import tachiyomi.domain.source.manga.interactor.GetMangaSourcesWithNonLibraryManga import tachiyomi.domain.source.manga.interactor.GetRemoteManga import tachiyomi.domain.source.manga.repository.MangaSourceRepository import tachiyomi.domain.source.manga.repository.MangaStubSourceRepository import tachiyomi.domain.track.anime.interactor.DeleteAnimeTrack import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.interactor.GetTracksPerAnime import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import tachiyomi.domain.track.anime.repository.AnimeTrackRepository import tachiyomi.domain.track.manga.interactor.DeleteMangaTrack import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.domain.track.manga.interactor.GetTracksPerManga import tachiyomi.domain.track.manga.interactor.InsertMangaTrack import tachiyomi.domain.track.manga.repository.MangaTrackRepository import tachiyomi.domain.updates.anime.interactor.GetAnimeUpdates import tachiyomi.domain.updates.anime.repository.AnimeUpdatesRepository import tachiyomi.domain.updates.manga.interactor.GetMangaUpdates import tachiyomi.domain.updates.manga.repository.MangaUpdatesRepository import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.addFactory import uy.kohesive.injekt.api.addSingletonFactory import uy.kohesive.injekt.api.get class DomainModule : InjektModule { override fun InjektRegistrar.registerInjectables() { addSingletonFactory { AnimeCategoryRepositoryImpl(get()) } addFactory { GetAnimeCategories(get()) } addFactory { GetVisibleAnimeCategories(get()) } addFactory { ResetAnimeCategoryFlags(get(), get()) } addFactory { SetAnimeDisplayMode(get()) } addFactory { SetSortModeForAnimeCategory(get(), get()) } addFactory { CreateAnimeCategoryWithName(get(), get()) } addFactory { RenameAnimeCategory(get()) } addFactory { ReorderAnimeCategory(get()) } addFactory { UpdateAnimeCategory(get()) } addFactory { HideAnimeCategory(get()) } addFactory { DeleteAnimeCategory(get(), get(), get()) } addSingletonFactory { MangaCategoryRepositoryImpl(get()) } addFactory { GetMangaCategories(get()) } addFactory { GetVisibleMangaCategories(get()) } addFactory { ResetMangaCategoryFlags(get(), get()) } addFactory { SetMangaDisplayMode(get()) } addFactory { SetSortModeForMangaCategory(get(), get()) } addFactory { CreateMangaCategoryWithName(get(), get()) } addFactory { RenameMangaCategory(get()) } addFactory { ReorderMangaCategory(get()) } addFactory { UpdateMangaCategory(get()) } addFactory { HideMangaCategory(get()) } addFactory { DeleteMangaCategory(get(), get(), get()) } addSingletonFactory { AnimeRepositoryImpl(get()) } addFactory { GetDuplicateLibraryAnime(get()) } addFactory { GetAnimeFavorites(get()) } addFactory { GetLibraryAnime(get()) } addFactory { GetAnimeWithEpisodesAndSeasons(get(), get()) } addFactory { GetAnimeByUrlAndSourceId(get()) } addFactory { GetAnime(get()) } addFactory { GetAnimeSeasonsByParentId(get()) } addFactory { GetNextEpisodes(get(), get(), get()) } addFactory { GetUpcomingAnime(get()) } addFactory { ResetAnimeViewerFlags(get()) } addFactory { SetAnimeEpisodeFlags(get()) } addFactory { SetAnimeSeasonFlags(get()) } addFactory { AnimeFetchInterval(get()) } addFactory { SetAnimeDefaultEpisodeFlags(get(), get(), get()) } addFactory { SetAnimeDefaultSeasonFlags(get(), get(), get()) } addFactory { SetAnimeViewerFlags(get()) } addFactory { NetworkToLocalAnime(get(), get()) } addFactory { UpdateAnime(get(), get()) } addFactory { SetAnimeCategories(get()) } addFactory { ShouldUpdateDbSeason() } addFactory { SyncSeasonsWithSource(get(), get(), get(), get(), get()) } addSingletonFactory { MangaRepositoryImpl(get()) } addFactory { GetDuplicateLibraryManga(get()) } addFactory { GetMangaFavorites(get()) } addFactory { GetLibraryManga(get()) } addFactory { GetMangaWithChapters(get(), get()) } addFactory { GetMangaByUrlAndSourceId(get()) } addFactory { GetManga(get()) } addFactory { GetNextChapters(get(), get(), get()) } addFactory { GetUpcomingManga(get()) } addFactory { ResetMangaViewerFlags(get()) } addFactory { SetMangaChapterFlags(get()) } addFactory { MangaFetchInterval(get()) } addFactory { SetMangaDefaultChapterFlags( get(), get(), get(), ) } addFactory { SetMangaViewerFlags(get()) } addFactory { NetworkToLocalManga(get()) } addFactory { UpdateManga(get(), get()) } addFactory { SetMangaCategories(get()) } addFactory { GetExcludedScanlators(get()) } addFactory { SetExcludedScanlators(get()) } addSingletonFactory { ReleaseServiceImpl(get(), get()) } addFactory { GetApplicationRelease(get(), get()) } addSingletonFactory { AnimeTrackRepositoryImpl(get()) } addFactory { TrackEpisode(get(), get(), get(), get()) } addFactory { AddAnimeTracks(get(), get(), get(), get()) } addFactory { RefreshAnimeTracks(get(), get(), get(), get()) } addFactory { DeleteAnimeTrack(get()) } addFactory { GetTracksPerAnime(get()) } addFactory { GetAnimeTracks(get()) } addFactory { InsertAnimeTrack(get()) } addFactory { SyncEpisodeProgressWithTrack(get(), get(), get()) } addSingletonFactory { MangaTrackRepositoryImpl(get()) } addFactory { TrackChapter(get(), get(), get(), get()) } addFactory { AddMangaTracks(get(), get(), get(), get()) } addFactory { RefreshMangaTracks(get(), get(), get(), get()) } addFactory { DeleteMangaTrack(get()) } addFactory { GetTracksPerManga(get()) } addFactory { GetMangaTracks(get()) } addFactory { InsertMangaTrack(get()) } addFactory { SyncChapterProgressWithTrack(get(), get(), get()) } addSingletonFactory { EpisodeRepositoryImpl(get()) } addFactory { GetEpisode(get()) } addFactory { GetEpisodesByAnimeId(get()) } addFactory { GetEpisodeByUrlAndAnimeId(get()) } addFactory { UpdateEpisode(get()) } addFactory { SetSeenStatus(get(), get(), get(), get()) } addFactory { ShouldUpdateDbEpisode() } addFactory { SyncEpisodesWithSource(get(), get(), get(), get(), get(), get(), get(), get()) } addFactory { FilterEpisodesForDownload(get(), get(), get()) } addSingletonFactory { ChapterRepositoryImpl(get()) } addFactory { GetChapter(get()) } addFactory { GetChaptersByMangaId(get()) } addFactory { GetChapterByUrlAndMangaId(get()) } addFactory { UpdateChapter(get()) } addFactory { SetReadStatus(get(), get(), get(), get()) } addFactory { ShouldUpdateDbChapter() } addFactory { SyncChaptersWithSource(get(), get(), get(), get(), get(), get(), get(), get(), get()) } addFactory { GetAvailableScanlators(get()) } addFactory { FilterChaptersForDownload(get(), get(), get()) } addSingletonFactory { AnimeHistoryRepositoryImpl(get()) } addFactory { GetAnimeHistory(get()) } addFactory { UpsertAnimeHistory(get()) } addFactory { RemoveAnimeHistory(get()) } addFactory { DeleteEpisodeDownload(get(), get()) } addFactory { GetAnimeExtensionsByType(get(), get()) } addFactory { GetAnimeExtensionSources(get()) } addFactory { GetAnimeExtensionLanguages(get(), get()) } addSingletonFactory { MangaHistoryRepositoryImpl(get()) } addFactory { GetMangaHistory(get()) } addFactory { UpsertMangaHistory(get()) } addFactory { RemoveMangaHistory(get()) } addFactory { GetTotalReadDuration(get()) } addFactory { DeleteChapterDownload(get(), get()) } addFactory { GetMangaExtensionsByType(get(), get()) } addFactory { GetExtensionSources(get()) } addFactory { GetMangaExtensionLanguages(get(), get()) } addSingletonFactory { AnimeUpdatesRepositoryImpl(get()) } addFactory { GetAnimeUpdates(get()) } addSingletonFactory { MangaUpdatesRepositoryImpl(get()) } addFactory { GetMangaUpdates(get()) } addSingletonFactory { AnimeSourceRepositoryImpl(get(), get()) } addSingletonFactory { AnimeStubSourceRepositoryImpl(get()) } addFactory { GetEnabledAnimeSources(get(), get()) } addFactory { GetLanguagesWithAnimeSources(get(), get()) } addFactory { GetRemoteAnime(get()) } addFactory { GetAnimeSourcesWithFavoriteCount(get(), get()) } addFactory { GetAnimeSourcesWithNonLibraryAnime(get()) } addFactory { ToggleAnimeSource(get()) } addFactory { ToggleAnimeSourcePin(get()) } addSingletonFactory { MangaSourceRepositoryImpl(get(), get()) } addSingletonFactory { MangaStubSourceRepositoryImpl(get()) } addFactory { GetEnabledMangaSources(get(), get()) } addFactory { GetLanguagesWithMangaSources(get(), get()) } addFactory { GetRemoteManga(get()) } addFactory { GetMangaSourcesWithFavoriteCount(get(), get()) } addFactory { GetMangaSourcesWithNonLibraryManga(get()) } addFactory { SetMigrateSorting(get()) } addFactory { ToggleLanguage(get()) } addFactory { ToggleMangaSource(get()) } addFactory { ToggleMangaSourcePin(get()) } addFactory { TrustAnimeExtension(get(), get()) } addFactory { TrustMangaExtension(get(), get()) } addFactory { ExtensionRepoService(get(), get()) } addSingletonFactory { AnimeExtensionRepoRepositoryImpl(get()) } addFactory { GetAnimeExtensionRepo(get()) } addFactory { GetAnimeExtensionRepoCount(get()) } addFactory { CreateAnimeExtensionRepo(get(), get()) } addFactory { DeleteAnimeExtensionRepo(get()) } addFactory { ReplaceAnimeExtensionRepo(get()) } addFactory { UpdateAnimeExtensionRepo(get(), get()) } addFactory { ToggleAnimeIncognito(get()) } addFactory { GetAnimeIncognitoState(get(), get(), get()) } addSingletonFactory { MangaExtensionRepoRepositoryImpl(get()) } addFactory { GetMangaExtensionRepo(get()) } addFactory { GetMangaExtensionRepoCount(get()) } addFactory { CreateMangaExtensionRepo(get(), get()) } addFactory { DeleteMangaExtensionRepo(get()) } addFactory { ReplaceMangaExtensionRepo(get()) } addFactory { UpdateMangaExtensionRepo(get(), get()) } addFactory { ToggleMangaIncognito(get()) } addFactory { GetMangaIncognitoState(get(), get(), get()) } addSingletonFactory { CustomButtonRepositoryImpl(get()) } addFactory { CreateCustomButton(get()) } addFactory { DeleteCustomButton(get()) } addFactory { GetCustomButtons(get()) } addFactory { UpdateCustomButton(get()) } addFactory { ReorderCustomButton(get()) } addFactory { ToggleFavoriteCustomButton(get()) } addFactory { TrackSelect(get(), get()) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/SYDomainModule.kt ================================================ package eu.kanade.domain import eu.kanade.domain.source.manga.interactor.ToggleExcludeFromMangaDataSaver import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.addFactory import uy.kohesive.injekt.api.get class SYDomainModule : InjektModule { override fun InjektRegistrar.registerInjectables() { addFactory { ToggleExcludeFromMangaDataSaver(get()) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/base/BasePreferences.kt ================================================ package eu.kanade.domain.base import android.content.Context import android.content.pm.PackageManager import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.util.system.GLUtil import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.i18n.MR class BasePreferences( val context: Context, private val preferenceStore: PreferenceStore, ) { fun downloadedOnly() = preferenceStore.getBoolean( Preference.appStateKey("pref_downloaded_only"), false, ) fun incognitoMode() = preferenceStore.getBoolean(Preference.appStateKey("incognito_mode"), false) fun extensionInstaller() = ExtensionInstallerPreference(context, preferenceStore) fun deviceHasPip() = context.packageManager.hasSystemFeature( PackageManager.FEATURE_PICTURE_IN_PICTURE, ) fun shownOnboardingFlow() = preferenceStore.getBoolean(Preference.appStateKey("onboarding_complete"), false) enum class ExtensionInstaller(val titleRes: StringResource, val requiresSystemPermission: Boolean) { LEGACY(MR.strings.ext_installer_legacy, true), PACKAGEINSTALLER(MR.strings.ext_installer_packageinstaller, true), SHIZUKU(MR.strings.ext_installer_shizuku, false), PRIVATE(MR.strings.ext_installer_private, false), } fun displayProfile() = preferenceStore.getString("pref_display_profile_key", "") fun hardwareBitmapThreshold() = preferenceStore.getInt("pref_hardware_bitmap_threshold", GLUtil.SAFE_TEXTURE_LIMIT) fun alwaysDecodeLongStripWithSSIV() = preferenceStore.getBoolean("pref_always_decode_long_strip_with_ssiv", false) } ================================================ FILE: app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt ================================================ package eu.kanade.domain.base import android.content.Context import eu.kanade.domain.base.BasePreferences.ExtensionInstaller import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller import eu.kanade.tachiyomi.util.system.isShizukuInstalled import kotlinx.coroutines.CoroutineScope import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.preference.getEnum class ExtensionInstallerPreference( private val context: Context, preferenceStore: PreferenceStore, ) : Preference { private val basePref = preferenceStore.getEnum(key(), defaultValue()) override fun key() = "extension_installer" val entries get() = ExtensionInstaller.entries.run { if (context.hasMiuiPackageInstaller) { filter { it != ExtensionInstaller.PACKAGEINSTALLER } } else { toList() } } override fun defaultValue() = if (context.hasMiuiPackageInstaller) { ExtensionInstaller.LEGACY } else { ExtensionInstaller.PACKAGEINSTALLER } private fun check(value: ExtensionInstaller): ExtensionInstaller { when (value) { ExtensionInstaller.PACKAGEINSTALLER -> { if (context.hasMiuiPackageInstaller) return ExtensionInstaller.LEGACY } ExtensionInstaller.SHIZUKU -> { if (!context.isShizukuInstalled) return defaultValue() } else -> {} } return value } override fun get(): ExtensionInstaller { val value = basePref.get() val checkedValue = check(value) if (value != checkedValue) { basePref.set(checkedValue) } return checkedValue } override fun set(value: ExtensionInstaller) { basePref.set(check(value)) } override fun isSet() = basePref.isSet() override fun delete() = basePref.delete() override fun changes() = basePref.changes() override fun stateIn(scope: CoroutineScope) = basePref.stateIn(scope) } ================================================ FILE: app/src/main/java/eu/kanade/domain/download/anime/interactor/DeleteEpisodeDownload.kt ================================================ package eu.kanade.domain.download.anime.interactor import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager class DeleteEpisodeDownload( private val sourceManager: AnimeSourceManager, private val downloadManager: AnimeDownloadManager, ) { suspend fun awaitAll(anime: Anime, vararg episodes: Episode) = withNonCancellableContext { sourceManager.get(anime.source)?.let { source -> downloadManager.deleteEpisodes(episodes.toList(), anime, source) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/download/manga/interactor/DeleteChapterDownload.kt ================================================ package eu.kanade.domain.download.manga.interactor import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.source.manga.service.MangaSourceManager class DeleteChapterDownload( private val sourceManager: MangaSourceManager, private val downloadManager: MangaDownloadManager, ) { suspend fun awaitAll(manga: Manga, vararg chapters: Chapter) = withNonCancellableContext { sourceManager.get(manga.source)?.let { source -> downloadManager.deleteChapters(chapters.toList(), manga, source) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/anime/interactor/SetAnimeViewerFlags.kt ================================================ package eu.kanade.domain.entries.anime.interactor import tachiyomi.core.common.util.lang.toLong import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeUpdate import tachiyomi.domain.entries.anime.repository.AnimeRepository import kotlin.math.pow class SetAnimeViewerFlags( private val animeRepository: AnimeRepository, ) { suspend fun awaitSetSkipIntroLength(id: Long, flag: Long) { val anime = animeRepository.getAnimeById(id) animeRepository.updateAnime( AnimeUpdate( id = id, viewerFlags = anime.viewerFlags .setFlag(flag, Anime.ANIME_INTRO_MASK) // Disable skip intro button if length is set to 0 .setFlag((flag == 0L).toLong().addHexZeros(14), Anime.ANIME_INTRO_DISABLE_MASK), ), ) } suspend fun awaitSetNextEpisodeAiring(id: Long, flags: Pair) { awaitSetNextEpisodeToAir(id, flags.first.toLong().addHexZeros(zeros = 2)) awaitSetNextEpisodeAiringAt(id, flags.second.addHexZeros(zeros = 6)) } private suspend fun awaitSetNextEpisodeToAir(id: Long, flag: Long) { val anime = animeRepository.getAnimeById(id) animeRepository.updateAnime( AnimeUpdate( id = id, viewerFlags = anime.viewerFlags.setFlag(flag, Anime.ANIME_AIRING_EPISODE_MASK), ), ) } private suspend fun awaitSetNextEpisodeAiringAt(id: Long, flag: Long) { val anime = animeRepository.getAnimeById(id) animeRepository.updateAnime( AnimeUpdate( id = id, viewerFlags = anime.viewerFlags.setFlag(flag, Anime.ANIME_AIRING_TIME_MASK), ), ) } private fun Long.setFlag(flag: Long, mask: Long): Long { return this and mask.inv() or (flag and mask) } private fun Long.addHexZeros(zeros: Int): Long { val hex = 16.0 return this.times(hex.pow(zeros)).toLong() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/anime/interactor/SyncSeasonsWithSource.kt ================================================ package eu.kanade.domain.entries.anime.interactor import eu.kanade.domain.entries.anime.model.toDomainAnime import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.SAnime import tachiyomi.domain.entries.anime.interactor.NetworkToLocalAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.NoSeasonsException import tachiyomi.domain.entries.anime.model.toAnimeUpdate import tachiyomi.domain.entries.anime.repository.AnimeRepository import tachiyomi.domain.items.season.interactor.GetAnimeSeasonsByParentId import tachiyomi.domain.items.season.interactor.ShouldUpdateDbSeason import tachiyomi.domain.items.season.service.SeasonRecognition import tachiyomi.source.local.entries.anime.isLocal import java.time.ZonedDateTime class SyncSeasonsWithSource( private val updateAnime: UpdateAnime, private val animeRepository: AnimeRepository, private val networkToLocalAnime: NetworkToLocalAnime, private val shouldUpdateDbSeason: ShouldUpdateDbSeason, private val getAnimeSeasonsByParentId: GetAnimeSeasonsByParentId, ) { suspend fun await( rawSourceSeasons: List, anime: Anime, source: AnimeSource, manualFetch: Boolean = false, fetchWindow: Pair = Pair(0, 0), ): List { if (rawSourceSeasons.isEmpty() && !source.isLocal()) { throw NoSeasonsException() } val now = ZonedDateTime.now() val sourceSeasons = rawSourceSeasons .distinctBy { it.url } .mapIndexed { i, sAnime -> networkToLocalAnime.await(sAnime.toDomainAnime(source.id)) .copy(parentId = anime.id, seasonSourceOrder = i.toLong()) } val dbSeasons = getAnimeSeasonsByParentId.await(anime.id) val newSeasons = mutableListOf() val updatedSeasons = mutableListOf() val removedSeasons = dbSeasons.filterNot { dbSeasons -> sourceSeasons.any { sourceSeason -> dbSeasons.anime.url == sourceSeason.url } } for (sourceSeason in sourceSeasons) { var season = sourceSeason // Recognize season number for the season val seasonNumber = SeasonRecognition.parseSeasonNumber( anime.title, season.title, season.seasonNumber, ) season = season.copy(seasonNumber = seasonNumber) val dbSeason = dbSeasons.find { it.anime.url == season.url }?.anime if (dbSeason == null) { newSeasons.add(season) } else { if (shouldUpdateDbSeason.await(dbSeason, season)) { val toChangeSeason = dbSeason.copy( title = season.title, seasonNumber = season.seasonNumber, seasonSourceOrder = season.seasonSourceOrder, ) updatedSeasons.add(toChangeSeason) } } } // Return if there's nothing to add, delete, or update to avoid unnecessary db transactions. if (newSeasons.isEmpty() && removedSeasons.isEmpty() && updatedSeasons.isEmpty()) { if (manualFetch || anime.fetchInterval == 0 || anime.nextUpdate < fetchWindow.first) { updateAnime.awaitUpdateFetchInterval( anime, now, fetchWindow, ) } return sourceSeasons } if (removedSeasons.isNotEmpty()) { val toDeleteIds = removedSeasons.map { it.id } animeRepository.removeParentIdByIds(toDeleteIds) } val toUpdate = newSeasons.map { it.toAnimeUpdate() } + updatedSeasons.map { it.toAnimeUpdate() } if (toUpdate.isNotEmpty()) { updateAnime.awaitAll(toUpdate) } updateAnime.awaitUpdateLastUpdate(anime.id) return sourceSeasons } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/anime/interactor/UpdateAnime.kt ================================================ package eu.kanade.domain.entries.anime.interactor import eu.kanade.domain.entries.anime.model.hasCustomBackground import eu.kanade.domain.entries.anime.model.hasCustomCover import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import tachiyomi.domain.entries.anime.interactor.AnimeFetchInterval import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeUpdate import tachiyomi.domain.entries.anime.repository.AnimeRepository import tachiyomi.source.local.entries.anime.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.ZonedDateTime class UpdateAnime( private val animeRepository: AnimeRepository, private val animeFetchInterval: AnimeFetchInterval, ) { suspend fun await(animeUpdate: AnimeUpdate): Boolean { return animeRepository.updateAnime(animeUpdate) } suspend fun awaitAll(animeUpdates: List): Boolean { return animeRepository.updateAllAnime(animeUpdates) } suspend fun awaitUpdateFromSource( localAnime: Anime, remoteAnime: SAnime, manualFetch: Boolean, coverCache: AnimeCoverCache = Injekt.get(), backgroundCache: AnimeBackgroundCache = Injekt.get(), ): Boolean { val remoteTitle = try { remoteAnime.title } catch (_: UninitializedPropertyAccessException) { "" } // if the anime isn't a favorite, set its title from source and update in db val title = if (remoteTitle.isEmpty() || localAnime.favorite) null else remoteTitle val coverLastModified = when { // Never refresh covers if the url is empty to avoid "losing" existing covers remoteAnime.thumbnail_url.isNullOrEmpty() -> null !manualFetch && localAnime.thumbnailUrl == remoteAnime.thumbnail_url -> null localAnime.isLocal() -> Instant.now().toEpochMilli() localAnime.hasCustomCover(coverCache) -> { coverCache.deleteFromCache(localAnime, false) null } else -> { coverCache.deleteFromCache(localAnime, false) Instant.now().toEpochMilli() } } val backgroundLastModified = when { // Never refresh backgrounds if the url is empty to avoid "losing" existing backgrounds remoteAnime.background_url.isNullOrEmpty() -> null !manualFetch && localAnime.backgroundUrl == remoteAnime.background_url -> null localAnime.isLocal() -> Instant.now().toEpochMilli() localAnime.hasCustomBackground(backgroundCache) -> { backgroundCache.deleteFromCache(localAnime, false) null } else -> { backgroundCache.deleteFromCache(localAnime, false) Instant.now().toEpochMilli() } } val thumbnailUrl = remoteAnime.thumbnail_url?.takeIf { it.isNotEmpty() } val backgroundUrl = remoteAnime.background_url?.takeIf { it.isNotEmpty() } return animeRepository.updateAnime( AnimeUpdate( id = localAnime.id, title = title, coverLastModified = coverLastModified, backgroundLastModified = backgroundLastModified, author = remoteAnime.author, artist = remoteAnime.artist, description = remoteAnime.description, genre = remoteAnime.getGenres(), thumbnailUrl = thumbnailUrl, backgroundUrl = backgroundUrl, status = remoteAnime.status.toLong(), updateStrategy = remoteAnime.update_strategy, initialized = true, ), ) } suspend fun awaitUpdateFetchInterval( anime: Anime, dateTime: ZonedDateTime = ZonedDateTime.now(), window: Pair = animeFetchInterval.getWindow(dateTime), ): Boolean { return animeRepository.updateAnime( animeFetchInterval.toAnimeUpdate(anime, dateTime, window), ) } suspend fun awaitUpdateLastUpdate(animeId: Long): Boolean { return animeRepository.updateAnime(AnimeUpdate(id = animeId, lastUpdate = Instant.now().toEpochMilli())) } suspend fun awaitUpdateCoverLastModified(animeId: Long): Boolean { return animeRepository.updateAnime( AnimeUpdate(id = animeId, coverLastModified = Instant.now().toEpochMilli()), ) } suspend fun awaitUpdateBackgroundLastModified(animeId: Long): Boolean { return animeRepository.updateAnime( AnimeUpdate(id = animeId, backgroundLastModified = Instant.now().toEpochMilli()), ) } suspend fun awaitUpdateFavorite(animeId: Long, favorite: Boolean): Boolean { val dateAdded = when (favorite) { true -> Instant.now().toEpochMilli() false -> 0 } return animeRepository.updateAnime( AnimeUpdate(id = animeId, favorite = favorite, dateAdded = dateAdded), ) } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/anime/model/Anime.kt ================================================ package eu.kanade.domain.entries.anime.model import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import tachiyomi.core.common.preference.TriState import tachiyomi.domain.entries.anime.model.Anime import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get // TODO: move these into the domain model val Anime.downloadedFilter: TriState get() { if (Injekt.get().downloadedOnly().get()) return TriState.ENABLED_IS return when (downloadedFilterRaw) { Anime.EPISODE_SHOW_DOWNLOADED -> TriState.ENABLED_IS Anime.EPISODE_SHOW_NOT_DOWNLOADED -> TriState.ENABLED_NOT else -> TriState.DISABLED } } val Anime.seasonDownloadedFilter: TriState get() { if (Injekt.get().downloadedOnly().get()) return TriState.ENABLED_IS return when (seasonDownloadedFilterRaw) { Anime.SEASON_SHOW_DOWNLOADED -> TriState.ENABLED_IS Anime.SEASON_SHOW_NOT_DOWNLOADED -> TriState.ENABLED_NOT else -> TriState.DISABLED } } fun Anime.episodesFiltered(): Boolean { return unseenFilter != TriState.DISABLED || downloadedFilter != TriState.DISABLED || bookmarkedFilter != TriState.DISABLED || fillermarkedFilter != TriState.DISABLED } fun Anime.seasonsFiltered(): Boolean { return seasonDownloadedFilter != TriState.DISABLED || seasonUnseenFilter != TriState.DISABLED || seasonStartedFilter != TriState.DISABLED || seasonCompletedFilter != TriState.DISABLED || seasonBookmarkedFilter != TriState.DISABLED || seasonFillermarkedFilter != TriState.DISABLED } fun Anime.toSAnime(): SAnime = SAnime.create().also { it.url = url it.title = title it.artist = artist it.author = author it.description = description it.genre = genre.orEmpty().joinToString() it.status = status.toInt() it.thumbnail_url = thumbnailUrl it.background_url = backgroundUrl it.fetch_type = fetchType it.season_number = seasonNumber it.initialized = initialized } fun Anime.copyFrom(other: SAnime): Anime { val author = other.author ?: author val artist = other.artist ?: artist val description = other.description ?: description val genres = if (other.genre != null) { other.getGenres() } else { genre } val thumbnailUrl = other.thumbnail_url ?: thumbnailUrl val backgroundUrl = other.background_url ?: backgroundUrl return this.copy( author = author, artist = artist, description = description, genre = genres, thumbnailUrl = thumbnailUrl, backgroundUrl = backgroundUrl, status = other.status.toLong(), updateStrategy = other.update_strategy, fetchType = other.fetch_type, seasonNumber = other.season_number, initialized = other.initialized && initialized, ) } fun SAnime.toDomainAnime(sourceId: Long): Anime { return Anime.create().copy( url = url, title = title, artist = artist, author = author, description = description, genre = getGenres(), status = status.toLong(), thumbnailUrl = thumbnail_url, backgroundUrl = background_url, updateStrategy = update_strategy, fetchType = fetch_type, seasonNumber = season_number, initialized = initialized, source = sourceId, ) } fun Anime.hasCustomCover(coverCache: AnimeCoverCache = Injekt.get()): Boolean { return coverCache.getCustomCoverFile(id).exists() } fun Anime.hasCustomBackground(backgroundCache: AnimeBackgroundCache = Injekt.get()): Boolean { return backgroundCache.getCustomBackgroundFile(id).exists() } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/manga/interactor/GetExcludedScanlators.kt ================================================ package eu.kanade.domain.entries.manga.interactor import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import tachiyomi.data.handlers.manga.MangaDatabaseHandler class GetExcludedScanlators( private val handler: MangaDatabaseHandler, ) { suspend fun await(mangaId: Long): Set { return handler.awaitList { excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(mangaId) } .toSet() } fun subscribe(mangaId: Long): Flow> { return handler.subscribeToList { excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(mangaId) } .map { it.toSet() } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/manga/interactor/SetExcludedScanlators.kt ================================================ package eu.kanade.domain.entries.manga.interactor import tachiyomi.data.handlers.manga.MangaDatabaseHandler class SetExcludedScanlators( private val handler: MangaDatabaseHandler, ) { suspend fun await(mangaId: Long, excludedScanlators: Set) { handler.await(inTransaction = true) { val currentExcluded = handler.awaitList { excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(mangaId) }.toSet() val toAdd = excludedScanlators.minus(currentExcluded) for (scanlator in toAdd) { excluded_scanlatorsQueries.insert(mangaId, scanlator) } val toRemove = currentExcluded.minus(excludedScanlators) excluded_scanlatorsQueries.remove(mangaId, toRemove) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/manga/interactor/SetMangaViewerFlags.kt ================================================ package eu.kanade.domain.entries.manga.interactor import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import tachiyomi.domain.entries.manga.model.MangaUpdate import tachiyomi.domain.entries.manga.repository.MangaRepository class SetMangaViewerFlags( private val mangaRepository: MangaRepository, ) { suspend fun awaitSetReadingMode(id: Long, flag: Long) { val manga = mangaRepository.getMangaById(id) mangaRepository.updateManga( MangaUpdate( id = id, viewerFlags = manga.viewerFlags.setFlag(flag, ReadingMode.MASK.toLong()), ), ) } suspend fun awaitSetOrientation(id: Long, flag: Long) { val manga = mangaRepository.getMangaById(id) mangaRepository.updateManga( MangaUpdate( id = id, viewerFlags = manga.viewerFlags.setFlag(flag, ReaderOrientation.MASK.toLong()), ), ) } private fun Long.setFlag(flag: Long, mask: Long): Long { return this and mask.inv() or (flag and mask) } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/manga/interactor/UpdateManga.kt ================================================ package eu.kanade.domain.entries.manga.interactor import eu.kanade.domain.entries.manga.model.hasCustomCover import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.source.model.SManga import tachiyomi.domain.entries.manga.interactor.MangaFetchInterval import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaUpdate import tachiyomi.domain.entries.manga.repository.MangaRepository import tachiyomi.source.local.entries.manga.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.ZonedDateTime class UpdateManga( private val mangaRepository: MangaRepository, private val mangaFetchInterval: MangaFetchInterval, ) { suspend fun await(mangaUpdate: MangaUpdate): Boolean { return mangaRepository.updateManga(mangaUpdate) } suspend fun awaitAll(mangaUpdates: List): Boolean { return mangaRepository.updateAllManga(mangaUpdates) } suspend fun awaitUpdateFromSource( localManga: Manga, remoteManga: SManga, manualFetch: Boolean, coverCache: MangaCoverCache = Injekt.get(), ): Boolean { val remoteTitle = try { remoteManga.title } catch (_: UninitializedPropertyAccessException) { "" } // if the manga isn't a favorite, set its title from source and update in db val title = if (remoteTitle.isEmpty() || localManga.favorite) null else remoteTitle val coverLastModified = when { // Never refresh covers if the url is empty to avoid "losing" existing covers remoteManga.thumbnail_url.isNullOrEmpty() -> null !manualFetch && localManga.thumbnailUrl == remoteManga.thumbnail_url -> null localManga.isLocal() -> Instant.now().toEpochMilli() localManga.hasCustomCover(coverCache) -> { coverCache.deleteFromCache(localManga, false) null } else -> { coverCache.deleteFromCache(localManga, false) Instant.now().toEpochMilli() } } val thumbnailUrl = remoteManga.thumbnail_url?.takeIf { it.isNotEmpty() } return mangaRepository.updateManga( MangaUpdate( id = localManga.id, title = title, coverLastModified = coverLastModified, author = remoteManga.author, artist = remoteManga.artist, description = remoteManga.description, genre = remoteManga.getGenres(), thumbnailUrl = thumbnailUrl, status = remoteManga.status.toLong(), updateStrategy = remoteManga.update_strategy, initialized = true, ), ) } suspend fun awaitUpdateFetchInterval( manga: Manga, dateTime: ZonedDateTime = ZonedDateTime.now(), window: Pair = mangaFetchInterval.getWindow(dateTime), ): Boolean { return mangaRepository.updateManga( mangaFetchInterval.toMangaUpdate(manga, dateTime, window), ) } suspend fun awaitUpdateLastUpdate(mangaId: Long): Boolean { return mangaRepository.updateManga(MangaUpdate(id = mangaId, lastUpdate = Instant.now().toEpochMilli())) } suspend fun awaitUpdateCoverLastModified(mangaId: Long): Boolean { return mangaRepository.updateManga(MangaUpdate(id = mangaId, coverLastModified = Instant.now().toEpochMilli())) } suspend fun awaitUpdateFavorite(mangaId: Long, favorite: Boolean): Boolean { val dateAdded = when (favorite) { true -> Instant.now().toEpochMilli() false -> 0 } return mangaRepository.updateManga( MangaUpdate(id = mangaId, favorite = favorite, dateAdded = dateAdded), ) } } ================================================ FILE: app/src/main/java/eu/kanade/domain/entries/manga/model/Manga.kt ================================================ package eu.kanade.domain.entries.manga.model import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import tachiyomi.core.common.preference.TriState import tachiyomi.core.metadata.comicinfo.ComicInfo import tachiyomi.core.metadata.comicinfo.ComicInfoPublishingStatus import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get // TODO: move these into the domain model val Manga.readingMode: Long get() = viewerFlags and ReadingMode.MASK.toLong() val Manga.readerOrientation: Long get() = viewerFlags and ReaderOrientation.MASK.toLong() val Manga.downloadedFilter: TriState get() { if (Injekt.get().downloadedOnly().get()) return TriState.ENABLED_IS return when (downloadedFilterRaw) { Manga.CHAPTER_SHOW_DOWNLOADED -> TriState.ENABLED_IS Manga.CHAPTER_SHOW_NOT_DOWNLOADED -> TriState.ENABLED_NOT else -> TriState.DISABLED } } fun Manga.chaptersFiltered(): Boolean { return unreadFilter != TriState.DISABLED || downloadedFilter != TriState.DISABLED || bookmarkedFilter != TriState.DISABLED } fun Manga.toSManga(): SManga = SManga.create().also { it.url = url it.title = title it.artist = artist it.author = author it.description = description it.genre = genre.orEmpty().joinToString() it.status = status.toInt() it.thumbnail_url = thumbnailUrl it.initialized = initialized } fun Manga.copyFrom(other: SManga): Manga { val author = other.author ?: author val artist = other.artist ?: artist val description = other.description ?: description val genres = if (other.genre != null) { other.getGenres() } else { genre } val thumbnailUrl = other.thumbnail_url ?: thumbnailUrl return this.copy( author = author, artist = artist, description = description, genre = genres, thumbnailUrl = thumbnailUrl, status = other.status.toLong(), updateStrategy = other.update_strategy, initialized = other.initialized && initialized, ) } fun SManga.toDomainManga(sourceId: Long): Manga { return Manga.create().copy( url = url, title = title, artist = artist, author = author, description = description, genre = getGenres(), status = status.toLong(), thumbnailUrl = thumbnail_url, updateStrategy = update_strategy, initialized = initialized, source = sourceId, ) } fun Manga.hasCustomCover(coverCache: MangaCoverCache = Injekt.get()): Boolean { return coverCache.getCustomCoverFile(id).exists() } /** * Creates a ComicInfo instance based on the manga and chapter metadata. */ fun getComicInfo( manga: Manga, chapter: Chapter, urls: List, categories: List?, sourceName: String, ) = ComicInfo( title = ComicInfo.Title(chapter.name), series = ComicInfo.Series(manga.title), number = chapter.chapterNumber.takeIf { it >= 0 }?.let { if ((it.rem(1) == 0.0)) { ComicInfo.Number(it.toInt().toString()) } else { ComicInfo.Number(it.toString()) } }, web = ComicInfo.Web(urls.joinToString(" ")), summary = manga.description?.let { ComicInfo.Summary(it) }, writer = manga.author?.let { ComicInfo.Writer(it) }, penciller = manga.artist?.let { ComicInfo.Penciller(it) }, translator = chapter.scanlator?.let { ComicInfo.Translator(it) }, genre = manga.genre?.let { ComicInfo.Genre(it.joinToString()) }, publishingStatus = ComicInfo.PublishingStatusTachiyomi( ComicInfoPublishingStatus.toComicInfoValue(manga.status), ), categories = categories?.let { ComicInfo.CategoriesTachiyomi(it.joinToString()) }, source = ComicInfo.SourceAniyomi(sourceName), inker = null, colorist = null, letterer = null, coverArtist = null, tags = null, ) ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/anime/interactor/GetAnimeExtensionLanguages.kt ================================================ package eu.kanade.domain.extension.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine class GetAnimeExtensionLanguages( private val preferences: SourcePreferences, private val extensionManager: AnimeExtensionManager, ) { fun subscribe(): Flow> { return combine( preferences.enabledLanguages().changes(), extensionManager.availableExtensionsFlow, ) { enabledLanguage, availableExtensions -> availableExtensions .flatMap { ext -> if (ext.sources.isEmpty()) { listOf(ext.lang) } else { ext.sources.map { it.lang } } } .distinct() .sortedWith( compareBy { it !in enabledLanguage }.then(LocaleHelper.comparator), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/anime/interactor/GetAnimeExtensionSources.kt ================================================ package eu.kanade.domain.extension.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map class GetAnimeExtensionSources( private val preferences: SourcePreferences, ) { fun subscribe(extension: AnimeExtension.Installed): Flow> { val isMultiSource = extension.sources.size > 1 val isMultiLangSingleSource = isMultiSource && extension.sources.map { it.name }.distinct().size == 1 return preferences.disabledAnimeSources().changes().map { disabledSources -> fun AnimeSource.isEnabled() = id.toString() !in disabledSources extension.sources .map { source -> AnimeExtensionSourceItem( source = source, enabled = source.isEnabled(), labelAsName = isMultiSource && !isMultiLangSingleSource, ) } } } } data class AnimeExtensionSourceItem( val source: AnimeSource, val enabled: Boolean, val labelAsName: Boolean, ) ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/anime/interactor/GetAnimeExtensionsByType.kt ================================================ package eu.kanade.domain.extension.anime.interactor import eu.kanade.domain.extension.anime.model.AnimeExtensions import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine class GetAnimeExtensionsByType( private val preferences: SourcePreferences, private val extensionManager: AnimeExtensionManager, ) { fun subscribe(): Flow { val showNsfwSources = preferences.showNsfwSource().get() return combine( preferences.enabledLanguages().changes(), extensionManager.installedExtensionsFlow, extensionManager.untrustedExtensionsFlow, extensionManager.availableExtensionsFlow, ) { enabledLanguages, _installed, _untrusted, _available -> val (updates, installed) = _installed .filter { (showNsfwSources || !it.isNsfw) } .sortedWith( compareBy { !it.isObsolete } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }, ) .partition { it.hasUpdate } val untrusted = _untrusted .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) val available = _available .filter { extension -> _installed.none { it.pkgName == extension.pkgName } && _untrusted.none { it.pkgName == extension.pkgName } && (showNsfwSources || !extension.isNsfw) } .flatMap { ext -> if (ext.sources.isEmpty()) { return@flatMap if (ext.lang in enabledLanguages) listOf(ext) else emptyList() } ext.sources.filter { it.lang in enabledLanguages } .map { ext.copy( name = it.name, lang = it.lang, pkgName = "${ext.pkgName}-${it.id}", sources = listOf(it), ) } } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) AnimeExtensions(updates, installed, available, untrusted) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/anime/interactor/TrustAnimeExtension.kt ================================================ package eu.kanade.domain.extension.anime.interactor import android.content.pm.PackageInfo import androidx.core.content.pm.PackageInfoCompat import eu.kanade.domain.source.service.SourcePreferences import mihon.domain.extensionrepo.anime.repository.AnimeExtensionRepoRepository import tachiyomi.core.common.preference.getAndSet class TrustAnimeExtension( private val animeExtensionRepoRepository: AnimeExtensionRepoRepository, private val preferences: SourcePreferences, ) { suspend fun isTrusted(pkgInfo: PackageInfo, fingerprints: List): Boolean { val trustedFingerprints = animeExtensionRepoRepository.getAll().map { it.signingKeyFingerprint }.toHashSet() val key = "${pkgInfo.packageName}:${PackageInfoCompat.getLongVersionCode(pkgInfo)}:${fingerprints.last()}" return trustedFingerprints.any { fingerprints.contains(it) } || key in preferences.trustedExtensions().get() } fun trust(pkgName: String, versionCode: Long, signatureHash: String) { preferences.trustedExtensions().getAndSet { exts -> // Remove previously trusted versions val removed = exts.filterNot { it.startsWith("$pkgName:") }.toMutableSet() removed.also { it += "$pkgName:$versionCode:$signatureHash" } } } fun revokeAll() { preferences.trustedExtensions().delete() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/anime/model/AnimeExtensions.kt ================================================ package eu.kanade.domain.extension.anime.model import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension data class AnimeExtensions( val updates: List, val installed: List, val available: List, val untrusted: List, ) ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/manga/interactor/GetMangaExtensionLanguages.kt ================================================ package eu.kanade.domain.extension.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine class GetMangaExtensionLanguages( private val preferences: SourcePreferences, private val extensionManager: MangaExtensionManager, ) { fun subscribe(): Flow> { return combine( preferences.enabledLanguages().changes(), extensionManager.availableExtensionsFlow, ) { enabledLanguage, availableExtensions -> availableExtensions .flatMap { ext -> if (ext.sources.isEmpty()) { listOf(ext.lang) } else { ext.sources.map { it.lang } } } .distinct() .sortedWith( compareBy { it !in enabledLanguage }.then(LocaleHelper.comparator), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/manga/interactor/GetMangaExtensionSources.kt ================================================ package eu.kanade.domain.extension.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.source.MangaSource import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map class GetExtensionSources( private val preferences: SourcePreferences, ) { fun subscribe(extension: MangaExtension.Installed): Flow> { val isMultiSource = extension.sources.size > 1 val isMultiLangSingleSource = isMultiSource && extension.sources.map { it.name }.distinct().size == 1 return preferences.disabledMangaSources().changes().map { disabledSources -> fun MangaSource.isEnabled() = id.toString() !in disabledSources extension.sources .map { source -> MangaExtensionSourceItem( source = source, enabled = source.isEnabled(), labelAsName = isMultiSource && !isMultiLangSingleSource, ) } } } } data class MangaExtensionSourceItem( val source: MangaSource, val enabled: Boolean, val labelAsName: Boolean, ) ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/manga/interactor/GetMangaExtensionsByType.kt ================================================ package eu.kanade.domain.extension.manga.interactor import eu.kanade.domain.extension.manga.model.MangaExtensions import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine class GetMangaExtensionsByType( private val preferences: SourcePreferences, private val extensionManager: MangaExtensionManager, ) { fun subscribe(): Flow { val showNsfwSources = preferences.showNsfwSource().get() return combine( preferences.enabledLanguages().changes(), extensionManager.installedExtensionsFlow, extensionManager.untrustedExtensionsFlow, extensionManager.availableExtensionsFlow, ) { enabledLanguages, _installed, _untrusted, _available -> val (updates, installed) = _installed .filter { (showNsfwSources || !it.isNsfw) } .sortedWith( compareBy { !it.isObsolete } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }, ) .partition { it.hasUpdate } val untrusted = _untrusted .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) val available = _available .filter { extension -> _installed.none { it.pkgName == extension.pkgName } && _untrusted.none { it.pkgName == extension.pkgName } && (showNsfwSources || !extension.isNsfw) } .flatMap { ext -> if (ext.sources.isEmpty()) { return@flatMap if (ext.lang in enabledLanguages) listOf(ext) else emptyList() } ext.sources.filter { it.lang in enabledLanguages } .map { ext.copy( name = it.name, lang = it.lang, pkgName = "${ext.pkgName}-${it.id}", sources = listOf(it), ) } } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) MangaExtensions(updates, installed, available, untrusted) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/manga/interactor/TrustMangaExtension.kt ================================================ package eu.kanade.domain.extension.manga.interactor import android.content.pm.PackageInfo import androidx.core.content.pm.PackageInfoCompat import eu.kanade.domain.source.service.SourcePreferences import mihon.domain.extensionrepo.manga.repository.MangaExtensionRepoRepository import tachiyomi.core.common.preference.getAndSet class TrustMangaExtension( private val mangaExtensionRepoRepository: MangaExtensionRepoRepository, private val preferences: SourcePreferences, ) { suspend fun isTrusted(pkgInfo: PackageInfo, fingerprints: List): Boolean { val trustedFingerprints = mangaExtensionRepoRepository.getAll().map { it.signingKeyFingerprint }.toHashSet() val key = "${pkgInfo.packageName}:${PackageInfoCompat.getLongVersionCode(pkgInfo)}:${fingerprints.last()}" return trustedFingerprints.any { fingerprints.contains(it) } || key in preferences.trustedExtensions().get() } fun trust(pkgName: String, versionCode: Long, signatureHash: String) { preferences.trustedExtensions().getAndSet { exts -> // Remove previously trusted versions val removed = exts.filterNot { it.startsWith("$pkgName:") }.toMutableSet() removed.also { it += "$pkgName:$versionCode:$signatureHash" } } } fun revokeAll() { preferences.trustedExtensions().delete() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/extension/manga/model/MangaExtensions.kt ================================================ package eu.kanade.domain.extension.manga.model import eu.kanade.tachiyomi.extension.manga.model.MangaExtension data class MangaExtensions( val updates: List, val installed: List, val available: List, val untrusted: List, ) ================================================ FILE: app/src/main/java/eu/kanade/domain/items/chapter/interactor/GetAvailableScanlators.kt ================================================ package eu.kanade.domain.items.chapter.interactor import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import tachiyomi.domain.items.chapter.repository.ChapterRepository class GetAvailableScanlators( private val repository: ChapterRepository, ) { private fun List.cleanupAvailableScanlators(): Set { return mapNotNull { it.ifBlank { null } }.toSet() } suspend fun await(mangaId: Long): Set { return repository.getScanlatorsByMangaId(mangaId) .cleanupAvailableScanlators() } fun subscribe(mangaId: Long): Flow> { return repository.getScanlatorsByMangaIdAsFlow(mangaId) .map { it.cleanupAvailableScanlators() } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/chapter/interactor/SetReadStatus.kt ================================================ package eu.kanade.domain.items.chapter.interactor import eu.kanade.domain.download.manga.interactor.DeleteChapterDownload import logcat.LogPriority import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.repository.MangaRepository import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.model.ChapterUpdate import tachiyomi.domain.items.chapter.repository.ChapterRepository class SetReadStatus( private val downloadPreferences: DownloadPreferences, private val deleteDownload: DeleteChapterDownload, private val mangaRepository: MangaRepository, private val chapterRepository: ChapterRepository, ) { private val mapper = { chapter: Chapter, read: Boolean -> ChapterUpdate( read = read, lastPageRead = if (!read) 0 else null, id = chapter.id, ) } suspend fun await(read: Boolean, vararg chapters: Chapter): Result = withNonCancellableContext { val chaptersToUpdate = chapters.filter { when (read) { true -> !it.read false -> it.read || it.lastPageRead > 0 } } if (chaptersToUpdate.isEmpty()) { return@withNonCancellableContext Result.NoChapters } try { chapterRepository.updateAllChapters( chaptersToUpdate.map { mapper(it, read) }, ) } catch (e: Exception) { logcat(LogPriority.ERROR, e) return@withNonCancellableContext Result.InternalError(e) } if (read && downloadPreferences.removeAfterMarkedAsRead().get()) { chaptersToUpdate .groupBy { it.mangaId } .forEach { (mangaId, chapters) -> deleteDownload.awaitAll( manga = mangaRepository.getMangaById(mangaId), chapters = chapters.toTypedArray(), ) } } Result.Success } suspend fun await(mangaId: Long, read: Boolean): Result = withNonCancellableContext { await( read = read, chapters = chapterRepository .getChapterByMangaId(mangaId) .toTypedArray(), ) } suspend fun await(manga: Manga, read: Boolean) = await(manga.id, read) sealed interface Result { data object Success : Result data object NoChapters : Result data class InternalError(val error: Throwable) : Result } } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/chapter/interactor/SyncChaptersWithSource.kt ================================================ package eu.kanade.domain.items.chapter.interactor import eu.kanade.domain.entries.manga.interactor.GetExcludedScanlators import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.domain.items.chapter.model.copyFromSChapter import eu.kanade.domain.items.chapter.model.toSChapter import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.download.manga.MangaDownloadProvider import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.online.HttpSource import tachiyomi.data.items.chapter.ChapterSanitizer import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.items.chapter.interactor.ShouldUpdateDbChapter import tachiyomi.domain.items.chapter.interactor.UpdateChapter import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.model.NoChaptersException import tachiyomi.domain.items.chapter.model.toChapterUpdate import tachiyomi.domain.items.chapter.repository.ChapterRepository import tachiyomi.domain.items.chapter.service.ChapterRecognition import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.source.local.entries.manga.isLocal import java.lang.Long.max import java.time.ZonedDateTime import java.util.TreeSet class SyncChaptersWithSource( private val downloadManager: MangaDownloadManager, private val downloadProvider: MangaDownloadProvider, private val chapterRepository: ChapterRepository, private val shouldUpdateDbChapter: ShouldUpdateDbChapter, private val updateManga: UpdateManga, private val updateChapter: UpdateChapter, private val getChaptersByMangaId: GetChaptersByMangaId, private val getExcludedScanlators: GetExcludedScanlators, private val libraryPreferences: LibraryPreferences, ) { /** * Method to synchronize db chapters with source ones * * @param rawSourceChapters the chapters from the source. * @param manga the manga the chapters belong to. * @param source the source the manga belongs to. * @return Newly added chapters */ suspend fun await( rawSourceChapters: List, manga: Manga, source: MangaSource, manualFetch: Boolean = false, fetchWindow: Pair = Pair(0, 0), ): List { if (rawSourceChapters.isEmpty() && !source.isLocal()) { throw NoChaptersException() } val now = ZonedDateTime.now() val nowMillis = now.toInstant().toEpochMilli() val sourceChapters = rawSourceChapters .distinctBy { it.url } .mapIndexed { i, sChapter -> Chapter.create() .copyFromSChapter(sChapter) .copy(name = with(ChapterSanitizer) { sChapter.name.sanitize(manga.title) }) .copy(mangaId = manga.id, sourceOrder = i.toLong()) } val dbChapters = getChaptersByMangaId.await(manga.id) val newChapters = mutableListOf() val updatedChapters = mutableListOf() val removedChapters = dbChapters.filterNot { dbChapter -> sourceChapters.any { sourceChapter -> dbChapter.url == sourceChapter.url } } // Used to not set upload date of older chapters // to a higher value than newer chapters var maxSeenUploadDate = 0L for (sourceChapter in sourceChapters) { var chapter = sourceChapter // Update metadata from source if necessary. if (source is HttpSource) { val sChapter = chapter.toSChapter() source.prepareNewChapter(sChapter, manga.toSManga()) chapter = chapter.copyFromSChapter(sChapter) } // Recognize chapter number for the chapter. val chapterNumber = ChapterRecognition.parseChapterNumber( manga.title, chapter.name, chapter.chapterNumber, ) chapter = chapter.copy(chapterNumber = chapterNumber) val dbChapter = dbChapters.find { it.url == chapter.url } if (dbChapter == null) { val toAddChapter = if (chapter.dateUpload == 0L) { val altDateUpload = if (maxSeenUploadDate == 0L) nowMillis else maxSeenUploadDate chapter.copy(dateUpload = altDateUpload) } else { maxSeenUploadDate = max(maxSeenUploadDate, sourceChapter.dateUpload) chapter } newChapters.add(toAddChapter) } else { if (shouldUpdateDbChapter.await(dbChapter, chapter)) { val shouldRenameChapter = downloadProvider.isChapterDirNameChanged( dbChapter, chapter, ) && downloadManager.isChapterDownloaded( dbChapter.name, dbChapter.scanlator, manga.title, manga.source, ) if (shouldRenameChapter) { downloadManager.renameChapter(source, manga, dbChapter, chapter) } var toChangeChapter = dbChapter.copy( name = chapter.name, chapterNumber = chapter.chapterNumber, scanlator = chapter.scanlator, sourceOrder = chapter.sourceOrder, ) if (chapter.dateUpload != 0L) { toChangeChapter = toChangeChapter.copy(dateUpload = chapter.dateUpload) } updatedChapters.add(toChangeChapter) } } } // Return if there's nothing to add, delete, or update to avoid unnecessary db transactions. if (newChapters.isEmpty() && removedChapters.isEmpty() && updatedChapters.isEmpty()) { if (manualFetch || manga.fetchInterval == 0 || manga.nextUpdate < fetchWindow.first) { updateManga.awaitUpdateFetchInterval( manga, now, fetchWindow, ) } return emptyList() } val changedOrDuplicateReadUrls = mutableSetOf() val deletedChapterNumbers = TreeSet() val deletedReadChapterNumbers = TreeSet() val deletedBookmarkedChapterNumbers = TreeSet() val readChapterNumbers = dbChapters .asSequence() .filter { it.read && it.isRecognizedNumber } .map { it.chapterNumber } .toSet() removedChapters.forEach { chapter -> if (chapter.read) deletedReadChapterNumbers.add(chapter.chapterNumber) if (chapter.bookmark) deletedBookmarkedChapterNumbers.add(chapter.chapterNumber) deletedChapterNumbers.add(chapter.chapterNumber) } val deletedChapterNumberDateFetchMap = removedChapters.sortedByDescending { it.dateFetch } .associate { it.chapterNumber to it.dateFetch } val markDuplicateAsRead = libraryPreferences.markDuplicateReadChapterAsRead().get() .contains(LibraryPreferences.MARK_DUPLICATE_CHAPTER_READ_NEW) // Date fetch is set in such a way that the upper ones will have bigger value than the lower ones // Sources MUST return the chapters from most to less recent, which is common. var itemCount = newChapters.size var updatedToAdd = newChapters.map { toAddItem -> var chapter = toAddItem.copy(dateFetch = nowMillis + itemCount--) if (chapter.chapterNumber in readChapterNumbers && markDuplicateAsRead) { changedOrDuplicateReadUrls.add(chapter.url) chapter = chapter.copy(read = true) } if (!chapter.isRecognizedNumber || chapter.chapterNumber !in deletedChapterNumbers) return@map chapter chapter = chapter.copy( read = chapter.chapterNumber in deletedReadChapterNumbers, bookmark = chapter.chapterNumber in deletedBookmarkedChapterNumbers, ) // Try to to use the fetch date of the original entry to not pollute 'Updates' tab deletedChapterNumberDateFetchMap[chapter.chapterNumber]?.let { chapter = chapter.copy(dateFetch = it) } changedOrDuplicateReadUrls.add(chapter.url) chapter } if (removedChapters.isNotEmpty()) { val toDeleteIds = removedChapters.map { it.id } chapterRepository.removeChaptersWithIds(toDeleteIds) } if (updatedToAdd.isNotEmpty()) { updatedToAdd = chapterRepository.addAllChapters(updatedToAdd) } if (updatedChapters.isNotEmpty()) { val chapterUpdates = updatedChapters.map { it.toChapterUpdate() } updateChapter.awaitAll(chapterUpdates) } updateManga.awaitUpdateFetchInterval(manga, now, fetchWindow) // Set this manga as updated since chapters were changed // Note that last_update actually represents last time the chapter list changed at all updateManga.awaitUpdateLastUpdate(manga.id) val excludedScanlators = getExcludedScanlators.await(manga.id).toHashSet() return updatedToAdd.filterNot { it.url in changedOrDuplicateReadUrls || it.scanlator in excludedScanlators } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/chapter/model/Chapter.kt ================================================ package eu.kanade.domain.items.chapter.model import eu.kanade.tachiyomi.data.database.models.manga.ChapterImpl import eu.kanade.tachiyomi.source.model.SChapter import tachiyomi.domain.items.chapter.model.Chapter import eu.kanade.tachiyomi.data.database.models.manga.Chapter as DbChapter // TODO: Remove when all deps are migrated fun Chapter.toSChapter(): SChapter { return SChapter.create().also { it.url = url it.name = name it.date_upload = dateUpload it.chapter_number = chapterNumber.toFloat() it.scanlator = scanlator } } fun Chapter.copyFromSChapter(sChapter: SChapter): Chapter { return this.copy( name = sChapter.name, url = sChapter.url, dateUpload = sChapter.date_upload, chapterNumber = sChapter.chapter_number.toDouble(), scanlator = sChapter.scanlator?.ifBlank { null }?.trim(), ) } fun Chapter.toDbChapter(): DbChapter = ChapterImpl().also { it.id = id it.manga_id = mangaId it.url = url it.name = name it.scanlator = scanlator it.read = read it.bookmark = bookmark it.last_page_read = lastPageRead.toInt() it.date_fetch = dateFetch it.date_upload = dateUpload it.chapter_number = chapterNumber.toFloat() it.source_order = sourceOrder.toInt() } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/chapter/model/ChapterFilter.kt ================================================ package eu.kanade.domain.items.chapter.model import eu.kanade.domain.entries.manga.model.downloadedFilter import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.ui.entries.manga.ChapterList import tachiyomi.domain.entries.applyFilter import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.service.getChapterSort import tachiyomi.source.local.entries.manga.isLocal /** * Applies the view filters to the list of chapters obtained from the database. * @return an observable of the list of chapters filtered and sorted. */ fun List.applyFilters(manga: Manga, downloadManager: MangaDownloadManager): List { val isLocalManga = manga.isLocal() val unreadFilter = manga.unreadFilter val downloadedFilter = manga.downloadedFilter val bookmarkedFilter = manga.bookmarkedFilter return filter { chapter -> applyFilter(unreadFilter) { !chapter.read } } .filter { chapter -> applyFilter(bookmarkedFilter) { chapter.bookmark } } .filter { chapter -> applyFilter(downloadedFilter) { val downloaded = downloadManager.isChapterDownloaded( chapter.name, chapter.scanlator, manga.title, manga.source, ) downloaded || isLocalManga } } .sortedWith(getChapterSort(manga)) } /** * Applies the view filters to the list of chapters obtained from the database. * @return an observable of the list of chapters filtered and sorted. */ fun List.applyFilters(manga: Manga): Sequence { val isLocalManga = manga.isLocal() val unreadFilter = manga.unreadFilter val downloadedFilter = manga.downloadedFilter val bookmarkedFilter = manga.bookmarkedFilter return asSequence() .filter { (chapter) -> applyFilter(unreadFilter) { !chapter.read } } .filter { (chapter) -> applyFilter(bookmarkedFilter) { chapter.bookmark } } .filter { applyFilter(downloadedFilter) { it.isDownloaded || isLocalManga } } .sortedWith { (chapter1), (chapter2) -> getChapterSort(manga).invoke(chapter1, chapter2) } } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/episode/interactor/SetSeenStatus.kt ================================================ package eu.kanade.domain.items.episode.interactor import eu.kanade.domain.download.anime.interactor.DeleteEpisodeDownload import logcat.LogPriority import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.repository.AnimeRepository import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.model.EpisodeUpdate import tachiyomi.domain.items.episode.repository.EpisodeRepository class SetSeenStatus( private val downloadPreferences: DownloadPreferences, private val deleteDownload: DeleteEpisodeDownload, private val animeRepository: AnimeRepository, private val episodeRepository: EpisodeRepository, ) { private val mapper = { episode: Episode, read: Boolean -> EpisodeUpdate( seen = read, lastSecondSeen = if (!read) 0 else null, id = episode.id, ) } suspend fun await(seen: Boolean, vararg episodes: Episode): Result = withNonCancellableContext { val episodesToUpdate = episodes.filter { when (seen) { true -> !it.seen false -> it.seen || it.lastSecondSeen > 0 } } if (episodesToUpdate.isEmpty()) { return@withNonCancellableContext Result.NoEpisodes } try { episodeRepository.updateAllEpisodes( episodesToUpdate.map { mapper(it, seen) }, ) } catch (e: Exception) { logcat(LogPriority.ERROR, e) return@withNonCancellableContext Result.InternalError(e) } if (seen && downloadPreferences.removeAfterMarkedAsRead().get()) { episodesToUpdate .groupBy { it.animeId } .forEach { (animeId, episodes) -> deleteDownload.awaitAll( anime = animeRepository.getAnimeById(animeId), episodes = episodes.toTypedArray(), ) } } Result.Success } suspend fun await(animeId: Long, seen: Boolean): Result = withNonCancellableContext { await( seen = seen, episodes = episodeRepository .getEpisodeByAnimeId(animeId) .toTypedArray(), ) } suspend fun await(anime: Anime, seen: Boolean) = await(anime.id, seen) sealed interface Result { data object Success : Result data object NoEpisodes : Result data class InternalError(val error: Throwable) : Result } } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/episode/interactor/SyncEpisodesWithSource.kt ================================================ package eu.kanade.domain.items.episode.interactor import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.domain.items.episode.model.copyFromSEpisode import eu.kanade.domain.items.episode.model.toSEpisode import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadProvider import tachiyomi.data.items.episode.EpisodeSanitizer import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.ShouldUpdateDbEpisode import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.model.NoEpisodesException import tachiyomi.domain.items.episode.model.toEpisodeUpdate import tachiyomi.domain.items.episode.repository.EpisodeRepository import tachiyomi.domain.items.episode.service.EpisodeRecognition import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.source.local.entries.anime.isLocal import java.lang.Long.max import java.time.ZonedDateTime import java.util.TreeSet class SyncEpisodesWithSource( private val downloadManager: AnimeDownloadManager, private val downloadProvider: AnimeDownloadProvider, private val episodeRepository: EpisodeRepository, private val shouldUpdateDbEpisode: ShouldUpdateDbEpisode, private val updateAnime: UpdateAnime, private val updateEpisode: UpdateEpisode, private val getEpisodesByAnimeId: GetEpisodesByAnimeId, private val libraryPreferences: LibraryPreferences, ) { /** * Method to synchronize db episodes with source ones * * @param rawSourceEpisodes the episodes from the source. * @param anime the anime the episodes belong to. * @param source the source the anime belongs to. * @return Newly added episodes */ suspend fun await( rawSourceEpisodes: List, anime: Anime, source: AnimeSource, manualFetch: Boolean = false, fetchWindow: Pair = Pair(0, 0), ): List { if (rawSourceEpisodes.isEmpty() && !source.isLocal()) { throw NoEpisodesException() } val now = ZonedDateTime.now() val nowMillis = now.toInstant().toEpochMilli() val sourceEpisodes = rawSourceEpisodes .distinctBy { it.url } .mapIndexed { i, sEpisode -> Episode.create() .copyFromSEpisode(sEpisode) .copy(name = with(EpisodeSanitizer) { sEpisode.name.sanitize(anime.title) }) .copy(animeId = anime.id, sourceOrder = i.toLong()) } val dbEpisodes = getEpisodesByAnimeId.await(anime.id) val newEpisodes = mutableListOf() val updatedEpisodes = mutableListOf() val removedEpisodes = dbEpisodes.filterNot { dbEpisode -> sourceEpisodes.any { sourceEpisode -> dbEpisode.url == sourceEpisode.url } } // Used to not set upload date of older episodes // to a higher value than newer episodes var maxSeenUploadDate = 0L for (sourceEpisode in sourceEpisodes) { var episode = sourceEpisode // Update metadata from source if necessary. if (source is AnimeHttpSource) { val sEpisode = episode.toSEpisode() source.prepareNewEpisode(sEpisode, anime.toSAnime()) episode = episode.copyFromSEpisode(sEpisode) } // Recognize episode number for the episode. val episodeNumber = EpisodeRecognition.parseEpisodeNumber( anime.title, episode.name, episode.episodeNumber, ) episode = episode.copy(episodeNumber = episodeNumber) val dbEpisode = dbEpisodes.find { it.url == episode.url } if (dbEpisode == null) { val toAddEpisode = if (episode.dateUpload == 0L) { val altDateUpload = if (maxSeenUploadDate == 0L) nowMillis else maxSeenUploadDate episode.copy(dateUpload = altDateUpload) } else { maxSeenUploadDate = max(maxSeenUploadDate, sourceEpisode.dateUpload) episode } newEpisodes.add(toAddEpisode) } else { if (shouldUpdateDbEpisode.await(dbEpisode, episode)) { val shouldRenameEpisode = downloadProvider.isEpisodeDirNameChanged( dbEpisode, episode, ) && downloadManager.isEpisodeDownloaded( dbEpisode.name, dbEpisode.scanlator, anime.title, anime.source, ) if (shouldRenameEpisode) { downloadManager.renameEpisode(source, anime, dbEpisode, episode) } var toChangeEpisode = dbEpisode.copy( name = episode.name, episodeNumber = episode.episodeNumber, scanlator = episode.scanlator, summary = episode.summary, sourceOrder = episode.sourceOrder, ) if (episode.dateUpload != 0L) { toChangeEpisode = toChangeEpisode.copy( dateUpload = sourceEpisode.dateUpload, ) } if (!toChangeEpisode.fillermark) { toChangeEpisode = toChangeEpisode.copy( fillermark = sourceEpisode.fillermark, ) } if (toChangeEpisode.previewUrl.isNullOrBlank()) { toChangeEpisode = toChangeEpisode.copy( previewUrl = sourceEpisode.previewUrl, ) } updatedEpisodes.add(toChangeEpisode) } } } // Return if there's nothing to add, delete, or update to avoid unnecessary db transactions. if (newEpisodes.isEmpty() && removedEpisodes.isEmpty() && updatedEpisodes.isEmpty()) { if (manualFetch || anime.fetchInterval == 0 || anime.nextUpdate < fetchWindow.first) { updateAnime.awaitUpdateFetchInterval( anime, now, fetchWindow, ) } return emptyList() } val changedOrDuplicateReadUrls = mutableSetOf() val deletedEpisodeNumbers = TreeSet() val deletedSeenEpisodeNumbers = TreeSet() val deletedBookmarkedEpisodeNumbers = TreeSet() val readEpisodeNumbers = dbEpisodes .asSequence() .filter { it.seen && it.isRecognizedNumber } .map { it.episodeNumber } .toSet() removedEpisodes.forEach { episode -> if (episode.seen) deletedSeenEpisodeNumbers.add(episode.episodeNumber) if (episode.bookmark) deletedBookmarkedEpisodeNumbers.add(episode.episodeNumber) deletedEpisodeNumbers.add(episode.episodeNumber) } val deletedEpisodeNumberDateFetchMap = removedEpisodes.sortedByDescending { it.dateFetch } .associate { it.episodeNumber to it.dateFetch } val markDuplicateAsRead = libraryPreferences.markDuplicateSeenEpisodeAsSeen().get() .contains(LibraryPreferences.MARK_DUPLICATE_EPISODE_SEEN_NEW) // Date fetch is set in such a way that the upper ones will have bigger value than the lower ones // Sources MUST return the episodes from most to less recent, which is common. var itemCount = newEpisodes.size var updatedToAdd = newEpisodes.map { toAddItem -> var episode = toAddItem.copy(dateFetch = nowMillis + itemCount--) if (episode.episodeNumber in readEpisodeNumbers && markDuplicateAsRead) { changedOrDuplicateReadUrls.add(episode.url) episode = episode.copy(seen = true) } if (!episode.isRecognizedNumber || episode.episodeNumber !in deletedEpisodeNumbers) return@map episode episode = episode.copy( seen = episode.episodeNumber in deletedSeenEpisodeNumbers, bookmark = episode.episodeNumber in deletedBookmarkedEpisodeNumbers, ) // Try to to use the fetch date of the original entry to not pollute 'Updates' tab deletedEpisodeNumberDateFetchMap[episode.episodeNumber]?.let { episode = episode.copy(dateFetch = it) } changedOrDuplicateReadUrls.add(episode.url) episode } if (removedEpisodes.isNotEmpty()) { val toDeleteIds = removedEpisodes.map { it.id } episodeRepository.removeEpisodesWithIds(toDeleteIds) } if (updatedToAdd.isNotEmpty()) { updatedToAdd = episodeRepository.addAllEpisodes(updatedToAdd) } if (updatedEpisodes.isNotEmpty()) { val episodeUpdates = updatedEpisodes.map { it.toEpisodeUpdate() } updateEpisode.awaitAll(episodeUpdates) } updateAnime.awaitUpdateFetchInterval(anime, now, fetchWindow) // Set this anime as updated since episodes were changed // Note that last_update actually represents last time the episode list changed at all updateAnime.awaitUpdateLastUpdate(anime.id) return updatedToAdd.filterNot { it.url in changedOrDuplicateReadUrls } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/episode/model/Episode.kt ================================================ package eu.kanade.domain.items.episode.model import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.data.database.models.anime.EpisodeImpl import tachiyomi.domain.items.episode.model.Episode import eu.kanade.tachiyomi.data.database.models.anime.Episode as DbEpisode // TODO: Remove when all deps are migrated fun Episode.toSEpisode(): SEpisode { return SEpisode.create().also { it.url = url it.name = name it.date_upload = dateUpload it.episode_number = episodeNumber.toFloat() it.fillermark = fillermark it.scanlator = scanlator it.summary = summary it.preview_url = previewUrl } } fun Episode.copyFromSEpisode(sEpisode: SEpisode): Episode { return this.copy( name = sEpisode.name, url = sEpisode.url, dateUpload = sEpisode.date_upload, episodeNumber = sEpisode.episode_number.toDouble(), fillermark = sEpisode.fillermark, scanlator = sEpisode.scanlator?.ifBlank { null }, summary = sEpisode.summary?.ifBlank { null }, previewUrl = sEpisode.preview_url?.ifBlank { null }, ) } fun Episode.toDbEpisode(): DbEpisode = EpisodeImpl().also { it.id = id it.anime_id = animeId it.url = url it.name = name it.scanlator = scanlator it.summary = summary it.preview_url = previewUrl it.seen = seen it.bookmark = bookmark it.fillermark = fillermark it.last_second_seen = lastSecondSeen it.total_seconds = totalSeconds it.date_fetch = dateFetch it.date_upload = dateUpload it.episode_number = episodeNumber.toFloat() it.source_order = sourceOrder.toInt() } ================================================ FILE: app/src/main/java/eu/kanade/domain/items/episode/model/EpisodeFilter.kt ================================================ package eu.kanade.domain.items.episode.model import eu.kanade.domain.entries.anime.model.downloadedFilter import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.ui.entries.anime.EpisodeList import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.applyFilter import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.service.getEpisodeSort import tachiyomi.source.local.entries.anime.isLocal /** * Applies the view filters to the list of episodes obtained from the database. * @return an observable of the list of episodes filtered and sorted. */ fun List.applyFilters(anime: Anime, downloadManager: AnimeDownloadManager): List { val isLocalAnime = anime.isLocal() val unseenFilter = anime.unseenFilter val downloadedFilter = anime.downloadedFilter val bookmarkedFilter = anime.bookmarkedFilter val fillermarkedFilter = anime.fillermarkedFilter return asSequence().filter { episode -> applyFilter(unseenFilter) { !episode.seen } } .filter { episode -> applyFilter(bookmarkedFilter) { episode.bookmark } } .filter { episode -> applyFilter(fillermarkedFilter) { episode.fillermark } } .filter { episode -> applyFilter(downloadedFilter) { val downloaded = downloadManager.isEpisodeDownloaded( episode.name, episode.scanlator, anime.title, anime.source, ) downloaded || isLocalAnime } } .sortedWith(getEpisodeSort(anime)).toList() } /** * Applies the view filters to the list of episodes obtained from the database. * @return an observable of the list of episodes filtered and sorted. */ fun List.applyFilters(anime: Anime): Sequence { val isLocalAnime = anime.isLocal() val unseenFilter = anime.unseenFilter val downloadedFilter = anime.downloadedFilter val bookmarkedFilter = anime.bookmarkedFilter val fillermarkedFilter = anime.fillermarkedFilter return asSequence() .filter { (episode) -> applyFilter(unseenFilter) { !episode.seen } } .filter { (episode) -> applyFilter(bookmarkedFilter) { episode.bookmark } } .filter { (episode) -> applyFilter(fillermarkedFilter) { episode.fillermark } } .filter { applyFilter(downloadedFilter) { it.isDownloaded || isLocalAnime } } .sortedWith { (episode1), (episode2) -> getEpisodeSort(anime).invoke(episode1, episode2) } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/GetAnimeIncognitoState.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged class GetAnimeIncognitoState( private val basePreferences: BasePreferences, private val sourcePreferences: SourcePreferences, private val extensionManager: AnimeExtensionManager, ) { fun await(sourceId: Long?): Boolean { if (basePreferences.incognitoMode().get()) return true if (sourceId == null) return false val extensionPackage = extensionManager.getExtensionPackage(sourceId) ?: return false return extensionPackage in sourcePreferences.incognitoAnimeExtensions().get() } fun subscribe(sourceId: Long?): Flow { if (sourceId == null) return basePreferences.incognitoMode().changes() return combine( basePreferences.incognitoMode().changes(), sourcePreferences.incognitoAnimeExtensions().changes(), extensionManager.getExtensionPackageAsFlow(sourceId), ) { incognito, incognitoExtensions, extensionPackage -> incognito || (extensionPackage in incognitoExtensions) } .distinctUntilChanged() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/GetAnimeSourcesWithFavoriteCount.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import tachiyomi.core.common.util.lang.compareToWithCollator import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.repository.AnimeSourceRepository import tachiyomi.source.local.entries.anime.LocalAnimeSource import java.util.Collections class GetAnimeSourcesWithFavoriteCount( private val repository: AnimeSourceRepository, private val preferences: SourcePreferences, ) { fun subscribe(): Flow>> { return combine( preferences.migrationSortingDirection().changes(), preferences.migrationSortingMode().changes(), repository.getAnimeSourcesWithFavoriteCount(), ) { direction, mode, list -> list .filterNot { it.first.id == LocalAnimeSource.ID } .sortedWith(sortFn(direction, mode)) } } private fun sortFn( direction: SetMigrateSorting.Direction, sorting: SetMigrateSorting.Mode, ): java.util.Comparator> { val sortFn: (Pair, Pair) -> Int = { a, b -> when (sorting) { SetMigrateSorting.Mode.ALPHABETICAL -> { when { a.first.isStub && !b.first.isStub -> -1 b.first.isStub && !a.first.isStub -> 1 else -> a.first.name.lowercase().compareToWithCollator(b.first.name.lowercase()) } } SetMigrateSorting.Mode.TOTAL -> { when { a.first.isStub && !b.first.isStub -> -1 b.first.isStub && !a.first.isStub -> 1 else -> a.second.compareTo(b.second) } } } } return when (direction) { SetMigrateSorting.Direction.ASCENDING -> Comparator(sortFn) SetMigrateSorting.Direction.DESCENDING -> Collections.reverseOrder(sortFn) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/GetEnabledAnimeSources.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.model.Pin import tachiyomi.domain.source.anime.model.Pins import tachiyomi.domain.source.anime.repository.AnimeSourceRepository import tachiyomi.source.local.entries.anime.LocalAnimeSource class GetEnabledAnimeSources( private val repository: AnimeSourceRepository, private val preferences: SourcePreferences, ) { fun subscribe(): Flow> { return combine( preferences.pinnedAnimeSources().changes(), preferences.enabledLanguages().changes(), preferences.disabledAnimeSources().changes(), preferences.lastUsedAnimeSource().changes(), repository.getAnimeSources(), ) { pinnedSourceIds, enabledLanguages, disabledSources, lastUsedSource, sources -> sources .filter { it.lang in enabledLanguages || it.id == LocalAnimeSource.ID } .filterNot { it.id.toString() in disabledSources } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) .flatMap { val flag = if ("${it.id}" in pinnedSourceIds) Pins.pinned else Pins.unpinned val source = it.copy(pin = flag) val toFlatten = mutableListOf(source) if (source.id == lastUsedSource) { toFlatten.add(source.copy(isUsedLast = true, pin = source.pin - Pin.Actual)) } toFlatten } } .distinctUntilChanged() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/GetLanguagesWithAnimeSources.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.repository.AnimeSourceRepository import java.util.SortedMap class GetLanguagesWithAnimeSources( private val repository: AnimeSourceRepository, private val preferences: SourcePreferences, ) { fun subscribe(): Flow>> { return combine( preferences.enabledLanguages().changes(), preferences.disabledAnimeSources().changes(), repository.getOnlineAnimeSources(), ) { enabledLanguage, disabledSource, onlineSources -> val sortedSources = onlineSources.sortedWith( compareBy { it.id.toString() in disabledSource } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }, ) sortedSources .groupBy { it.lang } .toSortedMap( compareBy { it !in enabledLanguage }.then(LocaleHelper.comparator), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/ToggleAnimeIncognito.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet class ToggleAnimeIncognito( private val preferences: SourcePreferences, ) { fun await(extensions: String, enable: Boolean) { preferences.incognitoAnimeExtensions().getAndSet { if (enable) it.plus(extensions) else it.minus(extensions) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/ToggleAnimeSource.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.anime.model.AnimeSource class ToggleAnimeSource( private val preferences: SourcePreferences, ) { fun await(source: AnimeSource, enable: Boolean = isEnabled(source.id)) { await(source.id, enable) } fun await(sourceId: Long, enable: Boolean = isEnabled(sourceId)) { preferences.disabledAnimeSources().getAndSet { disabled -> if (enable) disabled.minus("$sourceId") else disabled.plus("$sourceId") } } fun await(sourceIds: List, enable: Boolean) { val transformedSourceIds = sourceIds.map { it.toString() } preferences.disabledAnimeSources().getAndSet { disabled -> if (enable) { disabled.minus(transformedSourceIds) } else { disabled.plus( transformedSourceIds, ) } } } private fun isEnabled(sourceId: Long): Boolean { return sourceId.toString() in preferences.disabledAnimeSources().get() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/interactor/ToggleAnimeSourcePin.kt ================================================ package eu.kanade.domain.source.anime.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.anime.model.AnimeSource class ToggleAnimeSourcePin( private val preferences: SourcePreferences, ) { fun await(source: AnimeSource) { val isPinned = source.id.toString() in preferences.pinnedAnimeSources().get() preferences.pinnedAnimeSources().getAndSet { pinned -> if (isPinned) pinned.minus("${source.id}") else pinned.plus("${source.id}") } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/anime/model/AnimeSource.kt ================================================ package eu.kanade.domain.source.anime.model import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.core.graphics.drawable.toBitmap import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import tachiyomi.domain.source.anime.model.AnimeSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get val AnimeSource.icon: ImageBitmap? get() { return Injekt.get().getAppIconForSource(id) ?.toBitmap() ?.asImageBitmap() } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/interactor/SetMigrateSorting.kt ================================================ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.service.SourcePreferences class SetMigrateSorting( private val preferences: SourcePreferences, ) { fun await(mode: Mode, direction: Direction) { preferences.migrationSortingMode().set(mode) preferences.migrationSortingDirection().set(direction) } enum class Mode { ALPHABETICAL, TOTAL, } enum class Direction { ASCENDING, DESCENDING, } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt ================================================ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet class ToggleLanguage( val preferences: SourcePreferences, ) { fun await(language: String) { val isEnabled = language in preferences.enabledLanguages().get() preferences.enabledLanguages().getAndSet { enabled -> if (isEnabled) enabled.minus(language) else enabled.plus(language) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/GetEnabledMangaSources.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import tachiyomi.domain.source.manga.model.Pin import tachiyomi.domain.source.manga.model.Pins import tachiyomi.domain.source.manga.model.Source import tachiyomi.domain.source.manga.repository.MangaSourceRepository import tachiyomi.source.local.entries.manga.LocalMangaSource class GetEnabledMangaSources( private val repository: MangaSourceRepository, private val preferences: SourcePreferences, ) { fun subscribe(): Flow> { return combine( preferences.pinnedMangaSources().changes(), preferences.enabledLanguages().changes(), combine( preferences.disabledMangaSources().changes(), preferences.lastUsedMangaSource().changes(), // SY --> preferences.dataSaverExcludedSources().changes(), // SY <-- ) { a, b, c -> Triple(a, b, c) }, repository.getMangaSources(), ) { pinnedSourceIds, enabledLanguages, (disabledSources, lastUsedSource, excludedFromDataSaver), sources -> sources .filter { it.lang in enabledLanguages || it.id == LocalMangaSource.ID } .filterNot { it.id.toString() in disabledSources } .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }) .flatMap { val flag = if ("${it.id}" in pinnedSourceIds) Pins.pinned else Pins.unpinned val source = it.copy( pin = flag, // SY --> isExcludedFromDataSaver = it.id.toString() in excludedFromDataSaver, // SY <-- ) val toFlatten = mutableListOf(source) if (source.id == lastUsedSource) { toFlatten.add(source.copy(isUsedLast = true, pin = source.pin - Pin.Actual)) } toFlatten } } .distinctUntilChanged() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/GetLanguagesWithMangaSources.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import tachiyomi.domain.source.manga.model.Source import tachiyomi.domain.source.manga.repository.MangaSourceRepository import java.util.SortedMap class GetLanguagesWithMangaSources( private val repository: MangaSourceRepository, private val preferences: SourcePreferences, ) { fun subscribe(): Flow>> { return combine( preferences.enabledLanguages().changes(), preferences.disabledMangaSources().changes(), repository.getOnlineMangaSources(), ) { enabledLanguage, disabledSource, onlineSources -> val sortedSources = onlineSources.sortedWith( compareBy { it.id.toString() in disabledSource } .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }, ) sortedSources .groupBy { it.lang } .toSortedMap( compareBy { it !in enabledLanguage }.then(LocaleHelper.comparator), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/GetMangaIncognitoState.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged class GetMangaIncognitoState( private val basePreferences: BasePreferences, private val sourcePreferences: SourcePreferences, private val extensionManager: MangaExtensionManager, ) { fun await(sourceId: Long?): Boolean { if (basePreferences.incognitoMode().get()) return true if (sourceId == null) return false val extensionPackage = extensionManager.getExtensionPackage(sourceId) ?: return false return extensionPackage in sourcePreferences.incognitoMangaExtensions().get() } fun subscribe(sourceId: Long?): Flow { if (sourceId == null) return basePreferences.incognitoMode().changes() return combine( basePreferences.incognitoMode().changes(), sourcePreferences.incognitoMangaExtensions().changes(), extensionManager.getExtensionPackageAsFlow(sourceId), ) { incognito, incognitoExtensions, extensionPackage -> incognito || (extensionPackage in incognitoExtensions) } .distinctUntilChanged() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/GetMangaSourcesWithFavoriteCount.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import tachiyomi.core.common.util.lang.compareToWithCollator import tachiyomi.domain.source.manga.model.Source import tachiyomi.domain.source.manga.repository.MangaSourceRepository import tachiyomi.source.local.entries.manga.LocalMangaSource import java.util.Collections class GetMangaSourcesWithFavoriteCount( private val repository: MangaSourceRepository, private val preferences: SourcePreferences, ) { fun subscribe(): Flow>> { return combine( preferences.migrationSortingDirection().changes(), preferences.migrationSortingMode().changes(), repository.getMangaSourcesWithFavoriteCount(), ) { direction, mode, list -> list .filterNot { it.first.id == LocalMangaSource.ID } .sortedWith(sortFn(direction, mode)) } } private fun sortFn( direction: SetMigrateSorting.Direction, sorting: SetMigrateSorting.Mode, ): java.util.Comparator> { val sortFn: (Pair, Pair) -> Int = { a, b -> when (sorting) { SetMigrateSorting.Mode.ALPHABETICAL -> { when { a.first.isStub && !b.first.isStub -> -1 b.first.isStub && !a.first.isStub -> 1 else -> a.first.name.lowercase().compareToWithCollator(b.first.name.lowercase()) } } SetMigrateSorting.Mode.TOTAL -> { when { a.first.isStub && !b.first.isStub -> -1 b.first.isStub && !a.first.isStub -> 1 else -> a.second.compareTo(b.second) } } } } return when (direction) { SetMigrateSorting.Direction.ASCENDING -> Comparator(sortFn) SetMigrateSorting.Direction.DESCENDING -> Collections.reverseOrder(sortFn) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/ToggleExcludeFromMangaDataSaver.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.manga.model.Source class ToggleExcludeFromMangaDataSaver( private val preferences: SourcePreferences, ) { fun await(source: Source) { preferences.dataSaverExcludedSources().getAndSet { if (source.id.toString() in it) { it - source.id.toString() } else { it + source.id.toString() } } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/ToggleMangaIncognito.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet class ToggleMangaIncognito( private val preferences: SourcePreferences, ) { fun await(extensions: String, enable: Boolean) { preferences.incognitoMangaExtensions().getAndSet { if (enable) it.plus(extensions) else it.minus(extensions) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/ToggleMangaSource.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.manga.model.Source class ToggleMangaSource( private val preferences: SourcePreferences, ) { fun await(source: Source, enable: Boolean = isEnabled(source.id)) { await(source.id, enable) } fun await(sourceId: Long, enable: Boolean = isEnabled(sourceId)) { preferences.disabledMangaSources().getAndSet { disabled -> if (enable) disabled.minus("$sourceId") else disabled.plus("$sourceId") } } fun await(sourceIds: List, enable: Boolean) { val transformedSourceIds = sourceIds.map { it.toString() } preferences.disabledMangaSources().getAndSet { disabled -> if (enable) { disabled.minus(transformedSourceIds) } else { disabled.plus( transformedSourceIds, ) } } } private fun isEnabled(sourceId: Long): Boolean { return sourceId.toString() in preferences.disabledMangaSources().get() } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/interactor/ToggleMangaSourcePin.kt ================================================ package eu.kanade.domain.source.manga.interactor import eu.kanade.domain.source.service.SourcePreferences import tachiyomi.core.common.preference.getAndSet import tachiyomi.domain.source.manga.model.Source class ToggleMangaSourcePin( private val preferences: SourcePreferences, ) { fun await(source: Source) { val isPinned = source.id.toString() in preferences.pinnedMangaSources().get() preferences.pinnedMangaSources().getAndSet { pinned -> if (isPinned) pinned.minus("${source.id}") else pinned.plus("${source.id}") } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/manga/model/MangaSource.kt ================================================ package eu.kanade.domain.source.manga.model import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.core.graphics.drawable.toBitmap import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import tachiyomi.domain.source.manga.model.Source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get val Source.icon: ImageBitmap? get() { return Injekt.get().getAppIconForSource(id) ?.toBitmap() ?.asImageBitmap() } ================================================ FILE: app/src/main/java/eu/kanade/domain/source/service/SourcePreferences.kt ================================================ package eu.kanade.domain.source.service import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.preference.getEnum import tachiyomi.domain.library.model.LibraryDisplayMode class SourcePreferences( private val preferenceStore: PreferenceStore, ) { // Common options fun sourceDisplayMode() = preferenceStore.getObject( "pref_display_mode_catalogue", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize, ) fun enabledLanguages() = preferenceStore.getStringSet( "source_languages", LocaleHelper.getDefaultEnabledLanguages(), ) fun showNsfwSource() = preferenceStore.getBoolean("show_nsfw_source", true) fun migrationSortingMode() = preferenceStore.getEnum( "pref_migration_sorting", SetMigrateSorting.Mode.ALPHABETICAL, ) fun migrationSortingDirection() = preferenceStore.getEnum( "pref_migration_direction", SetMigrateSorting.Direction.ASCENDING, ) fun animeExtensionRepos() = preferenceStore.getStringSet("anime_extension_repos", emptySet()) fun mangaExtensionRepos() = preferenceStore.getStringSet("extension_repos", emptySet()) fun trustedExtensions() = preferenceStore.getStringSet( Preference.appStateKey("trusted_extensions"), emptySet(), ) fun globalSearchFilterState() = preferenceStore.getBoolean( Preference.appStateKey("has_filters_toggle_state"), false, ) // Mixture Sources fun disabledAnimeSources() = preferenceStore.getStringSet("hidden_anime_catalogues", emptySet()) fun disabledMangaSources() = preferenceStore.getStringSet("hidden_catalogues", emptySet()) fun incognitoAnimeExtensions() = preferenceStore.getStringSet("incognito_anime_extensions", emptySet()) fun incognitoMangaExtensions() = preferenceStore.getStringSet("incognito_manga_extensions", emptySet()) fun pinnedAnimeSources() = preferenceStore.getStringSet("pinned_anime_catalogues", emptySet()) fun pinnedMangaSources() = preferenceStore.getStringSet("pinned_catalogues", emptySet()) fun lastUsedAnimeSource() = preferenceStore.getLong( Preference.appStateKey("last_anime_catalogue_source"), -1, ) fun lastUsedMangaSource() = preferenceStore.getLong( Preference.appStateKey("last_catalogue_source"), -1, ) fun animeExtensionUpdatesCount() = preferenceStore.getInt("animeext_updates_count", 0) fun mangaExtensionUpdatesCount() = preferenceStore.getInt("ext_updates_count", 0) fun hideInAnimeLibraryItems() = preferenceStore.getBoolean( "browse_hide_in_anime_library_items", false, ) fun hideInMangaLibraryItems() = preferenceStore.getBoolean( "browse_hide_in_library_items", false, ) // SY --> // fun enableSourceBlacklist() = preferenceStore.getBoolean("eh_enable_source_blacklist", true) // fun sourcesTabCategories() = preferenceStore.getStringSet("sources_tab_categories", mutableSetOf()) // fun sourcesTabCategoriesFilter() = preferenceStore.getBoolean("sources_tab_categories_filter", false) // fun sourcesTabSourcesInCategories() = preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf()) fun dataSaver() = preferenceStore.getEnum("data_saver", DataSaver.NONE) fun dataSaverIgnoreJpeg() = preferenceStore.getBoolean("ignore_jpeg", false) fun dataSaverIgnoreGif() = preferenceStore.getBoolean("ignore_gif", true) fun dataSaverImageQuality() = preferenceStore.getInt("data_saver_image_quality", 80) fun dataSaverImageFormatJpeg() = preferenceStore.getBoolean( "data_saver_image_format_jpeg", false, ) fun dataSaverServer() = preferenceStore.getString("data_saver_server", "") fun dataSaverColorBW() = preferenceStore.getBoolean("data_saver_color_bw", false) fun dataSaverExcludedSources() = preferenceStore.getStringSet("data_saver_excluded", emptySet()) fun dataSaverDownloader() = preferenceStore.getBoolean("data_saver_downloader", true) enum class DataSaver { NONE, BANDWIDTH_HERO, WSRV_NL, RESMUSH_IT, } // SY <-- } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/interactor/AddAnimeTracks.kt ================================================ package eu.kanade.domain.track.anime.interactor import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.domain.track.anime.model.toDomainTrack import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.history.anime.interactor.GetAnimeHistory import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.ZoneOffset class AddAnimeTracks( private val insertTrack: InsertAnimeTrack, private val syncChapterProgressWithTrack: SyncEpisodeProgressWithTrack, private val getEpisodesByAnimeId: GetEpisodesByAnimeId, private val trackerManager: TrackerManager, ) { // TODO: update all trackers based on common data suspend fun bind(tracker: AnimeTracker, item: AnimeTrack, animeId: Long) = withNonCancellableContext { withIOContext { val allChapters = getEpisodesByAnimeId.await(animeId) val hasSeenEpisodes = allChapters.any { it.seen } tracker.bind(item, hasSeenEpisodes) var track = item.toDomainTrack(idRequired = false) ?: return@withIOContext insertTrack.await(track) // TODO: merge into [SyncChapterProgressWithTrack]? // Update chapter progress if newer chapters marked read locally if (hasSeenEpisodes) { val latestLocalReadChapterNumber = allChapters .sortedBy { it.episodeNumber } .takeWhile { it.seen } .lastOrNull() ?.episodeNumber ?: -1.0 if (latestLocalReadChapterNumber > track.lastEpisodeSeen) { track = track.copy( lastEpisodeSeen = latestLocalReadChapterNumber, ) tracker.setRemoteLastEpisodeSeen(track.toDbTrack(), latestLocalReadChapterNumber.toInt()) } if (track.startDate <= 0) { val firstReadChapterDate = Injekt.get().await(animeId) .sortedBy { it.seenAt } .firstOrNull() ?.seenAt firstReadChapterDate?.let { val startDate = firstReadChapterDate.time.convertEpochMillisZone( ZoneOffset.systemDefault(), ZoneOffset.UTC, ) track = track.copy( startDate = startDate, ) tracker.setRemoteStartDate(track.toDbTrack(), startDate) } } } syncChapterProgressWithTrack.await(animeId, track, tracker) } } suspend fun bindEnhancedTrackers(anime: Anime, source: AnimeSource) = withNonCancellableContext { withIOContext { trackerManager.loggedInTrackers() .filterIsInstance() .filter { it.accept(source) } .forEach { service -> try { service.match(anime)?.let { track -> track.anime_id = anime.id (service as Tracker).animeService.bind(track) insertTrack.await(track.toDomainTrack(idRequired = false)!!) syncChapterProgressWithTrack.await( anime.id, track.toDomainTrack(idRequired = false)!!, service.animeService, ) } } catch (e: Exception) { logcat( LogPriority.WARN, e, ) { "Could not match anime: ${anime.title} with service $service" } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/interactor/RefreshAnimeTracks.kt ================================================ package eu.kanade.domain.track.anime.interactor import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.domain.track.anime.model.toDomainTrack import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.supervisorScope import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack class RefreshAnimeTracks( private val getTracks: GetAnimeTracks, private val trackerManager: TrackerManager, private val insertTrack: InsertAnimeTrack, private val syncEpisodeProgressWithTrack: SyncEpisodeProgressWithTrack, ) { /** * Fetches updated tracking data from all logged in trackers. * * @return Failed updates. */ suspend fun await(animeId: Long): List> { return supervisorScope { return@supervisorScope getTracks.await(animeId) .map { it to trackerManager.get(it.trackerId) } .filter { (_, service) -> service?.isLoggedIn == true } .map { (track, service) -> async { return@async try { val updatedTrack = service!!.animeService.refresh(track.toDbTrack()).toDomainTrack()!! insertTrack.await(updatedTrack) syncEpisodeProgressWithTrack.await(animeId, updatedTrack, service.animeService) null } catch (e: Throwable) { service to e } } } .awaitAll() .filterNotNull() } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/interactor/SyncEpisodeProgressWithTrack.kt ================================================ package eu.kanade.domain.track.anime.interactor import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.toEpisodeUpdate import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import tachiyomi.domain.track.anime.model.AnimeTrack import kotlin.math.max class SyncEpisodeProgressWithTrack( private val updateEpisode: UpdateEpisode, private val insertTrack: InsertAnimeTrack, private val getEpisodesByAnimeId: GetEpisodesByAnimeId, ) { suspend fun await( animeId: Long, remoteTrack: AnimeTrack, service: AnimeTracker, ) { if (service !is EnhancedAnimeTracker) { return } val sortedEpisodes = getEpisodesByAnimeId.await(animeId) .sortedBy { it.episodeNumber } .filter { it.isRecognizedNumber } val episodeUpdates = sortedEpisodes .filter { episode -> episode.episodeNumber <= remoteTrack.lastEpisodeSeen && !episode.seen } .map { it.copy(seen = true).toEpisodeUpdate() } // only take into account continuous watching val localLastSeen = sortedEpisodes.takeWhile { it.seen }.lastOrNull()?.episodeNumber ?: 0F val lastSeen = max(remoteTrack.lastEpisodeSeen, localLastSeen.toDouble()) val updatedTrack = remoteTrack.copy(lastEpisodeSeen = lastSeen) try { service.update(updatedTrack.toDbTrack()) updateEpisode.awaitAll(episodeUpdates) insertTrack.await(updatedTrack) } catch (e: Throwable) { logcat(LogPriority.WARN, e) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/interactor/TrackEpisode.kt ================================================ package eu.kanade.domain.track.anime.interactor import android.content.Context import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.domain.track.anime.model.toDomainTrack import eu.kanade.domain.track.anime.service.DelayedAnimeTrackingUpdateJob import eu.kanade.domain.track.anime.store.DelayedAnimeTrackingStore import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.util.system.isOnline import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import logcat.LogPriority import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack class TrackEpisode( private val getTracks: GetAnimeTracks, private val trackerManager: TrackerManager, private val insertTrack: InsertAnimeTrack, private val delayedTrackingStore: DelayedAnimeTrackingStore, ) { suspend fun await(context: Context, animeId: Long, episodeNumber: Double, setupJobOnFailure: Boolean = true) { withNonCancellableContext { val tracks = getTracks.await(animeId) if (tracks.isEmpty()) return@withNonCancellableContext tracks.mapNotNull { track -> val service = trackerManager.get(track.trackerId) if (service == null || !service.isLoggedIn || episodeNumber <= track.lastEpisodeSeen) { return@mapNotNull null } async { runCatching { if (context.isOnline()) { val updatedTrack = service.animeService.refresh(track.toDbTrack()) .toDomainTrack(idRequired = true)!! .copy(lastEpisodeSeen = episodeNumber) service.animeService.update(updatedTrack.toDbTrack(), true) insertTrack.await(updatedTrack) delayedTrackingStore.removeAnimeItem(track.id) } else { delayedTrackingStore.addAnime(track.id, episodeNumber) if (setupJobOnFailure) { DelayedAnimeTrackingUpdateJob.setupTask(context) } } } } } .awaitAll() .mapNotNull { it.exceptionOrNull() } .forEach { logcat(LogPriority.INFO, it) } } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/model/AnimeTrack.kt ================================================ package eu.kanade.domain.track.anime.model import tachiyomi.domain.track.anime.model.AnimeTrack import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack as DbAnimeTrack fun AnimeTrack.copyPersonalFrom(other: AnimeTrack): AnimeTrack { return this.copy( lastEpisodeSeen = other.lastEpisodeSeen, score = other.score, status = other.status, startDate = other.startDate, finishDate = other.finishDate, private = other.private, ) } fun AnimeTrack.toDbTrack(): DbAnimeTrack = DbAnimeTrack.create(trackerId).also { it.id = id it.anime_id = animeId it.remote_id = remoteId it.library_id = libraryId it.title = title it.last_episode_seen = lastEpisodeSeen it.total_episodes = totalEpisodes it.status = status it.score = score it.tracking_url = remoteUrl it.started_watching_date = startDate it.finished_watching_date = finishDate it.private = private } fun DbAnimeTrack.toDomainTrack(idRequired: Boolean = true): AnimeTrack? { val trackId = id ?: if (!idRequired) -1 else return null return AnimeTrack( id = trackId, animeId = anime_id, trackerId = tracker_id.toLong(), remoteId = remote_id, libraryId = library_id, title = title, lastEpisodeSeen = last_episode_seen, totalEpisodes = total_episodes, status = status, score = score, remoteUrl = tracking_url, startDate = started_watching_date, finishDate = finished_watching_date, private = private, ) } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/service/DelayedAnimeTrackingUpdateJob.kt ================================================ package eu.kanade.domain.track.anime.service import android.content.Context import androidx.work.BackoffPolicy import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkerParameters import eu.kanade.domain.track.anime.interactor.TrackEpisode import eu.kanade.domain.track.anime.store.DelayedAnimeTrackingStore import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.minutes import kotlin.time.toJavaDuration class DelayedAnimeTrackingUpdateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { if (runAttemptCount > 3) { return Result.failure() } val getTracks = Injekt.get() val trackEpisode = Injekt.get() val delayedTrackingStore = Injekt.get() withIOContext { delayedTrackingStore.getAnimeItems() .mapNotNull { val track = getTracks.awaitOne(it.trackId) if (track == null) { delayedTrackingStore.removeAnimeItem(it.trackId) } track?.copy(lastEpisodeSeen = it.lastEpisodeSeen.toDouble()) } .forEach { animeTrack -> logcat(LogPriority.DEBUG) { "Updating delayed track item: ${animeTrack.animeId}" + ", last chapter read: ${animeTrack.lastEpisodeSeen}" } trackEpisode.await( context, animeTrack.animeId, animeTrack.lastEpisodeSeen, setupJobOnFailure = false, ) } } return if (delayedTrackingStore.getAnimeItems().isEmpty()) Result.success() else Result.retry() } companion object { private const val TAG = "DelayedAnimeTrackingUpdate" fun setupTask(context: Context) { val constraints = Constraints( requiredNetworkType = NetworkType.CONNECTED, ) val request = OneTimeWorkRequestBuilder() .setConstraints(constraints) .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 5.minutes.toJavaDuration()) .addTag(TAG) .build() context.workManager.enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/anime/store/DelayedAnimeTrackingStore.kt ================================================ package eu.kanade.domain.track.anime.store import android.content.Context import androidx.core.content.edit import logcat.LogPriority import tachiyomi.core.common.util.system.logcat class DelayedAnimeTrackingStore(context: Context) { /** * Preference file where queued tracking updates are stored. */ private val preferences = context.getSharedPreferences("tracking_queue", Context.MODE_PRIVATE) fun addAnime(trackId: Long, lastEpisodeSeen: Double) { val previousLastEpisodeSeen = preferences.getFloat(trackId.toString(), 0f) if (lastEpisodeSeen > previousLastEpisodeSeen) { logcat(LogPriority.DEBUG) { "Queuing track item: $trackId, last episode seen: $lastEpisodeSeen" } preferences.edit { putFloat(trackId.toString(), lastEpisodeSeen.toFloat()) } } } fun removeAnimeItem(trackId: Long) { preferences.edit { remove(trackId.toString()) } } fun getAnimeItems(): List { return preferences.all.mapNotNull { DelayedAnimeTrackingItem( trackId = it.key.toLong(), lastEpisodeSeen = it.value.toString().toFloat(), ) } } data class DelayedAnimeTrackingItem( val trackId: Long, val lastEpisodeSeen: Float, ) } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/interactor/AddMangaTracks.kt ================================================ package eu.kanade.domain.track.manga.interactor import eu.kanade.domain.track.manga.model.toDbTrack import eu.kanade.domain.track.manga.model.toDomainTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.history.manga.interactor.GetMangaHistory import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.track.manga.interactor.InsertMangaTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.ZoneOffset class AddMangaTracks( private val insertTrack: InsertMangaTrack, private val syncChapterProgressWithTrack: SyncChapterProgressWithTrack, private val getChaptersByMangaId: GetChaptersByMangaId, private val trackerManager: TrackerManager, ) { // TODO: update all trackers based on common data suspend fun bind(tracker: MangaTracker, item: MangaTrack, mangaId: Long) = withNonCancellableContext { withIOContext { val allChapters = getChaptersByMangaId.await(mangaId) val hasReadChapters = allChapters.any { it.read } tracker.bind(item, hasReadChapters) var track = item.toDomainTrack(idRequired = false) ?: return@withIOContext insertTrack.await(track) // TODO: merge into [SyncChapterProgressWithTrack]? // Update chapter progress if newer chapters marked read locally if (hasReadChapters) { val latestLocalReadChapterNumber = allChapters .sortedBy { it.chapterNumber } .takeWhile { it.read } .lastOrNull() ?.chapterNumber ?: -1.0 if (latestLocalReadChapterNumber > track.lastChapterRead) { track = track.copy( lastChapterRead = latestLocalReadChapterNumber, ) tracker.setRemoteLastChapterRead(track.toDbTrack(), latestLocalReadChapterNumber.toInt()) } if (track.startDate <= 0) { val firstReadChapterDate = Injekt.get().await(mangaId) .sortedBy { it.readAt } .firstOrNull() ?.readAt firstReadChapterDate?.let { val startDate = firstReadChapterDate.time.convertEpochMillisZone( ZoneOffset.systemDefault(), ZoneOffset.UTC, ) track = track.copy( startDate = startDate, ) tracker.setRemoteStartDate(track.toDbTrack(), startDate) } } } syncChapterProgressWithTrack.await(mangaId, track, tracker) } } suspend fun bindEnhancedTrackers(manga: Manga, source: MangaSource) = withNonCancellableContext { withIOContext { trackerManager.loggedInTrackers() .filterIsInstance() .filter { it.accept(source) } .forEach { service -> try { service.match(manga)?.let { track -> track.manga_id = manga.id (service as Tracker).mangaService.bind(track) insertTrack.await(track.toDomainTrack(idRequired = false)!!) syncChapterProgressWithTrack.await( manga.id, track.toDomainTrack(idRequired = false)!!, service.mangaService, ) } } catch (e: Exception) { logcat( LogPriority.WARN, e, ) { "Could not match manga: ${manga.title} with service $service" } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/interactor/RefreshMangaTracks.kt ================================================ package eu.kanade.domain.track.manga.interactor import eu.kanade.domain.track.manga.model.toDbTrack import eu.kanade.domain.track.manga.model.toDomainTrack import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.supervisorScope import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.domain.track.manga.interactor.InsertMangaTrack class RefreshMangaTracks( private val getTracks: GetMangaTracks, private val trackerManager: TrackerManager, private val insertTrack: InsertMangaTrack, private val syncChapterProgressWithTrack: SyncChapterProgressWithTrack, ) { /** * Fetches updated tracking data from all logged in trackers. * * @return Failed updates. */ suspend fun await(mangaId: Long): List> { return supervisorScope { return@supervisorScope getTracks.await(mangaId) .map { it to trackerManager.get(it.trackerId) } .filter { (_, service) -> service?.isLoggedIn == true } .map { (track, service) -> async { return@async try { val updatedTrack = service!!.mangaService.refresh(track.toDbTrack()).toDomainTrack()!! insertTrack.await(updatedTrack) syncChapterProgressWithTrack.await(mangaId, updatedTrack, service.mangaService) null } catch (e: Throwable) { service to e } } } .awaitAll() .filterNotNull() } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/interactor/SyncChapterProgressWithTrack.kt ================================================ package eu.kanade.domain.track.manga.interactor import eu.kanade.domain.track.manga.model.toDbTrack import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.items.chapter.interactor.UpdateChapter import tachiyomi.domain.items.chapter.model.toChapterUpdate import tachiyomi.domain.track.manga.interactor.InsertMangaTrack import tachiyomi.domain.track.manga.model.MangaTrack import kotlin.math.max class SyncChapterProgressWithTrack( private val updateChapter: UpdateChapter, private val insertTrack: InsertMangaTrack, private val getChaptersByMangaId: GetChaptersByMangaId, ) { suspend fun await( mangaId: Long, remoteTrack: MangaTrack, tracker: MangaTracker, ) { if (tracker !is EnhancedMangaTracker) { return } val sortedChapters = getChaptersByMangaId.await(mangaId) .sortedBy { it.chapterNumber } .filter { it.isRecognizedNumber } val chapterUpdates = sortedChapters .filter { chapter -> chapter.chapterNumber <= remoteTrack.lastChapterRead && !chapter.read } .map { it.copy(read = true).toChapterUpdate() } // only take into account continuous reading val localLastRead = sortedChapters.takeWhile { it.read }.lastOrNull()?.chapterNumber ?: 0F val lastRead = max(remoteTrack.lastChapterRead, localLastRead.toDouble()) val updatedTrack = remoteTrack.copy(lastChapterRead = lastRead) try { tracker.update(updatedTrack.toDbTrack()) updateChapter.awaitAll(chapterUpdates) insertTrack.await(updatedTrack) } catch (e: Throwable) { logcat(LogPriority.WARN, e) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/interactor/TrackChapter.kt ================================================ package eu.kanade.domain.track.manga.interactor import android.content.Context import eu.kanade.domain.track.manga.model.toDbTrack import eu.kanade.domain.track.manga.model.toDomainTrack import eu.kanade.domain.track.manga.service.DelayedMangaTrackingUpdateJob import eu.kanade.domain.track.manga.store.DelayedMangaTrackingStore import eu.kanade.tachiyomi.data.track.TrackerManager import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import logcat.LogPriority import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.domain.track.manga.interactor.InsertMangaTrack class TrackChapter( private val getTracks: GetMangaTracks, private val trackerManager: TrackerManager, private val insertTrack: InsertMangaTrack, private val delayedTrackingStore: DelayedMangaTrackingStore, ) { suspend fun await(context: Context, mangaId: Long, chapterNumber: Double, setupJobOnFailure: Boolean = true) { withNonCancellableContext { val tracks = getTracks.await(mangaId) if (tracks.isEmpty()) return@withNonCancellableContext tracks.mapNotNull { track -> val service = trackerManager.get(track.trackerId) if (service == null || !service.isLoggedIn || chapterNumber <= track.lastChapterRead) { if (service == null || !service.isLoggedIn || chapterNumber <= track.lastChapterRead) { return@mapNotNull null } } async { runCatching { try { val updatedTrack = service.mangaService.refresh(track.toDbTrack()) .toDomainTrack(idRequired = true)!! .copy(lastChapterRead = chapterNumber) service.mangaService.update(updatedTrack.toDbTrack(), true) insertTrack.await(updatedTrack) delayedTrackingStore.removeMangaItem(track.id) } catch (e: Exception) { delayedTrackingStore.addManga(track.id, chapterNumber) if (setupJobOnFailure) { DelayedMangaTrackingUpdateJob.setupTask(context) } throw e } } } } .awaitAll() .mapNotNull { it.exceptionOrNull() } .forEach { logcat(LogPriority.INFO, it) } } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/model/MangaTrack.kt ================================================ package eu.kanade.domain.track.manga.model import tachiyomi.domain.track.manga.model.MangaTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack as DbMangaTrack fun MangaTrack.copyPersonalFrom(other: MangaTrack): MangaTrack { return this.copy( lastChapterRead = other.lastChapterRead, score = other.score, status = other.status, startDate = other.startDate, finishDate = other.finishDate, private = other.private, ) } fun MangaTrack.toDbTrack(): DbMangaTrack = DbMangaTrack.create(trackerId).also { it.id = id it.manga_id = mangaId it.remote_id = remoteId it.library_id = libraryId it.title = title it.last_chapter_read = lastChapterRead it.total_chapters = totalChapters it.status = status it.score = score it.tracking_url = remoteUrl it.started_reading_date = startDate it.finished_reading_date = finishDate it.private = private } fun DbMangaTrack.toDomainTrack(idRequired: Boolean = true): MangaTrack? { val trackId = id ?: if (!idRequired) -1 else return null return MangaTrack( id = trackId, mangaId = manga_id, trackerId = tracker_id, remoteId = remote_id, libraryId = library_id, title = title, lastChapterRead = last_chapter_read, totalChapters = total_chapters, status = status, score = score, remoteUrl = tracking_url, startDate = started_reading_date, finishDate = finished_reading_date, private = private, ) } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/service/DelayedMangaTrackingUpdateJob.kt ================================================ package eu.kanade.domain.track.manga.service import android.content.Context import androidx.work.BackoffPolicy import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkerParameters import eu.kanade.domain.track.manga.interactor.TrackChapter import eu.kanade.domain.track.manga.store.DelayedMangaTrackingStore import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.manga.interactor.GetMangaTracks import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.TimeUnit class DelayedMangaTrackingUpdateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { override suspend fun doWork(): Result { if (runAttemptCount > 3) { return Result.failure() } val getTracks = Injekt.get() val trackChapter = Injekt.get() val delayedTrackingStore = Injekt.get() withIOContext { delayedTrackingStore.getMangaItems() .mapNotNull { val track = getTracks.awaitOne(it.trackId) if (track == null) { delayedTrackingStore.removeMangaItem(it.trackId) } track?.copy(lastChapterRead = it.lastChapterRead.toDouble()) } .forEach { track -> logcat(LogPriority.DEBUG) { "Updating delayed track item: ${track.mangaId}, last chapter read: ${track.lastChapterRead}" } trackChapter.await(context, track.mangaId, track.lastChapterRead, setupJobOnFailure = false) } } return if (delayedTrackingStore.getMangaItems().isEmpty()) Result.success() else Result.retry() } companion object { private const val TAG = "DelayedMangaTrackingUpdate" fun setupTask(context: Context) { val constraints = Constraints( requiredNetworkType = NetworkType.CONNECTED, ) val request = OneTimeWorkRequestBuilder() .setConstraints(constraints) .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 5, TimeUnit.MINUTES) .addTag(TAG) .build() context.workManager.enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/manga/store/DelayedMangaTrackingStore.kt ================================================ package eu.kanade.domain.track.manga.store import android.content.Context import androidx.core.content.edit import logcat.LogPriority import tachiyomi.core.common.util.system.logcat class DelayedMangaTrackingStore(context: Context) { /** * Preference file where queued tracking updates are stored. */ private val preferences = context.getSharedPreferences("tracking_queue", Context.MODE_PRIVATE) fun addManga(trackId: Long, lastChapterRead: Double) { val previousLastChapterRead = preferences.getFloat(trackId.toString(), 0f) if (lastChapterRead > previousLastChapterRead) { logcat(LogPriority.DEBUG) { "Queuing track item: $trackId, last chapter read: $lastChapterRead" } preferences.edit { putFloat(trackId.toString(), lastChapterRead.toFloat()) } } } fun removeMangaItem(trackId: Long) { preferences.edit { remove(trackId.toString()) } } fun getMangaItems(): List { return preferences.all.mapNotNull { DelayedTrackingItem( trackId = it.key.toLong(), lastChapterRead = it.value.toString().toFloat(), ) } } data class DelayedTrackingItem( val trackId: Long, val lastChapterRead: Float, ) } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/model/AutoTrackState.kt ================================================ package eu.kanade.domain.track.model import dev.icerock.moko.resources.StringResource import tachiyomi.i18n.MR enum class AutoTrackState(val titleRes: StringResource) { ALWAYS(MR.strings.lock_always), ASK(MR.strings.default_category_summary), NEVER(MR.strings.lock_never), } ================================================ FILE: app/src/main/java/eu/kanade/domain/track/service/TrackPreferences.kt ================================================ package eu.kanade.domain.track.service import eu.kanade.domain.track.model.AutoTrackState import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.anilist.Anilist import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.preference.getEnum class TrackPreferences( private val preferenceStore: PreferenceStore, ) { fun trackUsername(tracker: Tracker) = preferenceStore.getString( Preference.privateKey("pref_mangasync_username_${tracker.id}"), "", ) fun trackPassword(tracker: Tracker) = preferenceStore.getString( Preference.privateKey("pref_mangasync_password_${tracker.id}"), "", ) fun trackAuthExpired(tracker: Tracker) = preferenceStore.getBoolean( Preference.privateKey("pref_tracker_auth_expired_${tracker.id}"), false, ) fun setCredentials(tracker: Tracker, username: String, password: String) { trackUsername(tracker).set(username) trackPassword(tracker).set(password) trackAuthExpired(tracker).set(false) } fun trackToken(tracker: Tracker) = preferenceStore.getString(Preference.privateKey("track_token_${tracker.id}"), "") fun anilistScoreType() = preferenceStore.getString("anilist_score_type", Anilist.POINT_10) fun autoUpdateTrack() = preferenceStore.getBoolean("pref_auto_update_manga_sync_key", true) fun trackOnAddingToLibrary() = preferenceStore.getBoolean("track_on_adding_to_library", true) fun showNextEpisodeAiringTime() = preferenceStore.getBoolean( "show_next_episode_airing_time", true, ) fun autoUpdateTrackOnMarkRead() = preferenceStore.getEnum( "pref_auto_update_manga_on_mark_read", AutoTrackState.ALWAYS, ) } ================================================ FILE: app/src/main/java/eu/kanade/domain/ui/UiPreferences.kt ================================================ package eu.kanade.domain.ui import eu.kanade.domain.ui.model.AppTheme import eu.kanade.domain.ui.model.NavStyle import eu.kanade.domain.ui.model.StartScreen import eu.kanade.domain.ui.model.TabletUiMode import eu.kanade.domain.ui.model.ThemeMode import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.preference.getEnum import java.time.format.DateTimeFormatter import java.time.format.FormatStyle import java.util.Locale class UiPreferences( private val preferenceStore: PreferenceStore, ) { fun themeMode() = preferenceStore.getEnum("pref_theme_mode_key", ThemeMode.SYSTEM) fun appTheme() = preferenceStore.getEnum( "pref_app_theme", if (DeviceUtil.isDynamicColorAvailable) { AppTheme.MONET } else { AppTheme.DEFAULT }, ) fun themeDarkAmoled() = preferenceStore.getBoolean("pref_theme_dark_amoled_key", false) fun relativeTime() = preferenceStore.getBoolean("relative_time_v2", true) fun dateFormat() = preferenceStore.getString("app_date_format", "") fun tabletUiMode() = preferenceStore.getEnum("tablet_ui_mode", TabletUiMode.AUTOMATIC) fun startScreen() = preferenceStore.getEnum("start_screen", StartScreen.ANIME) fun navStyle() = preferenceStore.getEnum("bottom_rail_nav_style", NavStyle.MOVE_HISTORY_TO_MORE) companion object { fun dateFormat(format: String): DateTimeFormatter = when (format) { "" -> DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) else -> DateTimeFormatter.ofPattern(format, Locale.getDefault()) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt ================================================ package eu.kanade.domain.ui.model import dev.icerock.moko.resources.StringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR enum class AppTheme(val titleRes: StringResource?) { DEFAULT(MR.strings.label_default), MONET(MR.strings.theme_monet), CLOUDFLARE(AYMR.strings.theme_cloudflare), COTTONCANDY(AYMR.strings.theme_cottoncandy), DOOM(AYMR.strings.theme_doom), GREEN_APPLE(MR.strings.theme_greenapple), LAVENDER(MR.strings.theme_lavender), MATRIX(AYMR.strings.theme_matrix), MIDNIGHT_DUSK(MR.strings.theme_midnightdusk), MOCHA(AYMR.strings.theme_mocha), SAPPHIRE(AYMR.strings.theme_sapphire), NORD(MR.strings.theme_nord), STRAWBERRY_DAIQUIRI(MR.strings.theme_strawberrydaiquiri), TAKO(MR.strings.theme_tako), TEALTURQUOISE(MR.strings.theme_tealturquoise), TIDAL_WAVE(MR.strings.theme_tidalwave), YINYANG(MR.strings.theme_yinyang), YOTSUBA(MR.strings.theme_yotsuba), MONOCHROME(MR.strings.theme_monochrome), // Deprecated DARK_BLUE(null), HOT_PINK(null), BLUE(null), } ================================================ FILE: app/src/main/java/eu/kanade/domain/ui/model/NavStyle.kt ================================================ package eu.kanade.domain.ui.model import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.CollectionsBookmark import androidx.compose.material.icons.outlined.Explore import androidx.compose.material.icons.outlined.History import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.BrowseTab import eu.kanade.tachiyomi.ui.history.HistoriesTab import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryTab import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryTab import eu.kanade.tachiyomi.ui.more.MoreTab import eu.kanade.tachiyomi.ui.updates.UpdatesTab import tachiyomi.i18n.aniyomi.AYMR enum class NavStyle( val titleRes: StringResource, val moreTab: Tab, ) { MOVE_MANGA_TO_MORE(titleRes = AYMR.strings.pref_bottom_nav_no_manga, moreTab = MangaLibraryTab), MOVE_UPDATES_TO_MORE(titleRes = AYMR.strings.pref_bottom_nav_no_updates, moreTab = UpdatesTab), MOVE_HISTORY_TO_MORE(titleRes = AYMR.strings.pref_bottom_nav_no_history, moreTab = HistoriesTab), MOVE_BROWSE_TO_MORE(titleRes = AYMR.strings.pref_bottom_nav_no_browse, moreTab = BrowseTab), ; val moreIcon: ImageVector @Composable get() = when (this) { MOVE_MANGA_TO_MORE -> Icons.Outlined.CollectionsBookmark MOVE_UPDATES_TO_MORE -> ImageVector.vectorResource(id = R.drawable.ic_updates_outline_24dp) MOVE_HISTORY_TO_MORE -> Icons.Outlined.History MOVE_BROWSE_TO_MORE -> Icons.Outlined.Explore } val tabs: List get() { return mutableListOf( AnimeLibraryTab, MangaLibraryTab, UpdatesTab, HistoriesTab, BrowseTab, MoreTab, ).apply { remove(this@NavStyle.moreTab) } } } ================================================ FILE: app/src/main/java/eu/kanade/domain/ui/model/StartScreen.kt ================================================ package eu.kanade.domain.ui.model import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.ui.browse.BrowseTab import eu.kanade.tachiyomi.ui.history.HistoriesTab import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryTab import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryTab import eu.kanade.tachiyomi.ui.updates.UpdatesTab import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR enum class StartScreen(val titleRes: StringResource, val tab: Tab) { ANIME(AYMR.strings.label_anime, AnimeLibraryTab), MANGA(AYMR.strings.manga, MangaLibraryTab), UPDATES(MR.strings.label_recent_updates, UpdatesTab), HISTORY(MR.strings.label_recent_manga, HistoriesTab), BROWSE(MR.strings.browse, BrowseTab), } ================================================ FILE: app/src/main/java/eu/kanade/domain/ui/model/TabletUiMode.kt ================================================ package eu.kanade.domain.ui.model import dev.icerock.moko.resources.StringResource import tachiyomi.i18n.MR enum class TabletUiMode(val titleRes: StringResource) { AUTOMATIC(MR.strings.automatic_background), ALWAYS(MR.strings.lock_always), LANDSCAPE(MR.strings.landscape), NEVER(MR.strings.lock_never), } ================================================ FILE: app/src/main/java/eu/kanade/domain/ui/model/ThemeMode.kt ================================================ package eu.kanade.domain.ui.model import androidx.appcompat.app.AppCompatDelegate enum class ThemeMode { LIGHT, DARK, SYSTEM, } fun setAppCompatDelegateThemeMode(themeMode: ThemeMode) { AppCompatDelegate.setDefaultNightMode( when (themeMode) { ThemeMode.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO ThemeMode.DARK -> AppCompatDelegate.MODE_NIGHT_YES ThemeMode.SYSTEM -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/BaseBrowseItem.kt ================================================ package eu.kanade.presentation.browse import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import tachiyomi.presentation.core.components.material.padding @Composable fun BaseBrowseItem( modifier: Modifier = Modifier, onClickItem: () -> Unit = {}, onLongClickItem: () -> Unit = {}, icon: @Composable RowScope.() -> Unit = {}, action: @Composable RowScope.() -> Unit = {}, content: @Composable RowScope.() -> Unit = {}, ) { Row( modifier = modifier .combinedClickable( onClick = onClickItem, onLongClick = onLongClickItem, ) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, ) { icon() content() action() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/BrowseBadges.kt ================================================ package eu.kanade.presentation.browse import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.CollectionsBookmark import androidx.compose.runtime.Composable import tachiyomi.presentation.core.components.Badge @Composable fun InLibraryBadge(enabled: Boolean) { if (enabled) { Badge( imageVector = Icons.Outlined.CollectionsBookmark, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/BrowseSourceDialogs.kt ================================================ package eu.kanade.presentation.browse import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable fun RemoveEntryDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, entryToRemove: String, ) { AlertDialog( onDismissRequest = onDismissRequest, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { onDismissRequest() onConfirm() }, ) { Text(text = stringResource(MR.strings.action_remove)) } }, title = { Text(text = stringResource(MR.strings.are_you_sure)) }, text = { Text(text = stringResource(MR.strings.remove_manga, entryToRemove)) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/BrowseSourceLoadingItem.kt ================================================ package eu.kanade.presentation.browse import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable internal fun BrowseSourceLoadingItem() { Row( modifier = Modifier .fillMaxWidth() .padding(vertical = 16.dp), horizontalArrangement = Arrangement.Center, ) { CircularProgressIndicator() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/GlobalSearchResultItems.kt ================================================ package eu.kanade.presentation.browse import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowForward import androidx.compose.material.icons.outlined.Error import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun GlobalSearchResultItem( title: String, subtitle: String, onClick: () -> Unit, modifier: Modifier = Modifier, content: @Composable () -> Unit, ) { Column(modifier = modifier) { Row( modifier = Modifier .padding( start = MaterialTheme.padding.medium, end = MaterialTheme.padding.extraSmall, ) .fillMaxWidth() .clickable(onClick = onClick), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Column { Text( text = title, style = MaterialTheme.typography.titleMedium, ) Text(text = subtitle) } IconButton(onClick = onClick) { Icon(imageVector = Icons.AutoMirrored.Outlined.ArrowForward, contentDescription = null) } } content() } } @Composable fun GlobalSearchLoadingResultItem() { Box( modifier = Modifier .fillMaxWidth() .padding(vertical = MaterialTheme.padding.medium), ) { CircularProgressIndicator( modifier = Modifier .size(16.dp) .align(Alignment.Center), strokeWidth = 2.dp, ) } } @Composable fun GlobalSearchErrorResultItem(message: String?) { Column( modifier = Modifier .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ) .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { Icon(imageVector = Icons.Outlined.Error, contentDescription = null) Spacer(Modifier.height(4.dp)) Text( text = message ?: stringResource(MR.strings.unknown_error), textAlign = TextAlign.Center, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/GlobalSerachCard.kt ================================================ package eu.kanade.presentation.browse import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryComfortableGridItem import tachiyomi.domain.entries.EntryCover @Composable fun GlobalSearchCard( title: String, cover: EntryCover, isFavorite: Boolean, onClick: () -> Unit, onLongClick: () -> Unit, ) { Box(modifier = Modifier.width(96.dp)) { EntryComfortableGridItem( title = title, coverData = cover, coverBadgeStart = { InLibraryBadge(enabled = isFavorite) }, coverAlpha = if (isFavorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, onClick = onClick, onLongClick = onLongClick, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionDetailsScreen.kt ================================================ package eu.kanade.presentation.browse.anime import android.content.Intent import android.net.Uri import android.provider.Settings import android.util.DisplayMetrics import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Launch import androidx.compose.material.icons.outlined.Settings import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import eu.kanade.domain.extension.anime.interactor.AnimeExtensionSourceItem import eu.kanade.presentation.browse.anime.components.AnimeExtensionIcon import eu.kanade.presentation.browse.manga.NsfwWarningDialog import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.more.settings.widget.TrailingWidgetBuffer import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.ui.browse.anime.extension.details.AnimeExtensionDetailsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun AnimeExtensionDetailsScreen( navigateUp: () -> Unit, state: AnimeExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, onClickIncognito: (Boolean) -> Unit, ) { val uriHandler = LocalUriHandler.current val url = remember(state.extension) { val regex = """https://raw.githubusercontent.com/(.+?)/(.+?)/.+""".toRegex() regex.find(state.extension?.repoUrl.orEmpty()) ?.let { val (user, repo) = it.destructured "https://github.com/$user/$repo" } ?: state.extension?.repoUrl } Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_extension_info), navigateUp = navigateUp, actions = { AppBarActions( actions = persistentListOf().builder() .apply { if (url != null) { add( AppBar.Action( title = stringResource(MR.strings.action_open_repo), icon = Icons.AutoMirrored.Outlined.Launch, onClick = { uriHandler.openUri(url) }, ), ) } addAll( listOf( AppBar.OverflowAction( title = stringResource(MR.strings.action_enable_all), onClick = onClickEnableAll, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_disable_all), onClick = onClickDisableAll, ), AppBar.OverflowAction( title = stringResource(MR.strings.pref_clear_cookies), onClick = onClickClearCookies, ), ), ) } .build(), ) }, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> if (state.extension == null) { EmptyScreen( MR.strings.empty_screen, modifier = Modifier.padding(paddingValues), ) return@Scaffold } AnimeExtensionDetails( contentPadding = paddingValues, extension = state.extension, sources = state.sources, incognitoMode = state.isIncognito, onClickSourcePreferences = onClickSourcePreferences, onClickUninstall = onClickUninstall, onClickSource = onClickSource, onClickIncognito = onClickIncognito, ) } } @Composable private fun AnimeExtensionDetails( contentPadding: PaddingValues, extension: AnimeExtension.Installed, sources: ImmutableList, incognitoMode: Boolean, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, onClickIncognito: (Boolean) -> Unit, ) { val context = LocalContext.current var showNsfwWarning by remember { mutableStateOf(false) } ScrollbarLazyColumn( contentPadding = contentPadding, ) { if (extension.isObsolete) { item { WarningBanner(MR.strings.obsolete_extension_message) } } item { DetailsHeader( extension = extension, extIncognitoMode = incognitoMode, onClickUninstall = onClickUninstall, onClickAppInfo = { Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { data = Uri.fromParts("package", extension.pkgName, null) context.startActivity(this) } Unit }.takeIf { extension.isShared }, onClickAgeRating = { showNsfwWarning = true }, onExtIncognitoChange = onClickIncognito, ) } items( items = sources, key = { it.source.id }, ) { source -> SourceSwitchPreference( modifier = Modifier.animateItem(), source = source, onClickSourcePreferences = onClickSourcePreferences, onClickSource = onClickSource, ) } } if (showNsfwWarning) { NsfwWarningDialog( onClickConfirm = { showNsfwWarning = false }, ) } } @Composable private fun DetailsHeader( extension: AnimeExtension, extIncognitoMode: Boolean, onClickAgeRating: () -> Unit, onClickUninstall: () -> Unit, onClickAppInfo: (() -> Unit)?, onExtIncognitoChange: (Boolean) -> Unit, ) { val context = LocalContext.current Column { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = MaterialTheme.padding.medium) .padding( top = MaterialTheme.padding.medium, bottom = MaterialTheme.padding.small, ) .clickable { val extDebugInfo = buildString { append( """ Extension name: ${extension.name} (lang: ${extension.lang}; package: ${extension.pkgName}) Extension version: ${extension.versionName} (lib: ${extension.libVersion}; version code: ${extension.versionCode}) NSFW: ${extension.isNsfw} """.trimIndent(), ) if (extension is AnimeExtension.Installed) { append("\n\n") append( """ Update available: ${extension.hasUpdate} Obsolete: ${extension.isObsolete} Shared: ${extension.isShared} Repository: ${extension.repoUrl} """.trimIndent(), ) } } context.copyToClipboard("Extension Debug information", extDebugInfo) }, horizontalAlignment = Alignment.CenterHorizontally, ) { AnimeExtensionIcon( modifier = Modifier .size(112.dp), extension = extension, density = DisplayMetrics.DENSITY_XXXHIGH, ) Text( text = extension.name, style = MaterialTheme.typography.headlineSmall, textAlign = TextAlign.Center, ) val strippedPkgName = extension.pkgName.substringAfter( "eu.kanade.tachiyomi.animeextension.", ) Text( text = strippedPkgName, style = MaterialTheme.typography.bodySmall, ) } Row( modifier = Modifier .fillMaxWidth() .padding( horizontal = MaterialTheme.padding.extraLarge, vertical = MaterialTheme.padding.small, ), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically, ) { InfoText( modifier = Modifier.weight(1f), primaryText = extension.versionName, secondaryText = stringResource(MR.strings.ext_info_version), ) InfoDivider() InfoText( modifier = Modifier.weight(if (extension.isNsfw) 1.5f else 1f), primaryText = LocaleHelper.getSourceDisplayName(extension.lang, context), secondaryText = stringResource(MR.strings.ext_info_language), ) if (extension.isNsfw) { InfoDivider() InfoText( modifier = Modifier.weight(1f), primaryText = stringResource(MR.strings.ext_nsfw_short), primaryTextStyle = MaterialTheme.typography.bodyLarge.copy( color = MaterialTheme.colorScheme.error, fontWeight = FontWeight.Medium, ), secondaryText = stringResource(MR.strings.ext_info_age_rating), onClick = onClickAgeRating, ) } } Row( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .padding(top = MaterialTheme.padding.small), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { OutlinedButton( modifier = Modifier.weight(1f), onClick = onClickUninstall, ) { Text(stringResource(MR.strings.ext_uninstall)) } if (onClickAppInfo != null) { Button( modifier = Modifier.weight(1f), onClick = onClickAppInfo, ) { Text( text = stringResource(MR.strings.ext_app_info), color = MaterialTheme.colorScheme.onPrimary, ) } } } TextPreferenceWidget( modifier = Modifier.padding(horizontal = MaterialTheme.padding.small), title = stringResource(MR.strings.pref_incognito_mode), subtitle = stringResource(MR.strings.pref_incognito_mode_extension_summary), icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), widget = { Row( verticalAlignment = Alignment.CenterVertically, ) { Switch( checked = extIncognitoMode, onCheckedChange = onExtIncognitoChange, modifier = Modifier.padding(start = TrailingWidgetBuffer), ) } }, ) HorizontalDivider() } } @Composable private fun InfoText( primaryText: String, secondaryText: String, modifier: Modifier = Modifier, primaryTextStyle: TextStyle = MaterialTheme.typography.bodyLarge, onClick: (() -> Unit)? = null, ) { val clickableModifier = if (onClick != null) { Modifier.clickable(interactionSource = null, indication = null, onClick = onClick) } else { Modifier } Column( modifier = modifier.then(clickableModifier), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { Text( text = primaryText, textAlign = TextAlign.Center, style = primaryTextStyle, ) Text( text = secondaryText + if (onClick != null) " ⓘ" else "", textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f), ) } } @Composable private fun InfoDivider() { VerticalDivider( modifier = Modifier.height(20.dp), ) } @Composable private fun SourceSwitchPreference( source: AnimeExtensionSourceItem, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickSource: (sourceId: Long) -> Unit, modifier: Modifier = Modifier, ) { val context = LocalContext.current TextPreferenceWidget( modifier = modifier, title = if (source.labelAsName) { source.source.toString() } else { LocaleHelper.getSourceDisplayName(source.source.lang, context) }, widget = { Row( verticalAlignment = Alignment.CenterVertically, ) { if (source.source is ConfigurableAnimeSource) { IconButton(onClick = { onClickSourcePreferences(source.source.id) }) { Icon( imageVector = Icons.Outlined.Settings, contentDescription = stringResource(MR.strings.label_settings), tint = MaterialTheme.colorScheme.onSurface, ) } } Switch( checked = source.enabled, onCheckedChange = null, modifier = Modifier.padding(start = TrailingWidgetBuffer), ) } }, onPreferenceClick = { onClickSource(source.source.id) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionFilterScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.tachiyomi.ui.browse.anime.extension.AnimeExtensionFilterState import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun AnimeExtensionFilterScreen( navigateUp: () -> Unit, state: AnimeExtensionFilterState.Success, onClickToggle: (String) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_extensions), navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.empty_screen, modifier = Modifier.padding(contentPadding), ) return@Scaffold } AnimeExtensionFilterContent( contentPadding = contentPadding, state = state, onClickLang = onClickToggle, ) } } @Composable private fun AnimeExtensionFilterContent( contentPadding: PaddingValues, state: AnimeExtensionFilterState.Success, onClickLang: (String) -> Unit, ) { val context = LocalContext.current LazyColumn( contentPadding = contentPadding, ) { items(state.languages) { language -> SwitchPreferenceWidget( modifier = Modifier.animateItem(), title = LocaleHelper.getSourceDisplayName(language, context), checked = language in state.enabledLanguages, onCheckedChanged = { onClickLang(language) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/AnimeExtensionsScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.GetApp import androidx.compose.material.icons.outlined.Public import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.VerifiedUser import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.BaseBrowseItem import eu.kanade.presentation.browse.anime.components.AnimeExtensionIcon import eu.kanade.presentation.browse.manga.ExtensionHeader import eu.kanade.presentation.browse.manga.ExtensionTrustDialog import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.entries.components.DotSeparatorNoSpaceText import eu.kanade.presentation.more.settings.screen.browse.AnimeExtensionReposScreen import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.ui.browse.anime.extension.AnimeExtensionUiModel import eu.kanade.tachiyomi.ui.browse.anime.extension.AnimeExtensionsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreenAction import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun AnimeExtensionScreen( state: AnimeExtensionsScreenModel.State, contentPadding: PaddingValues, searchQuery: String?, onLongClickItem: (AnimeExtension) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onOpenWebView: (AnimeExtension.Available) -> Unit, onInstallExtension: (AnimeExtension.Available) -> Unit, onUninstallExtension: (AnimeExtension) -> Unit, onUpdateExtension: (AnimeExtension.Installed) -> Unit, onTrustExtension: (AnimeExtension.Untrusted) -> Unit, onOpenExtension: (AnimeExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, onRefresh: () -> Unit, ) { val navigator = LocalNavigator.currentOrThrow PullRefresh( refreshing = state.isRefreshing, onRefresh = onRefresh, enabled = !state.isLoading, ) { when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> { val msg = if (!searchQuery.isNullOrEmpty()) { MR.strings.no_results_found } else { MR.strings.empty_screen } EmptyScreen( stringRes = msg, modifier = Modifier.padding(contentPadding), actions = persistentListOf( EmptyScreenAction( stringRes = MR.strings.label_extension_repos, icon = Icons.Outlined.Settings, onClick = { navigator.push(AnimeExtensionReposScreen()) }, ), ), ) } else -> { AnimeExtensionContent( state = state, contentPadding = contentPadding, onLongClickItem = onLongClickItem, onClickItemCancel = onClickItemCancel, onOpenWebView = onOpenWebView, onInstallExtension = onInstallExtension, onUninstallExtension = onUninstallExtension, onUpdateExtension = onUpdateExtension, onTrustExtension = onTrustExtension, onOpenExtension = onOpenExtension, onClickUpdateAll = onClickUpdateAll, ) } } } } @Composable private fun AnimeExtensionContent( state: AnimeExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (AnimeExtension) -> Unit, onOpenWebView: (AnimeExtension.Available) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onInstallExtension: (AnimeExtension.Available) -> Unit, onUninstallExtension: (AnimeExtension) -> Unit, onUpdateExtension: (AnimeExtension.Installed) -> Unit, onTrustExtension: (AnimeExtension.Untrusted) -> Unit, onOpenExtension: (AnimeExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) { val context = LocalContext.current var trustState by remember { mutableStateOf(null) } val installGranted = rememberRequestPackageInstallsPermissionState(initialValue = true) FastScrollLazyColumn( contentPadding = contentPadding + topSmallPaddingValues, ) { if (!installGranted && state.installer?.requiresSystemPermission == true) { item(key = "extension-permissions-warning") { WarningBanner( textRes = MR.strings.ext_permission_install_apps_warning, modifier = Modifier.clickable { context.launchRequestPackageInstallsPermission() }, ) } } state.items.forEach { (header, items) -> item( contentType = "header", key = "extensionHeader-${header.hashCode()}", ) { when (header) { is AnimeExtensionUiModel.Header.Resource -> { val action: @Composable RowScope.() -> Unit = if (header.textRes == MR.strings.ext_updates_pending) { { Button(onClick = { onClickUpdateAll() }) { Text( text = stringResource(MR.strings.ext_update_all), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.onPrimary, ), ) } } } else { {} } ExtensionHeader( textRes = header.textRes, modifier = Modifier.animateItemFastScroll(), action = action, ) } is AnimeExtensionUiModel.Header.Text -> { ExtensionHeader( text = header.text, modifier = Modifier.animateItemFastScroll(), ) } } } items( items = items, contentType = { "item" }, key = { item -> when (item.extension) { is AnimeExtension.Untrusted -> "extension-untrusted-${item.hashCode()}" is AnimeExtension.Installed -> "extension-installed-${item.hashCode()}" is AnimeExtension.Available -> "extension-available-${item.hashCode()}" } }, ) { item -> AnimeExtensionItem( item = item, modifier = Modifier.animateItemFastScroll(), onClickItem = { when (it) { is AnimeExtension.Available -> onInstallExtension(it) is AnimeExtension.Installed -> onOpenExtension(it) is AnimeExtension.Untrusted -> { trustState = it } } }, onLongClickItem = onLongClickItem, onClickItemSecondaryAction = { when (it) { is AnimeExtension.Available -> onOpenWebView(it) is AnimeExtension.Installed -> onOpenExtension(it) else -> {} } }, onClickItemCancel = onClickItemCancel, onClickItemAction = { when (it) { is AnimeExtension.Available -> onInstallExtension(it) is AnimeExtension.Installed -> { if (it.hasUpdate) { onUpdateExtension(it) } else { onOpenExtension(it) } } is AnimeExtension.Untrusted -> { trustState = it } } }, ) } } } if (trustState != null) { ExtensionTrustDialog( onClickConfirm = { onTrustExtension(trustState!!) trustState = null }, onClickDismiss = { onUninstallExtension(trustState!!) trustState = null }, onDismissRequest = { trustState = null }, ) } } @Composable private fun AnimeExtensionItem( item: AnimeExtensionUiModel.Item, onClickItem: (AnimeExtension) -> Unit, onLongClickItem: (AnimeExtension) -> Unit, onClickItemCancel: (AnimeExtension) -> Unit, onClickItemAction: (AnimeExtension) -> Unit, modifier: Modifier = Modifier, onClickItemSecondaryAction: (AnimeExtension) -> Unit, ) { val (extension, installStep) = item BaseBrowseItem( modifier = modifier .combinedClickable( onClick = { onClickItem(extension) }, onLongClick = { onLongClickItem(extension) }, ), onClickItem = { onClickItem(extension) }, onLongClickItem = { onLongClickItem(extension) }, icon = { Box( modifier = Modifier .size(40.dp), contentAlignment = Alignment.Center, ) { val idle = installStep.isCompleted() if (!idle) { CircularProgressIndicator( modifier = Modifier.size(40.dp), strokeWidth = 2.dp, ) } val padding by animateDpAsState( targetValue = if (idle) 0.dp else 8.dp, label = "iconPadding", ) AnimeExtensionIcon( extension = extension, modifier = Modifier .matchParentSize() .padding(padding), ) } }, action = { AnimeExtensionItemActions( extension = extension, installStep = installStep, onClickItemCancel = onClickItemCancel, onClickItemAction = onClickItemAction, onClickItemSecondaryAction = onClickItemSecondaryAction, ) }, ) { AnimeExtensionItemContent( extension = extension, installStep = installStep, modifier = Modifier.weight(1f), ) } } @Composable private fun AnimeExtensionItemContent( extension: AnimeExtension, installStep: InstallStep, modifier: Modifier = Modifier, ) { Column( modifier = modifier.padding(start = MaterialTheme.padding.medium), ) { Text( text = extension.name, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) // Won't look good but it's not like we can ellipsize overflowing content FlowRow( modifier = Modifier.secondaryItemAlpha(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { ProvideTextStyle(value = MaterialTheme.typography.bodySmall) { if (extension is AnimeExtension.Installed && extension.lang.isNotEmpty()) { Text( text = LocaleHelper.getSourceDisplayName( extension.lang, LocalContext.current, ), ) } if (extension.versionName.isNotEmpty()) { Text( text = extension.versionName, ) } val warning = when { extension is AnimeExtension.Untrusted -> MR.strings.ext_untrusted extension is AnimeExtension.Installed && extension.isObsolete -> MR.strings.ext_obsolete extension.isNsfw -> MR.strings.ext_nsfw_short else -> null } if (warning != null) { Text( text = stringResource(warning).uppercase(), color = MaterialTheme.colorScheme.error, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } if (!installStep.isCompleted()) { DotSeparatorNoSpaceText() Text( text = when (installStep) { InstallStep.Pending -> stringResource(MR.strings.ext_pending) InstallStep.Downloading -> stringResource(MR.strings.ext_downloading) InstallStep.Installing -> stringResource(MR.strings.ext_installing) else -> error("Must not show non-install process text") }, ) } } } } } @Composable private fun AnimeExtensionItemActions( extension: AnimeExtension, installStep: InstallStep, modifier: Modifier = Modifier, onClickItemCancel: (AnimeExtension) -> Unit = {}, onClickItemAction: (AnimeExtension) -> Unit = {}, onClickItemSecondaryAction: (AnimeExtension) -> Unit = {}, ) { val isIdle = installStep.isCompleted() Row( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { when { !isIdle -> { IconButton(onClick = { onClickItemCancel(extension) }) { Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_cancel), ) } } installStep == InstallStep.Error -> { IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.Refresh, contentDescription = stringResource(MR.strings.action_retry), ) } } installStep == InstallStep.Idle -> { when (extension) { is AnimeExtension.Installed -> { IconButton(onClick = { onClickItemSecondaryAction(extension) }) { Icon( imageVector = Icons.Outlined.Settings, contentDescription = stringResource(MR.strings.action_settings), ) } if (extension.hasUpdate) { IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.GetApp, contentDescription = stringResource(MR.strings.ext_update), ) } } } is AnimeExtension.Untrusted -> { IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.VerifiedUser, contentDescription = stringResource(MR.strings.ext_trust), ) } } is AnimeExtension.Available -> { if (extension.sources.isNotEmpty()) { IconButton( onClick = { onClickItemSecondaryAction(extension) }, ) { Icon( imageVector = Icons.Outlined.Public, contentDescription = stringResource(MR.strings.action_open_in_web_view), ) } } IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.GetApp, contentDescription = stringResource(MR.strings.ext_install), ) } } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesFilterScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material3.Checkbox import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.browse.anime.components.BaseAnimeSourceItem import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.browse.anime.source.AnimeSourcesFilterScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun AnimeSourcesFilterScreen( navigateUp: () -> Unit, state: AnimeSourcesFilterScreenModel.State.Success, onClickLanguage: (String) -> Unit, onClickSource: (AnimeSource) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_sources), navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.source_filter_empty_screen, modifier = Modifier.padding(contentPadding), ) return@Scaffold } AnimeSourcesFilterContent( contentPadding = contentPadding, state = state, onClickLanguage = onClickLanguage, onClickSource = onClickSource, ) } } @Composable private fun AnimeSourcesFilterContent( contentPadding: PaddingValues, state: AnimeSourcesFilterScreenModel.State.Success, onClickLanguage: (String) -> Unit, onClickSource: (AnimeSource) -> Unit, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { state.items.forEach { (language, sources) -> val enabled = language in state.enabledLanguages item( key = language, contentType = "source-filter-header", ) { AnimeSourcesFilterHeader( modifier = Modifier.animateItemFastScroll(), language = language, enabled = enabled, onClickItem = onClickLanguage, ) } if (enabled) { items( items = sources, key = { "source-filter-${it.key()}" }, contentType = { "source-filter-item" }, ) { source -> AnimeSourcesFilterItem( modifier = Modifier.animateItemFastScroll(), source = source, isEnabled = "${source.id}" !in state.disabledSources, onClickItem = onClickSource, ) } } } } } @Composable fun AnimeSourcesFilterHeader( language: String, enabled: Boolean, onClickItem: (String) -> Unit, modifier: Modifier = Modifier, ) { SwitchPreferenceWidget( modifier = modifier, title = LocaleHelper.getSourceDisplayName(language, LocalContext.current), checked = enabled, onCheckedChanged = { onClickItem(language) }, ) } @Composable private fun AnimeSourcesFilterItem( source: AnimeSource, isEnabled: Boolean, onClickItem: (AnimeSource) -> Unit, modifier: Modifier = Modifier, ) { BaseAnimeSourceItem( modifier = modifier, source = source, showLanguageInContent = false, onClickItem = { onClickItem(source) }, action = { Checkbox(checked = isEnabled, onCheckedChange = null) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/AnimeSourcesScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PushPin import androidx.compose.material.icons.outlined.PushPin import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.anime.components.BaseAnimeSourceItem import eu.kanade.tachiyomi.ui.browse.anime.source.AnimeSourcesScreenModel import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreenModel.Listing import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.model.Pin import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.plus import tachiyomi.source.local.entries.anime.LocalAnimeSource @Composable fun AnimeSourcesScreen( state: AnimeSourcesScreenModel.State, contentPadding: PaddingValues, onClickItem: (AnimeSource, Listing) -> Unit, onClickPin: (AnimeSource) -> Unit, onLongClickItem: (AnimeSource) -> Unit, ) { when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> EmptyScreen( stringRes = MR.strings.source_empty_screen, modifier = Modifier.padding(contentPadding), ) else -> { ScrollbarLazyColumn( contentPadding = contentPadding + topSmallPaddingValues, ) { items( items = state.items, contentType = { when (it) { is AnimeSourceUiModel.Header -> "header" is AnimeSourceUiModel.Item -> "item" } }, key = { when (it) { is AnimeSourceUiModel.Header -> it.hashCode() is AnimeSourceUiModel.Item -> "source-${it.source.key()}" } }, ) { model -> when (model) { is AnimeSourceUiModel.Header -> { AnimeSourceHeader( modifier = Modifier.animateItem(), language = model.language, ) } is AnimeSourceUiModel.Item -> AnimeSourceItem( modifier = Modifier.animateItem(), source = model.source, onClickItem = onClickItem, onLongClickItem = onLongClickItem, onClickPin = onClickPin, ) } } } } } } @Composable private fun AnimeSourceHeader( language: String, modifier: Modifier = Modifier, ) { val context = LocalContext.current Text( text = LocaleHelper.getSourceDisplayName(language, context), modifier = modifier .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), style = MaterialTheme.typography.header, ) } @Composable private fun AnimeSourceItem( source: AnimeSource, onClickItem: (AnimeSource, Listing) -> Unit, onLongClickItem: (AnimeSource) -> Unit, onClickPin: (AnimeSource) -> Unit, modifier: Modifier = Modifier, ) { BaseAnimeSourceItem( modifier = modifier, source = source, onClickItem = { onClickItem(source, Listing.Popular) }, onLongClickItem = { onLongClickItem(source) }, action = { if (source.supportsLatest) { TextButton(onClick = { onClickItem(source, Listing.Latest) }) { Text( text = stringResource(MR.strings.latest), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), ) } } AnimeSourcePinButton( isPinned = Pin.Pinned in source.pin, onClick = { onClickPin(source) }, ) }, ) } @Composable private fun AnimeSourcePinButton( isPinned: Boolean, onClick: () -> Unit, ) { val icon = if (isPinned) Icons.Filled.PushPin else Icons.Outlined.PushPin val tint = if (isPinned) { MaterialTheme.colorScheme.primary } else { MaterialTheme.colorScheme.onBackground.copy( alpha = SECONDARY_ALPHA, ) } val description = if (isPinned) MR.strings.action_unpin else MR.strings.action_pin IconButton(onClick = onClick) { Icon( imageVector = icon, tint = tint, contentDescription = stringResource(description), ) } } @Composable fun AnimeSourceOptionsDialog( source: AnimeSource, onClickPin: () -> Unit, onClickDisable: () -> Unit, onDismiss: () -> Unit, ) { AlertDialog( title = { Text(text = source.visualName) }, text = { Column { val textId = if (Pin.Pinned in source.pin) MR.strings.action_unpin else MR.strings.action_pin Text( text = stringResource(textId), modifier = Modifier .clickable(onClick = onClickPin) .fillMaxWidth() .padding(vertical = 16.dp), ) if (source.id != LocalAnimeSource.ID) { Text( text = stringResource(MR.strings.action_disable), modifier = Modifier .clickable(onClick = onClickDisable) .fillMaxWidth() .padding(vertical = 16.dp), ) } } }, onDismissRequest = onDismiss, confirmButton = {}, ) } sealed interface AnimeSourceUiModel { data class Item(val source: AnimeSource) : AnimeSourceUiModel data class Header(val language: String) : AnimeSourceUiModel } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/BrowseAnimeSourceScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material.icons.outlined.Public import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.anime.components.BrowseAnimeSourceComfortableGrid import eu.kanade.presentation.browse.anime.components.BrowseAnimeSourceCompactGrid import eu.kanade.presentation.browse.anime.components.BrowseAnimeSourceList import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.formattedMessage import eu.kanade.tachiyomi.animesource.AnimeSource import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.StateFlow import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreenAction import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.anime.LocalAnimeSource @Composable fun BrowseAnimeSourceContent( source: AnimeSource?, animeList: LazyPagingItems>, columns: GridCells, entries: Int = 0, topBarHeight: Int = 0, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalAnimeSourceHelpClick: () -> Unit, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) { val context = LocalContext.current val errorState = animeList.loadState.refresh.takeIf { it is LoadState.Error } ?: animeList.loadState.append.takeIf { it is LoadState.Error } val getErrorMessage: (LoadState.Error) -> String = { state -> with(context) { state.error.formattedMessage } } LaunchedEffect(errorState) { if (animeList.itemCount > 0 && errorState != null && errorState is LoadState.Error) { val result = snackbarHostState.showSnackbar( message = getErrorMessage(errorState), actionLabel = context.stringResource(MR.strings.action_retry), duration = SnackbarDuration.Indefinite, ) when (result) { SnackbarResult.Dismissed -> snackbarHostState.currentSnackbarData?.dismiss() SnackbarResult.ActionPerformed -> animeList.retry() } } } if (animeList.itemCount <= 0 && errorState != null && errorState is LoadState.Error) { EmptyScreen( modifier = Modifier.padding(contentPadding), message = getErrorMessage(errorState), actions = if (source is LocalAnimeSource) { persistentListOf( EmptyScreenAction( stringRes = MR.strings.local_source_help_guide, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = onLocalAnimeSourceHelpClick, ), ) } else { persistentListOf( EmptyScreenAction( stringRes = MR.strings.action_retry, icon = Icons.Outlined.Refresh, onClick = animeList::refresh, ), EmptyScreenAction( stringRes = MR.strings.action_open_in_web_view, icon = Icons.Outlined.Public, onClick = onWebViewClick, ), EmptyScreenAction( stringRes = MR.strings.label_help, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = onHelpClick, ), ) }, ) return } if (animeList.itemCount == 0 && animeList.loadState.refresh is LoadState.Loading) { LoadingScreen( modifier = Modifier.padding(contentPadding), ) return } when (displayMode) { LibraryDisplayMode.ComfortableGrid -> { BrowseAnimeSourceComfortableGrid( animeList = animeList, columns = columns, contentPadding = contentPadding, onAnimeClick = onAnimeClick, onAnimeLongClick = onAnimeLongClick, ) } LibraryDisplayMode.List -> { BrowseAnimeSourceList( animeList = animeList, entries = entries, topBarHeight = topBarHeight, contentPadding = contentPadding, onAnimeClick = onAnimeClick, onAnimeLongClick = onAnimeLongClick, ) } LibraryDisplayMode.CompactGrid, LibraryDisplayMode.CoverOnlyGrid -> { BrowseAnimeSourceCompactGrid( animeList = animeList, columns = columns, contentPadding = contentPadding, onAnimeClick = onAnimeClick, onAnimeLongClick = onAnimeLongClick, ) } } } @Composable internal fun MissingSourceScreen( source: StubAnimeSource, navigateUp: () -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = source.name, navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> EmptyScreen( message = stringResource(MR.strings.source_not_installed, source.toString()), modifier = Modifier.padding(paddingValues), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/GlobalAnimeSearchScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.ui.Modifier import eu.kanade.presentation.browse.GlobalSearchErrorResultItem import eu.kanade.presentation.browse.GlobalSearchLoadingResultItem import eu.kanade.presentation.browse.GlobalSearchResultItem import eu.kanade.presentation.browse.anime.components.GlobalAnimeSearchCardRow import eu.kanade.presentation.browse.anime.components.GlobalAnimeSearchToolbar import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSearchItemResult import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSearchScreenModel import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSourceFilter import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.presentation.core.components.material.Scaffold @Composable fun GlobalAnimeSearchScreen( state: AnimeSearchScreenModel.State, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onToggleResults: () -> Unit, getAnime: @Composable (Anime) -> State, onClickSource: (AnimeCatalogueSource) -> Unit, onClickItem: (Anime) -> Unit, onLongClickItem: (Anime) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> GlobalAnimeSearchToolbar( searchQuery = state.searchQuery, progress = state.progress, total = state.total, navigateUp = navigateUp, onChangeSearchQuery = onChangeSearchQuery, onSearch = onSearch, sourceFilter = state.sourceFilter, onChangeSearchFilter = onChangeSearchFilter, onlyShowHasResults = state.onlyShowHasResults, onToggleResults = onToggleResults, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> GlobalSearchContent( items = state.filteredItems, contentPadding = paddingValues, getAnime = getAnime, onClickSource = onClickSource, onClickItem = onClickItem, onLongClickItem = onLongClickItem, ) } } @Composable internal fun GlobalSearchContent( items: Map, contentPadding: PaddingValues, getAnime: @Composable (Anime) -> State, onClickSource: (AnimeCatalogueSource) -> Unit, onClickItem: (Anime) -> Unit, onLongClickItem: (Anime) -> Unit, fromSourceId: Long? = null, ) { LazyColumn( contentPadding = contentPadding, ) { items.forEach { (source, result) -> item(key = source.id) { GlobalSearchResultItem( title = fromSourceId?.let { "▶ ${source.name}".takeIf { source.id == fromSourceId } } ?: source.name, subtitle = LocaleHelper.getLocalizedDisplayName(source.lang), onClick = { onClickSource(source) }, modifier = Modifier.animateItem(), ) { when (result) { AnimeSearchItemResult.Loading -> { GlobalSearchLoadingResultItem() } is AnimeSearchItemResult.Success -> { GlobalAnimeSearchCardRow( titles = result.result, getAnime = getAnime, onClick = onClickItem, onLongClick = onLongClickItem, ) } is AnimeSearchItemResult.Error -> { GlobalSearchErrorResultItem(message = result.throwable.message) } } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/MigrateAnimeScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.entries.anime.components.BaseAnimeListItem import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.MigrateAnimeScreenModel import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun MigrateAnimeScreen( navigateUp: () -> Unit, title: String?, state: MigrateAnimeScreenModel.State, onClickItem: (Anime) -> Unit, onClickCover: (Anime) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = title, navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.empty_screen, modifier = Modifier.padding(contentPadding), ) return@Scaffold } MigrateAnimeContent( contentPadding = contentPadding, state = state, onClickItem = onClickItem, onClickCover = onClickCover, ) } } @Composable private fun MigrateAnimeContent( contentPadding: PaddingValues, state: MigrateAnimeScreenModel.State, onClickItem: (Anime) -> Unit, onClickCover: (Anime) -> Unit, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { items(state.titles) { anime -> MigrateAnimeItem( anime = anime, onClickItem = onClickItem, onClickCover = onClickCover, ) } } } @Composable private fun MigrateAnimeItem( anime: Anime, onClickItem: (Anime) -> Unit, onClickCover: (Anime) -> Unit, modifier: Modifier = Modifier, ) { BaseAnimeListItem( modifier = modifier, anime = anime, onClickItem = { onClickItem(anime) }, onClickCover = { onClickCover(anime) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/MigrateAnimeSearchScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.runtime.Composable import androidx.compose.runtime.State import eu.kanade.presentation.browse.anime.components.GlobalAnimeSearchToolbar import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSearchScreenModel import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSourceFilter import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.presentation.core.components.material.Scaffold @Composable fun MigrateAnimeSearchScreen( state: AnimeSearchScreenModel.State, fromSourceId: Long?, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onToggleResults: () -> Unit, getAnime: @Composable (Anime) -> State, onClickSource: (AnimeCatalogueSource) -> Unit, onClickItem: (Anime) -> Unit, onLongClickItem: (Anime) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> GlobalAnimeSearchToolbar( searchQuery = state.searchQuery, progress = state.progress, total = state.total, navigateUp = navigateUp, onChangeSearchQuery = onChangeSearchQuery, onSearch = onSearch, sourceFilter = state.sourceFilter, onChangeSearchFilter = onChangeSearchFilter, onlyShowHasResults = state.onlyShowHasResults, onToggleResults = onToggleResults, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> GlobalSearchContent( fromSourceId = fromSourceId, items = state.filteredItems, contentPadding = paddingValues, getAnime = getAnime, onClickSource = onClickSource, onClickItem = onClickItem, onLongClickItem = onLongClickItem, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/MigrateAnimeSourceScreen.kt ================================================ package eu.kanade.presentation.browse.anime import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowDownward import androidx.compose.material.icons.outlined.ArrowUpward import androidx.compose.material.icons.outlined.Numbers import androidx.compose.material.icons.outlined.SortByAlpha import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.presentation.browse.anime.components.AnimeSourceIcon import eu.kanade.presentation.browse.anime.components.BaseAnimeSourceItem import eu.kanade.tachiyomi.ui.browse.anime.migration.sources.MigrateAnimeSourceScreenModel import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Badge import tachiyomi.presentation.core.components.BadgeGroup import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.Scroller.STICKY_HEADER_KEY_PREFIX import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun MigrateAnimeSourceScreen( state: MigrateAnimeSourceScreenModel.State, contentPadding: PaddingValues, onClickItem: (AnimeSource) -> Unit, onToggleSortingDirection: () -> Unit, onToggleSortingMode: () -> Unit, ) { val context = LocalContext.current when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> EmptyScreen( stringRes = MR.strings.information_empty_library, modifier = Modifier.padding(contentPadding), ) else -> MigrateAnimeSourceList( list = state.items, contentPadding = contentPadding, onClickItem = onClickItem, onLongClickItem = { source -> val sourceId = source.id.toString() context.copyToClipboard(sourceId, sourceId) }, sortingMode = state.sortingMode, onToggleSortingMode = onToggleSortingMode, sortingDirection = state.sortingDirection, onToggleSortingDirection = onToggleSortingDirection, ) } } @Composable private fun MigrateAnimeSourceList( list: ImmutableList>, contentPadding: PaddingValues, onClickItem: (AnimeSource) -> Unit, onLongClickItem: (AnimeSource) -> Unit, sortingMode: SetMigrateSorting.Mode, onToggleSortingMode: () -> Unit, sortingDirection: SetMigrateSorting.Direction, onToggleSortingDirection: () -> Unit, ) { ScrollbarLazyColumn( contentPadding = contentPadding + topSmallPaddingValues, ) { stickyHeader(key = STICKY_HEADER_KEY_PREFIX) { Row( modifier = Modifier .background(MaterialTheme.colorScheme.background) .padding(start = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(MR.strings.migration_selection_prompt), modifier = Modifier.weight(1f), style = MaterialTheme.typography.header, ) IconButton(onClick = onToggleSortingMode) { when (sortingMode) { SetMigrateSorting.Mode.ALPHABETICAL -> Icon( Icons.Outlined.SortByAlpha, contentDescription = stringResource(MR.strings.action_sort_alpha), ) SetMigrateSorting.Mode.TOTAL -> Icon( Icons.Outlined.Numbers, contentDescription = stringResource(MR.strings.action_sort_count), ) } } IconButton(onClick = onToggleSortingDirection) { when (sortingDirection) { SetMigrateSorting.Direction.ASCENDING -> Icon( Icons.Outlined.ArrowUpward, contentDescription = stringResource(MR.strings.action_asc), ) SetMigrateSorting.Direction.DESCENDING -> Icon( Icons.Outlined.ArrowDownward, contentDescription = stringResource(MR.strings.action_desc), ) } } } } items( items = list, key = { (source, _) -> "migrate-${source.id}" }, ) { (source, count) -> MigrateAnimeSourceItem( modifier = Modifier.animateItem(), source = source, count = count, onClickItem = { onClickItem(source) }, onLongClickItem = { onLongClickItem(source) }, ) } } } @Composable private fun MigrateAnimeSourceItem( source: AnimeSource, count: Long, onClickItem: () -> Unit, onLongClickItem: () -> Unit, modifier: Modifier = Modifier, ) { BaseAnimeSourceItem( modifier = modifier, source = source, showLanguageInContent = source.lang != "", onClickItem = onClickItem, onLongClickItem = onLongClickItem, icon = { AnimeSourceIcon(source = source) }, action = { BadgeGroup { Badge(text = "$count") } }, content = { _, sourceLangString -> Column( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .weight(1f), ) { Text( text = source.name.ifBlank { source.id.toString() }, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), verticalAlignment = Alignment.CenterVertically, ) { if (sourceLangString != null) { Text( modifier = Modifier.secondaryItemAlpha(), text = sourceLangString, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } if (source.isStub) { Text( modifier = Modifier.secondaryItemAlpha(), text = stringResource(MR.strings.not_installed), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error, ) } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/BaseAnimeSourceItem.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import eu.kanade.presentation.browse.BaseBrowseItem import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun BaseAnimeSourceItem( source: AnimeSource, modifier: Modifier = Modifier, showLanguageInContent: Boolean = true, onClickItem: () -> Unit = {}, onLongClickItem: () -> Unit = {}, icon: @Composable RowScope.(AnimeSource) -> Unit = defaultIcon, action: @Composable RowScope.(AnimeSource) -> Unit = {}, content: @Composable RowScope.(AnimeSource, String?) -> Unit = defaultContent, ) { val sourceLangString = LocaleHelper.getSourceDisplayName(source.lang, LocalContext.current).takeIf { showLanguageInContent } BaseBrowseItem( modifier = modifier, onClickItem = onClickItem, onLongClickItem = onLongClickItem, icon = { icon.invoke(this, source) }, action = { action.invoke(this, source) }, content = { content.invoke(this, source, sourceLangString) }, ) } private val defaultIcon: @Composable RowScope.(AnimeSource) -> Unit = { source -> AnimeSourceIcon(source = source) } private val defaultContent: @Composable RowScope.(AnimeSource, String?) -> Unit = { source, sourceLangString -> Column( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .weight(1f), ) { Text( text = source.name, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) if (sourceLangString != null) { Text( modifier = Modifier.secondaryItemAlpha(), text = sourceLangString, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/BrowseAnimeIcons.kt ================================================ package eu.kanade.presentation.browse.anime.components import android.util.DisplayMetrics import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Dangerous import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.imageResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.core.graphics.drawable.toBitmap import coil3.compose.AsyncImage import eu.kanade.domain.source.anime.model.icon import eu.kanade.presentation.util.rememberResourceBitmapPainter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionLoader import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.source.local.entries.anime.LocalAnimeSource private val defaultModifier = Modifier .height(40.dp) .aspectRatio(1f) @Composable fun AnimeSourceIcon( source: AnimeSource, modifier: Modifier = Modifier, ) { val icon = source.icon when { source.isStub && icon == null -> { Image( imageVector = Icons.Filled.Warning, contentDescription = null, colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.error), modifier = modifier.then(defaultModifier), ) } icon != null -> { Image( bitmap = icon, contentDescription = null, modifier = modifier.then(defaultModifier), ) } source.id == LocalAnimeSource.ID -> { Image( painter = painterResource(R.mipmap.ic_local_source), contentDescription = null, modifier = modifier.then(defaultModifier), ) } else -> { Image( painter = painterResource(R.mipmap.ic_default_source), contentDescription = null, modifier = modifier.then(defaultModifier), ) } } } @Composable fun AnimeExtensionIcon( extension: AnimeExtension, modifier: Modifier = Modifier, density: Int = DisplayMetrics.DENSITY_DEFAULT, ) { when (extension) { is AnimeExtension.Available -> { AsyncImage( model = extension.iconUrl, contentDescription = null, placeholder = ColorPainter(Color(0x1F888888)), error = rememberResourceBitmapPainter(id = R.drawable.cover_error), modifier = modifier .clip(MaterialTheme.shapes.extraSmall), ) } is AnimeExtension.Installed -> { val icon by extension.getIcon(density) when (icon) { is Result.Loading -> Box(modifier = modifier) is Result.Success -> Image( bitmap = (icon as Result.Success).value, contentDescription = null, modifier = modifier, ) Result.Error -> Image( bitmap = ImageBitmap.imageResource(id = R.mipmap.ic_default_source), contentDescription = null, modifier = modifier, ) } } is AnimeExtension.Untrusted -> Image( imageVector = Icons.Filled.Dangerous, contentDescription = null, colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.error), modifier = modifier.then(defaultModifier), ) } } @Composable private fun AnimeExtension.getIcon(density: Int = DisplayMetrics.DENSITY_DEFAULT): State> { val context = LocalContext.current return produceState>(initialValue = Result.Loading, this) { withIOContext { value = try { val appInfo = AnimeExtensionLoader.getAnimeExtensionPackageInfoFromPkgName( context, pkgName, )!!.applicationInfo!! val appResources = context.packageManager.getResourcesForApplication(appInfo) Result.Success( appResources.getDrawableForDensity(appInfo.icon, density, null)!! .toBitmap() .asImageBitmap(), ) } catch (e: Exception) { Result.Error } } } } sealed class Result { data object Loading : Result() data object Error : Result() data class Success(val value: T) : Result() } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/BrowseAnimeSourceComfortableGrid.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.BrowseSourceLoadingItem import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryComfortableGridItem import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.presentation.core.util.plus @Composable fun BrowseAnimeSourceComfortableGrid( animeList: LazyPagingItems>, columns: GridCells, contentPadding: PaddingValues, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) { LazyVerticalGrid( columns = columns, contentPadding = contentPadding + PaddingValues(8.dp), verticalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridVerticalSpacer), horizontalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridHorizontalSpacer), ) { if (animeList.loadState.prepend is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } items(count = animeList.itemCount) { index -> val anime by animeList[index]?.collectAsState() ?: return@items BrowseAnimeSourceComfortableGridItem( anime = anime, onClick = { onAnimeClick(anime) }, onLongClick = { onAnimeLongClick(anime) }, ) } if (animeList.loadState.refresh is LoadState.Loading || animeList.loadState.append is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } } } @Composable private fun BrowseAnimeSourceComfortableGridItem( anime: Anime, onClick: () -> Unit = {}, onLongClick: () -> Unit = onClick, ) { EntryComfortableGridItem( title = anime.title, coverData = AnimeCover( animeId = anime.id, sourceId = anime.source, isAnimeFavorite = anime.favorite, url = anime.thumbnailUrl, lastModified = anime.coverLastModified, ), coverAlpha = if (anime.favorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, coverBadgeStart = { InLibraryBadge(enabled = anime.favorite) }, onLongClick = onLongClick, onClick = onClick, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/BrowseAnimeSourceCompactGrid.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.BrowseSourceLoadingItem import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryCompactGridItem import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.presentation.core.util.plus @Composable fun BrowseAnimeSourceCompactGrid( animeList: LazyPagingItems>, columns: GridCells, contentPadding: PaddingValues, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) { LazyVerticalGrid( columns = columns, contentPadding = contentPadding + PaddingValues(8.dp), verticalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridVerticalSpacer), horizontalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridHorizontalSpacer), ) { if (animeList.loadState.prepend is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } items(count = animeList.itemCount) { index -> val anime by animeList[index]?.collectAsState() ?: return@items BrowseAnimeSourceCompactGridItem( anime = anime, onClick = { onAnimeClick(anime) }, onLongClick = { onAnimeLongClick(anime) }, ) } if (animeList.loadState.refresh is LoadState.Loading || animeList.loadState.append is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } } } @Composable private fun BrowseAnimeSourceCompactGridItem( anime: Anime, onClick: () -> Unit = {}, onLongClick: () -> Unit = onClick, ) { EntryCompactGridItem( title = anime.title, coverData = AnimeCover( animeId = anime.id, sourceId = anime.source, isAnimeFavorite = anime.favorite, url = anime.thumbnailUrl, lastModified = anime.coverLastModified, ), coverAlpha = if (anime.favorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, coverBadgeStart = { InLibraryBadge(enabled = anime.favorite) }, onLongClick = onLongClick, onClick = onClick, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/BrowseAnimeSourceList.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.BrowseSourceLoadingItem import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryListItem import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.presentation.core.util.plus @Composable fun BrowseAnimeSourceList( animeList: LazyPagingItems>, entries: Int, topBarHeight: Int, contentPadding: PaddingValues, onAnimeClick: (Anime) -> Unit, onAnimeLongClick: (Anime) -> Unit, ) { val sourceListState = rememberLazyListState() BoxWithConstraints { val density = LocalDensity.current val containerHeightPx = with(density) { this@BoxWithConstraints.maxHeight.roundToPx() } LazyColumn( state = sourceListState, contentPadding = contentPadding + PaddingValues(vertical = 8.dp), ) { item { if (animeList.loadState.prepend is LoadState.Loading) { BrowseSourceLoadingItem() } } items(count = animeList.itemCount) { index -> val anime by animeList[index]?.collectAsState() ?: return@items BrowseAnimeSourceListItem( anime = anime, onClick = { onAnimeClick(anime) }, onLongClick = { onAnimeLongClick(anime) }, entries = entries, containerHeight = containerHeightPx - topBarHeight, ) } item { if (animeList.loadState.refresh is LoadState.Loading || animeList.loadState.append is LoadState.Loading ) { BrowseSourceLoadingItem() } } } } } @Composable private fun BrowseAnimeSourceListItem( anime: Anime, onClick: () -> Unit = {}, onLongClick: () -> Unit = onClick, entries: Int, containerHeight: Int, ) { EntryListItem( title = anime.title, coverData = AnimeCover( animeId = anime.id, sourceId = anime.source, isAnimeFavorite = anime.favorite, url = anime.thumbnailUrl, lastModified = anime.coverLastModified, ), coverAlpha = if (anime.favorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, badge = { InLibraryBadge(enabled = anime.favorite) }, onLongClick = onLongClick, onClick = onClick, entries = entries, containerHeight = containerHeight, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/BrowseAnimeSourceToolbar.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ViewList import androidx.compose.material.icons.filled.ViewModule import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AppBarTitle import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.RadioMenuItem import eu.kanade.presentation.components.SearchToolbar import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.source.local.entries.anime.LocalAnimeSource @Composable fun BrowseAnimeSourceToolbar( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: AnimeSource?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) { // Avoid capturing unstable source in actions lambda val title = source?.name val isLocalSource = source is LocalAnimeSource val isConfigurableSource = source is ConfigurableAnimeSource var selectingDisplayMode by remember { mutableStateOf(false) } SearchToolbar( navigateUp = navigateUp, titleContent = { AppBarTitle(title) }, searchQuery = searchQuery, onChangeSearchQuery = onSearchQueryChange, onSearch = onSearch, onClickCloseSearch = navigateUp, actions = { AppBarActions( actions = persistentListOf().builder() .apply { add( AppBar.Action( title = stringResource(MR.strings.action_display_mode), icon = if (displayMode == LibraryDisplayMode.List) { Icons.AutoMirrored.Filled.ViewList } else { Icons.Filled.ViewModule }, onClick = { selectingDisplayMode = true }, ), ) if (isLocalSource) { add( AppBar.OverflowAction( title = stringResource(MR.strings.label_help), onClick = onHelpClick, ), ) } else { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_open_in_web_view), onClick = onWebViewClick, ), ) } if (isConfigurableSource) { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_settings), onClick = onSettingsClick, ), ) } } .build(), ) DropdownMenu( expanded = selectingDisplayMode, onDismissRequest = { selectingDisplayMode = false }, ) { RadioMenuItem( text = { Text(text = stringResource(MR.strings.action_display_comfortable_grid)) }, isChecked = displayMode == LibraryDisplayMode.ComfortableGrid, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) } RadioMenuItem( text = { Text(text = stringResource(MR.strings.action_display_grid)) }, isChecked = displayMode == LibraryDisplayMode.CompactGrid, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.CompactGrid) } RadioMenuItem( text = { Text(text = stringResource(MR.strings.action_display_list)) }, isChecked = displayMode == LibraryDisplayMode.List, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.List) } } }, scrollBehavior = scrollBehavior, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/GlobalAnimeSearchCardRow.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryComfortableGridItem import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.domain.entries.anime.model.asAnimeCover import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun GlobalAnimeSearchCardRow( titles: List, getAnime: @Composable (Anime) -> State, onClick: (Anime) -> Unit, onLongClick: (Anime) -> Unit, ) { if (titles.isEmpty()) { EmptyResultItem() return } LazyRow( contentPadding = PaddingValues(MaterialTheme.padding.small), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { items(titles) { val title by getAnime(it) AnimeItem( title = title.title, cover = title.asAnimeCover(), isFavorite = title.favorite, onClick = { onClick(title) }, onLongClick = { onLongClick(title) }, ) } } } @Composable private fun AnimeItem( title: String, cover: AnimeCover, isFavorite: Boolean, onClick: () -> Unit, onLongClick: () -> Unit, ) { Box(modifier = Modifier.width(96.dp)) { EntryComfortableGridItem( title = title, titleMaxLines = 3, coverData = cover, coverBadgeStart = { InLibraryBadge(enabled = isFavorite) }, coverAlpha = if (isFavorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, onClick = onClick, onLongClick = onLongClick, ) } } @Composable private fun EmptyResultItem() { Text( text = stringResource(MR.strings.no_results_found), modifier = Modifier .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/anime/components/GlobalAnimeSearchToolbar.kt ================================================ package eu.kanade.presentation.browse.anime.components import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.PushPin import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import eu.kanade.presentation.components.SearchToolbar import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSourceFilter import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun GlobalAnimeSearchToolbar( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: AnimeSourceFilter, onChangeSearchFilter: (AnimeSourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) { Column(modifier = Modifier.background(MaterialTheme.colorScheme.surface)) { Box { SearchToolbar( searchQuery = searchQuery, onChangeSearchQuery = onChangeSearchQuery, onSearch = onSearch, onClickCloseSearch = navigateUp, navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) if (progress in 1..>, columns: GridCells, entries: Int = 0, topBarHeight: Int = 0, displayMode: LibraryDisplayMode, snackbarHostState: SnackbarHostState, contentPadding: PaddingValues, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onLocalSourceHelpClick: () -> Unit, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) { val context = LocalContext.current val errorState = mangaList.loadState.refresh.takeIf { it is LoadState.Error } ?: mangaList.loadState.append.takeIf { it is LoadState.Error } val getErrorMessage: (LoadState.Error) -> String = { state -> with(context) { state.error.formattedMessage } } LaunchedEffect(errorState) { if (mangaList.itemCount > 0 && errorState != null && errorState is LoadState.Error) { val result = snackbarHostState.showSnackbar( message = getErrorMessage(errorState), actionLabel = context.stringResource(MR.strings.action_retry), duration = SnackbarDuration.Indefinite, ) when (result) { SnackbarResult.Dismissed -> snackbarHostState.currentSnackbarData?.dismiss() SnackbarResult.ActionPerformed -> mangaList.retry() } } } if (mangaList.itemCount <= 0 && errorState != null && errorState is LoadState.Error) { EmptyScreen( modifier = Modifier.padding(contentPadding), message = getErrorMessage(errorState), actions = if (source is LocalMangaSource) { persistentListOf( EmptyScreenAction( stringRes = MR.strings.local_source_help_guide, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = onLocalSourceHelpClick, ), ) } else { persistentListOf( EmptyScreenAction( stringRes = MR.strings.action_retry, icon = Icons.Outlined.Refresh, onClick = mangaList::refresh, ), EmptyScreenAction( stringRes = MR.strings.action_open_in_web_view, icon = Icons.Outlined.Public, onClick = onWebViewClick, ), EmptyScreenAction( stringRes = MR.strings.label_help, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = onHelpClick, ), ) }, ) return } if (mangaList.itemCount == 0 && mangaList.loadState.refresh is LoadState.Loading) { LoadingScreen( modifier = Modifier.padding(contentPadding), ) return } when (displayMode) { LibraryDisplayMode.ComfortableGrid -> { BrowseMangaSourceComfortableGrid( mangaList = mangaList, columns = columns, contentPadding = contentPadding, onMangaClick = onMangaClick, onMangaLongClick = onMangaLongClick, ) } LibraryDisplayMode.List -> { BrowseMangaSourceList( mangaList = mangaList, entries = entries, topBarHeight = topBarHeight, contentPadding = contentPadding, onMangaClick = onMangaClick, onMangaLongClick = onMangaLongClick, ) } LibraryDisplayMode.CompactGrid, LibraryDisplayMode.CoverOnlyGrid -> { BrowseMangaSourceCompactGrid( mangaList = mangaList, columns = columns, contentPadding = contentPadding, onMangaClick = onMangaClick, onMangaLongClick = onMangaLongClick, ) } } } @Composable internal fun MissingSourceScreen( source: StubMangaSource, navigateUp: () -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = source.name, navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> EmptyScreen( message = stringResource(MR.strings.source_not_installed, source.toString()), modifier = Modifier.padding(paddingValues), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/GlobalMangaSearchScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.ui.Modifier import eu.kanade.presentation.browse.GlobalSearchErrorResultItem import eu.kanade.presentation.browse.GlobalSearchLoadingResultItem import eu.kanade.presentation.browse.GlobalSearchResultItem import eu.kanade.presentation.browse.manga.components.GlobalMangaSearchCardRow import eu.kanade.presentation.browse.manga.components.GlobalMangaSearchToolbar import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSearchItemResult import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSearchScreenModel import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSourceFilter import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.presentation.core.components.material.Scaffold @Composable fun GlobalMangaSearchScreen( state: MangaSearchScreenModel.State, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onToggleResults: () -> Unit, getManga: @Composable (Manga) -> State, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> GlobalMangaSearchToolbar( searchQuery = state.searchQuery, progress = state.progress, total = state.total, navigateUp = navigateUp, onChangeSearchQuery = onChangeSearchQuery, onSearch = onSearch, sourceFilter = state.sourceFilter, onChangeSearchFilter = onChangeSearchFilter, onlyShowHasResults = state.onlyShowHasResults, onToggleResults = onToggleResults, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> GlobalSearchContent( items = state.filteredItems, contentPadding = paddingValues, getManga = getManga, onClickSource = onClickSource, onClickItem = onClickItem, onLongClickItem = onLongClickItem, ) } } @Composable internal fun GlobalSearchContent( items: Map, contentPadding: PaddingValues, getManga: @Composable (Manga) -> State, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, fromSourceId: Long? = null, ) { LazyColumn( contentPadding = contentPadding, ) { items.forEach { (source, result) -> item(key = source.id) { GlobalSearchResultItem( title = fromSourceId?.let { "▶ ${source.name}".takeIf { source.id == fromSourceId } } ?: source.name, subtitle = LocaleHelper.getLocalizedDisplayName(source.lang), onClick = { onClickSource(source) }, modifier = Modifier.animateItem(), ) { when (result) { MangaSearchItemResult.Loading -> { GlobalSearchLoadingResultItem() } is MangaSearchItemResult.Success -> { GlobalMangaSearchCardRow( titles = result.result, getManga = getManga, onClick = onClickItem, onLongClick = onLongClickItem, ) } is MangaSearchItemResult.Error -> { GlobalSearchErrorResultItem(message = result.throwable.message) } } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionDetailsScreen.kt ================================================ package eu.kanade.presentation.browse.manga import android.content.Intent import android.net.Uri import android.provider.Settings import android.util.DisplayMetrics import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Launch import androidx.compose.material.icons.outlined.Settings import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import eu.kanade.domain.extension.manga.interactor.MangaExtensionSourceItem import eu.kanade.presentation.browse.manga.components.MangaExtensionIcon import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.more.settings.widget.TrailingWidgetBuffer import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.ui.browse.manga.extension.details.MangaExtensionDetailsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun MangaExtensionDetailsScreen( navigateUp: () -> Unit, state: MangaExtensionDetailsScreenModel.State, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickEnableAll: () -> Unit, onClickDisableAll: () -> Unit, onClickClearCookies: () -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, onClickIncognito: (Boolean) -> Unit, ) { val uriHandler = LocalUriHandler.current val url = remember(state.extension) { val regex = """https://raw.githubusercontent.com/(.+?)/(.+?)/.+""".toRegex() regex.find(state.extension?.repoUrl.orEmpty()) ?.let { val (user, repo) = it.destructured "https://github.com/$user/$repo" } ?: state.extension?.repoUrl } Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_extension_info), navigateUp = navigateUp, actions = { AppBarActions( actions = persistentListOf().builder() .apply { if (url != null) { add( AppBar.Action( title = stringResource(MR.strings.action_open_repo), icon = Icons.AutoMirrored.Outlined.Launch, onClick = { uriHandler.openUri(url) }, ), ) } addAll( listOf( AppBar.OverflowAction( title = stringResource(MR.strings.action_enable_all), onClick = onClickEnableAll, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_disable_all), onClick = onClickDisableAll, ), AppBar.OverflowAction( title = stringResource(MR.strings.pref_clear_cookies), onClick = onClickClearCookies, ), ), ) } .build(), ) }, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> if (state.extension == null) { EmptyScreen( MR.strings.empty_screen, modifier = Modifier.padding(paddingValues), ) return@Scaffold } ExtensionDetails( contentPadding = paddingValues, extension = state.extension, sources = state.sources, incognitoMode = state.isIncognito, onClickSourcePreferences = onClickSourcePreferences, onClickUninstall = onClickUninstall, onClickSource = onClickSource, onClickIncognito = onClickIncognito, ) } } @Composable private fun ExtensionDetails( contentPadding: PaddingValues, extension: MangaExtension.Installed, sources: ImmutableList, incognitoMode: Boolean, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickUninstall: () -> Unit, onClickSource: (sourceId: Long) -> Unit, onClickIncognito: (Boolean) -> Unit, ) { val context = LocalContext.current var showNsfwWarning by remember { mutableStateOf(false) } ScrollbarLazyColumn( contentPadding = contentPadding, ) { if (extension.isObsolete) { item { WarningBanner(MR.strings.obsolete_extension_message) } } item { DetailsHeader( extension = extension, extIncognitoMode = incognitoMode, onClickUninstall = onClickUninstall, onClickAppInfo = { Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { data = Uri.fromParts("package", extension.pkgName, null) context.startActivity(this) } Unit }.takeIf { extension.isShared }, onClickAgeRating = { showNsfwWarning = true }, onExtIncognitoChange = onClickIncognito, ) } items( items = sources, key = { it.source.id }, ) { source -> SourceSwitchPreference( modifier = Modifier.animateItem(), source = source, onClickSourcePreferences = onClickSourcePreferences, onClickSource = onClickSource, ) } } if (showNsfwWarning) { NsfwWarningDialog( onClickConfirm = { showNsfwWarning = false }, ) } } @Composable private fun DetailsHeader( extension: MangaExtension, extIncognitoMode: Boolean, onClickAgeRating: () -> Unit, onClickUninstall: () -> Unit, onClickAppInfo: (() -> Unit)?, onExtIncognitoChange: (Boolean) -> Unit, ) { val context = LocalContext.current Column { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = MaterialTheme.padding.medium) .padding( top = MaterialTheme.padding.medium, bottom = MaterialTheme.padding.small, ) .clickable { val extDebugInfo = buildString { append( """ Extension name: ${extension.name} (lang: ${extension.lang}; package: ${extension.pkgName}) Extension version: ${extension.versionName} (lib: ${extension.libVersion}; version code: ${extension.versionCode}) NSFW: ${extension.isNsfw} """.trimIndent(), ) if (extension is MangaExtension.Installed) { append("\n\n") append( """ Update available: ${extension.hasUpdate} Obsolete: ${extension.isObsolete} Shared: ${extension.isShared} Repository: ${extension.repoUrl} """.trimIndent(), ) } } context.copyToClipboard("Extension Debug information", extDebugInfo) }, horizontalAlignment = Alignment.CenterHorizontally, ) { MangaExtensionIcon( modifier = Modifier .size(112.dp), extension = extension, density = DisplayMetrics.DENSITY_XXXHIGH, ) Text( text = extension.name, style = MaterialTheme.typography.headlineSmall, textAlign = TextAlign.Center, ) val strippedPkgName = extension.pkgName.substringAfter("eu.kanade.tachiyomi.extension.") Text( text = strippedPkgName, style = MaterialTheme.typography.bodySmall, ) } Row( modifier = Modifier .fillMaxWidth() .padding( horizontal = MaterialTheme.padding.extraLarge, vertical = MaterialTheme.padding.small, ), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically, ) { InfoText( modifier = Modifier.weight(1f), primaryText = extension.versionName, secondaryText = stringResource(MR.strings.ext_info_version), ) InfoDivider() InfoText( modifier = Modifier.weight(if (extension.isNsfw) 1.5f else 1f), primaryText = LocaleHelper.getSourceDisplayName(extension.lang, context), secondaryText = stringResource(MR.strings.ext_info_language), ) if (extension.isNsfw) { InfoDivider() InfoText( modifier = Modifier.weight(1f), primaryText = stringResource(MR.strings.ext_nsfw_short), primaryTextStyle = MaterialTheme.typography.bodyLarge.copy( color = MaterialTheme.colorScheme.error, fontWeight = FontWeight.Medium, ), secondaryText = stringResource(MR.strings.ext_info_age_rating), onClick = onClickAgeRating, ) } } Row( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .padding(top = MaterialTheme.padding.small), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { OutlinedButton( modifier = Modifier.weight(1f), onClick = onClickUninstall, ) { Text(stringResource(MR.strings.ext_uninstall)) } if (onClickAppInfo != null) { Button( modifier = Modifier.weight(1f), onClick = onClickAppInfo, ) { Text( text = stringResource(MR.strings.ext_app_info), color = MaterialTheme.colorScheme.onPrimary, ) } } } TextPreferenceWidget( modifier = Modifier.padding(horizontal = MaterialTheme.padding.small), title = stringResource(MR.strings.pref_incognito_mode), subtitle = stringResource(MR.strings.pref_incognito_mode_extension_summary), icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), widget = { Row( verticalAlignment = Alignment.CenterVertically, ) { Switch( checked = extIncognitoMode, onCheckedChange = onExtIncognitoChange, modifier = Modifier.padding(start = TrailingWidgetBuffer), ) } }, ) HorizontalDivider() } } @Composable private fun InfoText( primaryText: String, secondaryText: String, modifier: Modifier = Modifier, primaryTextStyle: TextStyle = MaterialTheme.typography.bodyLarge, onClick: (() -> Unit)? = null, ) { val clickableModifier = if (onClick != null) { Modifier.clickable(interactionSource = null, indication = null, onClick = onClick) } else { Modifier } Column( modifier = modifier.then(clickableModifier), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { Text( text = primaryText, textAlign = TextAlign.Center, style = primaryTextStyle, ) Text( text = secondaryText + if (onClick != null) " ⓘ" else "", textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f), ) } } @Composable private fun InfoDivider() { VerticalDivider( modifier = Modifier.height(20.dp), ) } @Composable private fun SourceSwitchPreference( source: MangaExtensionSourceItem, onClickSourcePreferences: (sourceId: Long) -> Unit, onClickSource: (sourceId: Long) -> Unit, modifier: Modifier = Modifier, ) { val context = LocalContext.current TextPreferenceWidget( modifier = modifier, title = if (source.labelAsName) { source.source.toString() } else { LocaleHelper.getSourceDisplayName(source.source.lang, context) }, widget = { Row( verticalAlignment = Alignment.CenterVertically, ) { if (source.source is ConfigurableSource) { IconButton(onClick = { onClickSourcePreferences(source.source.id) }) { Icon( imageVector = Icons.Outlined.Settings, contentDescription = stringResource(MR.strings.label_settings), tint = MaterialTheme.colorScheme.onSurface, ) } } Switch( checked = source.enabled, onCheckedChange = null, modifier = Modifier.padding(start = TrailingWidgetBuffer), ) } }, onPreferenceClick = { onClickSource(source.source.id) }, ) } @Composable fun NsfwWarningDialog( onClickConfirm: () -> Unit, ) { AlertDialog( text = { Text(text = stringResource(MR.strings.ext_nsfw_warning)) }, confirmButton = { TextButton(onClick = onClickConfirm) { Text(text = stringResource(MR.strings.action_ok)) } }, onDismissRequest = onClickConfirm, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionFilterScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.tachiyomi.ui.browse.manga.extension.MangaExtensionFilterState import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun MangaExtensionFilterScreen( navigateUp: () -> Unit, state: MangaExtensionFilterState.Success, onClickToggle: (String) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_extensions), navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.empty_screen, modifier = Modifier.padding(contentPadding), ) return@Scaffold } ExtensionFilterContent( contentPadding = contentPadding, state = state, onClickLang = onClickToggle, ) } } @Composable private fun ExtensionFilterContent( contentPadding: PaddingValues, state: MangaExtensionFilterState.Success, onClickLang: (String) -> Unit, ) { val context = LocalContext.current LazyColumn( contentPadding = contentPadding, ) { items(state.languages) { language -> SwitchPreferenceWidget( modifier = Modifier.animateItem(), title = LocaleHelper.getSourceDisplayName(language, context), checked = language in state.enabledLanguages, onCheckedChanged = { onClickLang(language) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MangaExtensionsScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.animation.core.animateDpAsState import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.GetApp import androidx.compose.material.icons.outlined.Public import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.VerifiedUser import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.browse.BaseBrowseItem import eu.kanade.presentation.browse.manga.components.MangaExtensionIcon import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.entries.components.DotSeparatorNoSpaceText import eu.kanade.presentation.more.settings.screen.browse.MangaExtensionReposScreen import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.ui.browse.manga.extension.MangaExtensionUiModel import eu.kanade.tachiyomi.ui.browse.manga.extension.MangaExtensionsScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreenAction import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun MangaExtensionScreen( state: MangaExtensionsScreenModel.State, contentPadding: PaddingValues, searchQuery: String?, onLongClickItem: (MangaExtension) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onOpenWebView: (MangaExtension.Available) -> Unit, onInstallExtension: (MangaExtension.Available) -> Unit, onUninstallExtension: (MangaExtension) -> Unit, onUpdateExtension: (MangaExtension.Installed) -> Unit, onTrustExtension: (MangaExtension.Untrusted) -> Unit, onOpenExtension: (MangaExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, onRefresh: () -> Unit, ) { val navigator = LocalNavigator.currentOrThrow PullRefresh( refreshing = state.isRefreshing, onRefresh = onRefresh, enabled = !state.isLoading, ) { when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> { val msg = if (!searchQuery.isNullOrEmpty()) { MR.strings.no_results_found } else { MR.strings.empty_screen } EmptyScreen( stringRes = msg, modifier = Modifier.padding(contentPadding), actions = persistentListOf( EmptyScreenAction( stringRes = MR.strings.label_extension_repos, icon = Icons.Outlined.Settings, onClick = { navigator.push(MangaExtensionReposScreen()) }, ), ), ) } else -> { ExtensionContent( state = state, contentPadding = contentPadding, onLongClickItem = onLongClickItem, onClickItemCancel = onClickItemCancel, onOpenWebView = onOpenWebView, onInstallExtension = onInstallExtension, onUninstallExtension = onUninstallExtension, onUpdateExtension = onUpdateExtension, onTrustExtension = onTrustExtension, onOpenExtension = onOpenExtension, onClickUpdateAll = onClickUpdateAll, ) } } } } @Composable private fun ExtensionContent( state: MangaExtensionsScreenModel.State, contentPadding: PaddingValues, onLongClickItem: (MangaExtension) -> Unit, onOpenWebView: (MangaExtension.Available) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onInstallExtension: (MangaExtension.Available) -> Unit, onUninstallExtension: (MangaExtension) -> Unit, onUpdateExtension: (MangaExtension.Installed) -> Unit, onTrustExtension: (MangaExtension.Untrusted) -> Unit, onOpenExtension: (MangaExtension.Installed) -> Unit, onClickUpdateAll: () -> Unit, ) { val context = LocalContext.current var trustState by remember { mutableStateOf(null) } val installGranted = rememberRequestPackageInstallsPermissionState(initialValue = true) FastScrollLazyColumn( contentPadding = contentPadding + topSmallPaddingValues, ) { if (!installGranted && state.installer?.requiresSystemPermission == true) { item(key = "extension-permissions-warning") { WarningBanner( textRes = MR.strings.ext_permission_install_apps_warning, modifier = Modifier.clickable { context.launchRequestPackageInstallsPermission() }, ) } } state.items.forEach { (header, items) -> item( contentType = "header", key = "extensionHeader-${header.hashCode()}", ) { when (header) { is MangaExtensionUiModel.Header.Resource -> { val action: @Composable RowScope.() -> Unit = if (header.textRes == MR.strings.ext_updates_pending) { { Button(onClick = { onClickUpdateAll() }) { Text( text = stringResource(MR.strings.ext_update_all), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.onPrimary, ), ) } } } else { {} } ExtensionHeader( textRes = header.textRes, modifier = Modifier.animateItemFastScroll(), action = action, ) } is MangaExtensionUiModel.Header.Text -> { ExtensionHeader( text = header.text, modifier = Modifier.animateItemFastScroll(), ) } } } items( items = items, contentType = { "item" }, key = { item -> when (item.extension) { is MangaExtension.Untrusted -> "extension-untrusted-${item.hashCode()}" is MangaExtension.Installed -> "extension-installed-${item.hashCode()}" is MangaExtension.Available -> "extension-available-${item.hashCode()}" } }, ) { item -> ExtensionItem( modifier = Modifier.animateItemFastScroll(), item = item, onClickItem = { when (it) { is MangaExtension.Available -> onInstallExtension(it) is MangaExtension.Installed -> onOpenExtension(it) is MangaExtension.Untrusted -> { trustState = it } } }, onLongClickItem = onLongClickItem, onClickItemSecondaryAction = { when (it) { is MangaExtension.Available -> onOpenWebView(it) is MangaExtension.Installed -> onOpenExtension(it) else -> {} } }, onClickItemCancel = onClickItemCancel, onClickItemAction = { when (it) { is MangaExtension.Available -> onInstallExtension(it) is MangaExtension.Installed -> { if (it.hasUpdate) { onUpdateExtension(it) } else { onOpenExtension(it) } } is MangaExtension.Untrusted -> { trustState = it } } }, ) } } } if (trustState != null) { ExtensionTrustDialog( onClickConfirm = { onTrustExtension(trustState!!) trustState = null }, onClickDismiss = { onUninstallExtension(trustState!!) trustState = null }, onDismissRequest = { trustState = null }, ) } } @Composable private fun ExtensionItem( item: MangaExtensionUiModel.Item, onClickItem: (MangaExtension) -> Unit, onLongClickItem: (MangaExtension) -> Unit, onClickItemCancel: (MangaExtension) -> Unit, onClickItemAction: (MangaExtension) -> Unit, onClickItemSecondaryAction: (MangaExtension) -> Unit, modifier: Modifier = Modifier, ) { val (extension, installStep) = item BaseBrowseItem( modifier = modifier .combinedClickable( onClick = { onClickItem(extension) }, onLongClick = { onLongClickItem(extension) }, ), onClickItem = { onClickItem(extension) }, onLongClickItem = { onLongClickItem(extension) }, icon = { Box( modifier = Modifier .size(40.dp), contentAlignment = Alignment.Center, ) { val idle = installStep.isCompleted() if (!idle) { CircularProgressIndicator( modifier = Modifier.size(40.dp), strokeWidth = 2.dp, ) } val padding by animateDpAsState( targetValue = if (idle) 0.dp else 8.dp, label = "iconPadding", ) MangaExtensionIcon( extension = extension, modifier = Modifier .matchParentSize() .padding(padding), ) } }, action = { ExtensionItemActions( extension = extension, installStep = installStep, onClickItemCancel = onClickItemCancel, onClickItemAction = onClickItemAction, onClickItemSecondaryAction = onClickItemSecondaryAction, ) }, ) { ExtensionItemContent( extension = extension, installStep = installStep, modifier = Modifier.weight(1f), ) } } @Composable private fun ExtensionItemContent( extension: MangaExtension, installStep: InstallStep, modifier: Modifier = Modifier, ) { Column( modifier = modifier.padding(start = MaterialTheme.padding.medium), ) { Text( text = extension.name, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) // Won't look good but it's not like we can ellipsize overflowing content FlowRow( modifier = Modifier.secondaryItemAlpha(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { ProvideTextStyle(value = MaterialTheme.typography.bodySmall) { if (extension is MangaExtension.Installed && extension.lang.isNotEmpty()) { Text( text = LocaleHelper.getSourceDisplayName( extension.lang, LocalContext.current, ), ) } if (extension.versionName.isNotEmpty()) { Text( text = extension.versionName, ) } val warning = when { extension is MangaExtension.Untrusted -> MR.strings.ext_untrusted extension is MangaExtension.Installed && extension.isObsolete -> MR.strings.ext_obsolete extension.isNsfw -> MR.strings.ext_nsfw_short else -> null } if (warning != null) { Text( text = stringResource(warning).uppercase(), color = MaterialTheme.colorScheme.error, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } if (!installStep.isCompleted()) { DotSeparatorNoSpaceText() Text( text = when (installStep) { InstallStep.Pending -> stringResource(MR.strings.ext_pending) InstallStep.Downloading -> stringResource(MR.strings.ext_downloading) InstallStep.Installing -> stringResource(MR.strings.ext_installing) else -> error("Must not show non-install process text") }, ) } } } } } @Composable private fun ExtensionItemActions( extension: MangaExtension, installStep: InstallStep, modifier: Modifier = Modifier, onClickItemCancel: (MangaExtension) -> Unit = {}, onClickItemAction: (MangaExtension) -> Unit = {}, onClickItemSecondaryAction: (MangaExtension) -> Unit = {}, ) { val isIdle = installStep.isCompleted() Row( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { when { !isIdle -> { IconButton(onClick = { onClickItemCancel(extension) }) { Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_cancel), ) } } installStep == InstallStep.Error -> { IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.Refresh, contentDescription = stringResource(MR.strings.action_retry), ) } } installStep == InstallStep.Idle -> { when (extension) { is MangaExtension.Installed -> { IconButton(onClick = { onClickItemSecondaryAction(extension) }) { Icon( imageVector = Icons.Outlined.Settings, contentDescription = stringResource(MR.strings.action_settings), ) } if (extension.hasUpdate) { IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.GetApp, contentDescription = stringResource(MR.strings.ext_update), ) } } } is MangaExtension.Untrusted -> { IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.VerifiedUser, contentDescription = stringResource(MR.strings.ext_trust), ) } } is MangaExtension.Available -> { if (extension.sources.isNotEmpty()) { IconButton( onClick = { onClickItemSecondaryAction(extension) }, ) { Icon( imageVector = Icons.Outlined.Public, contentDescription = stringResource(MR.strings.action_open_in_web_view), ) } } IconButton(onClick = { onClickItemAction(extension) }) { Icon( imageVector = Icons.Outlined.GetApp, contentDescription = stringResource(MR.strings.ext_install), ) } } } } } } } @Composable fun ExtensionHeader( textRes: StringResource, modifier: Modifier = Modifier, action: @Composable RowScope.() -> Unit = {}, ) { ExtensionHeader( text = stringResource(textRes), modifier = modifier, action = action, ) } @Composable fun ExtensionHeader( text: String, modifier: Modifier = Modifier, action: @Composable RowScope.() -> Unit = {}, ) { Row( modifier = modifier.padding(horizontal = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { Text( text = text, modifier = Modifier .padding(vertical = 8.dp) .weight(1f), style = MaterialTheme.typography.header, ) action() } } @Composable fun ExtensionTrustDialog( onClickConfirm: () -> Unit, onClickDismiss: () -> Unit, onDismissRequest: () -> Unit, ) { AlertDialog( title = { Text(text = stringResource(MR.strings.untrusted_extension)) }, text = { Text(text = stringResource(MR.strings.untrusted_extension_message)) }, confirmButton = { TextButton(onClick = onClickConfirm) { Text(text = stringResource(MR.strings.ext_trust)) } }, dismissButton = { TextButton(onClick = onClickDismiss) { Text(text = stringResource(MR.strings.ext_uninstall)) } }, onDismissRequest = onDismissRequest, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesFilterScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material3.Checkbox import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.browse.manga.components.BaseMangaSourceItem import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.browse.manga.source.MangaSourcesFilterScreenModel import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.manga.model.Source import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun MangaSourcesFilterScreen( navigateUp: () -> Unit, state: MangaSourcesFilterScreenModel.State.Success, onClickLanguage: (String) -> Unit, onClickSource: (Source) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_sources), navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.source_filter_empty_screen, modifier = Modifier.padding(contentPadding), ) return@Scaffold } SourcesFilterContent( contentPadding = contentPadding, state = state, onClickLanguage = onClickLanguage, onClickSource = onClickSource, ) } } @Composable private fun SourcesFilterContent( contentPadding: PaddingValues, state: MangaSourcesFilterScreenModel.State.Success, onClickLanguage: (String) -> Unit, onClickSource: (Source) -> Unit, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { state.items.forEach { (language, sources) -> val enabled = language in state.enabledLanguages item( key = language, contentType = "source-filter-header", ) { SourcesFilterHeader( modifier = Modifier.animateItemFastScroll(), language = language, enabled = enabled, onClickItem = onClickLanguage, ) } if (enabled) { items( items = sources, key = { "source-filter-${it.key()}" }, contentType = { "source-filter-item" }, ) { source -> SourcesFilterItem( modifier = Modifier.animateItemFastScroll(), source = source, enabled = "${source.id}" !in state.disabledSources, onClickItem = onClickSource, ) } } } } } @Composable private fun SourcesFilterHeader( language: String, enabled: Boolean, onClickItem: (String) -> Unit, modifier: Modifier = Modifier, ) { SwitchPreferenceWidget( modifier = modifier, title = LocaleHelper.getSourceDisplayName(language, LocalContext.current), checked = enabled, onCheckedChanged = { onClickItem(language) }, ) } @Composable private fun SourcesFilterItem( source: Source, enabled: Boolean, onClickItem: (Source) -> Unit, modifier: Modifier = Modifier, ) { BaseMangaSourceItem( modifier = modifier, source = source, showLanguageInContent = false, onClickItem = { onClickItem(source) }, action = { Checkbox(checked = enabled, onCheckedChange = null) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MangaSourcesScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PushPin import androidx.compose.material.icons.outlined.PushPin import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.manga.components.BaseMangaSourceItem import eu.kanade.tachiyomi.ui.browse.manga.source.MangaSourcesScreenModel import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreenModel.Listing import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.manga.model.Pin import tachiyomi.domain.source.manga.model.Source import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.plus import tachiyomi.source.local.entries.manga.LocalMangaSource @Composable fun MangaSourcesScreen( state: MangaSourcesScreenModel.State, contentPadding: PaddingValues, onClickItem: (Source, Listing) -> Unit, onClickPin: (Source) -> Unit, onLongClickItem: (Source) -> Unit, ) { when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> EmptyScreen( stringRes = MR.strings.source_empty_screen, modifier = Modifier.padding(contentPadding), ) else -> { ScrollbarLazyColumn( contentPadding = contentPadding + topSmallPaddingValues, ) { items( items = state.items, contentType = { when (it) { is MangaSourceUiModel.Header -> "header" is MangaSourceUiModel.Item -> "item" } }, key = { when (it) { is MangaSourceUiModel.Header -> it.hashCode() is MangaSourceUiModel.Item -> "source-${it.source.key()}" } }, ) { model -> when (model) { is MangaSourceUiModel.Header -> { SourceHeader( modifier = Modifier.animateItem(), language = model.language, ) } is MangaSourceUiModel.Item -> SourceItem( modifier = Modifier.animateItem(), source = model.source, onClickItem = onClickItem, onLongClickItem = onLongClickItem, onClickPin = onClickPin, ) } } } } } } @Composable private fun SourceHeader( language: String, modifier: Modifier = Modifier, ) { val context = LocalContext.current Text( text = LocaleHelper.getSourceDisplayName(language, context), modifier = modifier .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), style = MaterialTheme.typography.header, ) } @Composable private fun SourceItem( source: Source, onClickItem: (Source, Listing) -> Unit, onLongClickItem: (Source) -> Unit, onClickPin: (Source) -> Unit, modifier: Modifier = Modifier, ) { BaseMangaSourceItem( modifier = modifier, source = source, onClickItem = { onClickItem(source, Listing.Popular) }, onLongClickItem = { onLongClickItem(source) }, action = { if (source.supportsLatest) { TextButton(onClick = { onClickItem(source, Listing.Latest) }) { Text( text = stringResource(MR.strings.latest), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), ) } } SourcePinButton( isPinned = Pin.Pinned in source.pin, onClick = { onClickPin(source) }, ) }, ) } @Composable private fun SourcePinButton( isPinned: Boolean, onClick: () -> Unit, ) { val icon = if (isPinned) Icons.Filled.PushPin else Icons.Outlined.PushPin val tint = if (isPinned) { MaterialTheme.colorScheme.primary } else { MaterialTheme.colorScheme.onBackground.copy( alpha = SECONDARY_ALPHA, ) } val description = if (isPinned) MR.strings.action_unpin else MR.strings.action_pin IconButton(onClick = onClick) { Icon( imageVector = icon, tint = tint, contentDescription = stringResource(description), ) } } @Composable fun MangaSourceOptionsDialog( source: Source, onClickPin: () -> Unit, onClickDisable: () -> Unit, // SY --> onClickToggleDataSaver: (() -> Unit)?, // SY <-- onDismiss: () -> Unit, ) { AlertDialog( title = { Text(text = source.visualName) }, text = { Column { val textId = if (Pin.Pinned in source.pin) MR.strings.action_unpin else MR.strings.action_pin Text( text = stringResource(textId), modifier = Modifier .clickable(onClick = onClickPin) .fillMaxWidth() .padding(vertical = 16.dp), ) if (source.id != LocalMangaSource.ID) { Text( text = stringResource(MR.strings.action_disable), modifier = Modifier .clickable(onClick = onClickDisable) .fillMaxWidth() .padding(vertical = 16.dp), ) } // SY --> if (onClickToggleDataSaver != null) { Text( text = if (source.isExcludedFromDataSaver) { stringResource(AYMR.strings.data_saver_stop_exclude) } else { stringResource(AYMR.strings.data_saver_exclude) }, modifier = Modifier .clickable(onClick = onClickToggleDataSaver) .fillMaxWidth() .padding(vertical = 16.dp), ) } // SY <-- } }, onDismissRequest = onDismiss, confirmButton = {}, ) } sealed interface MangaSourceUiModel { data class Item(val source: Source) : MangaSourceUiModel data class Header(val language: String) : MangaSourceUiModel } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MigrateMangaScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.entries.manga.components.BaseMangaListItem import eu.kanade.tachiyomi.ui.browse.manga.migration.manga.MigrateMangaScreenModel import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun MigrateMangaScreen( navigateUp: () -> Unit, title: String?, state: MigrateMangaScreenModel.State, onClickItem: (Manga) -> Unit, onClickCover: (Manga) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> AppBar( title = title, navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.empty_screen, modifier = Modifier.padding(contentPadding), ) return@Scaffold } MigrateMangaContent( contentPadding = contentPadding, state = state, onClickItem = onClickItem, onClickCover = onClickCover, ) } } @Composable private fun MigrateMangaContent( contentPadding: PaddingValues, state: MigrateMangaScreenModel.State, onClickItem: (Manga) -> Unit, onClickCover: (Manga) -> Unit, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { items(state.titles) { manga -> MigrateMangaItem( manga = manga, onClickItem = onClickItem, onClickCover = onClickCover, ) } } } @Composable private fun MigrateMangaItem( manga: Manga, onClickItem: (Manga) -> Unit, onClickCover: (Manga) -> Unit, modifier: Modifier = Modifier, ) { BaseMangaListItem( modifier = modifier, manga = manga, onClickItem = { onClickItem(manga) }, onClickCover = { onClickCover(manga) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MigrateMangaSearchScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.runtime.Composable import androidx.compose.runtime.State import eu.kanade.presentation.browse.manga.components.GlobalMangaSearchToolbar import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSearchScreenModel import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSourceFilter import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.presentation.core.components.material.Scaffold @Composable fun MigrateMangaSearchScreen( state: MangaSearchScreenModel.State, fromSourceId: Long?, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onToggleResults: () -> Unit, getManga: @Composable (Manga) -> State, onClickSource: (CatalogueSource) -> Unit, onClickItem: (Manga) -> Unit, onLongClickItem: (Manga) -> Unit, ) { Scaffold( topBar = { scrollBehavior -> GlobalMangaSearchToolbar( searchQuery = state.searchQuery, progress = state.progress, total = state.total, navigateUp = navigateUp, onChangeSearchQuery = onChangeSearchQuery, onSearch = onSearch, sourceFilter = state.sourceFilter, onChangeSearchFilter = onChangeSearchFilter, onlyShowHasResults = state.onlyShowHasResults, onToggleResults = onToggleResults, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> GlobalSearchContent( fromSourceId = fromSourceId, items = state.filteredItems, contentPadding = paddingValues, getManga = getManga, onClickSource = onClickSource, onClickItem = onClickItem, onLongClickItem = onLongClickItem, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/MigrateMangaSourceScreen.kt ================================================ package eu.kanade.presentation.browse.manga import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowDownward import androidx.compose.material.icons.outlined.ArrowUpward import androidx.compose.material.icons.outlined.Numbers import androidx.compose.material.icons.outlined.SortByAlpha import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.presentation.browse.manga.components.BaseMangaSourceItem import eu.kanade.presentation.browse.manga.components.MangaSourceIcon import eu.kanade.tachiyomi.ui.browse.manga.migration.sources.MigrateMangaSourceScreenModel import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.source.manga.model.Source import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Badge import tachiyomi.presentation.core.components.BadgeGroup import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.Scroller.STICKY_HEADER_KEY_PREFIX import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun MigrateMangaSourceScreen( state: MigrateMangaSourceScreenModel.State, contentPadding: PaddingValues, onClickItem: (Source) -> Unit, onToggleSortingDirection: () -> Unit, onToggleSortingMode: () -> Unit, ) { val context = LocalContext.current when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.isEmpty -> EmptyScreen( stringRes = MR.strings.information_empty_library, modifier = Modifier.padding(contentPadding), ) else -> MigrateSourceList( list = state.items, contentPadding = contentPadding, onClickItem = onClickItem, onLongClickItem = { source -> val sourceId = source.id.toString() context.copyToClipboard(sourceId, sourceId) }, sortingMode = state.sortingMode, onToggleSortingMode = onToggleSortingMode, sortingDirection = state.sortingDirection, onToggleSortingDirection = onToggleSortingDirection, ) } } @Composable private fun MigrateSourceList( list: ImmutableList>, contentPadding: PaddingValues, onClickItem: (Source) -> Unit, onLongClickItem: (Source) -> Unit, sortingMode: SetMigrateSorting.Mode, onToggleSortingMode: () -> Unit, sortingDirection: SetMigrateSorting.Direction, onToggleSortingDirection: () -> Unit, ) { ScrollbarLazyColumn( contentPadding = contentPadding + topSmallPaddingValues, ) { stickyHeader(key = STICKY_HEADER_KEY_PREFIX) { Row( modifier = Modifier .background(MaterialTheme.colorScheme.background) .padding(start = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(MR.strings.migration_selection_prompt), modifier = Modifier.weight(1f), style = MaterialTheme.typography.header, ) IconButton(onClick = onToggleSortingMode) { when (sortingMode) { SetMigrateSorting.Mode.ALPHABETICAL -> Icon( Icons.Outlined.SortByAlpha, contentDescription = stringResource(MR.strings.action_sort_alpha), ) SetMigrateSorting.Mode.TOTAL -> Icon( Icons.Outlined.Numbers, contentDescription = stringResource(MR.strings.action_sort_count), ) } } IconButton(onClick = onToggleSortingDirection) { when (sortingDirection) { SetMigrateSorting.Direction.ASCENDING -> Icon( Icons.Outlined.ArrowUpward, contentDescription = stringResource(MR.strings.action_asc), ) SetMigrateSorting.Direction.DESCENDING -> Icon( Icons.Outlined.ArrowDownward, contentDescription = stringResource(MR.strings.action_desc), ) } } } } items( items = list, key = { (source, _) -> "migrate-${source.id}" }, ) { (source, count) -> MigrateSourceItem( modifier = Modifier.animateItem(), source = source, count = count, onClickItem = { onClickItem(source) }, onLongClickItem = { onLongClickItem(source) }, ) } } } @Composable private fun MigrateSourceItem( source: Source, count: Long, onClickItem: () -> Unit, onLongClickItem: () -> Unit, modifier: Modifier = Modifier, ) { BaseMangaSourceItem( modifier = modifier, source = source, showLanguageInContent = source.lang != "", onClickItem = onClickItem, onLongClickItem = onLongClickItem, icon = { MangaSourceIcon(source = source) }, action = { BadgeGroup { Badge(text = "$count") } }, content = { _, sourceLangString -> Column( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .weight(1f), ) { Text( text = source.name.ifBlank { source.id.toString() }, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), verticalAlignment = Alignment.CenterVertically, ) { if (sourceLangString != null) { Text( modifier = Modifier.secondaryItemAlpha(), text = sourceLangString, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } if (source.isStub) { Text( modifier = Modifier.secondaryItemAlpha(), text = stringResource(MR.strings.not_installed), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error, ) } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/BaseMangaSourceItem.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import eu.kanade.presentation.browse.BaseBrowseItem import eu.kanade.tachiyomi.util.system.LocaleHelper import tachiyomi.domain.source.manga.model.Source import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun BaseMangaSourceItem( source: Source, modifier: Modifier = Modifier, showLanguageInContent: Boolean = true, onClickItem: () -> Unit = {}, onLongClickItem: () -> Unit = {}, icon: @Composable RowScope.(Source) -> Unit = defaultIcon, action: @Composable RowScope.(Source) -> Unit = {}, content: @Composable RowScope.(Source, String?) -> Unit = defaultContent, ) { val sourceLangString = LocaleHelper.getSourceDisplayName(source.lang, LocalContext.current).takeIf { showLanguageInContent } BaseBrowseItem( modifier = modifier, onClickItem = onClickItem, onLongClickItem = onLongClickItem, icon = { icon.invoke(this, source) }, action = { action.invoke(this, source) }, content = { content.invoke(this, source, sourceLangString) }, ) } private val defaultIcon: @Composable RowScope.(Source) -> Unit = { source -> MangaSourceIcon(source = source) } private val defaultContent: @Composable RowScope.(Source, String?) -> Unit = { source, sourceLangString -> Column( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .weight(1f), ) { Text( text = source.name, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) if (sourceLangString != null) { Text( modifier = Modifier.secondaryItemAlpha(), text = sourceLangString, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/BrowseMangaIcons.kt ================================================ package eu.kanade.presentation.browse.manga.components import android.util.DisplayMetrics import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Dangerous import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.imageResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.core.graphics.drawable.toBitmap import coil3.compose.AsyncImage import eu.kanade.domain.source.manga.model.icon import eu.kanade.presentation.util.rememberResourceBitmapPainter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionLoader import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.source.manga.model.Source import tachiyomi.source.local.entries.manga.LocalMangaSource private val defaultModifier = Modifier .height(40.dp) .aspectRatio(1f) @Composable fun MangaSourceIcon( source: Source, modifier: Modifier = Modifier, ) { val icon = source.icon when { source.isStub && icon == null -> { Image( imageVector = Icons.Filled.Warning, contentDescription = null, colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.error), modifier = modifier.then(defaultModifier), ) } icon != null -> { Image( bitmap = icon, contentDescription = null, modifier = modifier.then(defaultModifier), ) } source.id == LocalMangaSource.ID -> { Image( painter = painterResource(R.mipmap.ic_local_source), contentDescription = null, modifier = modifier.then(defaultModifier), ) } else -> { Image( painter = painterResource(R.mipmap.ic_default_source), contentDescription = null, modifier = modifier.then(defaultModifier), ) } } } @Composable fun MangaExtensionIcon( extension: MangaExtension, modifier: Modifier = Modifier, density: Int = DisplayMetrics.DENSITY_DEFAULT, ) { when (extension) { is MangaExtension.Available -> { AsyncImage( model = extension.iconUrl, contentDescription = null, placeholder = ColorPainter(Color(0x1F888888)), error = rememberResourceBitmapPainter(id = R.drawable.cover_error), modifier = modifier .clip(MaterialTheme.shapes.extraSmall), ) } is MangaExtension.Installed -> { val icon by extension.getIcon(density) when (icon) { Result.Loading -> Box(modifier = modifier) is Result.Success -> Image( bitmap = (icon as Result.Success).value, contentDescription = null, modifier = modifier, ) Result.Error -> Image( bitmap = ImageBitmap.imageResource(id = R.mipmap.ic_default_source), contentDescription = null, modifier = modifier, ) } } is MangaExtension.Untrusted -> Image( imageVector = Icons.Filled.Dangerous, contentDescription = null, colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.error), modifier = modifier.then(defaultModifier), ) } } @Composable private fun MangaExtension.getIcon(density: Int = DisplayMetrics.DENSITY_DEFAULT): State> { val context = LocalContext.current return produceState>(initialValue = Result.Loading, this) { withIOContext { value = try { val appInfo = MangaExtensionLoader.getMangaExtensionPackageInfoFromPkgName( context, pkgName, )!!.applicationInfo!! val appResources = context.packageManager.getResourcesForApplication(appInfo) Result.Success( appResources.getDrawableForDensity(appInfo.icon, density, null)!! .toBitmap() .asImageBitmap(), ) } catch (e: Exception) { Result.Error } } } } sealed class Result { data object Loading : Result() data object Error : Result() data class Success(val value: T) : Result() } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/BrowseMangaSourceComfortableGrid.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.BrowseSourceLoadingItem import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryComfortableGridItem import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.presentation.core.util.plus @Composable fun BrowseMangaSourceComfortableGrid( mangaList: LazyPagingItems>, columns: GridCells, contentPadding: PaddingValues, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) { LazyVerticalGrid( columns = columns, contentPadding = contentPadding + PaddingValues(8.dp), verticalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridVerticalSpacer), horizontalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridHorizontalSpacer), ) { if (mangaList.loadState.prepend is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } items(count = mangaList.itemCount) { index -> val manga by mangaList[index]?.collectAsState() ?: return@items BrowseMangaSourceComfortableGridItem( manga = manga, onClick = { onMangaClick(manga) }, onLongClick = { onMangaLongClick(manga) }, ) } if (mangaList.loadState.refresh is LoadState.Loading || mangaList.loadState.append is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } } } @Composable private fun BrowseMangaSourceComfortableGridItem( manga: Manga, onClick: () -> Unit = {}, onLongClick: () -> Unit = onClick, ) { EntryComfortableGridItem( title = manga.title, coverData = MangaCover( mangaId = manga.id, sourceId = manga.source, isMangaFavorite = manga.favorite, url = manga.thumbnailUrl, lastModified = manga.coverLastModified, ), coverAlpha = if (manga.favorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, coverBadgeStart = { InLibraryBadge(enabled = manga.favorite) }, onLongClick = onLongClick, onClick = onClick, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/BrowseMangaSourceCompactGrid.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.BrowseSourceLoadingItem import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryCompactGridItem import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.presentation.core.util.plus @Composable fun BrowseMangaSourceCompactGrid( mangaList: LazyPagingItems>, columns: GridCells, contentPadding: PaddingValues, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) { LazyVerticalGrid( columns = columns, contentPadding = contentPadding + PaddingValues(8.dp), verticalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridVerticalSpacer), horizontalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridHorizontalSpacer), ) { if (mangaList.loadState.prepend is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } items(count = mangaList.itemCount) { index -> val manga by mangaList[index]?.collectAsState() ?: return@items BrowseMangaSourceCompactGridItem( manga = manga, onClick = { onMangaClick(manga) }, onLongClick = { onMangaLongClick(manga) }, ) } if (mangaList.loadState.refresh is LoadState.Loading || mangaList.loadState.append is LoadState.Loading) { item(span = { GridItemSpan(maxLineSpan) }) { BrowseSourceLoadingItem() } } } } @Composable private fun BrowseMangaSourceCompactGridItem( manga: Manga, onClick: () -> Unit = {}, onLongClick: () -> Unit = onClick, ) { EntryCompactGridItem( title = manga.title, coverData = MangaCover( mangaId = manga.id, sourceId = manga.source, isMangaFavorite = manga.favorite, url = manga.thumbnailUrl, lastModified = manga.coverLastModified, ), coverAlpha = if (manga.favorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, coverBadgeStart = { InLibraryBadge(enabled = manga.favorite) }, onLongClick = onLongClick, onClick = onClick, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/BrowseMangaSourceList.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import eu.kanade.presentation.browse.BrowseSourceLoadingItem import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryListItem import kotlinx.coroutines.flow.StateFlow import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.presentation.core.util.plus @Composable fun BrowseMangaSourceList( mangaList: LazyPagingItems>, entries: Int, topBarHeight: Int, contentPadding: PaddingValues, onMangaClick: (Manga) -> Unit, onMangaLongClick: (Manga) -> Unit, ) { val sourceListState = rememberLazyListState() BoxWithConstraints { val density = LocalDensity.current val containerHeightPx = with(density) { this@BoxWithConstraints.maxHeight.roundToPx() } LazyColumn( state = sourceListState, contentPadding = contentPadding + PaddingValues(vertical = 8.dp), ) { item { if (mangaList.loadState.prepend is LoadState.Loading) { BrowseSourceLoadingItem() } } items(count = mangaList.itemCount) { index -> val manga by mangaList[index]?.collectAsState() ?: return@items BrowseMangaSourceListItem( manga = manga, onClick = { onMangaClick(manga) }, onLongClick = { onMangaLongClick(manga) }, entries = entries, containerHeight = containerHeightPx - topBarHeight, ) } item { if (mangaList.loadState.refresh is LoadState.Loading || mangaList.loadState.append is LoadState.Loading ) { BrowseSourceLoadingItem() } } } } } @Composable private fun BrowseMangaSourceListItem( manga: Manga, onClick: () -> Unit = {}, onLongClick: () -> Unit = onClick, entries: Int, containerHeight: Int, ) { EntryListItem( title = manga.title, coverData = MangaCover( mangaId = manga.id, sourceId = manga.source, isMangaFavorite = manga.favorite, url = manga.thumbnailUrl, lastModified = manga.coverLastModified, ), coverAlpha = if (manga.favorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, badge = { InLibraryBadge(enabled = manga.favorite) }, onLongClick = onLongClick, onClick = onClick, entries = entries, containerHeight = containerHeight, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/BrowseMangaSourceToolbar.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ViewList import androidx.compose.material.icons.filled.ViewModule import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AppBarTitle import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.RadioMenuItem import eu.kanade.presentation.components.SearchToolbar import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.MangaSource import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.source.local.entries.manga.LocalMangaSource @Composable fun BrowseMangaSourceToolbar( searchQuery: String?, onSearchQueryChange: (String?) -> Unit, source: MangaSource?, displayMode: LibraryDisplayMode, onDisplayModeChange: (LibraryDisplayMode) -> Unit, navigateUp: () -> Unit, onWebViewClick: () -> Unit, onHelpClick: () -> Unit, onSettingsClick: () -> Unit, onSearch: (String) -> Unit, scrollBehavior: TopAppBarScrollBehavior? = null, ) { // Avoid capturing unstable source in actions lambda val title = source?.name val isLocalSource = source is LocalMangaSource val isConfigurableSource = source is ConfigurableSource var selectingDisplayMode by remember { mutableStateOf(false) } SearchToolbar( navigateUp = navigateUp, titleContent = { AppBarTitle(title) }, searchQuery = searchQuery, onChangeSearchQuery = onSearchQueryChange, onSearch = onSearch, onClickCloseSearch = navigateUp, actions = { AppBarActions( actions = persistentListOf().builder() .apply { add( AppBar.Action( title = stringResource(MR.strings.action_display_mode), icon = if (displayMode == LibraryDisplayMode.List) { Icons.AutoMirrored.Filled.ViewList } else { Icons.Filled.ViewModule }, onClick = { selectingDisplayMode = true }, ), ) if (isLocalSource) { add( AppBar.OverflowAction( title = stringResource(MR.strings.label_help), onClick = onHelpClick, ), ) } else { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_open_in_web_view), onClick = onWebViewClick, ), ) } if (isConfigurableSource) { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_settings), onClick = onSettingsClick, ), ) } } .build(), ) DropdownMenu( expanded = selectingDisplayMode, onDismissRequest = { selectingDisplayMode = false }, ) { RadioMenuItem( text = { Text(text = stringResource(MR.strings.action_display_comfortable_grid)) }, isChecked = displayMode == LibraryDisplayMode.ComfortableGrid, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) } RadioMenuItem( text = { Text(text = stringResource(MR.strings.action_display_grid)) }, isChecked = displayMode == LibraryDisplayMode.CompactGrid, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.CompactGrid) } RadioMenuItem( text = { Text(text = stringResource(MR.strings.action_display_list)) }, isChecked = displayMode == LibraryDisplayMode.List, ) { selectingDisplayMode = false onDisplayModeChange(LibraryDisplayMode.List) } } }, scrollBehavior = scrollBehavior, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/GlobalMangaSearchCardRow.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.browse.InLibraryBadge import eu.kanade.presentation.library.components.CommonEntryItemDefaults import eu.kanade.presentation.library.components.EntryComfortableGridItem import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.domain.entries.manga.model.asMangaCover import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun GlobalMangaSearchCardRow( titles: List, getManga: @Composable (Manga) -> State, onClick: (Manga) -> Unit, onLongClick: (Manga) -> Unit, ) { if (titles.isEmpty()) { EmptyResultItem() return } LazyRow( contentPadding = PaddingValues(MaterialTheme.padding.small), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { items(titles) { val title by getManga(it) MangaItem( title = title.title, cover = title.asMangaCover(), isFavorite = title.favorite, onClick = { onClick(title) }, onLongClick = { onLongClick(title) }, ) } } } @Composable private fun MangaItem( title: String, cover: MangaCover, isFavorite: Boolean, onClick: () -> Unit, onLongClick: () -> Unit, ) { Box(modifier = Modifier.width(96.dp)) { EntryComfortableGridItem( title = title, titleMaxLines = 3, coverData = cover, coverBadgeStart = { InLibraryBadge(enabled = isFavorite) }, coverAlpha = if (isFavorite) CommonEntryItemDefaults.BrowseFavoriteCoverAlpha else 1f, onClick = onClick, onLongClick = onLongClick, ) } } @Composable private fun EmptyResultItem() { Text( text = stringResource(MR.strings.no_results_found), modifier = Modifier .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/browse/manga/components/GlobalMangaSearchToolbar.kt ================================================ package eu.kanade.presentation.browse.manga.components import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.PushPin import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import eu.kanade.presentation.components.SearchToolbar import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSourceFilter import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun GlobalMangaSearchToolbar( searchQuery: String?, progress: Int, total: Int, navigateUp: () -> Unit, onChangeSearchQuery: (String?) -> Unit, onSearch: (String) -> Unit, sourceFilter: MangaSourceFilter, onChangeSearchFilter: (MangaSourceFilter) -> Unit, onlyShowHasResults: Boolean, onToggleResults: () -> Unit, scrollBehavior: TopAppBarScrollBehavior, ) { Column(modifier = Modifier.background(MaterialTheme.colorScheme.surface)) { Box { SearchToolbar( searchQuery = searchQuery, onChangeSearchQuery = onChangeSearchQuery, onSearch = onSearch, onClickCloseSearch = navigateUp, navigateUp = navigateUp, scrollBehavior = scrollBehavior, ) if (progress in 1.. Unit, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onChangeOrder: (Category, Int) -> Unit, ) { val lazyListState = rememberLazyListState() Scaffold( floatingActionButton = { CategoryFloatingActionButton( lazyListState = lazyListState, onCreate = onClickCreate, ) }, ) { paddingValues -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.information_empty_category, modifier = Modifier.padding(paddingValues), ) return@Scaffold } CategoryContent( categories = state.categories, lazyListState = lazyListState, paddingValues = paddingValues, onClickRename = onClickRename, onClickHide = onClickHide, onClickDelete = onClickDelete, onChangeOrder = onChangeOrder, ) } } @Composable private fun CategoryContent( categories: List, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onChangeOrder: (Category, Int) -> Unit, ) { val categoriesState = remember { categories.toMutableStateList() } val reorderableState = rememberReorderableLazyListState(lazyListState, paddingValues) { from, to -> val item = categoriesState.removeAt(from.index) categoriesState.add(to.index, item) onChangeOrder(item, to.index) } LaunchedEffect(categories) { if (!reorderableState.isAnyItemDragging) { categoriesState.clear() categoriesState.addAll(categories) } } LazyColumn( modifier = Modifier.fillMaxSize(), state = lazyListState, contentPadding = PaddingValues(MaterialTheme.padding.medium), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items( items = categoriesState, key = { category -> category.key }, ) { category -> ReorderableItem(reorderableState, category.key) { CategoryListItem( modifier = Modifier.animateItem(), category = category, onRename = { onClickRename(category) }, onHide = { onClickHide(category) }, onDelete = { onClickDelete(category) }, ) } } } } private val Category.key inline get() = "category-$id" ================================================ FILE: app/src/main/java/eu/kanade/presentation/category/CategoryExtensions.kt ================================================ package eu.kanade.presentation.category import android.content.Context import androidx.compose.runtime.Composable import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource val Category.visualName: String @Composable get() = when { isSystemCategory -> stringResource(MR.strings.label_default) else -> name } fun Category.visualName(context: Context): String = when { isSystemCategory -> context.stringResource(MR.strings.label_default) else -> name } ================================================ FILE: app/src/main/java/eu/kanade/presentation/category/MangaCategoryScreen.kt ================================================ package eu.kanade.presentation.category import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Modifier import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.category.components.CategoryListItem import eu.kanade.tachiyomi.ui.category.manga.MangaCategoryScreenState import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyListState import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.screens.EmptyScreen @Composable fun MangaCategoryScreen( state: MangaCategoryScreenState.Success, onClickCreate: () -> Unit, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onChangeOrder: (Category, Int) -> Unit, ) { val lazyListState = rememberLazyListState() Scaffold( floatingActionButton = { CategoryFloatingActionButton( lazyListState = lazyListState, onCreate = onClickCreate, ) }, ) { paddingValues -> if (state.isEmpty) { EmptyScreen( stringRes = MR.strings.information_empty_category, modifier = Modifier.padding(paddingValues), ) return@Scaffold } CategoryContent( categories = state.categories, lazyListState = lazyListState, paddingValues = paddingValues, onClickRename = onClickRename, onClickHide = onClickHide, onClickDelete = onClickDelete, onChangeOrder = onChangeOrder, ) } } @Composable private fun CategoryContent( categories: List, lazyListState: LazyListState, paddingValues: PaddingValues, onClickRename: (Category) -> Unit, onClickHide: (Category) -> Unit, onClickDelete: (Category) -> Unit, onChangeOrder: (Category, Int) -> Unit, ) { val categoriesState = remember { categories.toMutableStateList() } val reorderableState = rememberReorderableLazyListState(lazyListState, paddingValues) { from, to -> val item = categoriesState.removeAt(from.index) categoriesState.add(to.index, item) onChangeOrder(item, to.index) } LaunchedEffect(categories) { if (!reorderableState.isAnyItemDragging) { categoriesState.clear() categoriesState.addAll(categories) } } LazyColumn( modifier = Modifier.fillMaxSize(), state = lazyListState, contentPadding = PaddingValues(MaterialTheme.padding.medium), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items( items = categoriesState, key = { category -> category.key }, ) { category -> ReorderableItem(reorderableState, category.key) { CategoryListItem( modifier = Modifier.animateItem(), category = category, onRename = { onClickRename(category) }, onHide = { onClickHide(category) }, onDelete = { onClickDelete(category) }, ) } } } } private val Category.key inline get() = "category-$id" ================================================ FILE: app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt ================================================ package eu.kanade.presentation.category.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Checkbox import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TriStateCheckbox import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import eu.kanade.core.preference.asToggleableState import eu.kanade.presentation.category.visualName import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay import tachiyomi.core.common.preference.CheckboxState import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import kotlin.time.Duration.Companion.seconds @Composable fun CategoryCreateDialog( onDismissRequest: () -> Unit, onCreate: (String) -> Unit, categories: ImmutableList, ) { var name by remember { mutableStateOf("") } val focusRequester = remember { FocusRequester() } val nameAlreadyExists = remember(name) { categories.contains(name) } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( enabled = name.isNotEmpty() && !nameAlreadyExists, onClick = { onCreate(name) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_add)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_add_category)) }, text = { OutlinedTextField( modifier = Modifier .focusRequester(focusRequester), value = name, onValueChange = { name = it }, label = { Text(text = stringResource(MR.strings.name)) }, supportingText = { val msgRes = if (name.isNotEmpty() && nameAlreadyExists) { MR.strings.error_category_exists } else { MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, isError = name.isNotEmpty() && nameAlreadyExists, singleLine = true, ) }, ) LaunchedEffect(focusRequester) { // TODO: https://issuetracker.google.com/issues/204502668 delay(0.1.seconds) focusRequester.requestFocus() } } @Composable fun CategoryRenameDialog( onDismissRequest: () -> Unit, onRename: (String) -> Unit, categories: ImmutableList, category: String, ) { var name by remember { mutableStateOf(category) } var valueHasChanged by remember { mutableStateOf(false) } val focusRequester = remember { FocusRequester() } val nameAlreadyExists = remember(name) { categories.contains(name) } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( enabled = valueHasChanged && !nameAlreadyExists, onClick = { onRename(name) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_rename_category)) }, text = { OutlinedTextField( modifier = Modifier.focusRequester(focusRequester), value = name, onValueChange = { valueHasChanged = name != it name = it }, label = { Text(text = stringResource(MR.strings.name)) }, supportingText = { val msgRes = if (valueHasChanged && nameAlreadyExists) { MR.strings.error_category_exists } else { MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, isError = valueHasChanged && nameAlreadyExists, singleLine = true, ) }, ) LaunchedEffect(focusRequester) { // TODO: https://issuetracker.google.com/issues/204502668 delay(0.1.seconds) focusRequester.requestFocus() } } @Composable fun CategoryDeleteDialog( onDismissRequest: () -> Unit, onDelete: () -> Unit, category: String, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.delete_category)) }, text = { Text(text = stringResource(MR.strings.delete_category_confirmation, category)) }, ) } @Composable fun ChangeCategoryDialog( initialSelection: ImmutableList>, onDismissRequest: () -> Unit, onEditCategories: () -> Unit, onConfirm: (List, List) -> Unit, ) { if (initialSelection.isEmpty()) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { tachiyomi.presentation.core.components.material.TextButton( onClick = { onDismissRequest() onEditCategories() }, ) { Text(text = stringResource(MR.strings.action_edit_categories)) } }, title = { Text(text = stringResource(MR.strings.action_move_category)) }, text = { Text(text = stringResource(MR.strings.information_empty_category_dialog)) }, ) return } var selection by remember { mutableStateOf(initialSelection) } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { Row { tachiyomi.presentation.core.components.material.TextButton(onClick = { onDismissRequest() onEditCategories() }) { Text(text = stringResource(MR.strings.action_edit)) } Spacer(modifier = Modifier.weight(1f)) tachiyomi.presentation.core.components.material.TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } tachiyomi.presentation.core.components.material.TextButton( onClick = { onDismissRequest() onConfirm( selection .filter { it is CheckboxState.State.Checked || it is CheckboxState.TriState.Include } .map { it.value.id }, selection .filter { it is CheckboxState.State.None || it is CheckboxState.TriState.None } .map { it.value.id }, ) }, ) { Text(text = stringResource(MR.strings.action_ok)) } } }, title = { Text(text = stringResource(MR.strings.action_move_category)) }, text = { Column( modifier = Modifier.verticalScroll(rememberScrollState()), ) { selection.forEach { checkbox -> val onChange: (CheckboxState) -> Unit = { val index = selection.indexOf(it) if (index != -1) { val mutableList = selection.toMutableList() mutableList[index] = it.next() selection = mutableList.toList().toImmutableList() } } Row( modifier = Modifier .fillMaxWidth() .clickable { onChange(checkbox) }, verticalAlignment = Alignment.CenterVertically, ) { when (checkbox) { is CheckboxState.TriState -> { TriStateCheckbox( state = checkbox.asToggleableState(), onClick = { onChange(checkbox) }, ) } is CheckboxState.State -> { Checkbox( checked = checkbox.isChecked, onCheckedChange = { onChange(checkbox) }, ) } } Text( text = checkbox.value.visualName, modifier = Modifier.padding(horizontal = MaterialTheme.padding.medium), ) } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/category/components/CategoryFloatingActionButton.kt ================================================ package eu.kanade.presentation.category.components import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.shouldExpandFAB @Composable fun CategoryFloatingActionButton( lazyListState: LazyListState, onCreate: () -> Unit, modifier: Modifier = Modifier, ) { ExtendedFloatingActionButton( text = { Text(text = stringResource(MR.strings.action_add)) }, icon = { Icon(imageVector = Icons.Outlined.Add, contentDescription = "") }, onClick = onCreate, expanded = lazyListState.shouldExpandFAB(), modifier = modifier, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/category/components/CategoryListItem.kt ================================================ package eu.kanade.presentation.category.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.DragHandle import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.Visibility import androidx.compose.material.icons.outlined.VisibilityOff import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import sh.calvin.reorderable.ReorderableCollectionItemScope import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ReorderableCollectionItemScope.CategoryListItem( category: Category, onRename: () -> Unit, onHide: () -> Unit, onDelete: () -> Unit, modifier: Modifier = Modifier, ) { ElevatedCard(modifier = modifier) { Row( modifier = Modifier .fillMaxWidth() .clickable(onClick = onRename) .padding(vertical = MaterialTheme.padding.small) .padding( start = MaterialTheme.padding.small, end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Outlined.DragHandle, contentDescription = null, modifier = Modifier .padding(MaterialTheme.padding.medium) .draggableHandle(), ) Text( text = category.name, modifier = Modifier.weight(1f), ) IconButton(onClick = onRename) { Icon( imageVector = Icons.Outlined.Edit, contentDescription = stringResource(MR.strings.action_rename_category), ) } IconButton( onClick = onHide, content = { Icon( imageVector = if (category.hidden) { Icons.Outlined.Visibility } else { Icons.Outlined.VisibilityOff }, contentDescription = stringResource(AYMR.strings.action_hide), ) }, ) IconButton(onClick = onDelete) { Icon( imageVector = Icons.Outlined.Delete, contentDescription = stringResource(MR.strings.action_delete), ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/AdaptiveSheet.kt ================================================ package eu.kanade.presentation.components import androidx.activity.compose.BackHandler import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.togetherWith import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import cafe.adriel.voyager.core.annotation.InternalVoyagerApi import cafe.adriel.voyager.core.lifecycle.DisposableEffectIgnoringConfiguration import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.Navigator import eu.kanade.presentation.util.ScreenTransition import eu.kanade.presentation.util.isTabletUi import tachiyomi.presentation.core.components.AdaptiveSheet as AdaptiveSheetImpl @OptIn(InternalVoyagerApi::class) @Composable fun NavigatorAdaptiveSheet( screen: Screen, enableSwipeDismiss: (Navigator) -> Boolean = { true }, onDismissRequest: () -> Unit, ) { Navigator( screen = screen, content = { sheetNavigator -> AdaptiveSheet( enableSwipeDismiss = enableSwipeDismiss(sheetNavigator), onDismissRequest = onDismissRequest, ) { ScreenTransition( navigator = sheetNavigator, transition = { fadeIn(animationSpec = tween(220, delayMillis = 90)) togetherWith fadeOut(animationSpec = tween(90)) }, ) BackHandler( enabled = sheetNavigator.size > 1, onBack = sheetNavigator::pop, ) } // Make sure screens are disposed no matter what if (sheetNavigator.parent?.disposeBehavior?.disposeNestedNavigators == false) { DisposableEffectIgnoringConfiguration { onDispose { sheetNavigator.items .asReversed() .forEach(sheetNavigator::dispose) } } } }, ) } /** * Sheet with adaptive position aligned to bottom on small screen, otherwise aligned to center * and will not be able to dismissed with swipe gesture. * * Max width of the content is set to 460 dp. */ @Composable fun AdaptiveSheet( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, enableSwipeDismiss: Boolean = true, content: @Composable () -> Unit, ) { val isTabletUi = isTabletUi() Dialog( onDismissRequest = onDismissRequest, properties = dialogProperties, ) { AdaptiveSheetImpl( modifier = modifier, isTabletUi = isTabletUi, enableSwipeDismiss = enableSwipeDismiss, onDismissRequest = onDismissRequest, ) { content() } } } private val dialogProperties = DialogProperties( usePlatformDefaultWidth = false, decorFitsSystemWindows = true, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/AppBar.kt ================================================ package eu.kanade.presentation.components import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.MoreVert import androidx.compose.material.icons.outlined.Search import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PlainTooltip import androidx.compose.material3.Text import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TooltipBox import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.rememberTooltipState import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import kotlinx.collections.immutable.ImmutableList import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Pill import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.clearFocusOnSoftKeyboardHide import tachiyomi.presentation.core.util.runOnEnterKeyPressed import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.showSoftKeyboard const val SEARCH_DEBOUNCE_MILLIS = 250L @Composable fun AppBar( title: String?, modifier: Modifier = Modifier, backgroundColor: Color? = null, // Text subtitle: String? = null, // Up button navigateUp: (() -> Unit)? = null, navigationIcon: ImageVector? = null, // Menu actions: @Composable RowScope.() -> Unit = {}, // Action mode actionModeCounter: Int = 0, onCancelActionMode: () -> Unit = {}, actionModeActions: @Composable RowScope.() -> Unit = {}, scrollBehavior: TopAppBarScrollBehavior? = null, ) { val isActionMode by remember(actionModeCounter) { derivedStateOf { actionModeCounter > 0 } } AppBar( modifier = modifier, backgroundColor = backgroundColor, titleContent = { if (isActionMode) { AppBarTitle(actionModeCounter.toString()) } else { AppBarTitle(title, subtitle = subtitle) } }, navigateUp = navigateUp, navigationIcon = navigationIcon, actions = { if (isActionMode) { actionModeActions() } else { actions() } }, isActionMode = isActionMode, onCancelActionMode = onCancelActionMode, scrollBehavior = scrollBehavior, ) } @Composable fun AppBar( // Title titleContent: @Composable () -> Unit, modifier: Modifier = Modifier, backgroundColor: Color? = null, // Up button navigateUp: (() -> Unit)? = null, navigationIcon: ImageVector? = null, // Menu actions: @Composable RowScope.() -> Unit = {}, // Action mode isActionMode: Boolean = false, onCancelActionMode: () -> Unit = {}, scrollBehavior: TopAppBarScrollBehavior? = null, ) { Column( modifier = modifier, ) { TopAppBar( navigationIcon = { if (isActionMode) { IconButton(onClick = onCancelActionMode) { Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_cancel), ) } } else { navigateUp?.let { IconButton(onClick = it) { UpIcon(navigationIcon = navigationIcon) } } } }, title = titleContent, actions = actions, colors = TopAppBarDefaults.topAppBarColors( containerColor = backgroundColor ?: MaterialTheme.colorScheme.surfaceColorAtElevation( elevation = if (isActionMode) 3.dp else 0.dp, ), ), scrollBehavior = scrollBehavior, ) } } @Composable fun AppBarTitle( title: String?, modifier: Modifier = Modifier, subtitle: String? = null, count: Int = 0, ) { if (count > 0) { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = title!!, maxLines = 1, modifier = Modifier.weight(1f, false), overflow = TextOverflow.Ellipsis, ) val pillAlpha = if (isSystemInDarkTheme()) 0.12f else 0.08f Pill( text = "$count", modifier = Modifier.padding(start = 4.dp), color = MaterialTheme.colorScheme.onBackground.copy(alpha = pillAlpha), fontSize = 14.sp, ) } } else { Column(modifier = modifier) { title?.let { Text( text = it, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } subtitle?.let { Text( text = it, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.basicMarquee( repeatDelayMillis = 2_000, ), ) } } } } @Composable fun AppBarActions( actions: ImmutableList, ) { var showMenu by remember { mutableStateOf(false) } actions.filterIsInstance().map { TooltipBox( positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), tooltip = { PlainTooltip { Text(it.title) } }, state = rememberTooltipState(), ) { IconButton( onClick = it.onClick, enabled = it.enabled, ) { Icon( imageVector = it.icon, tint = it.iconTint ?: LocalContentColor.current, contentDescription = it.title, ) } } } val overflowActions = actions.filterIsInstance() if (overflowActions.isNotEmpty()) { TooltipBox( positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), tooltip = { PlainTooltip { Text(stringResource(MR.strings.action_menu_overflow_description)) } }, state = rememberTooltipState(), ) { IconButton( onClick = { showMenu = !showMenu }, ) { Icon( Icons.Outlined.MoreVert, contentDescription = stringResource( MR.strings.action_menu_overflow_description, ), ) } } DropdownMenu( expanded = showMenu, onDismissRequest = { showMenu = false }, ) { overflowActions.map { DropdownMenuItem( onClick = { it.onClick() showMenu = false }, text = { Text(it.title, fontWeight = FontWeight.Normal) }, ) } } } } /** * @param searchEnabled Set to false if you don't want to show search action. * @param searchQuery If null, use normal toolbar. * @param placeholderText If null, [MR.strings.action_search_hint] is used. */ @Composable fun SearchToolbar( searchQuery: String?, onChangeSearchQuery: (String?) -> Unit, modifier: Modifier = Modifier, titleContent: @Composable () -> Unit = {}, navigateUp: (() -> Unit)? = null, searchEnabled: Boolean = true, placeholderText: String? = null, onSearch: (String) -> Unit = {}, onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) }, actions: @Composable RowScope.() -> Unit = {}, scrollBehavior: TopAppBarScrollBehavior? = null, visualTransformation: VisualTransformation = VisualTransformation.None, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, ) { val focusRequester = remember { FocusRequester() } AppBar( modifier = modifier, titleContent = { if (searchQuery == null) return@AppBar titleContent() val keyboardController = LocalSoftwareKeyboardController.current val focusManager = LocalFocusManager.current val searchAndClearFocus: () -> Unit = f@{ if (searchQuery.isBlank()) return@f onSearch(searchQuery) focusManager.clearFocus() keyboardController?.hide() } BasicTextField( value = searchQuery, onValueChange = onChangeSearchQuery, modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester) .runOnEnterKeyPressed(action = searchAndClearFocus) .showSoftKeyboard(remember { searchQuery.isEmpty() }) .clearFocusOnSoftKeyboardHide(), textStyle = MaterialTheme.typography.titleMedium.copy( color = MaterialTheme.colorScheme.onBackground, fontWeight = FontWeight.Normal, fontSize = 18.sp, ), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardActions = KeyboardActions(onSearch = { searchAndClearFocus() }), singleLine = true, cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), visualTransformation = visualTransformation, interactionSource = interactionSource, decorationBox = { innerTextField -> TextFieldDefaults.DecorationBox( value = searchQuery, innerTextField = innerTextField, enabled = true, singleLine = true, visualTransformation = visualTransformation, interactionSource = interactionSource, placeholder = { Text( modifier = Modifier.secondaryItemAlpha(), text = ( placeholderText ?: stringResource( MR.strings.action_search_hint, ) ), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleMedium.copy( fontSize = 18.sp, fontWeight = FontWeight.Normal, ), ) }, container = {}, ) }, ) }, navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch, actions = { key("search") { val onClick = { onChangeSearchQuery("") } if (!searchEnabled) { // Don't show search action } else if (searchQuery == null) { TooltipBox( positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), tooltip = { PlainTooltip { Text(stringResource(MR.strings.action_search)) } }, state = rememberTooltipState(), ) { IconButton( onClick = onClick, ) { Icon( Icons.Outlined.Search, contentDescription = stringResource(MR.strings.action_search), ) } } } else if (searchQuery.isNotEmpty()) { TooltipBox( positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), tooltip = { PlainTooltip { Text(stringResource(MR.strings.action_reset)) } }, state = rememberTooltipState(), ) { IconButton( onClick = { onClick() focusRequester.requestFocus() }, ) { Icon( Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_reset), ) } } } } key("actions") { actions() } }, isActionMode = false, scrollBehavior = scrollBehavior, ) } @Composable fun UpIcon( modifier: Modifier = Modifier, navigationIcon: ImageVector? = null, ) { val icon = navigationIcon ?: Icons.AutoMirrored.Outlined.ArrowBack Icon( imageVector = icon, contentDescription = stringResource(MR.strings.action_bar_up_description), modifier = modifier, ) } sealed interface AppBar { sealed interface AppBarAction data class Action( val title: String, val icon: ImageVector, val iconTint: Color? = null, val onClick: () -> Unit, val enabled: Boolean = true, ) : AppBarAction data class OverflowAction( val title: String, val onClick: () -> Unit, ) : AppBarAction } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/Banners.kt ================================================ package eu.kanade.presentation.components import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.expandVertically import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.layout.SubcomposeLayout import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastMap import androidx.compose.ui.util.fastMaxBy import dev.icerock.moko.resources.StringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource val DownloadedOnlyBannerBackgroundColor @Composable get() = MaterialTheme.colorScheme.tertiary val IncognitoModeBannerBackgroundColor @Composable get() = MaterialTheme.colorScheme.primary val IndexingBannerBackgroundColor @Composable get() = MaterialTheme.colorScheme.secondary @Composable fun WarningBanner( textRes: StringResource, modifier: Modifier = Modifier, ) { Text( text = stringResource(textRes), modifier = modifier .fillMaxWidth() .background(MaterialTheme.colorScheme.error) .padding(16.dp), color = MaterialTheme.colorScheme.onError, style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Center, ) } @Composable fun AppStateBanners( downloadedOnlyMode: Boolean, incognitoMode: Boolean, indexing: Boolean, modifier: Modifier = Modifier, ) { val density = LocalDensity.current val mainInsets = WindowInsets.statusBars val mainInsetsTop = mainInsets.getTop(density) SubcomposeLayout(modifier = modifier) { constraints -> val indexingPlaceable = subcompose(0) { AnimatedVisibility( visible = indexing, enter = expandVertically(), exit = shrinkVertically(), ) { IndexingDownloadBanner( modifier = Modifier.windowInsetsPadding(mainInsets), ) } }.fastMap { it.measure(constraints) } val indexingHeight = indexingPlaceable.fastMaxBy { it.height }?.height ?: 0 val downloadedOnlyPlaceable = subcompose(1) { AnimatedVisibility( visible = downloadedOnlyMode, enter = expandVertically(), exit = shrinkVertically(), ) { val top = (mainInsetsTop - indexingHeight).coerceAtLeast(0) DownloadedOnlyModeBanner( modifier = Modifier.windowInsetsPadding(WindowInsets(top = top)), ) } }.fastMap { it.measure(constraints) } val downloadedOnlyHeight = downloadedOnlyPlaceable.fastMaxBy { it.height }?.height ?: 0 val incognitoPlaceable = subcompose(2) { AnimatedVisibility( visible = incognitoMode, enter = expandVertically(), exit = shrinkVertically(), ) { val top = (mainInsetsTop - indexingHeight - downloadedOnlyHeight).coerceAtLeast(0) IncognitoModeBanner( modifier = Modifier.windowInsetsPadding(WindowInsets(top = top)), ) } }.fastMap { it.measure(constraints) } val incognitoHeight = incognitoPlaceable.fastMaxBy { it.height }?.height ?: 0 layout(constraints.maxWidth, indexingHeight + downloadedOnlyHeight + incognitoHeight) { indexingPlaceable.fastForEach { it.place(0, 0) } downloadedOnlyPlaceable.fastForEach { it.place(0, indexingHeight) } incognitoPlaceable.fastForEach { it.place(0, indexingHeight + downloadedOnlyHeight) } } } } @Composable private fun DownloadedOnlyModeBanner(modifier: Modifier = Modifier) { Text( text = stringResource(MR.strings.label_downloaded_only), modifier = Modifier .background(DownloadedOnlyBannerBackgroundColor) .fillMaxWidth() .padding(4.dp) .then(modifier), color = MaterialTheme.colorScheme.onTertiary, textAlign = TextAlign.Center, style = MaterialTheme.typography.labelMedium, ) } @Composable private fun IncognitoModeBanner(modifier: Modifier = Modifier) { Text( text = stringResource(MR.strings.pref_incognito_mode), modifier = Modifier .background(IncognitoModeBannerBackgroundColor) .fillMaxWidth() .padding(4.dp) .then(modifier), color = MaterialTheme.colorScheme.onPrimary, textAlign = TextAlign.Center, style = MaterialTheme.typography.labelMedium, ) } @Composable private fun IndexingDownloadBanner(modifier: Modifier = Modifier) { val density = LocalDensity.current Row( modifier = Modifier .background(color = IndexingBannerBackgroundColor) .fillMaxWidth() .padding(8.dp) .then(modifier), horizontalArrangement = Arrangement.Center, ) { var textHeight by remember { mutableStateOf(0.dp) } CircularProgressIndicator( modifier = Modifier.requiredSize(textHeight), color = MaterialTheme.colorScheme.onSecondary, strokeWidth = textHeight / 8, ) Spacer(modifier = Modifier.width(8.dp)) Text( text = stringResource(MR.strings.download_notifier_cache_renewal), color = MaterialTheme.colorScheme.onSecondary, textAlign = TextAlign.Center, style = MaterialTheme.typography.labelMedium, onTextLayout = { with(density) { textHeight = it.size.height.toDp() } }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/DateText.kt ================================================ package eu.kanade.presentation.components import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import eu.kanade.domain.ui.UiPreferences import eu.kanade.tachiyomi.util.lang.toRelativeString import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId @Composable fun relativeDateText( dateEpochMillis: Long, ): String { return relativeDateText( localDate = LocalDate.ofInstant( Instant.ofEpochMilli(dateEpochMillis), ZoneId.systemDefault(), ) .takeIf { dateEpochMillis > 0L }, ) } // For use in chapter/episode release time @Composable fun relativeDateTimeText( dateEpochMillis: Long, ): String { return relativeDateTimeText( localDateTime = LocalDateTime.ofInstant( Instant.ofEpochMilli(dateEpochMillis), ZoneId.systemDefault(), ) .takeIf { dateEpochMillis > 0L }, ) } @Composable fun relativeDateText( localDate: LocalDate?, ): String { val context = LocalContext.current val preferences = remember { Injekt.get() } val relativeTime = remember { preferences.relativeTime().get() } val dateFormat = remember { UiPreferences.dateFormat(preferences.dateFormat().get()) } return localDate?.toRelativeString( context = context, relative = relativeTime, dateFormat = dateFormat, ) ?: stringResource(MR.strings.not_applicable) } // For use in chapter/episode release time @Composable fun relativeDateTimeText( localDateTime: LocalDateTime?, ): String { val context = LocalContext.current val preferences = remember { Injekt.get() } val relativeTime = remember { preferences.relativeTime().get() } val dateFormat = remember { UiPreferences.dateFormat(preferences.dateFormat().get()) } return localDateTime?.toRelativeString( context = context, relative = relativeTime, dateFormat = dateFormat, ) ?: stringResource(MR.strings.not_applicable) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/DropdownMenu.kt ================================================ package eu.kanade.presentation.components import androidx.compose.foundation.ScrollState import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowRight import androidx.compose.material.icons.outlined.RadioButtonChecked import androidx.compose.material.icons.outlined.RadioButtonUnchecked import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.window.PopupProperties import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import androidx.compose.material3.DropdownMenu as ComposeDropdownMenu /** * DropdownMenu but overlaps anchor and has width constraints to better * match non-Compose implementation. */ @Composable fun DropdownMenu( expanded: Boolean, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, offset: DpOffset = DpOffset(8.dp, (-56).dp), scrollState: ScrollState = rememberScrollState(), properties: PopupProperties = PopupProperties(focusable = true), content: @Composable ColumnScope.() -> Unit, ) { ComposeDropdownMenu( expanded = expanded, onDismissRequest = onDismissRequest, modifier = modifier.sizeIn(minWidth = 196.dp, maxWidth = 196.dp), offset = offset, scrollState = scrollState, properties = properties, content = content, ) } @Composable fun RadioMenuItem( text: @Composable () -> Unit, isChecked: Boolean, modifier: Modifier = Modifier, onClick: () -> Unit, ) { DropdownMenuItem( text = text, onClick = onClick, trailingIcon = { if (isChecked) { Icon( imageVector = Icons.Outlined.RadioButtonChecked, contentDescription = stringResource(MR.strings.selected), tint = MaterialTheme.colorScheme.primary, ) } else { Icon( imageVector = Icons.Outlined.RadioButtonUnchecked, contentDescription = stringResource(MR.strings.not_selected), ) } }, modifier = modifier, ) } @Composable fun NestedMenuItem( text: @Composable () -> Unit, children: @Composable ColumnScope.(() -> Unit) -> Unit, modifier: Modifier = Modifier, ) { var nestedExpanded by remember { mutableStateOf(false) } val closeMenu = { nestedExpanded = false } Box { DropdownMenuItem( text = text, onClick = { nestedExpanded = true }, trailingIcon = { Icon( imageVector = Icons.AutoMirrored.Outlined.ArrowRight, contentDescription = null, ) }, ) DropdownMenu( expanded = nestedExpanded, onDismissRequest = closeMenu, modifier = modifier, ) { children(closeMenu) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/EmptyScreen.kt ================================================ package eu.kanade.presentation.components import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreenAction @PreviewLightDark @Composable private fun NoActionPreview() { TachiyomiPreviewTheme { Surface { EmptyScreen( stringRes = MR.strings.empty_screen, ) } } } @PreviewLightDark @Composable private fun WithActionPreview() { TachiyomiPreviewTheme { Surface { EmptyScreen( stringRes = MR.strings.empty_screen, actions = persistentListOf( EmptyScreenAction( stringRes = MR.strings.action_retry, icon = Icons.Outlined.Refresh, onClick = {}, ), EmptyScreenAction( stringRes = MR.strings.getting_started_guide, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = {}, ), ), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/EntryDownloadDropdownMenu.kt ================================================ package eu.kanade.presentation.components import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.presentation.entries.DownloadAction import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource @Composable fun EntryDownloadDropdownMenu( expanded: Boolean, onDismissRequest: () -> Unit, onDownloadClicked: (DownloadAction) -> Unit, isManga: Boolean, modifier: Modifier = Modifier, ) { val downloadAmount = if (isManga) MR.plurals.download_amount else AYMR.plurals.download_amount_anime val downloadUnviewed = if (isManga) MR.strings.download_unread else AYMR.strings.download_unseen val options = persistentListOf( DownloadAction.NEXT_1_ITEM to pluralStringResource(downloadAmount, 1, 1), DownloadAction.NEXT_5_ITEMS to pluralStringResource(downloadAmount, 5, 5), DownloadAction.NEXT_10_ITEMS to pluralStringResource(downloadAmount, 10, 10), DownloadAction.NEXT_25_ITEMS to pluralStringResource(downloadAmount, 25, 25), DownloadAction.UNVIEWED_ITEMS to stringResource(downloadUnviewed), ) DropdownMenu( expanded = expanded, onDismissRequest = onDismissRequest, modifier = modifier, ) { options.map { (downloadAction, string) -> DropdownMenuItem( text = { Text(text = string) }, onClick = { onDownloadClicked(downloadAction) onDismissRequest() }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/FloatingActionAddButton.kt ================================================ package eu.kanade.presentation.components import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.shouldExpandFAB @Composable fun FloatingActionAddButton( lazyListState: LazyListState, onClick: () -> Unit, modifier: Modifier = Modifier, ) { ExtendedFloatingActionButton( text = { Text(text = stringResource(MR.strings.action_add)) }, icon = { Icon(imageVector = Icons.Outlined.Add, contentDescription = null) }, onClick = onClick, expanded = lazyListState.shouldExpandFAB(), modifier = modifier, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/ItemDownloadIndicator.kt ================================================ package eu.kanade.presentation.components import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.ripple import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedback import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.semantics.Role import androidx.compose.ui.unit.dp import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.presentation.core.components.material.IconButtonTokens import uy.kohesive.injekt.injectLazy internal fun Modifier.commonClickable( enabled: Boolean, hapticFeedback: HapticFeedback, onLongClick: () -> Unit, onClick: () -> Unit, ) = this.combinedClickable( enabled = enabled, onLongClick = { onLongClick() hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) }, onClick = onClick, role = Role.Button, interactionSource = null, indication = ripple( bounded = false, radius = IconButtonTokens.StateLayerSize / 2, ), ) internal val IndicatorSize = 26.dp internal val IndicatorPadding = 2.dp // To match composable parameter name when used later internal val IndicatorStrokeWidth = IndicatorPadding internal val IndicatorModifier = Modifier .size(IndicatorSize) .padding(IndicatorPadding) internal val ArrowModifier = Modifier .size(IndicatorSize - 7.dp) internal val preferences: DownloadPreferences by injectLazy() ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/TabbedDialog.kt ================================================ package eu.kanade.presentation.components import androidx.compose.animation.animateContentSize import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.Tab import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEachIndexed import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.TabText import tachiyomi.presentation.core.i18n.stringResource object TabbedDialogPaddings { val Horizontal = 24.dp val Vertical = 8.dp } @Composable fun TabbedDialog( onDismissRequest: () -> Unit, tabTitles: ImmutableList, modifier: Modifier = Modifier, tabOverflowMenuContent: (@Composable ColumnScope.(() -> Unit) -> Unit)? = null, onOverflowMenuClicked: (() -> Unit)? = null, overflowIcon: ImageVector? = null, pagerState: PagerState = rememberPagerState { tabTitles.size }, content: @Composable (Int) -> Unit, ) { AdaptiveSheet( modifier = modifier, onDismissRequest = onDismissRequest, ) { val scope = rememberCoroutineScope() Column { Row { PrimaryTabRow( modifier = Modifier.weight(1f), selectedTabIndex = pagerState.currentPage, containerColor = MaterialTheme.colorScheme.surfaceContainerHigh, divider = {}, ) { tabTitles.fastForEachIndexed { index, tab -> Tab( selected = pagerState.currentPage == index, onClick = { scope.launch { pagerState.animateScrollToPage(index) } }, text = { TabText(text = tab) }, unselectedContentColor = MaterialTheme.colorScheme.onSurface, ) } } MoreMenu(onOverflowMenuClicked, tabOverflowMenuContent, overflowIcon) } HorizontalDivider() HorizontalPager( modifier = Modifier.animateContentSize(), state = pagerState, verticalAlignment = Alignment.Top, pageContent = { page -> content(page) }, ) } } } @Composable private fun MoreMenu( onClickIcon: (() -> Unit)?, content: @Composable (ColumnScope.(() -> Unit) -> Unit)?, overflowIcon: ImageVector? = null, ) { if (onClickIcon == null && content == null) return var expanded by remember { mutableStateOf(false) } val onClick = onClickIcon ?: { expanded = true } Box(modifier = Modifier.wrapContentSize(Alignment.TopStart)) { IconButton(onClick = onClick) { Icon( imageVector = overflowIcon ?: Icons.Default.MoreVert, contentDescription = stringResource(MR.strings.label_more), ) } if (onClickIcon == null) { DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, ) { content!! { expanded = false } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/components/TabbedScreen.kt ================================================ package eu.kanade.presentation.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Tab import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.launch import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.TabText import tachiyomi.presentation.core.i18n.stringResource @Composable fun TabbedScreen( titleRes: StringResource?, tabs: ImmutableList, modifier: Modifier = Modifier, state: PagerState = rememberPagerState { tabs.size }, mangaSearchQuery: String? = null, onChangeMangaSearchQuery: (String?) -> Unit = {}, scrollable: Boolean = false, animeSearchQuery: String? = null, onChangeAnimeSearchQuery: (String?) -> Unit = {}, ) { val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } Scaffold( topBar = { if (titleRes != null) { val tab = tabs[state.currentPage] val searchEnabled = tab.searchEnabled val actualQuery = when (state.currentPage % 2) { 1 -> mangaSearchQuery // History and Browse else -> animeSearchQuery } val actualOnChange = when (state.currentPage % 2) { 1 -> onChangeMangaSearchQuery // History and Browse else -> onChangeAnimeSearchQuery } SearchToolbar( titleContent = { AppBarTitle( stringResource(titleRes), modifier = modifier, null, tab.numberTitle, ) }, searchEnabled = searchEnabled, searchQuery = if (searchEnabled) actualQuery else null, onChangeSearchQuery = actualOnChange, actions = { AppBarActions(tab.actions) }, navigateUp = tab.navigateUp, ) } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> Column( modifier = Modifier.padding( top = contentPadding.calculateTopPadding(), start = contentPadding.calculateStartPadding(LocalLayoutDirection.current), end = contentPadding.calculateEndPadding(LocalLayoutDirection.current), ), ) { FlexibleTabRow( scrollable = scrollable, selectedTabIndex = state.currentPage, ) { tabs.forEachIndexed { index, tab -> Tab( selected = state.currentPage == index, onClick = { scope.launch { state.animateScrollToPage(index) } }, text = { TabText( text = stringResource(tab.titleRes), badgeCount = tab.badgeNumber, ) }, unselectedContentColor = MaterialTheme.colorScheme.onSurface, ) } } HorizontalPager( modifier = Modifier.fillMaxSize(), state = state, verticalAlignment = Alignment.Top, ) { page -> tabs[page].content( PaddingValues(bottom = contentPadding.calculateBottomPadding()), snackbarHostState, ) } } } } data class TabContent( val titleRes: StringResource, val badgeNumber: Int? = null, val searchEnabled: Boolean = false, val actions: ImmutableList = persistentListOf(), val content: @Composable (contentPadding: PaddingValues, snackbarHostState: SnackbarHostState) -> Unit, val numberTitle: Int = 0, val cancelAction: () -> Unit = {}, val navigateUp: (() -> Unit)? = null, ) @Composable private fun FlexibleTabRow( scrollable: Boolean, selectedTabIndex: Int, block: @Composable () -> Unit, ) { return if (scrollable) { ScrollableTabRow( selectedTabIndex = selectedTabIndex, edgePadding = 13.dp, modifier = Modifier.zIndex(1f), ) { block() } } else { PrimaryTabRow( selectedTabIndex = selectedTabIndex, modifier = Modifier.zIndex(1f), ) { block() } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/crash/CrashScreen.kt ================================================ package eu.kanade.presentation.crash import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.BugReport import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.util.CrashLogUtil import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.InfoScreen @Composable fun CrashScreen( exception: Throwable?, onRestartClick: () -> Unit, ) { val scope = rememberCoroutineScope() val context = LocalContext.current InfoScreen( icon = Icons.Outlined.BugReport, headingText = stringResource(MR.strings.crash_screen_title), subtitleText = stringResource( MR.strings.crash_screen_description, stringResource(MR.strings.app_name), ), acceptText = stringResource(MR.strings.pref_dump_crash_logs), onAcceptClick = { scope.launch { CrashLogUtil(context).dumpLogs(exception) } }, rejectText = stringResource(MR.strings.crash_screen_restart_application), onRejectClick = onRestartClick, ) { Box( modifier = Modifier .padding(vertical = MaterialTheme.padding.small) .clip(MaterialTheme.shapes.small) .fillMaxSize() .background(MaterialTheme.colorScheme.surfaceVariant), ) { Text( text = exception.toString(), modifier = Modifier .padding(all = MaterialTheme.padding.small), color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } } @PreviewLightDark @Composable private fun CrashScreenPreview() { TachiyomiPreviewTheme { CrashScreen(exception = RuntimeException("Dummy")) {} } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/EntryScreenConstants.kt ================================================ package eu.kanade.presentation.entries enum class DownloadAction { NEXT_1_ITEM, NEXT_5_ITEMS, NEXT_10_ITEMS, NEXT_25_ITEMS, UNVIEWED_ITEMS, } enum class EditCoverAction { EDIT, DELETE, } enum class EntryScreenItem { INFO_BOX, ACTION_ROW, DESCRIPTION_WITH_TAG, ITEM_HEADER, ITEM, AIRING_TIME, } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/AnimeScreen.kt ================================================ package eu.kanade.presentation.entries.anime import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.lazy.grid.rememberLazyGridState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.layout import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.offset import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastMap import aniyomi.domain.anime.SeasonAnime import aniyomi.domain.anime.SeasonDisplayMode import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.entries.anime.model.episodesFiltered import eu.kanade.domain.entries.anime.model.seasonsFiltered import eu.kanade.presentation.components.relativeDateTimeText import eu.kanade.presentation.entries.DownloadAction import eu.kanade.presentation.entries.EntryScreenItem import eu.kanade.presentation.entries.anime.components.AnimeActionRow import eu.kanade.presentation.entries.anime.components.AnimeEpisodeListItem import eu.kanade.presentation.entries.anime.components.AnimeInfoBox import eu.kanade.presentation.entries.anime.components.AnimeSeasonListItem import eu.kanade.presentation.entries.anime.components.EpisodeDownloadAction import eu.kanade.presentation.entries.anime.components.ExpandableAnimeDescription import eu.kanade.presentation.entries.anime.components.NextEpisodeAiringListItem import eu.kanade.presentation.entries.components.EntryBottomActionMenu import eu.kanade.presentation.entries.components.EntryToolbar import eu.kanade.presentation.entries.components.ItemHeader import eu.kanade.presentation.entries.components.MissingItemCountListItem import eu.kanade.presentation.util.formatEpisodeNumber import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.source.anime.getNameForAnimeInfo import eu.kanade.tachiyomi.ui.browse.anime.extension.details.AnimeSourcePreferencesScreen import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreenModel import eu.kanade.tachiyomi.ui.entries.anime.AnimeSeasonItem import eu.kanade.tachiyomi.ui.entries.anime.EpisodeList import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.coroutines.delay import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.service.missingEntriesCount import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.FastScrollLazyVerticalGrid import tachiyomi.presentation.core.components.TwoPanelBox import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.shouldExpandFAB import tachiyomi.source.local.entries.anime.isLocal import java.time.Instant import java.util.concurrent.TimeUnit @Composable fun AnimeScreen( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, navigateUp: () -> Unit, onEpisodeClicked: (episode: Episode, alt: Boolean) -> Unit, onDownloadEpisode: ((List, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: (() -> Unit)?, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiFillermarkClicked: (List, fillermarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List) -> Unit, // For episode swipe onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, // Season clicked onSeasonClicked: (SeasonAnime) -> Unit, onContinueWatchingClicked: ((SeasonAnime) -> Unit)?, ) { val context = LocalContext.current val onCopyTagToClipboard: (tag: String) -> Unit = { if (it.isNotEmpty()) { context.copyToClipboard(it, it) } } val navigator = LocalNavigator.currentOrThrow val onSettingsClicked: (() -> Unit)? = { navigator.push(AnimeSourcePreferencesScreen(state.source.id)) }.takeIf { state.source is ConfigurableAnimeSource } if (!isTabletUi) { AnimeScreenSmallImpl( state = state, snackbarHostState = snackbarHostState, nextUpdate = nextUpdate, episodeSwipeStartAction = episodeSwipeStartAction, episodeSwipeEndAction = episodeSwipeEndAction, showNextEpisodeAirTime = showNextEpisodeAirTime, alwaysUseExternalPlayer = alwaysUseExternalPlayer, navigateUp = navigateUp, onEpisodeClicked = onEpisodeClicked, onDownloadEpisode = onDownloadEpisode, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, onFilterClicked = onFilterButtonClicked, onRefresh = onRefresh, onContinueWatching = onContinueWatching, onSearch = onSearch, onCoverClicked = onCoverClicked, onShareClicked = onShareClicked, onDownloadActionClicked = onDownloadActionClicked, onEditCategoryClicked = onEditCategoryClicked, onEditIntervalClicked = onEditFetchIntervalClicked, onMigrateClicked = onMigrateClicked, changeAnimeSkipIntro = changeAnimeSkipIntro, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiFillermarkClicked = onMultiFillermarkClicked, onMultiMarkAsSeenClicked = onMultiMarkAsSeenClicked, onMarkPreviousAsSeenClicked = onMarkPreviousAsSeenClicked, onMultiDeleteClicked = onMultiDeleteClicked, onEpisodeSwipe = onEpisodeSwipe, onEpisodeSelected = onEpisodeSelected, onAllEpisodeSelected = onAllEpisodeSelected, onInvertSelection = onInvertSelection, onSettingsClicked = onSettingsClicked, onSeasonClicked = onSeasonClicked, onClickContinueWatching = onContinueWatchingClicked, ) } else { AnimeScreenLargeImpl( state = state, snackbarHostState = snackbarHostState, nextUpdate = nextUpdate, episodeSwipeStartAction = episodeSwipeStartAction, episodeSwipeEndAction = episodeSwipeEndAction, showNextEpisodeAirTime = showNextEpisodeAirTime, alwaysUseExternalPlayer = alwaysUseExternalPlayer, navigateUp = navigateUp, onEpisodeClicked = onEpisodeClicked, onDownloadEpisode = onDownloadEpisode, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, onFilterButtonClicked = onFilterButtonClicked, onRefresh = onRefresh, onContinueWatching = onContinueWatching, onSearch = onSearch, onCoverClicked = onCoverClicked, onShareClicked = onShareClicked, onDownloadActionClicked = onDownloadActionClicked, onEditCategoryClicked = onEditCategoryClicked, onEditIntervalClicked = onEditFetchIntervalClicked, changeAnimeSkipIntro = changeAnimeSkipIntro, onMigrateClicked = onMigrateClicked, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiFillermarkClicked = onMultiFillermarkClicked, onMultiMarkAsSeenClicked = onMultiMarkAsSeenClicked, onMarkPreviousAsSeenClicked = onMarkPreviousAsSeenClicked, onMultiDeleteClicked = onMultiDeleteClicked, onEpisodeSwipe = onEpisodeSwipe, onEpisodeSelected = onEpisodeSelected, onAllEpisodeSelected = onAllEpisodeSelected, onInvertSelection = onInvertSelection, onSettingsClicked = onSettingsClicked, onSeasonClicked = onSeasonClicked, onClickContinueWatching = onContinueWatchingClicked, ) } } @OptIn(ExperimentalMaterial3Api::class) @Composable private fun AnimeScreenSmallImpl( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, navigateUp: () -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: (() -> Unit)?, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiFillermarkClicked: (List, fillermarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List) -> Unit, // For episode swipe onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, // Season clicked onSeasonClicked: (SeasonAnime) -> Unit, onClickContinueWatching: ((SeasonAnime) -> Unit)?, ) { val density = LocalDensity.current val offsetGridPaddingPx = with(density) { GRID_PADDING.roundToPx() } val gridSize = remember(state.anime) { state.anime.seasonDisplayGridSize } val itemListState = rememberLazyGridState() val seasons = remember(state) { state.processedSeasons } val episodes = remember(state) { state.processedEpisodes } val listItem = remember(state) { state.episodeListItems } val hasFilters = remember(state) { when (state.anime.fetchType) { FetchType.Seasons -> state.anime.seasonsFiltered() FetchType.Episodes -> state.anime.episodesFiltered() } } var toolbarHeight by remember { mutableIntStateOf(0) } val isAnySelected by remember { derivedStateOf { episodes.fastAny { it.selected } } } BackHandler(onBack = { if (isAnySelected) { onAllEpisodeSelected(false) } else { navigateUp() } }) BoxWithConstraints { val density = LocalDensity.current val containerHeightPx = with(density) { this@BoxWithConstraints.maxHeight.roundToPx() } Scaffold( topBar = { val selectedEpisodeCount: Int = remember(episodes) { episodes.count { it.selected } } val isFirstItemVisible by remember { derivedStateOf { itemListState.firstVisibleItemIndex == 0 } } val isFirstItemScrolled by remember { derivedStateOf { itemListState.firstVisibleItemScrollOffset > 0 } } val titleAlpha by animateFloatAsState( if (!isFirstItemVisible) 1f else 0f, label = "Top Bar Title", ) val backgroundAlpha by animateFloatAsState( if (!isFirstItemVisible || isFirstItemScrolled) 1f else 0f, label = "Top Bar Background", ) EntryToolbar( title = state.anime.title, hasFilters = hasFilters, navigateUp = navigateUp, onClickFilter = onFilterClicked, onClickShare = onShareClicked, onClickDownload = onDownloadActionClicked, onClickEditCategory = onEditCategoryClicked, onClickRefresh = onRefresh, onClickMigrate = onMigrateClicked, onClickSettings = onSettingsClicked, changeAnimeSkipIntro = changeAnimeSkipIntro, actionModeCounter = selectedEpisodeCount, onCancelActionMode = { onAllEpisodeSelected(false) }, onSelectAll = { onAllEpisodeSelected(true) }, onInvertSelection = { onInvertSelection() }, titleAlphaProvider = { titleAlpha }, backgroundAlphaProvider = { backgroundAlpha }, isManga = false, modifier = Modifier.onSizeChanged { toolbarHeight = it.height }, ) }, bottomBar = { val selectedEpisodes = remember(episodes) { episodes.filter { it.selected } } SharedAnimeBottomActionMenu( selected = selectedEpisodes, onEpisodeClicked = onEpisodeClicked, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiFillermarkClicked = onMultiFillermarkClicked, onMultiMarkAsSeenClicked = onMultiMarkAsSeenClicked, onMarkPreviousAsSeenClicked = onMarkPreviousAsSeenClicked, onDownloadEpisode = onDownloadEpisode, onMultiDeleteClicked = onMultiDeleteClicked, fillFraction = 1f, alwaysUseExternalPlayer = alwaysUseExternalPlayer, ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { val isFABVisible = remember(episodes) { episodes.fastAny { !it.episode.seen } && !isAnySelected } AnimatedVisibility( visible = isFABVisible, enter = fadeIn(), exit = fadeOut(), ) { ExtendedFloatingActionButton( text = { val isWatching = remember(state.episodes) { state.episodes.fastAny { it.episode.seen } } Text( text = stringResource( if (isWatching) MR.strings.action_resume else MR.strings.action_start, ), ) }, icon = { Icon( imageVector = Icons.Filled.PlayArrow, contentDescription = null, ) }, onClick = onContinueWatching, expanded = itemListState.shouldExpandFAB(), ) } }, ) { contentPadding -> val topPadding = contentPadding.calculateTopPadding() PullRefresh( refreshing = state.isRefreshingData, onRefresh = onRefresh, enabled = !isAnySelected, indicatorPadding = PaddingValues(top = topPadding), ) { val layoutDirection = LocalLayoutDirection.current FastScrollLazyVerticalGrid( modifier = Modifier.fillMaxHeight(), state = itemListState, columns = if (gridSize == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(gridSize), contentPadding = PaddingValues( start = GRID_PADDING + contentPadding.calculateStartPadding(layoutDirection), end = GRID_PADDING + contentPadding.calculateEndPadding(layoutDirection), bottom = contentPadding.calculateBottomPadding(), ), ) { item( key = EntryScreenItem.INFO_BOX, contentType = EntryScreenItem.INFO_BOX, span = { GridItemSpan(maxLineSpan) }, ) { AnimeInfoBox( isTabletUi = false, appBarPadding = topPadding, anime = state.anime, sourceName = remember { state.source.getNameForAnimeInfo() }, isStubSource = remember { state.source is StubAnimeSource }, onCoverClick = onCoverClicked, doSearch = onSearch, modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } item( key = EntryScreenItem.ACTION_ROW, contentType = EntryScreenItem.ACTION_ROW, span = { GridItemSpan(maxLineSpan) }, ) { AnimeActionRow( favorite = state.anime.favorite, trackingCount = state.trackingCount, nextUpdate = nextUpdate, isUserIntervalMode = state.anime.fetchInterval < 0, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onEditIntervalClicked = onEditIntervalClicked, onEditCategory = onEditCategoryClicked, modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } item( key = EntryScreenItem.DESCRIPTION_WITH_TAG, contentType = EntryScreenItem.DESCRIPTION_WITH_TAG, span = { GridItemSpan(maxLineSpan) }, ) { ExpandableAnimeDescription( defaultExpandState = state.isFromSource, description = state.anime.description, tagsProvider = { state.anime.genre }, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } item( key = EntryScreenItem.ITEM_HEADER, contentType = EntryScreenItem.ITEM_HEADER, span = { GridItemSpan(maxLineSpan) }, ) { val missingEpisodesCount = remember(episodes) { episodes.map { it.episode.episodeNumber }.missingEntriesCount() } val missingSeasonsCount = remember(seasons) { seasons.map { it.seasonAnime.anime.seasonNumber }.missingEntriesCount() } ItemHeader( enabled = !isAnySelected, itemCount = when (state.anime.fetchType) { FetchType.Seasons -> seasons.size FetchType.Episodes -> episodes.size }, missingItemsCount = maxOf(missingEpisodesCount, missingSeasonsCount), onClick = onFilterClicked, isManga = false, fetchType = state.anime.fetchType, modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } when (state.anime.fetchType) { FetchType.Seasons -> { sharedSeasons( anime = state.anime, seasons = seasons, containerHeight = containerHeightPx - toolbarHeight, onSeasonClicked = onSeasonClicked, onClickContinueWatching = onClickContinueWatching, listItemModifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } FetchType.Episodes -> { if (state.airingTime > 0L) { item( key = EntryScreenItem.AIRING_TIME, contentType = EntryScreenItem.AIRING_TIME, span = { GridItemSpan(maxLineSpan) }, ) { // Handles the second by second countdown var timer by remember { mutableLongStateOf(state.airingTime) } LaunchedEffect(key1 = timer) { if (timer > 0L) { delay(1000L) timer -= 1000L } } if (timer > 0L && showNextEpisodeAirTime && state.anime.status.toInt() != SAnime.COMPLETED ) { NextEpisodeAiringListItem( title = stringResource( AYMR.strings.display_mode_episode, formatEpisodeNumber(state.airingEpisodeNumber), ), date = formatTime(state.airingTime, useDayFormat = true), modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } } } sharedEpisodeItems( anime = state.anime, episodes = listItem, isAnyEpisodeSelected = episodes.fastAny { it.selected }, showSummaries = state.showSummaries, showPreviews = state.showPreviews, episodeSwipeStartAction = episodeSwipeStartAction, episodeSwipeEndAction = episodeSwipeEndAction, onEpisodeClicked = onEpisodeClicked, onDownloadEpisode = onDownloadEpisode, onEpisodeSelected = onEpisodeSelected, onEpisodeSwipe = onEpisodeSwipe, itemModifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } } } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun AnimeScreenLargeImpl( state: AnimeScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, showNextEpisodeAirTime: Boolean, alwaysUseExternalPlayer: Boolean, navigateUp: () -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List, EpisodeDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: (() -> Unit)?, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueWatching: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, changeAnimeSkipIntro: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiFillermarkClicked: (List, fillermarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onMultiDeleteClicked: (List) -> Unit, // For swipe actions onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, // Episode selection onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onAllEpisodeSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, // Season clicked onSeasonClicked: (SeasonAnime) -> Unit, onClickContinueWatching: ((SeasonAnime) -> Unit)?, ) { val layoutDirection = LocalLayoutDirection.current val density = LocalDensity.current val seasons = remember(state) { state.processedSeasons } val episodes = remember(state) { state.processedEpisodes } val listItem = remember(state) { state.episodeListItems } val isAnySelected by remember { derivedStateOf { episodes.fastAny { it.selected } } } val insetPadding = WindowInsets.systemBars.only(WindowInsetsSides.Horizontal).asPaddingValues() var topBarHeight by remember { mutableIntStateOf(0) } val offsetGridPaddingPx = with(density) { GRID_PADDING.roundToPx() } val gridSize = remember(state.anime) { state.anime.seasonDisplayGridSize } val itemListState = rememberLazyGridState() val hasFilters = remember(state) { when (state.anime.fetchType) { FetchType.Seasons -> state.anime.seasonsFiltered() FetchType.Episodes -> state.anime.episodesFiltered() } } BackHandler(onBack = { if (isAnySelected) { onAllEpisodeSelected(false) } else { navigateUp() } }) BoxWithConstraints { val density = LocalDensity.current val containerHeightPx = with(density) { this@BoxWithConstraints.maxHeight.roundToPx() } Scaffold( topBar = { val selectedChapterCount = remember(episodes) { episodes.count { it.selected } } EntryToolbar( modifier = Modifier.onSizeChanged { topBarHeight = it.height }, title = state.anime.title, hasFilters = hasFilters, navigateUp = navigateUp, onClickFilter = onFilterButtonClicked, onClickShare = onShareClicked, onClickDownload = onDownloadActionClicked, onClickEditCategory = onEditCategoryClicked, onClickRefresh = onRefresh, onClickMigrate = onMigrateClicked, onCancelActionMode = { onAllEpisodeSelected(false) }, onClickSettings = onSettingsClicked, changeAnimeSkipIntro = changeAnimeSkipIntro, actionModeCounter = selectedChapterCount, onSelectAll = { onAllEpisodeSelected(true) }, onInvertSelection = { onInvertSelection() }, titleAlphaProvider = { 1f }, backgroundAlphaProvider = { 1f }, isManga = false, ) }, bottomBar = { Box( modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.BottomEnd, ) { val selectedEpisodes = remember(episodes) { episodes.filter { it.selected } } SharedAnimeBottomActionMenu( selected = selectedEpisodes, onEpisodeClicked = onEpisodeClicked, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiFillermarkClicked = onMultiFillermarkClicked, onMultiMarkAsSeenClicked = onMultiMarkAsSeenClicked, onMarkPreviousAsSeenClicked = onMarkPreviousAsSeenClicked, onDownloadEpisode = onDownloadEpisode, onMultiDeleteClicked = onMultiDeleteClicked, fillFraction = 0.5f, alwaysUseExternalPlayer = alwaysUseExternalPlayer, ) } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { val isFABVisible = remember(episodes) { episodes.fastAny { !it.episode.seen } && !isAnySelected } AnimatedVisibility( visible = isFABVisible, enter = fadeIn(), exit = fadeOut(), ) { ExtendedFloatingActionButton( text = { val isWatching = remember(state.episodes) { state.episodes.fastAny { it.episode.seen } } Text( text = stringResource( if (isWatching) MR.strings.action_resume else MR.strings.action_start, ), ) }, icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, onClick = onContinueWatching, expanded = itemListState.shouldExpandFAB(), ) } }, ) { contentPadding -> PullRefresh( refreshing = state.isRefreshingData, onRefresh = onRefresh, enabled = !isAnySelected, indicatorPadding = PaddingValues( start = insetPadding.calculateStartPadding(layoutDirection), top = with(density) { topBarHeight.toDp() }, end = insetPadding.calculateEndPadding(layoutDirection), ), ) { TwoPanelBox( modifier = Modifier.padding( start = contentPadding.calculateStartPadding(layoutDirection), end = contentPadding.calculateEndPadding(layoutDirection), ), startContent = { Column( modifier = Modifier .verticalScroll(rememberScrollState()) .padding(bottom = contentPadding.calculateBottomPadding()), ) { AnimeInfoBox( isTabletUi = true, appBarPadding = contentPadding.calculateTopPadding(), anime = state.anime, sourceName = remember { state.source.getNameForAnimeInfo() }, isStubSource = remember { state.source is StubAnimeSource }, onCoverClick = onCoverClicked, doSearch = onSearch, ) AnimeActionRow( favorite = state.anime.favorite, trackingCount = state.trackingCount, nextUpdate = nextUpdate, isUserIntervalMode = state.anime.fetchInterval < 0, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onEditIntervalClicked = onEditIntervalClicked, onEditCategory = onEditCategoryClicked, ) ExpandableAnimeDescription( defaultExpandState = true, description = state.anime.description, tagsProvider = { state.anime.genre }, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, ) } }, endContent = { FastScrollLazyVerticalGrid( modifier = Modifier.fillMaxHeight(), state = itemListState, columns = if (gridSize == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(gridSize), contentPadding = PaddingValues( start = GRID_PADDING, end = GRID_PADDING, top = contentPadding.calculateTopPadding(), bottom = contentPadding.calculateBottomPadding(), ), ) { item( key = EntryScreenItem.ITEM_HEADER, contentType = EntryScreenItem.ITEM_HEADER, span = { GridItemSpan(maxLineSpan) }, ) { val missingEpisodesCount = remember(episodes) { episodes.map { it.episode.episodeNumber }.missingEntriesCount() } val missingSeasonsCount = remember(seasons) { seasons.map { it.seasonAnime.anime.seasonNumber }.missingEntriesCount() } ItemHeader( enabled = !isAnySelected, itemCount = when (state.anime.fetchType) { FetchType.Seasons -> seasons.size FetchType.Episodes -> episodes.size }, missingItemsCount = maxOf(missingEpisodesCount, missingSeasonsCount), onClick = onFilterButtonClicked, isManga = false, fetchType = state.anime.fetchType, modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } when (state.anime.fetchType) { FetchType.Seasons -> { sharedSeasons( anime = state.anime, seasons = seasons, containerHeight = containerHeightPx - topBarHeight, onSeasonClicked = onSeasonClicked, onClickContinueWatching = onClickContinueWatching, listItemModifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } FetchType.Episodes -> { if (state.airingTime > 0L) { item( key = EntryScreenItem.AIRING_TIME, contentType = EntryScreenItem.AIRING_TIME, ) { // Handles the second by second countdown reseting var timer by remember { mutableLongStateOf(state.airingTime) } LaunchedEffect(key1 = timer) { if (timer > 0L) { delay(1000L) timer -= 1000L } } if (timer > 0L && showNextEpisodeAirTime && state.anime.status.toInt() != SAnime.COMPLETED ) { NextEpisodeAiringListItem( title = stringResource( AYMR.strings.display_mode_episode, formatEpisodeNumber(state.airingEpisodeNumber), ), date = formatTime(state.airingTime, useDayFormat = true), modifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } } } sharedEpisodeItems( anime = state.anime, episodes = listItem, isAnyEpisodeSelected = episodes.fastAny { it.selected }, showSummaries = state.showSummaries, showPreviews = state.showPreviews, episodeSwipeStartAction = episodeSwipeStartAction, episodeSwipeEndAction = episodeSwipeEndAction, onEpisodeClicked = onEpisodeClicked, onDownloadEpisode = onDownloadEpisode, onEpisodeSelected = onEpisodeSelected, onEpisodeSwipe = onEpisodeSwipe, itemModifier = Modifier.ignorePadding(offsetGridPaddingPx), ) } } } }, ) } } } } @Composable private fun SharedAnimeBottomActionMenu( selected: List, onEpisodeClicked: (Episode, Boolean) -> Unit, onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiFillermarkClicked: (List, fillermarked: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List, markAsSeen: Boolean) -> Unit, onMarkPreviousAsSeenClicked: (Episode) -> Unit, onDownloadEpisode: ((List, EpisodeDownloadAction) -> Unit)?, onMultiDeleteClicked: (List) -> Unit, fillFraction: Float, alwaysUseExternalPlayer: Boolean, modifier: Modifier = Modifier, ) { EntryBottomActionMenu( visible = selected.isNotEmpty(), modifier = modifier.fillMaxWidth(fillFraction), onBookmarkClicked = { onMultiBookmarkClicked.invoke(selected.fastMap { it.episode }, true) }.takeIf { selected.fastAny { !it.episode.bookmark } }, onRemoveBookmarkClicked = { onMultiBookmarkClicked.invoke(selected.fastMap { it.episode }, false) }.takeIf { selected.fastAll { it.episode.bookmark } }, onFillermarkClicked = { onMultiFillermarkClicked.invoke(selected.fastMap { it.episode }, true) }.takeIf { selected.fastAny { !it.episode.fillermark } }, onRemoveFillermarkClicked = { onMultiFillermarkClicked.invoke(selected.fastMap { it.episode }, false) }.takeIf { selected.fastAll { it.episode.fillermark } }, onMarkAsViewedClicked = { onMultiMarkAsSeenClicked(selected.fastMap { it.episode }, true) }.takeIf { selected.fastAny { !it.episode.seen } }, onMarkAsUnviewedClicked = { onMultiMarkAsSeenClicked(selected.fastMap { it.episode }, false) }.takeIf { selected.fastAny { it.episode.seen || it.episode.lastSecondSeen > 0L } }, onMarkPreviousAsViewedClicked = { onMarkPreviousAsSeenClicked(selected[0].episode) }.takeIf { selected.size == 1 }, onDownloadClicked = { onDownloadEpisode!!(selected.toList(), EpisodeDownloadAction.START) }.takeIf { onDownloadEpisode != null && selected.fastAny { it.downloadState != AnimeDownload.State.DOWNLOADED } }, onDeleteClicked = { onMultiDeleteClicked(selected.fastMap { it.episode }) }.takeIf { onDownloadEpisode != null && selected.fastAny { it.downloadState == AnimeDownload.State.DOWNLOADED } }, onExternalClicked = { onEpisodeClicked(selected.fastMap { it.episode }.first(), true) }.takeIf { !alwaysUseExternalPlayer && selected.size == 1 }, onInternalClicked = { onEpisodeClicked(selected.fastMap { it.episode }.first(), true) }.takeIf { alwaysUseExternalPlayer && selected.size == 1 }, isManga = false, ) } private fun LazyGridScope.sharedSeasons( anime: Anime, seasons: List, containerHeight: Int, onSeasonClicked: (SeasonAnime) -> Unit, onClickContinueWatching: ((SeasonAnime) -> Unit)?, listItemModifier: Modifier = Modifier, ) { items( items = seasons, key = { season -> season.seasonAnime.anime }, span = { GridItemSpan(if (anime.seasonDisplayGridMode == SeasonDisplayMode.List) maxLineSpan else 1) }, ) { item -> AnimeSeasonListItem( anime = anime, item = item, containerHeight = containerHeight, onSeasonClicked = onSeasonClicked, onClickContinueWatching = onClickContinueWatching, listItemModifier = listItemModifier, ) } } private fun LazyGridScope.sharedEpisodeItems( anime: Anime, episodes: List, isAnyEpisodeSelected: Boolean, showSummaries: Boolean, showPreviews: Boolean, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, onEpisodeClicked: (Episode, Boolean) -> Unit, onDownloadEpisode: ((List, EpisodeDownloadAction) -> Unit)?, onEpisodeSelected: (EpisodeList.Item, Boolean, Boolean, Boolean) -> Unit, onEpisodeSwipe: (EpisodeList.Item, LibraryPreferences.EpisodeSwipeAction) -> Unit, itemModifier: Modifier = Modifier, ) { items( items = episodes, key = { episodeItem -> when (episodeItem) { is EpisodeList.MissingCount -> "missing-count-${episodeItem.id}" is EpisodeList.Item -> "episode-${episodeItem.id}" } }, contentType = { EntryScreenItem.ITEM }, span = { GridItemSpan(maxLineSpan) }, ) { episodeItem -> val haptic = LocalHapticFeedback.current when (episodeItem) { is EpisodeList.MissingCount -> { MissingItemCountListItem( count = episodeItem.count, modifier = itemModifier, ) } is EpisodeList.Item -> { AnimeEpisodeListItem( title = if (anime.displayMode == Anime.EPISODE_DISPLAY_NUMBER) { stringResource( AYMR.strings.display_mode_episode, formatEpisodeNumber(episodeItem.episode.episodeNumber), ) } else { episodeItem.episode.name }, date = relativeDateTimeText(episodeItem.episode.dateUpload), watchProgress = episodeItem.episode.lastSecondSeen .takeIf { !episodeItem.episode.seen && it > 0L } ?.let { stringResource( AYMR.strings.episode_progress, formatTime(it), formatTime(episodeItem.episode.totalSeconds), ) }, scanlator = episodeItem.episode.scanlator.takeIf { !it.isNullOrBlank() }, summary = episodeItem.episode.summary.takeIf { !it.isNullOrBlank() && showSummaries }, previewUrl = episodeItem.episode.previewUrl.takeIf { !it.isNullOrBlank() && showPreviews }, seen = episodeItem.episode.seen, bookmark = episodeItem.episode.bookmark, fillermark = episodeItem.episode.fillermark, selected = episodeItem.selected, isAnyEpisodeSelected = isAnyEpisodeSelected, downloadIndicatorEnabled = !isAnyEpisodeSelected && !anime.isLocal(), downloadStateProvider = { episodeItem.downloadState }, downloadProgressProvider = { episodeItem.downloadProgress }, episodeSwipeStartAction = episodeSwipeStartAction, episodeSwipeEndAction = episodeSwipeEndAction, onLongClick = { onEpisodeSelected(episodeItem, !episodeItem.selected, true, true) haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, onClick = { onEpisodeItemClick( episodeItem = episodeItem, isAnyEpisodeSelected = isAnyEpisodeSelected, onToggleSelection = { onEpisodeSelected(episodeItem, !episodeItem.selected, true, false) }, onEpisodeClicked = onEpisodeClicked, ) }, onDownloadClick = if (onDownloadEpisode != null) { { onDownloadEpisode(listOf(episodeItem), it) } } else { null }, onEpisodeSwipe = { onEpisodeSwipe(episodeItem, it) }, modifier = itemModifier, ) } } } } private fun onEpisodeItemClick( episodeItem: EpisodeList.Item, isAnyEpisodeSelected: Boolean, onToggleSelection: (Boolean) -> Unit, onEpisodeClicked: (Episode, Boolean) -> Unit, ) { when { episodeItem.selected -> onToggleSelection(false) isAnyEpisodeSelected -> onToggleSelection(true) else -> onEpisodeClicked(episodeItem.episode, false) } } private fun formatTime(milliseconds: Long, useDayFormat: Boolean = false): String { return if (useDayFormat) { String.format( "Airing in %02dd %02dh %02dm %02ds", TimeUnit.MILLISECONDS.toDays(milliseconds), TimeUnit.MILLISECONDS.toHours(milliseconds) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(milliseconds)), TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) } else if (milliseconds > 3600000L) { String.format( "%d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds), TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) } else { String.format( "%d:%02d", TimeUnit.MILLISECONDS.toMinutes(milliseconds), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) } } private val GRID_PADDING = 14.dp private fun Modifier.ignorePadding(gridPadding: Int) = layout { measurable, constraints -> val looseConstraints = constraints.offset(gridPadding * 2, 0) val placeable = measurable.measure(looseConstraints) layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/DuplicateAnimeDialog.kt ================================================ package eu.kanade.presentation.entries.anime import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material.icons.outlined.Book import androidx.compose.material.icons.outlined.SwapVert import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.presentation.more.settings.LocalPreferenceMinHeight import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun DuplicateAnimeDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, onOpenAnime: () -> Unit, onMigrate: () -> Unit, modifier: Modifier = Modifier, ) { val minHeight = LocalPreferenceMinHeight.current AdaptiveSheet( modifier = modifier, onDismissRequest = onDismissRequest, ) { Column( modifier = Modifier .padding( vertical = TabbedDialogPaddings.Vertical, horizontal = TabbedDialogPaddings.Horizontal, ) .fillMaxWidth(), ) { Text( modifier = Modifier.padding(TitlePadding), text = stringResource(MR.strings.are_you_sure), style = MaterialTheme.typography.headlineMedium, ) Text( text = stringResource(MR.strings.confirm_add_duplicate_manga), style = MaterialTheme.typography.bodyMedium, ) Spacer(Modifier.height(PaddingSize)) TextPreferenceWidget( title = stringResource(AYMR.strings.action_show_anime), icon = Icons.Outlined.Book, onPreferenceClick = { onDismissRequest() onOpenAnime() }, ) HorizontalDivider() TextPreferenceWidget( title = stringResource(MR.strings.action_migrate_duplicate), icon = Icons.Outlined.SwapVert, onPreferenceClick = { onDismissRequest() onMigrate() }, ) HorizontalDivider() TextPreferenceWidget( title = stringResource(MR.strings.action_add_anyway), icon = Icons.Outlined.Add, onPreferenceClick = { onDismissRequest() onConfirm() }, ) Row( modifier = Modifier .sizeIn(minHeight = minHeight) .clickable { onDismissRequest.invoke() } .padding(ButtonPadding) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { OutlinedButton(onClick = onDismissRequest, modifier = Modifier.fillMaxWidth()) { Text( modifier = Modifier .padding(vertical = 8.dp), text = stringResource(MR.strings.action_cancel), color = MaterialTheme.colorScheme.primary, style = MaterialTheme.typography.titleLarge, fontSize = 16.sp, ) } } } } } private val PaddingSize = 16.dp private val ButtonPadding = PaddingValues(top = 16.dp, bottom = 16.dp) private val TitlePadding = PaddingValues(bottom = 16.dp, top = 8.dp) ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/EpisodeOptionsDialogScreen.kt ================================================ package eu.kanade.presentation.entries.anime import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateContentSize import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.Input import androidx.compose.material.icons.outlined.NavigateNext import androidx.compose.material.icons.outlined.OpenInNew import androidx.compose.material.icons.outlined.SystemUpdateAlt import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.core.screen.Screen import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.Hoster import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.player.controls.components.sheets.HosterState import eu.kanade.tachiyomi.ui.player.controls.components.sheets.QualitySheetHosterContent import eu.kanade.tachiyomi.ui.player.controls.components.sheets.QualitySheetVideoContent import eu.kanade.tachiyomi.ui.player.controls.components.sheets.getChangedAt import eu.kanade.tachiyomi.ui.player.loader.EpisodeLoader import eu.kanade.tachiyomi.ui.player.loader.HosterLoader import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchUI import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.interactor.GetEpisode import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.atomic.AtomicBoolean import kotlin.coroutines.cancellation.CancellationException class EpisodeOptionsDialogScreen( private val useExternalDownloader: Boolean, private val episodeTitle: String, private val episodeId: Long, private val animeId: Long, private val sourceId: Long, ) : Screen { @Composable override fun Content() { val sm = rememberScreenModel { EpisodeOptionsDialogScreenModel( episodeId = episodeId, animeId = animeId, sourceId = sourceId, ) } val episode by sm.episode.collectAsState() val anime by sm.anime.collectAsState() val hosterState by sm.hosterState.collectAsState() val hosterExpandedList by sm.hosterExpandedList.collectAsState() val selectedHosterVideoIndex by sm.selectedHosterVideoIndex.collectAsState() val currentVideo by sm.currentVideo.collectAsState() val showAllQualities by sm.showAllQualities.collectAsState() EpisodeOptionsDialog( useExternalDownloader = useExternalDownloader, episodeTitle = episodeTitle, episode = episode, anime = anime, showAllQualities = showAllQualities, resultList = hosterState, expandedList = hosterExpandedList, currentVideo = currentVideo, selectedHosterVideoIndex = selectedHosterVideoIndex, onShowAllQualities = sm::onShowAllQualities, onClickHoster = sm::onClickHoster, onClickVideo = sm::onClickVideo, getHosterList = sm::getHosterList, ) } companion object { var onDismissDialog: () -> Unit = {} } } class EpisodeOptionsDialogScreenModel( episodeId: Long, animeId: Long, sourceId: Long, ) : ScreenModel { private val sourceManager: AnimeSourceManager = Injekt.get() private val _hosterState = MutableStateFlow>?>(null) val hosterState = _hosterState.asStateFlow() private val _hosterExpandedList = MutableStateFlow>(emptyList()) val hosterExpandedList = _hosterExpandedList.asStateFlow() private val _selectedHosterVideoIndex = MutableStateFlow(Pair(-1, -1)) val selectedHosterVideoIndex = _selectedHosterVideoIndex.asStateFlow() private val _currentVideo = MutableStateFlow(null) val currentVideo = _currentVideo.asStateFlow() private val _episode = MutableStateFlow(null) val episode = _episode.asStateFlow() private val _anime = MutableStateFlow(null) val anime = _anime.asStateFlow() @Suppress("ktlint:standard:backing-property-naming") private val _hosterList = MutableStateFlow>(emptyList()) @Suppress("ktlint:standard:backing-property-naming") private val _source = MutableStateFlow(null) private val _showAllQualities = MutableStateFlow(false) val showAllQualities = _showAllQualities.asStateFlow() init { val hasFoundPreferredVideo = AtomicBoolean(false) screenModelScope.launchIO { val episode = Injekt.get().await(episodeId)!! val anime = Injekt.get().await(animeId)!! val source = sourceManager.getOrStub(sourceId) _episode.update { _ -> episode } _anime.update { _ -> anime } _source.update { _ -> source } val hosterListResult = withIOContext { try { Result.success(EpisodeLoader.getHosters(episode, anime, source)) } catch (e: Exception) { Result.failure(e) } } if (hosterListResult.isFailure) { _hosterState.update { _ -> Result.failure(hosterListResult.exceptionOrNull()!!) } return@launchIO } val hosterList = hosterListResult.getOrThrow() _hosterList.update { _ -> hosterList } _hosterExpandedList.update { _ -> List(hosterList.size) { true } } val initialHosterState = hosterList.map { hoster -> if (hoster.videoList == null) { HosterState.Loading(hoster.hosterName) } else { val videoList = hoster.videoList!! HosterState.Ready( hoster.hosterName, videoList, List(videoList.size) { Video.State.LOAD_VIDEO }, ) } } _hosterState.update { _ -> Result.success(initialHosterState) } try { hosterList.mapIndexed { hosterIdx, hoster -> async { val hosterState = EpisodeLoader.loadHosterVideos(source, hoster) _hosterState.updateAt(hosterIdx, hosterState) if (hosterState is HosterState.Ready) { val prefIndex = hosterState.videoList.indexOfFirst { it.preferred } if (prefIndex != -1) { if (hasFoundPreferredVideo.compareAndSet(false, true)) { val success = loadVideo(source, hosterState.videoList[prefIndex], hosterIdx, prefIndex) if (!success) { hasFoundPreferredVideo.set(false) } } } } } }.awaitAll() if (hasFoundPreferredVideo.compareAndSet(false, true)) { val hosterStateList = hosterState.value!!.getOrThrow() val (hosterIdx, videoIdx) = HosterLoader.selectBestVideo(hosterStateList) if (hosterIdx == -1) { _hosterState.update { _ -> Result.failure(NoSuchElementException("No available videos")) } return@launchIO } val video = (hosterStateList[hosterIdx] as HosterState.Ready).videoList[videoIdx] loadVideo(source, video, hosterIdx, videoIdx) } } catch (e: CancellationException) { _hosterState.update { _ -> Result.success(hosterList.map { HosterState.Idle(it.hosterName) }) } throw e } } } private suspend fun loadVideo(source: AnimeSource, video: Video, hosterIndex: Int, videoIndex: Int): Boolean { val selectedHosterState = (_hosterState.value!!.getOrThrow()[hosterIndex] as? HosterState.Ready) ?: return false val oldSelectedIndex = _selectedHosterVideoIndex.value _selectedHosterVideoIndex.update { _ -> Pair(hosterIndex, videoIndex) } _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, video, Video.State.LOAD_VIDEO), ) val resolvedVideo = if (selectedHosterState.videoState[videoIndex] != Video.State.READY) { HosterLoader.getResolvedVideo(source, video) } else { video } if (resolvedVideo == null || resolvedVideo.videoUrl.isEmpty()) { if (currentVideo.value == null) { _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, video, Video.State.ERROR), ) val hosterStateList = hosterState.value?.getOrNull() ?: return false val (newHosterIdx, newVideoIdx) = HosterLoader.selectBestVideo(hosterStateList) if (newHosterIdx == -1) { _hosterState.update { _ -> Result.failure(NoSuchElementException("No available videos")) } return false } val newVideo = (hosterStateList[newHosterIdx] as HosterState.Ready).videoList[newVideoIdx] return loadVideo(source, newVideo, newHosterIdx, newVideoIdx) } else { _selectedHosterVideoIndex.update { _ -> oldSelectedIndex } _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, video, Video.State.ERROR), ) return false } } _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, resolvedVideo, Video.State.READY), ) _currentVideo.update { _ -> resolvedVideo } return true } private fun MutableStateFlow>?>.updateAt(index: Int, newValue: T) { this.update { values -> values?.getOrNull()?.let { Result.success( it.toMutableList().apply { this[index] = newValue }, ) } ?: values } } fun onShowAllQualities(value: Boolean) { _showAllQualities.update { _ -> value } } fun onClickHoster(hosterIndex: Int) { val hosterState = hosterState.value?.getOrNull()?.getOrNull(hosterIndex) ?: return when (hosterState) { is HosterState.Ready -> { _hosterExpandedList.update { values -> values.toMutableList().apply { this[hosterIndex] = !hosterExpandedList.value[hosterIndex] } } } is HosterState.Error, is HosterState.Idle -> { val hosterName = hosterState.name _hosterState.updateAt(hosterIndex, HosterState.Loading(hosterName)) screenModelScope.launchIO { val newHosterState = EpisodeLoader.loadHosterVideos( _source.value!!, _hosterList.value[hosterIndex], ) _hosterState.updateAt(hosterIndex, newHosterState) } } is HosterState.Loading -> {} } } fun onClickVideo(hosterIndex: Int, videoIndex: Int) { val video = (_hosterState.value?.getOrNull()?.getOrNull(hosterIndex) as? HosterState.Ready) ?.videoList ?.getOrNull(videoIndex) ?: return screenModelScope.launchIO { val success = loadVideo(_source.value!!, video, hosterIndex, videoIndex) if (success) { _showAllQualities.update { _ -> false } } } } fun getHosterList(): List? { val hosterStateList = hosterState.value?.getOrNull() ?: return null return _hosterList.value.mapIndexed { index, h -> if (hosterStateList[index] is HosterState.Ready) { Hoster( hosterName = h.hosterName, hosterUrl = h.hosterUrl, videoList = (hosterStateList[index] as HosterState.Ready).videoList, ) } else { Hoster( hosterName = h.hosterName, hosterUrl = h.hosterUrl, videoList = h.videoList, ) } } } } @Composable fun EpisodeOptionsDialog( useExternalDownloader: Boolean, episodeTitle: String, episode: Episode?, anime: Anime?, showAllQualities: Boolean, resultList: Result>? = null, expandedList: List, currentVideo: Video?, selectedHosterVideoIndex: Pair, onShowAllQualities: (Boolean) -> Unit, onClickHoster: (Int) -> Unit, onClickVideo: (Int, Int) -> Unit, getHosterList: () -> List?, ) { val context = LocalContext.current val scope = rememberCoroutineScope() Column( modifier = Modifier .animateContentSize() .fillMaxWidth() .verticalScroll(rememberScrollState()) .padding(vertical = TabbedDialogPaddings.Vertical) .windowInsetsPadding(WindowInsets.systemBars), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Text( text = episodeTitle, modifier = Modifier.padding(horizontal = TabbedDialogPaddings.Horizontal), fontWeight = FontWeight.Bold, maxLines = 1, style = MaterialTheme.typography.titleSmall, ) Text( text = stringResource(AYMR.strings.choose_video_quality), modifier = Modifier.padding(horizontal = TabbedDialogPaddings.Horizontal), fontStyle = FontStyle.Italic, style = MaterialTheme.typography.bodyMedium, ) val onError: () -> Unit = { logcat(LogPriority.ERROR) { "Error getting links" } scope.launchUI { context.toast("No available videos") } EpisodeOptionsDialogScreen.onDismissDialog() } if (resultList?.isFailure == true) { onError() } if (resultList == null || episode == null || anime == null || currentVideo == null) { LoadingScreen() } else { val hosterStateList = resultList.getOrNull() if (!hosterStateList.isNullOrEmpty()) { VideoList( useExternalDownloader = useExternalDownloader, episode = episode, anime = anime, showAllQualities = showAllQualities, hosterStateList = hosterStateList, expandedList = expandedList, currentVideo = currentVideo, selectedHosterVideoIndex = selectedHosterVideoIndex, onShowAllQualities = onShowAllQualities, onClickHoster = onClickHoster, onClickVideo = onClickVideo, getHosterList = getHosterList, ) } else { onError() } } } } @Composable private fun VideoList( useExternalDownloader: Boolean, episode: Episode, anime: Anime, showAllQualities: Boolean, hosterStateList: List, expandedList: List, currentVideo: Video, selectedHosterVideoIndex: Pair, onShowAllQualities: (Boolean) -> Unit, onClickHoster: (Int) -> Unit, onClickVideo: (Int, Int) -> Unit, getHosterList: () -> List?, ) { val downloadManager = Injekt.get() val clipboardManager = LocalClipboardManager.current val context = LocalContext.current val scope = rememberCoroutineScope() val copiedString = stringResource(AYMR.strings.copied_video_link_to_clipboard) AnimatedVisibility( visible = !showAllQualities, enter = slideInHorizontally(), exit = slideOutHorizontally(), ) { Column { if (currentVideo.videoUrl.isNotEmpty() && !showAllQualities) { ClickableRow( text = currentVideo.videoTitle, icon = null, onClick = { onShowAllQualities(true) }, showDropdownArrow = true, ) val downloadEpisode: (Boolean) -> Unit = { downloadManager.downloadEpisodes( anime, listOf(episode), true, it, currentVideo, ) } QualityOptions( onDownloadClicked = { downloadEpisode(useExternalDownloader) }, onExtDownloadClicked = { downloadEpisode(!useExternalDownloader) }, onCopyClicked = { clipboardManager.setText(AnnotatedString(currentVideo.videoUrl)) scope.launch { context.toast(copiedString) } }, onExtPlayerClicked = { scope.launch { MainActivity.startPlayerActivity( context, anime.id, episode.id, true, currentVideo, ) } }, onIntPlayerClicked = { scope.launch { MainActivity.startPlayerActivity( context, anime.id, episode.id, false, currentVideo, selectedHosterVideoIndex.first, selectedHosterVideoIndex.second, getHosterList(), ) } }, ) } } } AnimatedVisibility( visible = showAllQualities, enter = slideInHorizontally(initialOffsetX = { it / 2 }), exit = slideOutHorizontally(targetOffsetX = { it / 2 }), ) { if (showAllQualities) { Box( modifier = Modifier .fillMaxWidth() .padding(horizontal = TabbedDialogPaddings.Horizontal) .heightIn(max = 600.dp), ) { if ( hosterStateList.size == 1 && hosterStateList.first().name == Hoster.NO_HOSTER_LIST && hosterStateList.first() is HosterState.Ready ) { QualitySheetVideoContent( videoList = (hosterStateList.first() as HosterState.Ready).videoList, videoState = (hosterStateList.first() as HosterState.Ready).videoState, selectedVideoIndex = selectedHosterVideoIndex.second, onClickVideo = onClickVideo, ) } else { QualitySheetHosterContent( hosterState = hosterStateList, expandedState = expandedList, selectedVideoIndex = selectedHosterVideoIndex, onClickHoster = onClickHoster, onClickVideo = onClickVideo, displayHosters = Pair(false, false), ) } } } } } @Composable private fun QualityOptions( onDownloadClicked: () -> Unit = {}, onExtDownloadClicked: () -> Unit = {}, onCopyClicked: () -> Unit = {}, onExtPlayerClicked: () -> Unit = {}, onIntPlayerClicked: () -> Unit = {}, ) { val closeMenu = { EpisodeOptionsDialogScreen.onDismissDialog() } Column { ClickableRow( text = stringResource(MR.strings.copy), icon = Icons.Outlined.ContentCopy, onClick = { onCopyClicked() }, ) ClickableRow( text = stringResource(AYMR.strings.action_start_download_internally), icon = Icons.Outlined.Download, onClick = { onDownloadClicked() closeMenu() }, ) ClickableRow( text = stringResource(AYMR.strings.action_start_download_externally), icon = Icons.Outlined.SystemUpdateAlt, onClick = { onExtDownloadClicked() closeMenu() }, ) ClickableRow( text = stringResource(AYMR.strings.action_play_externally), icon = Icons.Outlined.OpenInNew, onClick = { onExtPlayerClicked() closeMenu() }, ) ClickableRow( text = stringResource(AYMR.strings.action_play_internally), icon = Icons.Outlined.Input, onClick = { onIntPlayerClicked() closeMenu() }, ) } } @Composable private fun ClickableRow( text: String, icon: ImageVector?, onClick: () -> Unit, showDropdownArrow: Boolean = false, ) { Row( modifier = Modifier .padding(horizontal = TabbedDialogPaddings.Horizontal) .clickable(role = Role.DropdownList, onClick = onClick) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { var textPadding = MaterialTheme.padding.medium if (icon != null) { Icon( imageVector = icon, contentDescription = null, modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.onSurface, ) Spacer(Modifier.width(MaterialTheme.padding.small)) textPadding = MaterialTheme.padding.small } Text( text = text, modifier = Modifier.padding(vertical = textPadding), style = MaterialTheme.typography.bodyMedium, ) if (showDropdownArrow) { Icon( imageVector = Icons.Outlined.NavigateNext, contentDescription = null, modifier = Modifier, tint = MaterialTheme.colorScheme.onSurface, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/EpisodeSettingsDialog.kt ================================================ package eu.kanade.presentation.entries.anime import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.entries.anime.model.downloadedFilter import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.preference.TriState import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.RadioItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun EpisodeSettingsDialog( onDismissRequest: () -> Unit, anime: Anime? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnseenFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, onFillermarkedFilterChanged: (TriState) -> Unit, onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onShowPreviewsEnabled: (Long) -> Unit, onShowSummariesEnabled: (Long) -> Unit, onSetAsDefault: (applyToExistingAnime: Boolean) -> Unit, ) { var showSetAsDefaultDialog by rememberSaveable { mutableStateOf(false) } if (showSetAsDefaultDialog) { SetAsDefaultDialog( onDismissRequest = { showSetAsDefaultDialog = false }, onConfirmed = onSetAsDefault, ) } val downloadedOnly = remember { Injekt.get().downloadedOnly().get() } TabbedDialog( onDismissRequest = onDismissRequest, tabTitles = persistentListOf( stringResource(MR.strings.action_filter), stringResource(MR.strings.action_sort), stringResource(MR.strings.action_display), ), tabOverflowMenuContent = { closeMenu -> DropdownMenuItem( text = { Text(stringResource(MR.strings.set_chapter_settings_as_default)) }, onClick = { showSetAsDefaultDialog = true closeMenu() }, ) }, ) { page -> Column( modifier = Modifier .padding(vertical = TabbedDialogPaddings.Vertical) .verticalScroll(rememberScrollState()), ) { when (page) { 0 -> { FilterPage( downloadFilter = anime?.downloadedFilter ?: TriState.DISABLED, onDownloadFilterChanged = onDownloadFilterChanged .takeUnless { downloadedOnly }, unseenFilter = anime?.unseenFilter ?: TriState.DISABLED, onUnseenFilterChanged = onUnseenFilterChanged, bookmarkedFilter = anime?.bookmarkedFilter ?: TriState.DISABLED, onBookmarkedFilterChanged = onBookmarkedFilterChanged, fillermarkedFilter = anime?.fillermarkedFilter ?: TriState.DISABLED, onFillermarkedFilterChanged = onFillermarkedFilterChanged, ) } 1 -> { SortPage( sortingMode = anime?.sorting ?: 0, sortDescending = anime?.sortDescending() ?: false, onItemSelected = onSortModeChanged, ) } 2 -> { DisplayPage( displayMode = anime?.displayMode ?: 0, onDisplayModeChanged = onDisplayModeChanged, showPreviews = anime?.showPreviews() ?: true, onShowPreviewsEnabled = onShowPreviewsEnabled, showSummaries = anime?.showSummaries() ?: true, onShowSummariesEnabled = onShowSummariesEnabled, ) } } } } } @Composable private fun ColumnScope.FilterPage( downloadFilter: TriState, onDownloadFilterChanged: ((TriState) -> Unit)?, unseenFilter: TriState, onUnseenFilterChanged: (TriState) -> Unit, bookmarkedFilter: TriState, onBookmarkedFilterChanged: (TriState) -> Unit, fillermarkedFilter: TriState, onFillermarkedFilterChanged: (TriState) -> Unit, ) { TriStateItem( label = stringResource(MR.strings.label_downloaded), state = downloadFilter, onClick = onDownloadFilterChanged, ) TriStateItem( label = stringResource(AYMR.strings.action_filter_unseen), state = unseenFilter, onClick = onUnseenFilterChanged, ) TriStateItem( label = stringResource(MR.strings.action_filter_bookmarked), state = bookmarkedFilter, onClick = onBookmarkedFilterChanged, ) TriStateItem( label = stringResource(AYMR.strings.action_filter_fillermarked), state = fillermarkedFilter, onClick = onFillermarkedFilterChanged, ) } @Composable private fun ColumnScope.SortPage( sortingMode: Long, sortDescending: Boolean, onItemSelected: (Long) -> Unit, ) { listOf( MR.strings.sort_by_source to Anime.EPISODE_SORTING_SOURCE, AYMR.strings.sort_by_episode_number to Anime.EPISODE_SORTING_NUMBER, MR.strings.sort_by_upload_date to Anime.EPISODE_SORTING_UPLOAD_DATE, MR.strings.action_sort_alpha to Anime.EPISODE_SORTING_ALPHABET, ).map { (titleRes, mode) -> SortItem( label = stringResource(titleRes), sortDescending = sortDescending.takeIf { sortingMode == mode }, onClick = { onItemSelected(mode) }, ) } } @Composable private fun ColumnScope.DisplayPage( displayMode: Long, onDisplayModeChanged: (Long) -> Unit, showPreviews: Boolean, onShowPreviewsEnabled: (Long) -> Unit, showSummaries: Boolean, onShowSummariesEnabled: (Long) -> Unit, ) { listOf( MR.strings.show_title to Anime.EPISODE_DISPLAY_NAME, AYMR.strings.show_episode_number to Anime.EPISODE_DISPLAY_NUMBER, ).map { (titleRes, mode) -> RadioItem( label = stringResource(titleRes), selected = displayMode == mode, onClick = { onDisplayModeChanged(mode) }, ) } val showPreviewsFlag = if (showPreviews) Anime.EPISODE_SHOW_NOT_PREVIEWS else Anime.EPISODE_SHOW_PREVIEWS CheckboxItem( label = stringResource(AYMR.strings.show_episode_previews), checked = showPreviews, onClick = { onShowPreviewsEnabled(showPreviewsFlag) }, ) val showSummariesFlag = if (showSummaries) Anime.EPISODE_SHOW_NOT_SUMMARIES else Anime.EPISODE_SHOW_SUMMARIES CheckboxItem( label = stringResource(AYMR.strings.show_episode_summaries), checked = showSummaries, onClick = { onShowSummariesEnabled(showSummariesFlag) }, ) } @Composable internal fun SetAsDefaultDialog( onDismissRequest: () -> Unit, isEpisode: Boolean = true, onConfirmed: (optionalChecked: Boolean) -> Unit, ) { var optionalChecked by rememberSaveable { mutableStateOf(false) } AlertDialog( onDismissRequest = onDismissRequest, title = { Text( text = if (isEpisode) { stringResource( AYMR.strings.episode_settings, ) } else { stringResource(AYMR.strings.season_settings) }, ) }, text = { Column( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text(text = stringResource(MR.strings.confirm_set_chapter_settings)) LabeledCheckbox( label = stringResource(AYMR.strings.also_set_episode_settings_for_library), checked = optionalChecked, onCheckedChange = { optionalChecked = it }, ) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { onConfirmed(optionalChecked) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/SeasonSettingsDialog.kt ================================================ package eu.kanade.presentation.entries.anime import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.FilterChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import aniyomi.domain.anime.SeasonDisplayMode import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.entries.anime.model.seasonDownloadedFilter import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.preference.TriState import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.RadioItem import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SettingsItemsPaddings import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun SeasonSettingsDialog( onDismissRequest: () -> Unit, anime: Anime? = null, // Filter page onDownloadFilterChanged: (TriState) -> Unit, onUnseenFilterChanged: (TriState) -> Unit, onStartedFilterChanged: (TriState) -> Unit, onCompletedFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, onFillermarkedFilterChanged: (TriState) -> Unit, // Sort page onSortModeChanged: (Long) -> Unit, // Display page onDisplayGridModeChanged: (SeasonDisplayMode) -> Unit, onDisplayGridSizeChanged: (Int) -> Unit, onOverlayDownloadedChanged: (Boolean) -> Unit, onOverlayUnseenChanged: (Boolean) -> Unit, onOverlayLocalChanged: (Boolean) -> Unit, onOverlayLangChanged: (Boolean) -> Unit, onOverlayContinueChanged: (Boolean) -> Unit, onDisplayModeChanged: (Long) -> Unit, // Overflow action onSetAsDefault: (applyToExistingAnime: Boolean) -> Unit, ) { var showSetAsDefaultDialog by rememberSaveable { mutableStateOf(false) } if (showSetAsDefaultDialog) { SetAsDefaultDialog( onDismissRequest = { showSetAsDefaultDialog = false }, isEpisode = false, onConfirmed = onSetAsDefault, ) } val downloadedOnly = remember { Injekt.get().downloadedOnly().get() } TabbedDialog( onDismissRequest = onDismissRequest, tabTitles = persistentListOf( stringResource(MR.strings.action_filter), stringResource(MR.strings.action_sort), stringResource(MR.strings.action_display), ), tabOverflowMenuContent = { closeMenu -> DropdownMenuItem( text = { Text(stringResource(MR.strings.set_chapter_settings_as_default)) }, onClick = { showSetAsDefaultDialog = true closeMenu() }, ) }, ) { page -> Column( modifier = Modifier .padding(vertical = TabbedDialogPaddings.Vertical) .verticalScroll(rememberScrollState()), ) { when (page) { 0 -> { SeasonFilterPage( downloadFilter = anime?.seasonDownloadedFilter ?: TriState.DISABLED, onDownloadFilterChanged = onDownloadFilterChanged .takeUnless { downloadedOnly }, unseenFilter = anime?.seasonUnseenFilter ?: TriState.DISABLED, onUnseenFilterChanged = onUnseenFilterChanged, startedFilter = anime?.seasonStartedFilter ?: TriState.DISABLED, onStartedFilterChanged = onStartedFilterChanged, completedFilter = anime?.seasonCompletedFilter ?: TriState.DISABLED, onCompletedFilterChanged = onCompletedFilterChanged, bookmarkedFilter = anime?.seasonBookmarkedFilter ?: TriState.DISABLED, onBookmarkedFilterChanged = onBookmarkedFilterChanged, fillermarkedFilter = anime?.seasonFillermarkedFilter ?: TriState.DISABLED, onFillermarkedFilterChanged = onFillermarkedFilterChanged, ) } 1 -> { SeasonSortPage( sortingMode = anime?.seasonSorting ?: 0, sortDescending = anime?.seasonSortDescending() ?: false, onItemSelected = onSortModeChanged, ) } 2 -> { SeasonDisplayPage( displayGridMode = anime?.seasonDisplayGridMode ?: SeasonDisplayMode.CompactGrid, displayGridModeChange = onDisplayGridModeChanged, displayGridModeSize = anime?.seasonDisplayGridSize ?: 0, displayGridModeSizeChange = onDisplayGridSizeChanged, overlayDownloaded = anime?.seasonDownloadedOverlay ?: false, overlayDownloadedChange = onOverlayDownloadedChanged, overlayUnseen = anime?.seasonUnseenOverlay ?: true, overlayUnseenChange = onOverlayUnseenChanged, overlayLocal = anime?.seasonLocalOverlay ?: true, overlayLocalChange = onOverlayLocalChanged, overlayLang = anime?.seasonLangOverlay ?: false, overlayLangChange = onOverlayLangChanged, overlayContinue = anime?.seasonContinueOverlay ?: true, overlayContinueChange = onOverlayContinueChanged, displayMode = anime?.seasonDisplayMode ?: 0L, displayModeChange = onDisplayModeChanged, ) } } } } } @Composable private fun ColumnScope.SeasonFilterPage( downloadFilter: TriState, onDownloadFilterChanged: ((TriState) -> Unit)?, unseenFilter: TriState, onUnseenFilterChanged: (TriState) -> Unit, startedFilter: TriState, onStartedFilterChanged: (TriState) -> Unit, completedFilter: TriState, onCompletedFilterChanged: (TriState) -> Unit, bookmarkedFilter: TriState, onBookmarkedFilterChanged: (TriState) -> Unit, fillermarkedFilter: TriState, onFillermarkedFilterChanged: (TriState) -> Unit, ) { TriStateItem( label = stringResource(MR.strings.label_downloaded), state = downloadFilter, onClick = onDownloadFilterChanged, ) TriStateItem( label = stringResource(AYMR.strings.action_filter_unseen), state = unseenFilter, onClick = onUnseenFilterChanged, ) TriStateItem( label = stringResource(MR.strings.label_started), state = startedFilter, onClick = onStartedFilterChanged, ) TriStateItem( label = stringResource(MR.strings.completed), state = completedFilter, onClick = onCompletedFilterChanged, ) TriStateItem( label = stringResource(MR.strings.action_filter_bookmarked), state = bookmarkedFilter, onClick = onBookmarkedFilterChanged, ) TriStateItem( label = stringResource(AYMR.strings.action_filter_fillermarked), state = fillermarkedFilter, onClick = onFillermarkedFilterChanged, ) } @Composable private fun ColumnScope.SeasonSortPage( sortingMode: Long, sortDescending: Boolean, onItemSelected: (Long) -> Unit, ) { listOf( MR.strings.sort_by_source to Anime.SEASON_SORT_SOURCE, AYMR.strings.sort_by_season_number to Anime.SEASON_SORT_SEASON, MR.strings.sort_by_upload_date to Anime.SEASON_SORT_UPLOAD, MR.strings.action_sort_alpha to Anime.SEASON_SORT_ALPHABET, AYMR.strings.action_sort_unseen_count to Anime.SEASON_SORT_COUNT, AYMR.strings.action_sort_last_seen to Anime.SEASON_SORT_LAST_SEEN, AYMR.strings.action_sort_episode_fetch_date to Anime.SEASON_SORT_FETCHED, ).map { (titleRes, mode) -> SortItem( label = stringResource(titleRes), sortDescending = sortDescending.takeIf { sortingMode == mode }, onClick = { onItemSelected(mode) }, ) } } private val displayModes = listOf( MR.strings.action_display_grid to SeasonDisplayMode.CompactGrid, MR.strings.action_display_comfortable_grid to SeasonDisplayMode.ComfortableGrid, MR.strings.action_display_cover_only_grid to SeasonDisplayMode.CoverOnlyGrid, MR.strings.action_display_list to SeasonDisplayMode.List, ) @Composable private fun ColumnScope.SeasonDisplayPage( displayGridMode: SeasonDisplayMode, displayGridModeChange: (SeasonDisplayMode) -> Unit, displayGridModeSize: Int, displayGridModeSizeChange: (Int) -> Unit, overlayDownloaded: Boolean, overlayDownloadedChange: (Boolean) -> Unit, overlayUnseen: Boolean, overlayUnseenChange: (Boolean) -> Unit, overlayLocal: Boolean, overlayLocalChange: (Boolean) -> Unit, overlayLang: Boolean, overlayLangChange: (Boolean) -> Unit, overlayContinue: Boolean, overlayContinueChange: (Boolean) -> Unit, displayMode: Long, displayModeChange: (Long) -> Unit, ) { SettingsChipRow(MR.strings.action_display_mode) { displayModes.map { (titleRes, mode) -> FilterChip( selected = displayGridMode == mode, onClick = { displayGridModeChange(mode) }, label = { Text(stringResource(titleRes)) }, ) } } if (displayGridMode == SeasonDisplayMode.List) { SliderItem( value = displayGridModeSize, valueRange = 0..10, label = stringResource(AYMR.strings.pref_library_rows), valueText = if (displayGridModeSize > 0) { displayGridModeSize.toString() } else { stringResource(MR.strings.label_auto) }, onChange = { displayGridModeSizeChange(it) }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } else { SliderItem( value = displayGridModeSize, valueRange = 0..10, label = stringResource(MR.strings.pref_library_columns), valueText = if (displayGridModeSize > 0) { displayGridModeSize.toString() } else { stringResource(MR.strings.label_auto) }, onChange = { displayGridModeSizeChange(it) }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } HeadingItem(MR.strings.overlay_header) LabeledCheckbox( label = stringResource(AYMR.strings.action_display_download_badge_anime), checked = overlayDownloaded, onCheckedChange = overlayDownloadedChange, modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, ), ) LabeledCheckbox( label = stringResource(AYMR.strings.action_display_unseen_badge), checked = overlayUnseen, onCheckedChange = overlayUnseenChange, modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, ), ) LabeledCheckbox( label = stringResource(MR.strings.action_display_local_badge), checked = overlayLocal, onCheckedChange = overlayLocalChange, modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, ), ) LabeledCheckbox( label = stringResource(MR.strings.action_display_language_badge), checked = overlayLang, onCheckedChange = overlayLangChange, modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, ), ) LabeledCheckbox( label = stringResource(AYMR.strings.action_display_show_continue_watching_button), checked = overlayContinue, onCheckedChange = overlayContinueChange, modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, ), ) HeadingItem(AYMR.strings.action_display_grid_mode) listOf( MR.strings.show_title to Anime.SEASON_DISPLAY_MODE_SOURCE, AYMR.strings.show_season_number to Anime.SEASON_DISPLAY_MODE_NUMBER, ).map { (titleRes, mode) -> RadioItem( label = stringResource(titleRes), selected = displayMode == mode, onClick = { displayModeChange(mode) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeEpisodeListItem.kt ================================================ package eu.kanade.presentation.entries.anime.components import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Label import androidx.compose.material.icons.automirrored.outlined.LabelOff import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.outlined.BookmarkAdd import androidx.compose.material.icons.outlined.BookmarkRemove import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Done import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.FileDownloadOff import androidx.compose.material.icons.outlined.NewLabel import androidx.compose.material.icons.outlined.RemoveDone import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.request.ImageRequest import coil3.request.crossfade import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import me.saket.swipe.SwipeableActionsBox import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha import tachiyomi.presentation.core.util.selectedBackground @Composable fun AnimeEpisodeListItem( title: String, date: String?, watchProgress: String?, scanlator: String?, summary: String?, previewUrl: String?, seen: Boolean, bookmark: Boolean, fillermark: Boolean, selected: Boolean, isAnyEpisodeSelected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, episodeSwipeStartAction: LibraryPreferences.EpisodeSwipeAction, episodeSwipeEndAction: LibraryPreferences.EpisodeSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((EpisodeDownloadAction) -> Unit)?, onEpisodeSwipe: (LibraryPreferences.EpisodeSwipeAction) -> Unit, modifier: Modifier = Modifier, ) { val start = getSwipeAction( action = episodeSwipeStartAction, seen = seen, bookmark = bookmark, fillermark = fillermark, downloadState = downloadStateProvider(), background = MaterialTheme.colorScheme.primaryContainer, onSwipe = { onEpisodeSwipe(episodeSwipeStartAction) }, ) val end = getSwipeAction( action = episodeSwipeEndAction, seen = seen, bookmark = bookmark, fillermark = fillermark, downloadState = downloadStateProvider(), background = MaterialTheme.colorScheme.primaryContainer, onSwipe = { onEpisodeSwipe(episodeSwipeEndAction) }, ) SwipeableActionsBox( modifier = modifier.clipToBounds(), startActions = listOfNotNull(start), endActions = listOfNotNull(end), swipeThreshold = swipeActionThreshold, backgroundUntilSwipeThreshold = MaterialTheme.colorScheme.surfaceContainerLowest, ) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .padding(start = 16.dp, top = 12.dp, end = 8.dp, bottom = 12.dp), ) { if (previewUrl.isNullOrBlank() && summary.isNullOrBlank()) { SimpleEpisodeListItemImpl( title = title, date = date, watchProgress = watchProgress, fillermark = fillermark, scanlator = scanlator, seen = seen, bookmark = bookmark, downloadIndicatorEnabled = downloadIndicatorEnabled, downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onDownloadClick = onDownloadClick, ) return@Row } Column { Row( horizontalArrangement = Arrangement.spacedBy(2.dp), verticalAlignment = Alignment.CenterVertically, ) { EpisodeThumbnail(previewUrl = previewUrl) Column { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth(), ) { val titleLines = if (previewUrl == null) 1 else 2 Text( text = title, style = MaterialTheme.typography.bodyMedium.copy(lineHeight = 14.sp), modifier = Modifier.weight(1f), maxLines = titleLines, minLines = titleLines, overflow = TextOverflow.Ellipsis, color = LocalContentColor.current.copy(alpha = if (seen) DISABLED_ALPHA else 1f), ) if (previewUrl == null) { BookmarkDownloadIcons( bookmark = bookmark, downloadIndicatorEnabled = downloadIndicatorEnabled, downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onDownloadClick = onDownloadClick, ) } } EpisodeSummary( seen = seen, isAnyEpisodeSelected = isAnyEpisodeSelected, summary = summary, ) } } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth(), ) { EpisodeInformation( seen = seen, date = date, watchProgress = watchProgress, fillermark = fillermark, scanlator = scanlator, ) if (previewUrl != null) { BookmarkDownloadIcons( bookmark = bookmark, downloadIndicatorEnabled = downloadIndicatorEnabled, downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onDownloadClick = onDownloadClick, ) } } } } } } @Composable private fun RowScope.SimpleEpisodeListItemImpl( title: String, date: String?, watchProgress: String?, fillermark: Boolean, scanlator: String?, seen: Boolean, bookmark: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, onDownloadClick: ((EpisodeDownloadAction) -> Unit)?, modifier: Modifier = Modifier, ) { Column( modifier = modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(if (fillermark) 0.dp else 6.dp), ) { Text( text = title, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, color = LocalContentColor.current.copy(alpha = if (seen) DISABLED_ALPHA else 1f), ) EpisodeInformation( seen = seen, date = date, watchProgress = watchProgress, fillermark = fillermark, scanlator = scanlator, ) } BookmarkDownloadIcons( bookmark = bookmark, downloadIndicatorEnabled = downloadIndicatorEnabled, downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onDownloadClick = onDownloadClick, ) } private fun getSwipeAction( action: LibraryPreferences.EpisodeSwipeAction, seen: Boolean, bookmark: Boolean, fillermark: Boolean, downloadState: AnimeDownload.State, background: Color, onSwipe: () -> Unit, ): me.saket.swipe.SwipeAction? { return when (action) { LibraryPreferences.EpisodeSwipeAction.ToggleSeen -> swipeAction( icon = if (!seen) Icons.Outlined.Done else Icons.Outlined.RemoveDone, background = background, isUndo = seen, onSwipe = onSwipe, ) LibraryPreferences.EpisodeSwipeAction.ToggleBookmark -> swipeAction( icon = if (!bookmark) Icons.Outlined.BookmarkAdd else Icons.Outlined.BookmarkRemove, background = background, isUndo = bookmark, onSwipe = onSwipe, ) LibraryPreferences.EpisodeSwipeAction.ToggleFillermark -> swipeAction( icon = if (!fillermark) Icons.Outlined.NewLabel else Icons.AutoMirrored.Outlined.LabelOff, background = background, isUndo = fillermark, onSwipe = onSwipe, ) LibraryPreferences.EpisodeSwipeAction.Download -> swipeAction( icon = when (downloadState) { AnimeDownload.State.NOT_DOWNLOADED, AnimeDownload.State.ERROR -> Icons.Outlined.Download AnimeDownload.State.QUEUE, AnimeDownload.State.DOWNLOADING -> Icons.Outlined.FileDownloadOff AnimeDownload.State.DOWNLOADED -> Icons.Outlined.Delete }, background = background, onSwipe = onSwipe, ) LibraryPreferences.EpisodeSwipeAction.Disabled -> null } } @Composable fun NextEpisodeAiringListItem( title: String, date: String, modifier: Modifier = Modifier, ) { Row( modifier = modifier.padding(start = 16.dp, top = 12.dp, end = 8.dp, bottom = 12.dp), ) { Column(modifier = Modifier.weight(1f)) { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = title, style = MaterialTheme.typography.bodyMedium.copy(lineHeight = 14.sp), maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.alpha(SECONDARY_ALPHA), color = MaterialTheme.colorScheme.primary, ) } Spacer(modifier = Modifier.height(6.dp)) Row(modifier = Modifier.alpha(SECONDARY_ALPHA)) { ProvideTextStyle( value = MaterialTheme.typography.bodySmall, ) { Text( text = date, maxLines = 1, overflow = TextOverflow.Ellipsis, color = MaterialTheme.colorScheme.primary, ) } } } } } private fun swipeAction( onSwipe: () -> Unit, icon: ImageVector, background: Color, isUndo: Boolean = false, ): me.saket.swipe.SwipeAction { return me.saket.swipe.SwipeAction( icon = { Icon( modifier = Modifier.padding(16.dp), imageVector = icon, tint = contentColorFor(background), contentDescription = null, ) }, background = background, onSwipe = onSwipe, isUndo = isUndo, ) } private val swipeActionThreshold = 56.dp @Composable private fun EpisodeThumbnail( previewUrl: String?, ) { val targetWidth = ((LocalConfiguration.current.screenWidthDp * 0.4f).coerceAtMost(250f)) if (previewUrl != null) { ItemCover.Thumb( modifier = Modifier .width(targetWidth.dp) .padding(end = 8.dp), data = ImageRequest.Builder(LocalContext.current) .data(previewUrl) .crossfade(true) .build(), ) } } @Composable private fun EpisodeSummary( seen: Boolean, isAnyEpisodeSelected: Boolean, summary: String?, ) { var expandSummary by remember { mutableStateOf(false) } if (summary != null) { Text( text = summary, style = MaterialTheme.typography.labelMedium, maxLines = if (expandSummary) Int.MAX_VALUE else 3, minLines = 3, fontWeight = FontWeight.Normal, fontSize = 10.sp, lineHeight = 11.sp, overflow = TextOverflow.Ellipsis, color = LocalContentColor.current.copy( alpha = if (seen) DISABLED_ALPHA else SECONDARY_ALPHA, ), modifier = Modifier.padding(bottom = 4.dp, start = 4.dp, end = 4.dp) .then( if (isAnyEpisodeSelected) { Modifier } else { Modifier.clickable { expandSummary = !expandSummary } }, ), ) } } @Composable private fun EpisodeInformation( seen: Boolean, date: String?, watchProgress: String?, fillermark: Boolean, scanlator: String?, ) { Row(verticalAlignment = Alignment.CenterVertically) { val subtitleStyle = MaterialTheme.typography.bodySmall .merge(color = LocalContentColor.current.copy(alpha = if (seen) DISABLED_ALPHA else SECONDARY_ALPHA)) ProvideTextStyle(value = subtitleStyle) { if (fillermark) { Icon( imageVector = Icons.AutoMirrored.Filled.Label, contentDescription = stringResource(AYMR.strings.filler), tint = MaterialTheme.colorScheme.tertiary.copy(alpha = subtitleStyle.alpha), modifier = Modifier.padding(end = 4.dp), ) Text( text = stringResource(AYMR.strings.filler), maxLines = 1, color = MaterialTheme.colorScheme.tertiary.copy(alpha = subtitleStyle.alpha), modifier = Modifier.padding(end = 4.dp), ) } if (date != null) { Text( text = date, maxLines = 1, overflow = TextOverflow.Ellipsis, ) if (watchProgress != null || scanlator != null) DotSeparatorText() } if (watchProgress != null) { Text( text = watchProgress, maxLines = 1, overflow = TextOverflow.Ellipsis, color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), ) if (scanlator != null) DotSeparatorText() } if (scanlator != null) { Text( text = scanlator, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } } @Composable private fun BookmarkDownloadIcons( bookmark: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, onDownloadClick: ((EpisodeDownloadAction) -> Unit)?, ) { Row(verticalAlignment = Alignment.CenterVertically) { if (bookmark) { Icon( imageVector = Icons.Filled.Bookmark, contentDescription = stringResource(MR.strings.action_filter_bookmarked), modifier = Modifier .secondaryItemAlpha() .padding(start = 4.dp), tint = MaterialTheme.colorScheme.primary, ) } EpisodeDownloadIndicator( enabled = downloadIndicatorEnabled, modifier = Modifier .padding(start = 4.dp), downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onClick = { onDownloadClick?.invoke(it) }, ) } } @Preview @Composable fun AnimeEpisodeListItemPreview() { AnimeEpisodeListItem( title = "Ep. 1 - To You, 2000 Years in the Future: The Fall of Zhiganshina (1)", date = "7/4/13", watchProgress = null, scanlator = null, summary = "As Titans continue to rampage, the townspeople gather at the inner gate. But a new Titan breaks " + "through and this one is unlike the others. Source: crunchyroll", previewUrl = null, seen = false, bookmark = false, fillermark = true, selected = false, isAnyEpisodeSelected = false, downloadIndicatorEnabled = true, downloadStateProvider = { AnimeDownload.State.NOT_DOWNLOADED }, downloadProgressProvider = { 0 }, episodeSwipeStartAction = LibraryPreferences.EpisodeSwipeAction.Disabled, episodeSwipeEndAction = LibraryPreferences.EpisodeSwipeAction.Disabled, onLongClick = {}, onClick = {}, onDownloadClick = {}, onEpisodeSwipe = {}, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeImagesDialog.kt ================================================ package eu.kanade.presentation.entries.anime.components import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.KeyboardArrowLeft import androidx.compose.material.icons.automirrored.outlined.KeyboardArrowRight import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.Save import androidx.compose.material.icons.outlined.Share import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.core.view.updatePadding import coil3.asDrawable import coil3.imageLoader import coil3.request.CachePolicy import coil3.request.ImageRequest import coil3.size.Size import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.entries.EditCoverAction import eu.kanade.tachiyomi.data.coil.useBackground import eu.kanade.tachiyomi.ui.reader.viewer.ReaderPageImageView import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.util.lang.launchUI import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.clickableNoIndication @Composable fun AnimeImagesDialog( anime: Anime, isCustomCover: Boolean, isCustomBackground: Boolean, snackbarHostState: SnackbarHostState, pagerState: PagerState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) { val scope = rememberCoroutineScope() val isCover = pagerState.currentPage != 1 val arrowIcon = if (isCover) { Icons.AutoMirrored.Outlined.KeyboardArrowRight } else { Icons.AutoMirrored.Outlined.KeyboardArrowLeft } val (editImageStringResource, alternateImageStringResource) = if (isCover) { MR.strings.action_edit_cover to AYMR.strings.action_edit_background } else { AYMR.strings.action_edit_background to MR.strings.action_edit_cover } val onImageSwitchClicked: () -> Unit = { scope.launchUI { pagerState.animateScrollToPage(1 - pagerState.currentPage) } } Dialog( onDismissRequest = onDismissRequest, properties = DialogProperties( usePlatformDefaultWidth = false, decorFitsSystemWindows = false, // Doesn't work https://issuetracker.google.com/issues/246909281 ), ) { Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, containerColor = Color.Transparent, bottomBar = { Row( modifier = Modifier .fillMaxWidth() .padding(4.dp) .navigationBarsPadding(), ) { ActionsPill { IconButton(onClick = onDismissRequest) { Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_close), ) } IconButton(onClick = onImageSwitchClicked) { Icon( imageVector = arrowIcon, contentDescription = stringResource(alternateImageStringResource), ) } } Spacer(modifier = Modifier.weight(1f)) ActionsPill { AppBarActions( actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_share), icon = Icons.Outlined.Share, onClick = onShareClick, ), AppBar.Action( title = stringResource(MR.strings.action_save), icon = Icons.Outlined.Save, onClick = onSaveClick, ), ), ) if (onEditClick != null) { Box { var expanded by remember { mutableStateOf(false) } IconButton( onClick = { if ((isCover && isCustomCover) || (!isCover && isCustomBackground)) { expanded = true } else { onEditClick(EditCoverAction.EDIT) } }, ) { Icon( imageVector = Icons.Outlined.Edit, contentDescription = stringResource(editImageStringResource), ) } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, offset = DpOffset(8.dp, 0.dp), ) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_edit)) }, onClick = { onEditClick(EditCoverAction.EDIT) expanded = false }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_delete)) }, onClick = { onEditClick(EditCoverAction.DELETE) expanded = false }, ) } } } } } }, ) { contentPadding -> val statusBarPaddingPx = with(LocalDensity.current) { contentPadding.calculateTopPadding().roundToPx() } val bottomPaddingPx = with(LocalDensity.current) { contentPadding.calculateBottomPadding().roundToPx() } Box( modifier = Modifier .fillMaxSize() .clickableNoIndication(onClick = onDismissRequest), ) { HorizontalPager( state = pagerState, ) { page -> AndroidView( factory = { ReaderPageImageView(it).apply { onViewClicked = onDismissRequest clipToPadding = false clipChildren = false } }, update = { view -> val context = view.context val request = ImageRequest.Builder(context) .data(anime) .useBackground(page == 1) .size(Size.ORIGINAL) .memoryCachePolicy(CachePolicy.DISABLED) .target { image -> val drawable = image.asDrawable(context.resources) // Copy bitmap in case it came from memory cache // Because SSIV needs to thoroughly read the image val copy = (drawable as? BitmapDrawable)?.let { BitmapDrawable( context.resources, it.bitmap.copy(Bitmap.Config.HARDWARE, false), ) } ?: drawable view.setImage(copy, ReaderPageImageView.Config(zoomDuration = 500)) } .build() context.imageLoader.enqueue(request) view.updatePadding(top = statusBarPaddingPx, bottom = bottomPaddingPx) }, modifier = Modifier.fillMaxSize(), ) } } } } } @Composable private fun ActionsPill(content: @Composable () -> Unit) { Row( modifier = Modifier .clip(MaterialTheme.shapes.extraLarge) .background(MaterialTheme.colorScheme.background.copy(alpha = 0.95f)), ) { content() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeInfoHeader.kt ================================================ package eu.kanade.presentation.entries.anime.components import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.spring import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Brush import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.HourglassEmpty import androidx.compose.material.icons.filled.PersonOutline import androidx.compose.material.icons.filled.Warning import androidx.compose.material.icons.outlined.AttachMoney import androidx.compose.material.icons.outlined.Block import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.Done import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material.icons.outlined.Pause import androidx.compose.material.icons.outlined.Public import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material.icons.outlined.Sync import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalMinimumInteractiveComponentSize import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.SuggestionChip import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.Layout import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import coil3.request.ImageRequest import coil3.request.crossfade import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.data.coil.useBackground import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.clickableNoIndication import tachiyomi.presentation.core.util.secondaryItemAlpha import java.time.Instant import java.time.temporal.ChronoUnit import kotlin.math.roundToInt private val whitespaceLineRegex = Regex("[\\r\\n]{2,}", setOf(RegexOption.MULTILINE)) @Composable fun AnimeInfoBox( isTabletUi: Boolean, appBarPadding: Dp, anime: Anime, sourceName: String, isStubSource: Boolean, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, ) { Box(modifier = modifier) { // Backdrop val backdropGradientColors = listOf( Color.Transparent, MaterialTheme.colorScheme.background, ) AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data(anime) .useBackground(true) .crossfade(true) .build(), contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier .matchParentSize() .drawWithContent { drawContent() drawRect( brush = Brush.verticalGradient(colors = backdropGradientColors), ) } .blur(4.dp) .alpha(0.2f), ) // Anime & source info CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurface) { if (!isTabletUi) { AnimeAndSourceTitlesSmall( appBarPadding = appBarPadding, anime = anime, sourceName = sourceName, isStubSource = isStubSource, onCoverClick = onCoverClick, doSearch = doSearch, ) } else { AnimeAndSourceTitlesLarge( appBarPadding = appBarPadding, anime = anime, sourceName = sourceName, isStubSource = isStubSource, onCoverClick = onCoverClick, doSearch = doSearch, ) } } } } @Composable fun AnimeActionRow( favorite: Boolean, trackingCount: Int, nextUpdate: Instant?, isUserIntervalMode: Boolean, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) { val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = DISABLED_ALPHA) // TODO: show something better when using custom interval val nextUpdateDays = remember(nextUpdate) { return@remember if (nextUpdate != null) { val now = Instant.now() now.until(nextUpdate, ChronoUnit.DAYS).toInt().coerceAtLeast(0) } else { null } } Row(modifier = modifier.padding(start = 16.dp, top = 8.dp, end = 16.dp)) { AnimeActionButton( title = if (favorite) { stringResource(MR.strings.in_library) } else { stringResource(MR.strings.add_to_library) }, icon = if (favorite) Icons.Filled.Favorite else Icons.Outlined.FavoriteBorder, color = if (favorite) MaterialTheme.colorScheme.primary else defaultActionButtonColor, onClick = onAddToLibraryClicked, onLongClick = onEditCategory, ) AnimeActionButton( title = when (nextUpdateDays) { null -> stringResource(MR.strings.not_applicable) 0 -> stringResource(MR.strings.manga_interval_expected_update_soon) else -> pluralStringResource( MR.plurals.day, count = nextUpdateDays, nextUpdateDays, ) }, icon = Icons.Default.HourglassEmpty, color = if (isUserIntervalMode) MaterialTheme.colorScheme.primary else defaultActionButtonColor, onClick = { onEditIntervalClicked?.invoke() }, ) if (onTrackingClicked != null) { AnimeActionButton( title = if (trackingCount == 0) { stringResource(MR.strings.manga_tracking_tab) } else { pluralStringResource(MR.plurals.num_trackers, count = trackingCount, trackingCount) }, icon = if (trackingCount == 0) Icons.Outlined.Sync else Icons.Outlined.Done, color = if (trackingCount == 0) defaultActionButtonColor else MaterialTheme.colorScheme.primary, onClick = onTrackingClicked, ) } if (onWebViewClicked != null) { AnimeActionButton( title = stringResource(MR.strings.action_web_view), icon = Icons.Outlined.Public, color = defaultActionButtonColor, onClick = onWebViewClicked, onLongClick = onWebViewLongClicked, ) } } } @Composable fun ExpandableAnimeDescription( defaultExpandState: Boolean, description: String?, tagsProvider: () -> List?, onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier = modifier) { val (expanded, onExpanded) = rememberSaveable { mutableStateOf(defaultExpandState) } val desc = description.takeIf { !it.isNullOrBlank() } ?: stringResource( MR.strings.description_placeholder, ) val trimmedDescription = remember(desc) { desc .replace(whitespaceLineRegex, "\n") .trimEnd() } AnimeSummary( expandedDescription = desc, shrunkDescription = trimmedDescription, expanded = expanded, modifier = Modifier .padding(top = 8.dp) .padding(horizontal = 16.dp) .clickableNoIndication { onExpanded(!expanded) }, ) val tags = tagsProvider() if (!tags.isNullOrEmpty()) { Box( modifier = Modifier .padding(top = 8.dp) .padding(vertical = 12.dp) .animateContentSize(animationSpec = spring()) .fillMaxWidth(), ) { var showMenu by remember { mutableStateOf(false) } var tagSelected by remember { mutableStateOf("") } DropdownMenu( expanded = showMenu, onDismissRequest = { showMenu = false }, ) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_search)) }, onClick = { onTagSearch(tagSelected) showMenu = false }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_copy_to_clipboard)) }, onClick = { onCopyTagToClipboard(tagSelected) showMenu = false }, ) } if (expanded) { FlowRow( modifier = Modifier.padding(horizontal = 16.dp), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { tags.forEach { TagsChip( modifier = DefaultTagChipModifier, text = it, onClick = { tagSelected = it showMenu = true }, ) } } } else { LazyRow( contentPadding = PaddingValues(horizontal = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { items(items = tags) { TagsChip( modifier = DefaultTagChipModifier, text = it, onClick = { tagSelected = it showMenu = true }, ) } } } } } } } @Composable private fun AnimeAndSourceTitlesLarge( appBarPadding: Dp, anime: Anime, sourceName: String, isStubSource: Boolean, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, ) { Column( modifier = Modifier .fillMaxWidth() .padding(start = 16.dp, top = appBarPadding + 16.dp, end = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { ItemCover.Book( modifier = Modifier.fillMaxWidth(0.65f), data = ImageRequest.Builder(LocalContext.current) .data(anime) .crossfade(true) .build(), contentDescription = stringResource(MR.strings.manga_cover), onClick = onCoverClick, ) Spacer(modifier = Modifier.height(16.dp)) AnimeContentInfo( title = anime.title, author = anime.author, artist = anime.artist, status = anime.status, sourceName = sourceName, isStubSource = isStubSource, doSearch = doSearch, textAlign = TextAlign.Center, ) } } @Composable private fun AnimeAndSourceTitlesSmall( appBarPadding: Dp, anime: Anime, sourceName: String, isStubSource: Boolean, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, ) { Row( modifier = Modifier .fillMaxWidth() .padding(start = 16.dp, top = appBarPadding + 16.dp, end = 16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Book( modifier = Modifier .sizeIn(maxWidth = 100.dp) .align(Alignment.Top), data = ImageRequest.Builder(LocalContext.current) .data(anime) .crossfade(true) .build(), contentDescription = stringResource(MR.strings.manga_cover), onClick = onCoverClick, ) Column( verticalArrangement = Arrangement.spacedBy(2.dp), ) { AnimeContentInfo( title = anime.title, author = anime.author, artist = anime.artist, status = anime.status, sourceName = sourceName, isStubSource = isStubSource, doSearch = doSearch, ) } } } @Composable private fun ColumnScope.AnimeContentInfo( title: String, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, doSearch: (query: String, global: Boolean) -> Unit, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) { val context = LocalContext.current Text( text = title.ifBlank { stringResource(MR.strings.unknown_title) }, style = MaterialTheme.typography.titleLarge, modifier = Modifier.clickableNoIndication( onLongClick = { if (title.isNotBlank()) { context.copyToClipboard( title, title, ) } }, onClick = { if (title.isNotBlank()) doSearch(title, true) }, ), textAlign = textAlign, ) Spacer(modifier = Modifier.height(2.dp)) Row( modifier = Modifier.secondaryItemAlpha(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Filled.PersonOutline, contentDescription = null, modifier = Modifier.size(16.dp), ) Text( text = author?.takeIf { it.isNotBlank() } ?: stringResource(MR.strings.unknown_author), style = MaterialTheme.typography.titleSmall, modifier = Modifier .clickableNoIndication( onLongClick = { if (!author.isNullOrBlank()) { context.copyToClipboard( author, author, ) } }, onClick = { if (!author.isNullOrBlank()) doSearch(author, true) }, ), textAlign = textAlign, ) } if (!artist.isNullOrBlank() && author != artist) { Row( modifier = Modifier.secondaryItemAlpha(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Filled.Brush, contentDescription = null, modifier = Modifier.size(16.dp), ) Text( text = artist, style = MaterialTheme.typography.titleSmall, modifier = Modifier .clickableNoIndication( onLongClick = { context.copyToClipboard(artist, artist) }, onClick = { doSearch(artist, true) }, ), textAlign = textAlign, ) } } Spacer(modifier = Modifier.height(2.dp)) Row( modifier = Modifier.secondaryItemAlpha(), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = when (status) { SAnime.ONGOING.toLong() -> Icons.Outlined.Schedule SAnime.COMPLETED.toLong() -> Icons.Outlined.DoneAll SAnime.LICENSED.toLong() -> Icons.Outlined.AttachMoney SAnime.PUBLISHING_FINISHED.toLong() -> Icons.Outlined.Done SAnime.CANCELLED.toLong() -> Icons.Outlined.Close SAnime.ON_HIATUS.toLong() -> Icons.Outlined.Pause else -> Icons.Outlined.Block }, contentDescription = null, modifier = Modifier .padding(end = 4.dp) .size(16.dp), ) ProvideTextStyle(MaterialTheme.typography.bodyMedium) { Text( text = when (status) { SAnime.ONGOING.toLong() -> stringResource(MR.strings.ongoing) SAnime.COMPLETED.toLong() -> stringResource(MR.strings.completed) SAnime.LICENSED.toLong() -> stringResource(MR.strings.licensed) SAnime.PUBLISHING_FINISHED.toLong() -> stringResource(MR.strings.publishing_finished) SAnime.CANCELLED.toLong() -> stringResource(MR.strings.cancelled) SAnime.ON_HIATUS.toLong() -> stringResource(MR.strings.on_hiatus) else -> stringResource(MR.strings.unknown) }, overflow = TextOverflow.Ellipsis, maxLines = 1, ) DotSeparatorText() if (isStubSource) { Icon( imageVector = Icons.Filled.Warning, contentDescription = null, modifier = Modifier .padding(end = 4.dp) .size(16.dp), tint = MaterialTheme.colorScheme.error, ) } Text( text = sourceName, modifier = Modifier.clickableNoIndication { doSearch( sourceName, false, ) }, overflow = TextOverflow.Ellipsis, maxLines = 1, ) } } } @Composable private fun AnimeSummary( expandedDescription: String, shrunkDescription: String, expanded: Boolean, modifier: Modifier = Modifier, ) { val animProgress by animateFloatAsState(if (expanded) 1f else 0f) Layout( modifier = modifier.clipToBounds(), contents = listOf( { Text( text = "\n\n", // Shows at least 3 lines style = MaterialTheme.typography.bodyMedium, ) }, { Text( text = expandedDescription, style = MaterialTheme.typography.bodyMedium, ) }, { SelectionContainer { Text( text = if (expanded) expandedDescription else shrunkDescription, maxLines = Int.MAX_VALUE, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onBackground, modifier = Modifier.secondaryItemAlpha(), ) } }, { val colors = listOf(Color.Transparent, MaterialTheme.colorScheme.background) Box( modifier = Modifier.background(Brush.verticalGradient(colors = colors)), contentAlignment = Alignment.Center, ) { val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_caret_down) Icon( painter = rememberAnimatedVectorPainter(image, !expanded), contentDescription = stringResource( if (expanded) MR.strings.manga_info_collapse else MR.strings.manga_info_expand, ), tint = MaterialTheme.colorScheme.onBackground, modifier = Modifier.background(Brush.radialGradient(colors = colors.asReversed())), ) } }, ), ) { (shrunk, expanded, actual, scrim), constraints -> val shrunkHeight = shrunk.single() .measure(constraints) .height val expandedHeight = expanded.single() .measure(constraints) .height val heightDelta = expandedHeight - shrunkHeight val scrimHeight = 24.dp.roundToPx() val actualPlaceable = actual.single() .measure(constraints) val scrimPlaceable = scrim.single() .measure(Constraints.fixed(width = constraints.maxWidth, height = scrimHeight)) val currentHeight = shrunkHeight + ((heightDelta + scrimHeight) * animProgress).roundToInt() layout(constraints.maxWidth, currentHeight) { actualPlaceable.place(0, 0) val scrimY = currentHeight - scrimHeight scrimPlaceable.place(0, scrimY) } } } private val DefaultTagChipModifier = Modifier.padding(vertical = 4.dp) @Composable private fun TagsChip( text: String, modifier: Modifier = Modifier, onClick: () -> Unit, ) { CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) { SuggestionChip( modifier = modifier, onClick = onClick, label = { Text(text = text, style = MaterialTheme.typography.bodySmall) }, ) } } @Composable private fun RowScope.AnimeActionButton( title: String, icon: ImageVector, color: Color, onClick: () -> Unit, onLongClick: (() -> Unit)? = null, ) { TextButton( onClick = onClick, modifier = Modifier.weight(1f), onLongClick = onLongClick, ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon( imageVector = icon, contentDescription = null, tint = color, modifier = Modifier.size(20.dp), ) Spacer(Modifier.height(4.dp)) Text( text = title, color = color, fontSize = 12.sp, textAlign = TextAlign.Center, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/components/AnimeSeasonListItem.kt ================================================ package eu.kanade.presentation.entries.anime.components import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import aniyomi.domain.anime.SeasonAnime import aniyomi.domain.anime.SeasonDisplayMode import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryComfortableGridItem import eu.kanade.presentation.library.components.EntryCompactGridItem import eu.kanade.presentation.library.components.EntryListItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.presentation.util.formatEpisodeNumber import eu.kanade.tachiyomi.ui.entries.anime.AnimeSeasonItem import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun AnimeSeasonListItem( anime: Anime, item: AnimeSeasonItem, containerHeight: Int, onSeasonClicked: (SeasonAnime) -> Unit, onClickContinueWatching: ((SeasonAnime) -> Unit)?, listItemModifier: Modifier = Modifier, ) { val itemAnime = item.seasonAnime.anime val title = if (anime.seasonDisplayMode == Anime.SEASON_DISPLAY_MODE_NUMBER) { stringResource( AYMR.strings.display_mode_season, formatEpisodeNumber(itemAnime.seasonNumber), ) } else { itemAnime.title } when (anime.seasonDisplayGridMode) { SeasonDisplayMode.ComfortableGrid -> { EntryComfortableGridItem( title = title, coverData = AnimeCover( animeId = itemAnime.id, sourceId = itemAnime.source, isAnimeFavorite = itemAnime.favorite, url = itemAnime.thumbnailUrl, lastModified = itemAnime.coverLastModified, ), coverBadgeStart = { DownloadsBadge(count = item.downloadCount) UnviewedBadge(count = item.unseenCount) }, coverBadgeEnd = { LanguageBadge( isLocal = item.isLocal, sourceLanguage = item.sourceLanguage, ) }, onLongClick = { onSeasonClicked(item.seasonAnime) }, onClick = { onSeasonClicked(item.seasonAnime) }, onClickContinueViewing = if (onClickContinueWatching != null && item.showContinueOverlay) { { onClickContinueWatching(item.seasonAnime) } } else { null }, ) } SeasonDisplayMode.CompactGrid, SeasonDisplayMode.CoverOnlyGrid -> { EntryCompactGridItem( title = title.takeIf { anime.seasonDisplayGridMode is SeasonDisplayMode.CompactGrid }, coverData = AnimeCover( animeId = itemAnime.id, sourceId = itemAnime.source, isAnimeFavorite = itemAnime.favorite, url = itemAnime.thumbnailUrl, lastModified = itemAnime.coverLastModified, ), coverBadgeStart = { DownloadsBadge(count = item.downloadCount) UnviewedBadge(count = item.unseenCount) }, coverBadgeEnd = { LanguageBadge( isLocal = item.isLocal, sourceLanguage = item.sourceLanguage, ) }, onLongClick = { onSeasonClicked(item.seasonAnime) }, onClick = { onSeasonClicked(item.seasonAnime) }, onClickContinueViewing = if (onClickContinueWatching != null && item.showContinueOverlay) { { onClickContinueWatching(item.seasonAnime) } } else { null }, ) } SeasonDisplayMode.List -> { EntryListItem( title = title, coverData = AnimeCover( animeId = itemAnime.id, sourceId = itemAnime.source, isAnimeFavorite = itemAnime.favorite, url = itemAnime.thumbnailUrl, lastModified = itemAnime.coverLastModified, ), badge = { DownloadsBadge(count = item.downloadCount) UnviewedBadge(count = item.unseenCount) LanguageBadge( isLocal = item.isLocal, sourceLanguage = item.sourceLanguage, ) }, onLongClick = { onSeasonClicked(item.seasonAnime) }, onClick = { onSeasonClicked(item.seasonAnime) }, onClickContinueViewing = if (onClickContinueWatching != null && item.showContinueOverlay) { { onClickContinueWatching(item.seasonAnime) } } else { null }, entries = anime.seasonDisplayGridSize, containerHeight = containerHeight, modifier = listItemModifier, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/components/BaseAnimeListItem.kt ================================================ package eu.kanade.presentation.entries.anime.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.ItemCover import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.presentation.core.components.material.padding @Composable fun BaseAnimeListItem( anime: Anime, modifier: Modifier = Modifier, onClickItem: () -> Unit = {}, onClickCover: () -> Unit = onClickItem, cover: @Composable RowScope.() -> Unit = { defaultCover(anime, onClickCover) }, actions: @Composable RowScope.() -> Unit = {}, content: @Composable RowScope.() -> Unit = { defaultContent(anime) }, ) { Row( modifier = modifier .clickable(onClick = onClickItem) .height(76.dp) .padding(horizontal = MaterialTheme.padding.medium, vertical = 3.dp), verticalAlignment = Alignment.CenterVertically, ) { cover() content() actions() } } private val defaultCover: @Composable RowScope.(Anime, () -> Unit) -> Unit = { anime, onClick -> ItemCover.Book( modifier = Modifier .fillMaxHeight(), data = anime, onClick = onClick, ) } private val defaultContent: @Composable RowScope.(Anime) -> Unit = { Box(modifier = Modifier.weight(1f)) { Text( text = it.title, modifier = Modifier .padding(start = MaterialTheme.padding.medium), overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/anime/components/EpisodeDownloadIndicator.kt ================================================ package eu.kanade.presentation.entries.anime.components import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.outlined.ArrowDownward import androidx.compose.material.icons.outlined.ErrorOutline import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProgressIndicatorDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.ArrowModifier import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.IndicatorModifier import eu.kanade.presentation.components.IndicatorSize import eu.kanade.presentation.components.IndicatorStrokeWidth import eu.kanade.presentation.components.commonClickable import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.IconButtonTokens import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha enum class EpisodeDownloadAction { START, START_NOW, CANCEL, DELETE, SHOW_QUALITIES, } @Composable fun EpisodeDownloadIndicator( enabled: Boolean, downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, onClick: (EpisodeDownloadAction) -> Unit, modifier: Modifier = Modifier, ) { when (val downloadState = downloadStateProvider()) { AnimeDownload.State.NOT_DOWNLOADED -> NotDownloadedIndicator( enabled = enabled, modifier = modifier, onClick = onClick, ) AnimeDownload.State.QUEUE, AnimeDownload.State.DOWNLOADING -> DownloadingIndicator( enabled = enabled, modifier = modifier, downloadState = downloadState, downloadProgressProvider = downloadProgressProvider, onClick = onClick, ) AnimeDownload.State.DOWNLOADED -> DownloadedIndicator( enabled = enabled, modifier = modifier, onClick = onClick, ) AnimeDownload.State.ERROR -> ErrorIndicator( enabled = enabled, modifier = modifier, onClick = onClick, ) } } @Composable private fun NotDownloadedIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (EpisodeDownloadAction) -> Unit, ) { Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { onClick(EpisodeDownloadAction.SHOW_QUALITIES) }, onClick = { onClick(EpisodeDownloadAction.START) }, ) .secondaryItemAlpha(), contentAlignment = Alignment.Center, ) { Icon( painter = painterResource(R.drawable.ic_download_item_24dp), contentDescription = stringResource(MR.strings.manga_download), modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @Composable private fun DownloadingIndicator( enabled: Boolean, downloadState: AnimeDownload.State, downloadProgressProvider: () -> Int, onClick: (EpisodeDownloadAction) -> Unit, modifier: Modifier = Modifier, ) { var isMenuExpanded by remember { mutableStateOf(false) } Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { onClick(EpisodeDownloadAction.CANCEL) }, onClick = { isMenuExpanded = true }, ), contentAlignment = Alignment.Center, ) { val arrowColor: Color val strokeColor = MaterialTheme.colorScheme.onSurfaceVariant val downloadProgress = downloadProgressProvider() val indeterminate = downloadState == AnimeDownload.State.QUEUE || (downloadState == AnimeDownload.State.DOWNLOADING && downloadProgress == 0) if (indeterminate) { arrowColor = strokeColor CircularProgressIndicator( modifier = IndicatorModifier, color = strokeColor, strokeWidth = IndicatorStrokeWidth, trackColor = Color.Transparent, strokeCap = StrokeCap.Butt, ) } else { val animatedProgress by animateFloatAsState( targetValue = downloadProgress / 100f, animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, label = "progress", ) arrowColor = if (animatedProgress < 0.5f) { strokeColor } else { MaterialTheme.colorScheme.background } CircularProgressIndicator( progress = { animatedProgress }, modifier = IndicatorModifier, color = strokeColor, strokeWidth = IndicatorSize / 2, trackColor = Color.Transparent, strokeCap = StrokeCap.Butt, gapSize = 0.dp, ) } DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_start_downloading_now)) }, onClick = { onClick(EpisodeDownloadAction.START_NOW) isMenuExpanded = false }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_cancel)) }, onClick = { onClick(EpisodeDownloadAction.CANCEL) isMenuExpanded = false }, ) } Icon( imageVector = Icons.Outlined.ArrowDownward, contentDescription = null, modifier = ArrowModifier, tint = arrowColor, ) } } @Composable private fun DownloadedIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (EpisodeDownloadAction) -> Unit, ) { var isMenuExpanded by remember { mutableStateOf(false) } Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { isMenuExpanded = true }, onClick = { isMenuExpanded = true }, ), contentAlignment = Alignment.Center, ) { Icon( imageVector = Icons.Filled.CheckCircle, contentDescription = null, modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_delete)) }, onClick = { onClick(EpisodeDownloadAction.DELETE) isMenuExpanded = false }, ) } } } @Composable private fun ErrorIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (EpisodeDownloadAction) -> Unit, ) { Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { onClick(EpisodeDownloadAction.START) }, onClick = { onClick(EpisodeDownloadAction.START) }, ), contentAlignment = Alignment.Center, ) { Icon( imageVector = Icons.Outlined.ErrorOutline, contentDescription = stringResource(AYMR.strings.download_error), modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.error, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/DotSeparatorText.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @Composable fun DotSeparatorText( modifier: Modifier = Modifier, ) { Text( text = " • ", modifier = modifier, ) } @Composable fun DotSeparatorNoSpaceText( modifier: Modifier = Modifier, ) { Text( text = "•", modifier = modifier, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/EntryBottomActionMenu.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.shape.ZeroCornerSize import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.automirrored.outlined.LabelOff import androidx.compose.material.icons.outlined.BookmarkAdd import androidx.compose.material.icons.outlined.BookmarkRemove import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.Input import androidx.compose.material.icons.outlined.NewLabel import androidx.compose.material.icons.outlined.OpenInNew import androidx.compose.material.icons.outlined.RemoveDone import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.EntryDownloadDropdownMenu import eu.kanade.presentation.entries.DownloadAction import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds @Composable fun EntryBottomActionMenu( visible: Boolean, isManga: Boolean, modifier: Modifier = Modifier, onBookmarkClicked: (() -> Unit)? = null, onRemoveBookmarkClicked: (() -> Unit)? = null, onFillermarkClicked: (() -> Unit)? = null, onRemoveFillermarkClicked: (() -> Unit)? = null, onMarkAsViewedClicked: (() -> Unit)? = null, onMarkAsUnviewedClicked: (() -> Unit)? = null, onMarkPreviousAsViewedClicked: (() -> Unit)? = null, onDownloadClicked: (() -> Unit)? = null, onDeleteClicked: (() -> Unit)? = null, onExternalClicked: (() -> Unit)? = null, onInternalClicked: (() -> Unit)? = null, ) { AnimatedVisibility( visible = visible, enter = expandVertically(expandFrom = Alignment.Bottom), exit = shrinkVertically(shrinkTowards = Alignment.Bottom), ) { val scope = rememberCoroutineScope() val playerPreferences: PlayerPreferences = Injekt.get() Surface( modifier = modifier, shape = MaterialTheme.shapes.large.copy( bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize, ), color = MaterialTheme.colorScheme.surfaceContainerHigh, ) { val haptic = LocalHapticFeedback.current val confirm = remember { mutableStateListOf(false, false, false, false, false, false, false, false, false, false, false) } val confirmRange = 0..<11 var resetJob: Job? = remember { null } val onLongClickItem: (Int) -> Unit = { toConfirmIndex -> haptic.performHapticFeedback(HapticFeedbackType.LongPress) (confirmRange).forEach { i -> confirm[i] = i == toConfirmIndex } resetJob?.cancel() resetJob = scope.launch { delay(1.seconds) if (isActive) confirm[toConfirmIndex] = false } } Row( modifier = Modifier .padding( WindowInsets.navigationBars .only(WindowInsetsSides.Bottom) .asPaddingValues(), ) .padding(horizontal = 8.dp, vertical = 12.dp), ) { if (onBookmarkClicked != null) { val bookmark = if (isManga) MR.strings.action_bookmark else AYMR.strings.action_bookmark_episode Button( title = stringResource(bookmark), icon = Icons.Outlined.BookmarkAdd, toConfirm = confirm[0], onLongClick = { onLongClickItem(0) }, onClick = onBookmarkClicked, ) } if (onRemoveBookmarkClicked != null) { val removeBookmark = if (isManga) { MR.strings.action_remove_bookmark } else { AYMR.strings.action_remove_bookmark_episode } Button( title = stringResource(removeBookmark), icon = Icons.Outlined.BookmarkRemove, toConfirm = confirm[1], onLongClick = { onLongClickItem(1) }, onClick = onRemoveBookmarkClicked, ) } if (onFillermarkClicked != null) { Button( title = stringResource(AYMR.strings.action_fillermark_episode), icon = Icons.Outlined.NewLabel, toConfirm = confirm[2], onLongClick = { onLongClickItem(2) }, onClick = onFillermarkClicked, ) } if (onRemoveFillermarkClicked != null) { Button( title = stringResource(AYMR.strings.action_remove_fillermark_episode), icon = Icons.AutoMirrored.Outlined.LabelOff, toConfirm = confirm[3], onLongClick = { onLongClickItem(3) }, onClick = onRemoveFillermarkClicked, ) } if (onMarkAsViewedClicked != null) { val viewed = if (isManga) MR.strings.action_mark_as_read else AYMR.strings.action_mark_as_seen Button( title = stringResource(viewed), icon = Icons.Outlined.DoneAll, toConfirm = confirm[4], onLongClick = { onLongClickItem(4) }, onClick = onMarkAsViewedClicked, ) } if (onMarkAsUnviewedClicked != null) { val unviewed = if (isManga) MR.strings.action_mark_as_unread else AYMR.strings.action_mark_as_unseen Button( title = stringResource(unviewed), icon = Icons.Outlined.RemoveDone, toConfirm = confirm[5], onLongClick = { onLongClickItem(5) }, onClick = onMarkAsUnviewedClicked, ) } if (onMarkPreviousAsViewedClicked != null) { val previousUnviewed = if (isManga) { MR.strings.action_mark_previous_as_read } else { AYMR.strings.action_mark_previous_as_seen } Button( title = stringResource(previousUnviewed), icon = ImageVector.vectorResource(R.drawable.ic_done_prev_24dp), toConfirm = confirm[6], onLongClick = { onLongClickItem(6) }, onClick = onMarkPreviousAsViewedClicked, ) } if (onDownloadClicked != null) { Button( title = stringResource(MR.strings.action_download), icon = Icons.Outlined.Download, toConfirm = confirm[7], onLongClick = { onLongClickItem(7) }, onClick = onDownloadClicked, ) } if (onDeleteClicked != null) { Button( title = stringResource(MR.strings.action_delete), icon = Icons.Outlined.Delete, toConfirm = confirm[8], onLongClick = { onLongClickItem(8) }, onClick = onDeleteClicked, ) } if (!isManga && onExternalClicked != null && !playerPreferences.alwaysUseExternalPlayer().get()) { Button( title = stringResource(AYMR.strings.action_play_externally), icon = Icons.Outlined.OpenInNew, toConfirm = confirm[9], onLongClick = { onLongClickItem(9) }, onClick = onExternalClicked, ) } if (!isManga && onInternalClicked != null && playerPreferences.alwaysUseExternalPlayer().get()) { Button( title = stringResource(AYMR.strings.action_play_internally), icon = Icons.Outlined.Input, toConfirm = confirm[10], onLongClick = { onLongClickItem(10) }, onClick = onInternalClicked, ) } } } } } @Composable private fun RowScope.Button( title: String, icon: ImageVector, toConfirm: Boolean, onLongClick: () -> Unit, onClick: () -> Unit, content: (@Composable () -> Unit)? = null, ) { val animatedWeight by animateFloatAsState( targetValue = if (toConfirm) 2f else 1f, label = "weight", ) Column( modifier = Modifier .size(48.dp) .weight(animatedWeight) .combinedClickable( interactionSource = null, indication = ripple(bounded = false), onLongClick = onLongClick, onClick = onClick, ), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, ) { Icon( imageVector = icon, contentDescription = title, ) AnimatedVisibility( visible = toConfirm, enter = expandVertically(expandFrom = Alignment.Top) + fadeIn(), exit = shrinkVertically(shrinkTowards = Alignment.Top) + fadeOut(), ) { Text( text = title, overflow = TextOverflow.Visible, maxLines = 1, style = MaterialTheme.typography.labelSmall, ) } content?.invoke() } } @Composable fun LibraryBottomActionMenu( visible: Boolean, onChangeCategoryClicked: () -> Unit, onMarkAsViewedClicked: () -> Unit, onMarkAsUnviewedClicked: () -> Unit, onDownloadClicked: ((DownloadAction) -> Unit)?, onDeleteClicked: () -> Unit, isManga: Boolean, modifier: Modifier = Modifier, ) { AnimatedVisibility( visible = visible, enter = expandVertically(animationSpec = tween(delayMillis = 300)), exit = shrinkVertically(animationSpec = tween()), ) { val scope = rememberCoroutineScope() Surface( modifier = modifier, shape = MaterialTheme.shapes.large.copy( bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize, ), color = MaterialTheme.colorScheme.surfaceContainerHigh, ) { val haptic = LocalHapticFeedback.current val confirm = remember { mutableStateListOf(false, false, false, false, false) } var resetJob: Job? = remember { null } val onLongClickItem: (Int) -> Unit = { toConfirmIndex -> haptic.performHapticFeedback(HapticFeedbackType.LongPress) (0..<5).forEach { i -> confirm[i] = i == toConfirmIndex } resetJob?.cancel() resetJob = scope.launch { delay(1.seconds) if (isActive) confirm[toConfirmIndex] = false } } Row( modifier = Modifier .windowInsetsPadding( WindowInsets.navigationBars .only(WindowInsetsSides.Bottom), ) .padding(horizontal = 8.dp, vertical = 12.dp), ) { Button( title = stringResource(MR.strings.action_move_category), icon = Icons.AutoMirrored.Outlined.Label, toConfirm = confirm[0], onLongClick = { onLongClickItem(0) }, onClick = onChangeCategoryClicked, ) val viewed = if (isManga) MR.strings.action_mark_as_read else AYMR.strings.action_mark_as_seen Button( title = stringResource(viewed), icon = Icons.Outlined.DoneAll, toConfirm = confirm[1], onLongClick = { onLongClickItem(1) }, onClick = onMarkAsViewedClicked, ) val unviewed = if (isManga) MR.strings.action_mark_as_unread else AYMR.strings.action_mark_as_unseen Button( title = stringResource(unviewed), icon = Icons.Outlined.RemoveDone, toConfirm = confirm[2], onLongClick = { onLongClickItem(2) }, onClick = onMarkAsUnviewedClicked, ) if (onDownloadClicked != null) { var downloadExpanded by remember { mutableStateOf(false) } Button( title = stringResource(MR.strings.action_download), icon = Icons.Outlined.Download, toConfirm = confirm[3], onLongClick = { onLongClickItem(3) }, onClick = { downloadExpanded = !downloadExpanded }, ) { val onDismissRequest = { downloadExpanded = false } EntryDownloadDropdownMenu( expanded = downloadExpanded, onDismissRequest = onDismissRequest, onDownloadClicked = onDownloadClicked, isManga = isManga, ) } } Button( title = stringResource(MR.strings.action_delete), icon = Icons.Outlined.Delete, toConfirm = confirm[4], onLongClick = { onLongClickItem(4) }, onClick = onDeleteClicked, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/EntryToolbar.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.FlipToBack import androidx.compose.material.icons.outlined.SelectAll import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.AppBarTitle import eu.kanade.presentation.components.EntryDownloadDropdownMenu import eu.kanade.presentation.entries.DownloadAction import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.active @Composable fun EntryToolbar( title: String, hasFilters: Boolean, navigateUp: () -> Unit, onClickFilter: () -> Unit, onClickShare: (() -> Unit)?, onClickDownload: ((DownloadAction) -> Unit)?, onClickEditCategory: (() -> Unit)?, onClickRefresh: () -> Unit, onClickMigrate: (() -> Unit)?, onClickSettings: (() -> Unit)?, // Anime only changeAnimeSkipIntro: (() -> Unit)?, // For action mode actionModeCounter: Int, onCancelActionMode: () -> Unit, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, titleAlphaProvider: () -> Float, backgroundAlphaProvider: () -> Float, isManga: Boolean, modifier: Modifier = Modifier, ) { val isActionMode = actionModeCounter > 0 AppBar( titleContent = { if (isActionMode) { AppBarTitle(actionModeCounter.toString()) } else { AppBarTitle(title, modifier = Modifier.alpha(titleAlphaProvider())) } }, modifier = modifier, backgroundColor = MaterialTheme.colorScheme .surfaceColorAtElevation(3.dp) .copy(alpha = if (isActionMode) 1f else backgroundAlphaProvider()), navigateUp = navigateUp, actions = { var downloadExpanded by remember { mutableStateOf(false) } if (onClickDownload != null) { val onDismissRequest = { downloadExpanded = false } EntryDownloadDropdownMenu( expanded = downloadExpanded, onDismissRequest = onDismissRequest, onDownloadClicked = onClickDownload, isManga = isManga, ) } val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current AppBarActions( actions = persistentListOf().builder().apply { if (isActionMode) { add( AppBar.Action( title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.SelectAll, onClick = onSelectAll, ), ) add( AppBar.Action( title = stringResource(MR.strings.action_select_inverse), icon = Icons.Outlined.FlipToBack, onClick = onInvertSelection, ), ) return@apply } if (onClickDownload != null) { add( AppBar.Action( title = stringResource(MR.strings.manga_download), icon = Icons.Outlined.Download, onClick = { downloadExpanded = !downloadExpanded }, ), ) } add( AppBar.Action( title = stringResource(MR.strings.action_filter), icon = Icons.Outlined.FilterList, iconTint = filterTint, onClick = onClickFilter, ), ) if (changeAnimeSkipIntro != null) { add( AppBar.OverflowAction( title = stringResource(AYMR.strings.action_change_intro_length), onClick = changeAnimeSkipIntro, ), ) } add( AppBar.OverflowAction( title = stringResource(MR.strings.action_webview_refresh), onClick = onClickRefresh, ), ) if (onClickEditCategory != null) { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_edit_categories), onClick = onClickEditCategory, ), ) } if (onClickMigrate != null) { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_migrate), onClick = onClickMigrate, ), ) } if (onClickShare != null) { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_share), onClick = onClickShare, ), ) } if (onClickSettings != null) { add( AppBar.OverflowAction( title = stringResource(AYMR.strings.settings), onClick = onClickSettings, ), ) } } .build(), ) }, isActionMode = isActionMode, onCancelActionMode = onCancelActionMode, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/ItemCover.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.aspectRatio import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.semantics.Role import coil3.compose.AsyncImage import eu.kanade.presentation.util.rememberResourceBitmapPainter import eu.kanade.tachiyomi.R enum class ItemCover(val ratio: Float) { Square(1f / 1f), Book(2f / 3f), Thumb(16f / 9f), ; @Composable operator fun invoke( data: Any?, modifier: Modifier = Modifier, contentDescription: String = "", shape: Shape = MaterialTheme.shapes.extraSmall, onClick: (() -> Unit)? = null, ) { AsyncImage( model = data, placeholder = ColorPainter(CoverPlaceholderColor), error = rememberResourceBitmapPainter(id = R.drawable.cover_error), contentDescription = contentDescription, modifier = modifier .aspectRatio(ratio) .clip(shape) .then( if (onClick != null) { Modifier.clickable( role = Role.Button, onClick = onClick, ) } else { Modifier }, ), contentScale = ContentScale.Crop, ) } } private val CoverPlaceholderColor = Color(0x1F888888) ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/ItemHeader.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.animesource.model.FetchType import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource @Composable fun ItemHeader( enabled: Boolean, itemCount: Int?, missingItemsCount: Int, onClick: () -> Unit, isManga: Boolean, modifier: Modifier = Modifier, fetchType: FetchType = FetchType.Episodes, ) { Column( modifier = modifier .fillMaxWidth() .clickable( enabled = enabled, onClick = onClick, ) .padding(horizontal = 16.dp, vertical = 4.dp), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Text( text = if (itemCount == null) { val count = if (isManga) MR.strings.chapters else AYMR.strings.episodes stringResource(count) } else { val pluralCount = if (isManga) { MR.plurals.manga_num_chapters } else { when (fetchType) { FetchType.Seasons -> AYMR.plurals.anime_num_seasons FetchType.Episodes -> AYMR.plurals.anime_num_episodes } } pluralStringResource(pluralCount, count = itemCount, itemCount) }, style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onBackground, ) MissingItemsWarning(missingItemsCount) } } @Composable private fun MissingItemsWarning(count: Int) { if (count == 0) { return } Text( text = pluralStringResource(AYMR.plurals.missing_items, count = count, count), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error.copy(alpha = SECONDARY_ALPHA), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/ItemsDialogs.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.util.system.isReleaseBuildType import kotlinx.collections.immutable.toImmutableList import tachiyomi.domain.entries.anime.interactor.AnimeFetchInterval import tachiyomi.domain.entries.manga.interactor.MangaFetchInterval import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.WheelTextPicker import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import java.time.Instant import java.time.temporal.ChronoUnit import kotlin.math.absoluteValue @Composable fun DeleteItemsDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, isManga: Boolean, ) { val subtitle = if (isManga) MR.strings.confirm_delete_chapters else AYMR.strings.confirm_delete_episodes AlertDialog( onDismissRequest = onDismissRequest, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { onDismissRequest() onConfirm() }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, title = { Text(text = stringResource(MR.strings.are_you_sure)) }, text = { Text(text = stringResource(subtitle)) }, ) } @Composable fun SetIntervalDialog( interval: Int, nextUpdate: Instant?, onDismissRequest: () -> Unit, isManga: Boolean, onValueChanged: ((Int) -> Unit)? = null, ) { var selectedInterval by rememberSaveable { mutableIntStateOf(if (interval < 0) -interval else 0) } val nextUpdateDays = remember(nextUpdate) { return@remember if (nextUpdate != null) { val now = Instant.now() now.until(nextUpdate, ChronoUnit.DAYS).toInt().coerceAtLeast(0) } else { null } } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(stringResource(MR.strings.pref_library_update_smart_update)) }, text = { Column { if (nextUpdateDays != null && nextUpdateDays >= 0 && interval >= 0) { Text( stringResource( if (isManga) { MR.strings.manga_interval_expected_update } else { AYMR.strings.anime_interval_expected_update }, pluralStringResource( MR.plurals.day, count = nextUpdateDays, nextUpdateDays, ), pluralStringResource( MR.plurals.day, count = interval.absoluteValue, interval.absoluteValue, ), ), ) } else { Text( stringResource( if (isManga) { MR.strings.manga_interval_expected_update_null } else { AYMR.strings.anime_interval_expected_update_null }, ), ) } Spacer(Modifier.height(MaterialTheme.padding.small)) if (onValueChanged != null && (!isReleaseBuildType)) { Text(stringResource(MR.strings.manga_interval_custom_amount)) BoxWithConstraints( modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center, ) { val size = DpSize(width = maxWidth / 2, height = 128.dp) val maxInterval = if (isManga) { MangaFetchInterval.MAX_INTERVAL } else { AnimeFetchInterval.MAX_INTERVAL } val items = (0..maxInterval) .map { if (it == 0) { stringResource(MR.strings.label_default) } else { it.toString() } } .toImmutableList() WheelTextPicker( items = items, size = size, startIndex = selectedInterval, onSelectionChanged = { selectedInterval = it }, ) } } } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton(onClick = { onValueChanged?.invoke(selectedInterval) onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/components/MissingItemCountListItem.kt ================================================ package eu.kanade.presentation.entries.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun MissingItemCountListItem( count: Int, modifier: Modifier = Modifier, ) { Row( modifier = modifier .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ) .secondaryItemAlpha(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { HorizontalDivider(modifier = Modifier.weight(1f)) Text( text = pluralStringResource(AYMR.plurals.missing_items, count = count, count), style = MaterialTheme.typography.labelMedium, ) HorizontalDivider(modifier = Modifier.weight(1f)) } } @PreviewLightDark @Composable private fun Preview() { TachiyomiPreviewTheme { Surface { MissingItemCountListItem(count = 42) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/ChapterSettingsDialog.kt ================================================ package eu.kanade.presentation.entries.manga import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.PeopleAlt import androidx.compose.material3.AlertDialog import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.entries.manga.model.downloadedFilter import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.preference.TriState import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.RadioItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.active import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun ChapterSettingsDialog( onDismissRequest: () -> Unit, manga: Manga? = null, onDownloadFilterChanged: (TriState) -> Unit, onUnreadFilterChanged: (TriState) -> Unit, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), onSortModeChanged: (Long) -> Unit, onDisplayModeChanged: (Long) -> Unit, onSetAsDefault: (applyToExistingManga: Boolean) -> Unit, onResetToDefault: () -> Unit, ) { var showSetAsDefaultDialog by rememberSaveable { mutableStateOf(false) } if (showSetAsDefaultDialog) { SetAsDefaultDialog( onDismissRequest = { showSetAsDefaultDialog = false }, onConfirmed = onSetAsDefault, ) } val downloadedOnly = remember { Injekt.get().downloadedOnly().get() } TabbedDialog( onDismissRequest = onDismissRequest, tabTitles = persistentListOf( stringResource(MR.strings.action_filter), stringResource(MR.strings.action_sort), stringResource(MR.strings.action_display), ), tabOverflowMenuContent = { closeMenu -> DropdownMenuItem( text = { Text(stringResource(MR.strings.set_chapter_settings_as_default)) }, onClick = { showSetAsDefaultDialog = true closeMenu() }, ) DropdownMenuItem( text = { Text(stringResource(MR.strings.action_reset)) }, onClick = { onResetToDefault() closeMenu() }, ) }, ) { page -> Column( modifier = Modifier .padding(vertical = TabbedDialogPaddings.Vertical) .verticalScroll(rememberScrollState()), ) { when (page) { 0 -> { FilterPage( downloadFilter = manga?.downloadedFilter ?: TriState.DISABLED, onDownloadFilterChanged = onDownloadFilterChanged .takeUnless { downloadedOnly }, unreadFilter = manga?.unreadFilter ?: TriState.DISABLED, onUnreadFilterChanged = onUnreadFilterChanged, bookmarkedFilter = manga?.bookmarkedFilter ?: TriState.DISABLED, onBookmarkedFilterChanged = onBookmarkedFilterChanged, scanlatorFilterActive = scanlatorFilterActive, onScanlatorFilterClicked = onScanlatorFilterClicked, ) } 1 -> { SortPage( sortingMode = manga?.sorting ?: 0, sortDescending = manga?.sortDescending() ?: false, onItemSelected = onSortModeChanged, ) } 2 -> { DisplayPage( displayMode = manga?.displayMode ?: 0, onItemSelected = onDisplayModeChanged, ) } } } } } @Composable private fun ColumnScope.FilterPage( downloadFilter: TriState, onDownloadFilterChanged: ((TriState) -> Unit)?, unreadFilter: TriState, onUnreadFilterChanged: (TriState) -> Unit, bookmarkedFilter: TriState, onBookmarkedFilterChanged: (TriState) -> Unit, scanlatorFilterActive: Boolean, onScanlatorFilterClicked: (() -> Unit), ) { TriStateItem( label = stringResource(MR.strings.label_downloaded), state = downloadFilter, onClick = onDownloadFilterChanged, ) TriStateItem( label = stringResource(MR.strings.action_filter_unread), state = unreadFilter, onClick = onUnreadFilterChanged, ) TriStateItem( label = stringResource(MR.strings.action_filter_bookmarked), state = bookmarkedFilter, onClick = onBookmarkedFilterChanged, ) ScanlatorFilterItem( active = scanlatorFilterActive, onClick = onScanlatorFilterClicked, ) } @Composable fun ScanlatorFilterItem( active: Boolean, onClick: () -> Unit, ) { Row( modifier = Modifier .clickable(onClick = onClick) .fillMaxWidth() .padding(horizontal = TabbedDialogPaddings.Horizontal, vertical = 12.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(24.dp), ) { Icon( imageVector = Icons.Outlined.PeopleAlt, contentDescription = null, tint = if (active) { MaterialTheme.colorScheme.active } else { LocalContentColor.current }, ) Text( text = stringResource(MR.strings.scanlator), style = MaterialTheme.typography.bodyMedium, ) } } @Composable private fun ColumnScope.SortPage( sortingMode: Long, sortDescending: Boolean, onItemSelected: (Long) -> Unit, ) { listOf( MR.strings.sort_by_source to Manga.CHAPTER_SORTING_SOURCE, MR.strings.sort_by_number to Manga.CHAPTER_SORTING_NUMBER, MR.strings.sort_by_upload_date to Manga.CHAPTER_SORTING_UPLOAD_DATE, MR.strings.action_sort_alpha to Manga.CHAPTER_SORTING_ALPHABET, ).map { (titleRes, mode) -> SortItem( label = stringResource(titleRes), sortDescending = sortDescending.takeIf { sortingMode == mode }, onClick = { onItemSelected(mode) }, ) } } @Composable private fun ColumnScope.DisplayPage( displayMode: Long, onItemSelected: (Long) -> Unit, ) { listOf( MR.strings.show_title to Manga.CHAPTER_DISPLAY_NAME, MR.strings.show_chapter_number to Manga.CHAPTER_DISPLAY_NUMBER, ).map { (titleRes, mode) -> RadioItem( label = stringResource(titleRes), selected = displayMode == mode, onClick = { onItemSelected(mode) }, ) } } @Composable private fun SetAsDefaultDialog( onDismissRequest: () -> Unit, onConfirmed: (optionalChecked: Boolean) -> Unit, ) { var optionalChecked by rememberSaveable { mutableStateOf(false) } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(MR.strings.chapter_settings)) }, text = { Column( verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text(text = stringResource(MR.strings.confirm_set_chapter_settings)) LabeledCheckbox( label = stringResource(AYMR.strings.also_set_chapter_settings_for_library), checked = optionalChecked, onCheckedChange = { optionalChecked = it }, ) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { onConfirmed(optionalChecked) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/DuplicateMangaDialog.kt ================================================ package eu.kanade.presentation.entries.manga import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add import androidx.compose.material.icons.outlined.Book import androidx.compose.material.icons.outlined.SwapVert import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.presentation.more.settings.LocalPreferenceMinHeight import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun DuplicateMangaDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, onOpenManga: () -> Unit, onMigrate: () -> Unit, modifier: Modifier = Modifier, ) { val minHeight = LocalPreferenceMinHeight.current AdaptiveSheet( modifier = modifier, onDismissRequest = onDismissRequest, ) { Column( modifier = Modifier .padding( vertical = TabbedDialogPaddings.Vertical, horizontal = TabbedDialogPaddings.Horizontal, ) .fillMaxWidth(), ) { Text( modifier = Modifier.padding(TitlePadding), text = stringResource(MR.strings.are_you_sure), style = MaterialTheme.typography.headlineMedium, ) Text( text = stringResource(MR.strings.confirm_add_duplicate_manga), style = MaterialTheme.typography.bodyMedium, ) Spacer(Modifier.height(PaddingSize)) TextPreferenceWidget( title = stringResource(AYMR.strings.action_show_manga), icon = Icons.Outlined.Book, onPreferenceClick = { onDismissRequest() onOpenManga() }, ) HorizontalDivider() TextPreferenceWidget( title = stringResource(MR.strings.action_migrate_duplicate), icon = Icons.Outlined.SwapVert, onPreferenceClick = { onDismissRequest() onMigrate() }, ) HorizontalDivider() TextPreferenceWidget( title = stringResource(MR.strings.action_add_anyway), icon = Icons.Outlined.Add, onPreferenceClick = { onDismissRequest() onConfirm() }, ) Row( modifier = Modifier .sizeIn(minHeight = minHeight) .clickable { onDismissRequest.invoke() } .padding(ButtonPadding) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { OutlinedButton(onClick = onDismissRequest, modifier = Modifier.fillMaxWidth()) { Text( modifier = Modifier .padding(vertical = 8.dp), text = stringResource(MR.strings.action_cancel), color = MaterialTheme.colorScheme.primary, style = MaterialTheme.typography.titleLarge, fontSize = 16.sp, ) } } } } } private val PaddingSize = 16.dp private val ButtonPadding = PaddingValues(top = 16.dp, bottom = 16.dp) private val TitlePadding = PaddingValues(bottom = 16.dp, top = 8.dp) ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/MangaScreen.kt ================================================ package eu.kanade.presentation.entries.manga import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.relativeDateTimeText import eu.kanade.presentation.entries.DownloadAction import eu.kanade.presentation.entries.EntryScreenItem import eu.kanade.presentation.entries.components.EntryBottomActionMenu import eu.kanade.presentation.entries.components.EntryToolbar import eu.kanade.presentation.entries.components.ItemHeader import eu.kanade.presentation.entries.components.MissingItemCountListItem import eu.kanade.presentation.entries.manga.components.ChapterDownloadAction import eu.kanade.presentation.entries.manga.components.ExpandableMangaDescription import eu.kanade.presentation.entries.manga.components.MangaActionRow import eu.kanade.presentation.entries.manga.components.MangaChapterListItem import eu.kanade.presentation.entries.manga.components.MangaInfoBox import eu.kanade.presentation.util.formatChapterNumber import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.manga.getNameForMangaInfo import eu.kanade.tachiyomi.ui.browse.manga.extension.details.MangaSourcePreferencesScreen import eu.kanade.tachiyomi.ui.entries.manga.ChapterList import eu.kanade.tachiyomi.ui.entries.manga.MangaScreenModel import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.service.missingChaptersCount import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.manga.model.StubMangaSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.TwoPanelBox import tachiyomi.presentation.core.components.VerticalFastScroller import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.shouldExpandFAB import tachiyomi.source.local.entries.manga.isLocal import java.time.Instant @Composable fun MangaScreen( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, isTabletUi: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, navigateUp: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditFetchIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) { val context = LocalContext.current val onCopyTagToClipboard: (tag: String) -> Unit = { if (it.isNotEmpty()) { context.copyToClipboard(it, it) } } val navigator = LocalNavigator.currentOrThrow val onSettingsClicked: (() -> Unit)? = { navigator.push(MangaSourcePreferencesScreen(state.source.id)) }.takeIf { state.source is ConfigurableSource } if (!isTabletUi) { MangaScreenSmallImpl( state = state, snackbarHostState = snackbarHostState, nextUpdate = nextUpdate, chapterSwipeStartAction = chapterSwipeStartAction, chapterSwipeEndAction = chapterSwipeEndAction, navigateUp = navigateUp, onChapterClicked = onChapterClicked, onDownloadChapter = onDownloadChapter, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, onFilterClicked = onFilterButtonClicked, onRefresh = onRefresh, onContinueReading = onContinueReading, onSearch = onSearch, onCoverClicked = onCoverClicked, onShareClicked = onShareClicked, onDownloadActionClicked = onDownloadActionClicked, onEditCategoryClicked = onEditCategoryClicked, onEditIntervalClicked = onEditFetchIntervalClicked, onMigrateClicked = onMigrateClicked, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiMarkAsReadClicked = onMultiMarkAsReadClicked, onMarkPreviousAsReadClicked = onMarkPreviousAsReadClicked, onMultiDeleteClicked = onMultiDeleteClicked, onChapterSwipe = onChapterSwipe, onChapterSelected = onChapterSelected, onAllChapterSelected = onAllChapterSelected, onInvertSelection = onInvertSelection, onSettingsClicked = onSettingsClicked, ) } else { MangaScreenLargeImpl( state = state, snackbarHostState = snackbarHostState, chapterSwipeStartAction = chapterSwipeStartAction, chapterSwipeEndAction = chapterSwipeEndAction, nextUpdate = nextUpdate, navigateUp = navigateUp, onChapterClicked = onChapterClicked, onDownloadChapter = onDownloadChapter, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, onFilterButtonClicked = onFilterButtonClicked, onRefresh = onRefresh, onContinueReading = onContinueReading, onSearch = onSearch, onCoverClicked = onCoverClicked, onShareClicked = onShareClicked, onDownloadActionClicked = onDownloadActionClicked, onEditCategoryClicked = onEditCategoryClicked, onEditIntervalClicked = onEditFetchIntervalClicked, onMigrateClicked = onMigrateClicked, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiMarkAsReadClicked = onMultiMarkAsReadClicked, onMarkPreviousAsReadClicked = onMarkPreviousAsReadClicked, onMultiDeleteClicked = onMultiDeleteClicked, onChapterSwipe = onChapterSwipe, onChapterSelected = onChapterSelected, onAllChapterSelected = onAllChapterSelected, onInvertSelection = onInvertSelection, onSettingsClicked = onSettingsClicked, ) } } @Composable private fun MangaScreenSmallImpl( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, navigateUp: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List) -> Unit, // For chapter swipe onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) { val chapterListState = rememberLazyListState() val (chapters, listItem, isAnySelected) = remember(state) { Triple( first = state.processedChapters, second = state.chapterListItems, third = state.isAnySelected, ) } BackHandler(onBack = { if (isAnySelected) { onAllChapterSelected(false) } else { navigateUp() } }) Scaffold( topBar = { val selectedChapterCount: Int = remember(chapters) { chapters.count { it.selected } } val isFirstItemVisible by remember { derivedStateOf { chapterListState.firstVisibleItemIndex == 0 } } val isFirstItemScrolled by remember { derivedStateOf { chapterListState.firstVisibleItemScrollOffset > 0 } } val titleAlpha by animateFloatAsState( if (!isFirstItemVisible) 1f else 0f, label = "Top Bar Title", ) val backgroundAlpha by animateFloatAsState( if (!isFirstItemVisible || isFirstItemScrolled) 1f else 0f, label = "Top Bar Background", ) EntryToolbar( title = state.manga.title, hasFilters = state.filterActive, navigateUp = navigateUp, onClickFilter = onFilterClicked, onClickShare = onShareClicked, onClickDownload = onDownloadActionClicked, onClickEditCategory = onEditCategoryClicked, onClickRefresh = onRefresh, onClickMigrate = onMigrateClicked, onClickSettings = onSettingsClicked, changeAnimeSkipIntro = null, actionModeCounter = selectedChapterCount, onCancelActionMode = { onAllChapterSelected(false) }, onSelectAll = { onAllChapterSelected(true) }, onInvertSelection = { onInvertSelection() }, titleAlphaProvider = { titleAlpha }, backgroundAlphaProvider = { backgroundAlpha }, isManga = true, ) }, bottomBar = { val selectedChapters = remember(chapters) { chapters.filter { it.selected } } SharedMangaBottomActionMenu( selected = selectedChapters, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiMarkAsReadClicked = onMultiMarkAsReadClicked, onMarkPreviousAsReadClicked = onMarkPreviousAsReadClicked, onDownloadChapter = onDownloadChapter, onMultiDeleteClicked = onMultiDeleteClicked, fillFraction = 1f, ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { val isFABVisible = remember(chapters) { chapters.fastAny { !it.chapter.read } && !isAnySelected } AnimatedVisibility( visible = isFABVisible, enter = fadeIn(), exit = fadeOut(), ) { ExtendedFloatingActionButton( text = { val isReading = remember(state.chapters) { state.chapters.fastAny { it.chapter.read } } Text( text = stringResource(if (isReading) MR.strings.action_resume else MR.strings.action_start), ) }, icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, onClick = onContinueReading, expanded = chapterListState.shouldExpandFAB(), ) } }, ) { contentPadding -> val topPadding = contentPadding.calculateTopPadding() PullRefresh( refreshing = state.isRefreshingData, onRefresh = onRefresh, enabled = !isAnySelected, indicatorPadding = PaddingValues(top = topPadding), ) { val layoutDirection = LocalLayoutDirection.current VerticalFastScroller( listState = chapterListState, topContentPadding = topPadding, endContentPadding = contentPadding.calculateEndPadding(layoutDirection), ) { LazyColumn( modifier = Modifier.fillMaxHeight(), state = chapterListState, contentPadding = PaddingValues( start = contentPadding.calculateStartPadding(layoutDirection), end = contentPadding.calculateEndPadding(layoutDirection), bottom = contentPadding.calculateBottomPadding(), ), ) { item( key = EntryScreenItem.INFO_BOX, contentType = EntryScreenItem.INFO_BOX, ) { MangaInfoBox( isTabletUi = false, appBarPadding = topPadding, manga = state.manga, sourceName = remember { state.source.getNameForMangaInfo() }, isStubSource = remember { state.source is StubMangaSource }, onCoverClick = onCoverClicked, doSearch = onSearch, ) } item( key = EntryScreenItem.ACTION_ROW, contentType = EntryScreenItem.ACTION_ROW, ) { MangaActionRow( favorite = state.manga.favorite, trackingCount = state.trackingCount, nextUpdate = nextUpdate, isUserIntervalMode = state.manga.fetchInterval < 0, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onEditIntervalClicked = onEditIntervalClicked, onEditCategory = onEditCategoryClicked, ) } item( key = EntryScreenItem.DESCRIPTION_WITH_TAG, contentType = EntryScreenItem.DESCRIPTION_WITH_TAG, ) { ExpandableMangaDescription( defaultExpandState = state.isFromSource, description = state.manga.description, tagsProvider = { state.manga.genre }, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, ) } item( key = EntryScreenItem.ITEM_HEADER, contentType = EntryScreenItem.ITEM_HEADER, ) { val missingChaptersCount = remember(chapters) { chapters.map { it.chapter.chapterNumber }.missingChaptersCount() } ItemHeader( enabled = !isAnySelected, itemCount = chapters.size, missingItemsCount = missingChaptersCount, onClick = onFilterClicked, isManga = true, ) } sharedChapterItems( manga = state.manga, chapters = listItem, isAnyChapterSelected = chapters.fastAny { it.selected }, chapterSwipeStartAction = chapterSwipeStartAction, chapterSwipeEndAction = chapterSwipeEndAction, onChapterClicked = onChapterClicked, onDownloadChapter = onDownloadChapter, onChapterSelected = onChapterSelected, onChapterSwipe = onChapterSwipe, ) } } } } } @Composable fun MangaScreenLargeImpl( state: MangaScreenModel.State.Success, snackbarHostState: SnackbarHostState, nextUpdate: Instant?, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, navigateUp: () -> Unit, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List, ChapterDownloadAction) -> Unit)?, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, // For tags menu onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, onFilterButtonClicked: () -> Unit, onRefresh: () -> Unit, onContinueReading: () -> Unit, onSearch: (query: String, global: Boolean) -> Unit, // For cover dialog onCoverClicked: () -> Unit, // For top action menu onShareClicked: (() -> Unit)?, onDownloadActionClicked: ((DownloadAction) -> Unit)?, onEditCategoryClicked: (() -> Unit)?, onEditIntervalClicked: (() -> Unit)?, onMigrateClicked: (() -> Unit)?, onSettingsClicked: (() -> Unit)?, // For bottom action menu onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onMultiDeleteClicked: (List) -> Unit, // For swipe actions onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, // Chapter selection onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onAllChapterSelected: (Boolean) -> Unit, onInvertSelection: () -> Unit, ) { val layoutDirection = LocalLayoutDirection.current val density = LocalDensity.current val (chapters, listItem, isAnySelected) = remember(state) { Triple( first = state.processedChapters, second = state.chapterListItems, third = state.isAnySelected, ) } val insetPadding = WindowInsets.systemBars.only(WindowInsetsSides.Horizontal).asPaddingValues() var topBarHeight by remember { mutableIntStateOf(0) } val chapterListState = rememberLazyListState() BackHandler(onBack = { if (isAnySelected) { onAllChapterSelected(false) } else { navigateUp() } }) Scaffold( topBar = { val selectedChapterCount = remember(chapters) { chapters.count { it.selected } } EntryToolbar( modifier = Modifier.onSizeChanged { topBarHeight = it.height }, title = state.manga.title, hasFilters = state.filterActive, navigateUp = navigateUp, onClickFilter = onFilterButtonClicked, onClickShare = onShareClicked, onClickDownload = onDownloadActionClicked, onClickEditCategory = onEditCategoryClicked, onClickRefresh = onRefresh, onClickMigrate = onMigrateClicked, onCancelActionMode = { onAllChapterSelected(false) }, onClickSettings = onSettingsClicked, changeAnimeSkipIntro = null, actionModeCounter = selectedChapterCount, onSelectAll = { onAllChapterSelected(true) }, onInvertSelection = { onInvertSelection() }, titleAlphaProvider = { 1f }, backgroundAlphaProvider = { 1f }, isManga = true, ) }, bottomBar = { Box( modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.BottomEnd, ) { val selectedChapters = remember(chapters) { chapters.filter { it.selected } } SharedMangaBottomActionMenu( selected = selectedChapters, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiMarkAsReadClicked = onMultiMarkAsReadClicked, onMarkPreviousAsReadClicked = onMarkPreviousAsReadClicked, onDownloadChapter = onDownloadChapter, onMultiDeleteClicked = onMultiDeleteClicked, fillFraction = 0.5f, ) } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { val isFABVisible = remember(chapters) { chapters.fastAny { !it.chapter.read } && !isAnySelected } AnimatedVisibility( visible = isFABVisible, enter = fadeIn(), exit = fadeOut(), ) { ExtendedFloatingActionButton( text = { val isReading = remember(state.chapters) { state.chapters.fastAny { it.chapter.read } } Text( text = stringResource( if (isReading) MR.strings.action_resume else MR.strings.action_start, ), ) }, icon = { Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null) }, onClick = onContinueReading, expanded = chapterListState.shouldExpandFAB(), ) } }, ) { contentPadding -> PullRefresh( refreshing = state.isRefreshingData, onRefresh = onRefresh, enabled = !isAnySelected, indicatorPadding = PaddingValues( start = insetPadding.calculateStartPadding(layoutDirection), top = with(density) { topBarHeight.toDp() }, end = insetPadding.calculateEndPadding(layoutDirection), ), ) { TwoPanelBox( modifier = Modifier.padding( start = contentPadding.calculateStartPadding(layoutDirection), end = contentPadding.calculateEndPadding(layoutDirection), ), startContent = { Column( modifier = Modifier .verticalScroll(rememberScrollState()) .padding(bottom = contentPadding.calculateBottomPadding()), ) { MangaInfoBox( isTabletUi = true, appBarPadding = contentPadding.calculateTopPadding(), manga = state.manga, sourceName = remember { state.source.getNameForMangaInfo() }, isStubSource = remember { state.source is StubMangaSource }, onCoverClick = onCoverClicked, doSearch = onSearch, ) MangaActionRow( favorite = state.manga.favorite, trackingCount = state.trackingCount, nextUpdate = nextUpdate, isUserIntervalMode = state.manga.fetchInterval < 0, onAddToLibraryClicked = onAddToLibraryClicked, onWebViewClicked = onWebViewClicked, onWebViewLongClicked = onWebViewLongClicked, onTrackingClicked = onTrackingClicked, onEditIntervalClicked = onEditIntervalClicked, onEditCategory = onEditCategoryClicked, ) ExpandableMangaDescription( defaultExpandState = true, description = state.manga.description, tagsProvider = { state.manga.genre }, onTagSearch = onTagSearch, onCopyTagToClipboard = onCopyTagToClipboard, ) } }, endContent = { VerticalFastScroller( listState = chapterListState, topContentPadding = contentPadding.calculateTopPadding(), ) { LazyColumn( modifier = Modifier.fillMaxHeight(), state = chapterListState, contentPadding = PaddingValues( top = contentPadding.calculateTopPadding(), bottom = contentPadding.calculateBottomPadding(), ), ) { item( key = EntryScreenItem.ITEM_HEADER, contentType = EntryScreenItem.ITEM_HEADER, ) { val missingChaptersCount = remember(chapters) { chapters.map { it.chapter.chapterNumber }.missingChaptersCount() } ItemHeader( enabled = !isAnySelected, itemCount = chapters.size, missingItemsCount = missingChaptersCount, onClick = onFilterButtonClicked, isManga = true, ) } sharedChapterItems( manga = state.manga, chapters = listItem, isAnyChapterSelected = chapters.fastAny { it.selected }, chapterSwipeStartAction = chapterSwipeStartAction, chapterSwipeEndAction = chapterSwipeEndAction, onChapterClicked = onChapterClicked, onDownloadChapter = onDownloadChapter, onChapterSelected = onChapterSelected, onChapterSwipe = onChapterSwipe, ) } } }, ) } } } @Composable private fun SharedMangaBottomActionMenu( selected: List, onMultiBookmarkClicked: (List, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onDownloadChapter: ((List, ChapterDownloadAction) -> Unit)?, onMultiDeleteClicked: (List) -> Unit, fillFraction: Float, modifier: Modifier = Modifier, ) { EntryBottomActionMenu( visible = selected.isNotEmpty(), modifier = modifier.fillMaxWidth(fillFraction), onBookmarkClicked = { onMultiBookmarkClicked.invoke(selected.fastMap { it.chapter }, true) }.takeIf { selected.fastAny { !it.chapter.bookmark } }, onRemoveBookmarkClicked = { onMultiBookmarkClicked.invoke(selected.fastMap { it.chapter }, false) }.takeIf { selected.fastAll { it.chapter.bookmark } }, onMarkAsViewedClicked = { onMultiMarkAsReadClicked(selected.fastMap { it.chapter }, true) }.takeIf { selected.fastAny { !it.chapter.read } }, onMarkAsUnviewedClicked = { onMultiMarkAsReadClicked(selected.fastMap { it.chapter }, false) }.takeIf { selected.fastAny { it.chapter.read || it.chapter.lastPageRead > 0L } }, onMarkPreviousAsViewedClicked = { onMarkPreviousAsReadClicked(selected[0].chapter) }.takeIf { selected.size == 1 }, onDownloadClicked = { onDownloadChapter!!(selected.toList(), ChapterDownloadAction.START) }.takeIf { onDownloadChapter != null && selected.fastAny { it.downloadState != MangaDownload.State.DOWNLOADED } }, onDeleteClicked = { onMultiDeleteClicked(selected.fastMap { it.chapter }) }.takeIf { selected.fastAny { it.downloadState == MangaDownload.State.DOWNLOADED } }, isManga = true, ) } private fun LazyListScope.sharedChapterItems( manga: Manga, chapters: List, isAnyChapterSelected: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List, ChapterDownloadAction) -> Unit)?, onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, ) { items( items = chapters, key = { item -> when (item) { is ChapterList.MissingCount -> "missing-count-${item.id}" is ChapterList.Item -> "chapter-${item.id}" } }, contentType = { EntryScreenItem.ITEM }, ) { item -> val haptic = LocalHapticFeedback.current when (item) { is ChapterList.MissingCount -> { MissingItemCountListItem(count = item.count) } is ChapterList.Item -> { MangaChapterListItem( title = if (manga.displayMode == Manga.CHAPTER_DISPLAY_NUMBER) { stringResource( MR.strings.display_mode_chapter, formatChapterNumber(item.chapter.chapterNumber), ) } else { item.chapter.name }, date = relativeDateTimeText(item.chapter.dateUpload), readProgress = item.chapter.lastPageRead .takeIf { !item.chapter.read && it > 0L } ?.let { stringResource( MR.strings.chapter_progress, it + 1, ) }, scanlator = item.chapter.scanlator.takeIf { !it.isNullOrBlank() }, read = item.chapter.read, bookmark = item.chapter.bookmark, selected = item.selected, downloadIndicatorEnabled = !isAnyChapterSelected && !manga.isLocal(), downloadStateProvider = { item.downloadState }, downloadProgressProvider = { item.downloadProgress }, chapterSwipeStartAction = chapterSwipeStartAction, chapterSwipeEndAction = chapterSwipeEndAction, onLongClick = { onChapterSelected(item, !item.selected, true, true) haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, onClick = { onChapterItemClick( chapterItem = item, isAnyChapterSelected = isAnyChapterSelected, onToggleSelection = { onChapterSelected(item, !item.selected, true, false) }, onChapterClicked = onChapterClicked, ) }, onDownloadClick = if (onDownloadChapter != null) { { onDownloadChapter(listOf(item), it) } } else { null }, onChapterSwipe = { onChapterSwipe(item, it) }, ) } } } } private fun onChapterItemClick( chapterItem: ChapterList.Item, isAnyChapterSelected: Boolean, onToggleSelection: (Boolean) -> Unit, onChapterClicked: (Chapter) -> Unit, ) { when { chapterItem.selected -> onToggleSelection(false) isAnyChapterSelected -> onToggleSelection(true) else -> onChapterClicked(chapterItem.chapter) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/components/BaseMangaListItem.kt ================================================ package eu.kanade.presentation.entries.manga.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.ItemCover import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.presentation.core.components.material.padding @Composable fun BaseMangaListItem( manga: Manga, modifier: Modifier = Modifier, onClickItem: () -> Unit = {}, onClickCover: () -> Unit = onClickItem, cover: @Composable RowScope.() -> Unit = { defaultCover(manga, onClickCover) }, actions: @Composable RowScope.() -> Unit = {}, content: @Composable RowScope.() -> Unit = { defaultContent(manga) }, ) { Row( modifier = modifier .clickable(onClick = onClickItem) .height(76.dp) .padding(horizontal = MaterialTheme.padding.medium, vertical = 3.dp), verticalAlignment = Alignment.CenterVertically, ) { cover() content() actions() } } private val defaultCover: @Composable RowScope.(Manga, () -> Unit) -> Unit = { manga, onClick -> ItemCover.Book( modifier = Modifier .fillMaxHeight(), data = manga, onClick = onClick, ) } private val defaultContent: @Composable RowScope.(Manga) -> Unit = { Box(modifier = Modifier.weight(1f)) { Text( text = it.title, modifier = Modifier .padding(start = MaterialTheme.padding.medium), overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/components/ChapterDownloadIndicator.kt ================================================ package eu.kanade.presentation.entries.manga.components import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.outlined.ArrowDownward import androidx.compose.material.icons.outlined.ErrorOutline import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProgressIndicatorDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.ArrowModifier import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.IndicatorModifier import eu.kanade.presentation.components.IndicatorSize import eu.kanade.presentation.components.IndicatorStrokeWidth import eu.kanade.presentation.components.commonClickable import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.IconButtonTokens import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha enum class ChapterDownloadAction { START, START_NOW, CANCEL, DELETE, } @Composable fun ChapterDownloadIndicator( enabled: Boolean, downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, onClick: (ChapterDownloadAction) -> Unit, modifier: Modifier = Modifier, ) { when (val downloadState = downloadStateProvider()) { MangaDownload.State.NOT_DOWNLOADED -> NotDownloadedIndicator( enabled = enabled, modifier = modifier, onClick = onClick, ) MangaDownload.State.QUEUE, MangaDownload.State.DOWNLOADING -> DownloadingIndicator( enabled = enabled, modifier = modifier, downloadState = downloadState, downloadProgressProvider = downloadProgressProvider, onClick = onClick, ) MangaDownload.State.DOWNLOADED -> DownloadedIndicator( enabled = enabled, modifier = modifier, onClick = onClick, ) MangaDownload.State.ERROR -> ErrorIndicator( enabled = enabled, modifier = modifier, onClick = onClick, ) } } @Composable private fun NotDownloadedIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (ChapterDownloadAction) -> Unit, ) { Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { onClick(ChapterDownloadAction.START_NOW) }, onClick = { onClick(ChapterDownloadAction.START) }, ) .secondaryItemAlpha(), contentAlignment = Alignment.Center, ) { Icon( painter = painterResource(R.drawable.ic_download_item_24dp), contentDescription = stringResource(MR.strings.manga_download), modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @Composable private fun DownloadingIndicator( enabled: Boolean, downloadState: MangaDownload.State, downloadProgressProvider: () -> Int, onClick: (ChapterDownloadAction) -> Unit, modifier: Modifier = Modifier, ) { var isMenuExpanded by remember { mutableStateOf(false) } Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { onClick(ChapterDownloadAction.CANCEL) }, onClick = { isMenuExpanded = true }, ), contentAlignment = Alignment.Center, ) { val arrowColor: Color val strokeColor = MaterialTheme.colorScheme.onSurfaceVariant val downloadProgress = downloadProgressProvider() val indeterminate = downloadState == MangaDownload.State.QUEUE || (downloadState == MangaDownload.State.DOWNLOADING && downloadProgress == 0) if (indeterminate) { arrowColor = strokeColor CircularProgressIndicator( modifier = IndicatorModifier, color = strokeColor, strokeWidth = IndicatorStrokeWidth, trackColor = Color.Transparent, strokeCap = StrokeCap.Butt, ) } else { val animatedProgress by animateFloatAsState( targetValue = downloadProgress / 100f, animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, label = "progress", ) arrowColor = if (animatedProgress < 0.5f) { strokeColor } else { MaterialTheme.colorScheme.background } CircularProgressIndicator( progress = { animatedProgress }, modifier = IndicatorModifier, color = strokeColor, strokeWidth = IndicatorSize / 2, trackColor = Color.Transparent, strokeCap = StrokeCap.Butt, gapSize = 0.dp, ) } DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_start_downloading_now)) }, onClick = { onClick(ChapterDownloadAction.START_NOW) isMenuExpanded = false }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_cancel)) }, onClick = { onClick(ChapterDownloadAction.CANCEL) isMenuExpanded = false }, ) } Icon( imageVector = Icons.Outlined.ArrowDownward, contentDescription = null, modifier = ArrowModifier, tint = arrowColor, ) } } @Composable private fun DownloadedIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (ChapterDownloadAction) -> Unit, ) { var isMenuExpanded by remember { mutableStateOf(false) } Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { isMenuExpanded = true }, onClick = { isMenuExpanded = true }, ), contentAlignment = Alignment.Center, ) { Icon( imageVector = Icons.Filled.CheckCircle, contentDescription = null, modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.onSurfaceVariant, ) DropdownMenu(expanded = isMenuExpanded, onDismissRequest = { isMenuExpanded = false }) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_delete)) }, onClick = { onClick(ChapterDownloadAction.DELETE) isMenuExpanded = false }, ) } } } @Composable private fun ErrorIndicator( enabled: Boolean, modifier: Modifier = Modifier, onClick: (ChapterDownloadAction) -> Unit, ) { Box( modifier = modifier .size(IconButtonTokens.StateLayerSize) .commonClickable( enabled = enabled, hapticFeedback = LocalHapticFeedback.current, onLongClick = { onClick(ChapterDownloadAction.START) }, onClick = { onClick(ChapterDownloadAction.START) }, ), contentAlignment = Alignment.Center, ) { Icon( imageVector = Icons.Outlined.ErrorOutline, contentDescription = stringResource(AYMR.strings.download_error), modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.error, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaChapterListItem.kt ================================================ package eu.kanade.presentation.entries.manga.components import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.filled.Circle import androidx.compose.material.icons.outlined.BookmarkAdd import androidx.compose.material.icons.outlined.BookmarkRemove import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Done import androidx.compose.material.icons.outlined.Download import androidx.compose.material.icons.outlined.FileDownloadOff import androidx.compose.material.icons.outlined.RemoveDone import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import me.saket.swipe.SwipeableActionsBox import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground @Composable fun MangaChapterListItem( title: String, date: String?, readProgress: String?, scanlator: String?, read: Boolean, bookmark: Boolean, selected: Boolean, downloadIndicatorEnabled: Boolean, downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onLongClick: () -> Unit, onClick: () -> Unit, onDownloadClick: ((ChapterDownloadAction) -> Unit)?, onChapterSwipe: (LibraryPreferences.ChapterSwipeAction) -> Unit, modifier: Modifier = Modifier, ) { val start = getSwipeAction( action = chapterSwipeStartAction, read = read, bookmark = bookmark, downloadState = downloadStateProvider(), background = MaterialTheme.colorScheme.primaryContainer, onSwipe = { onChapterSwipe(chapterSwipeStartAction) }, ) val end = getSwipeAction( action = chapterSwipeEndAction, read = read, bookmark = bookmark, downloadState = downloadStateProvider(), background = MaterialTheme.colorScheme.primaryContainer, onSwipe = { onChapterSwipe(chapterSwipeEndAction) }, ) SwipeableActionsBox( modifier = Modifier.clipToBounds(), startActions = listOfNotNull(start), endActions = listOfNotNull(end), swipeThreshold = swipeActionThreshold, backgroundUntilSwipeThreshold = MaterialTheme.colorScheme.surfaceContainerLowest, ) { Row( modifier = modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .padding(start = 16.dp, top = 12.dp, end = 8.dp, bottom = 12.dp), ) { Column( modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(6.dp), ) { Row( horizontalArrangement = Arrangement.spacedBy(2.dp), verticalAlignment = Alignment.CenterVertically, ) { var textHeight by remember { mutableIntStateOf(0) } if (!read) { Icon( imageVector = Icons.Filled.Circle, contentDescription = stringResource(MR.strings.unread), modifier = Modifier .height(8.dp) .padding(end = 4.dp), tint = MaterialTheme.colorScheme.primary, ) } if (bookmark) { Icon( imageVector = Icons.Filled.Bookmark, contentDescription = stringResource(MR.strings.action_filter_bookmarked), modifier = Modifier .sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }), tint = MaterialTheme.colorScheme.primary, ) } Text( text = title, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, onTextLayout = { textHeight = it.size.height }, color = LocalContentColor.current.copy(alpha = if (read) DISABLED_ALPHA else 1f), ) } Row { val subtitleStyle = MaterialTheme.typography.bodySmall .merge( color = LocalContentColor.current .copy(alpha = if (read) DISABLED_ALPHA else SECONDARY_ALPHA), ) ProvideTextStyle(value = subtitleStyle) { if (date != null) { Text( text = date, maxLines = 1, overflow = TextOverflow.Ellipsis, ) if (readProgress != null || scanlator != null) DotSeparatorText() } if (readProgress != null) { Text( text = readProgress, maxLines = 1, overflow = TextOverflow.Ellipsis, color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), ) if (scanlator != null) DotSeparatorText() } if (scanlator != null) { Text( text = scanlator, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } } ChapterDownloadIndicator( enabled = downloadIndicatorEnabled, modifier = Modifier.padding(start = 4.dp), downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onClick = { onDownloadClick?.invoke(it) }, ) } } } private fun getSwipeAction( action: LibraryPreferences.ChapterSwipeAction, read: Boolean, bookmark: Boolean, downloadState: MangaDownload.State, background: Color, onSwipe: () -> Unit, ): me.saket.swipe.SwipeAction? { return when (action) { LibraryPreferences.ChapterSwipeAction.ToggleRead -> swipeAction( icon = if (!read) Icons.Outlined.Done else Icons.Outlined.RemoveDone, background = background, isUndo = read, onSwipe = onSwipe, ) LibraryPreferences.ChapterSwipeAction.ToggleBookmark -> swipeAction( icon = if (!bookmark) Icons.Outlined.BookmarkAdd else Icons.Outlined.BookmarkRemove, background = background, isUndo = bookmark, onSwipe = onSwipe, ) LibraryPreferences.ChapterSwipeAction.Download -> swipeAction( icon = when (downloadState) { MangaDownload.State.NOT_DOWNLOADED, MangaDownload.State.ERROR -> Icons.Outlined.Download MangaDownload.State.QUEUE, MangaDownload.State.DOWNLOADING -> Icons.Outlined.FileDownloadOff MangaDownload.State.DOWNLOADED -> Icons.Outlined.Delete }, background = background, onSwipe = onSwipe, ) LibraryPreferences.ChapterSwipeAction.Disabled -> null } } private fun swipeAction( onSwipe: () -> Unit, icon: ImageVector, background: Color, isUndo: Boolean = false, ): me.saket.swipe.SwipeAction { return me.saket.swipe.SwipeAction( icon = { Icon( modifier = Modifier.padding(16.dp), imageVector = icon, tint = contentColorFor(background), contentDescription = null, ) }, background = background, onSwipe = onSwipe, isUndo = isUndo, ) } private val swipeActionThreshold = 56.dp ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaCoverDialog.kt ================================================ package eu.kanade.presentation.entries.manga.components import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.Save import androidx.compose.material.icons.outlined.Share import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.core.view.updatePadding import coil3.asDrawable import coil3.imageLoader import coil3.request.CachePolicy import coil3.request.ImageRequest import coil3.size.Size import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.entries.EditCoverAction import eu.kanade.tachiyomi.ui.reader.viewer.ReaderPageImageView import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.clickableNoIndication @Composable fun MangaCoverDialog( manga: Manga, isCustomCover: Boolean, snackbarHostState: SnackbarHostState, onShareClick: () -> Unit, onSaveClick: () -> Unit, onEditClick: ((EditCoverAction) -> Unit)?, onDismissRequest: () -> Unit, ) { Dialog( onDismissRequest = onDismissRequest, properties = DialogProperties( usePlatformDefaultWidth = false, decorFitsSystemWindows = false, // Doesn't work https://issuetracker.google.com/issues/246909281 ), ) { Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, containerColor = Color.Transparent, bottomBar = { Row( modifier = Modifier .fillMaxWidth() .padding(4.dp) .navigationBarsPadding(), ) { ActionsPill { IconButton(onClick = onDismissRequest) { Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_close), ) } } Spacer(modifier = Modifier.weight(1f)) ActionsPill { AppBarActions( actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_share), icon = Icons.Outlined.Share, onClick = onShareClick, ), AppBar.Action( title = stringResource(MR.strings.action_save), icon = Icons.Outlined.Save, onClick = onSaveClick, ), ), ) if (onEditClick != null) { Box { var expanded by remember { mutableStateOf(false) } IconButton( onClick = { if (isCustomCover) { expanded = true } else { onEditClick(EditCoverAction.EDIT) } }, ) { Icon( imageVector = Icons.Outlined.Edit, contentDescription = stringResource( MR.strings.action_edit_cover, ), ) } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, offset = DpOffset(8.dp, 0.dp), ) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_edit)) }, onClick = { onEditClick(EditCoverAction.EDIT) expanded = false }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_delete)) }, onClick = { onEditClick(EditCoverAction.DELETE) expanded = false }, ) } } } } } }, ) { contentPadding -> val statusBarPaddingPx = with(LocalDensity.current) { contentPadding.calculateTopPadding().roundToPx() } val bottomPaddingPx = with(LocalDensity.current) { contentPadding.calculateBottomPadding().roundToPx() } Box( modifier = Modifier .fillMaxSize() .clickableNoIndication(onClick = onDismissRequest), ) { AndroidView( factory = { ReaderPageImageView(it).apply { onViewClicked = onDismissRequest clipToPadding = false clipChildren = false } }, update = { view -> val request = ImageRequest.Builder(view.context) .data(manga) .size(Size.ORIGINAL) .memoryCachePolicy(CachePolicy.DISABLED) .target { image -> val drawable = image.asDrawable(view.context.resources) // Copy bitmap in case it came from memory cache // Because SSIV needs to thoroughly read the image val copy = (drawable as? BitmapDrawable)?.let { BitmapDrawable( view.context.resources, it.bitmap.copy(Bitmap.Config.HARDWARE, false), ) } ?: drawable view.setImage(copy, ReaderPageImageView.Config(zoomDuration = 500)) } .build() view.context.imageLoader.enqueue(request) view.updatePadding(top = statusBarPaddingPx, bottom = bottomPaddingPx) }, modifier = Modifier.fillMaxSize(), ) } } } } @Composable private fun ActionsPill(content: @Composable () -> Unit) { Row( modifier = Modifier .clip(MaterialTheme.shapes.extraLarge) .background(MaterialTheme.colorScheme.background.copy(alpha = 0.95f)), ) { content() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/components/MangaInfoHeader.kt ================================================ package eu.kanade.presentation.entries.manga.components import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.spring import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Brush import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.HourglassEmpty import androidx.compose.material.icons.filled.PersonOutline import androidx.compose.material.icons.filled.Warning import androidx.compose.material.icons.outlined.AttachMoney import androidx.compose.material.icons.outlined.Block import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.Done import androidx.compose.material.icons.outlined.DoneAll import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material.icons.outlined.Pause import androidx.compose.material.icons.outlined.Public import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material.icons.outlined.Sync import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalMinimumInteractiveComponentSize import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.SuggestionChip import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.Layout import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import coil3.request.ImageRequest import coil3.request.crossfade import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.clickableNoIndication import tachiyomi.presentation.core.util.secondaryItemAlpha import java.time.Instant import java.time.temporal.ChronoUnit import kotlin.math.roundToInt private val whitespaceLineRegex = Regex("[\\r\\n]{2,}", setOf(RegexOption.MULTILINE)) @Composable fun MangaInfoBox( isTabletUi: Boolean, appBarPadding: Dp, manga: Manga, sourceName: String, isStubSource: Boolean, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, ) { Box(modifier = modifier) { // Backdrop val backdropGradientColors = listOf( Color.Transparent, MaterialTheme.colorScheme.background, ) AsyncImage( model = ImageRequest.Builder(LocalContext.current) .data(manga) .crossfade(true) .build(), contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier .matchParentSize() .drawWithContent { drawContent() drawRect( brush = Brush.verticalGradient(colors = backdropGradientColors), ) } .blur(4.dp) .alpha(0.2f), ) // Manga & source info CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurface) { if (!isTabletUi) { MangaAndSourceTitlesSmall( appBarPadding = appBarPadding, manga = manga, sourceName = sourceName, isStubSource = isStubSource, onCoverClick = onCoverClick, doSearch = doSearch, ) } else { MangaAndSourceTitlesLarge( appBarPadding = appBarPadding, manga = manga, sourceName = sourceName, isStubSource = isStubSource, onCoverClick = onCoverClick, doSearch = doSearch, ) } } } } @Composable fun MangaActionRow( favorite: Boolean, trackingCount: Int, nextUpdate: Instant?, isUserIntervalMode: Boolean, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, onEditIntervalClicked: (() -> Unit)?, onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) { val defaultActionButtonColor = MaterialTheme.colorScheme.onSurface.copy(alpha = DISABLED_ALPHA) // TODO: show something better when using custom interval val nextUpdateDays = remember(nextUpdate) { return@remember if (nextUpdate != null) { val now = Instant.now() now.until(nextUpdate, ChronoUnit.DAYS).toInt().coerceAtLeast(0) } else { null } } Row(modifier = modifier.padding(start = 16.dp, top = 8.dp, end = 16.dp)) { MangaActionButton( title = if (favorite) { stringResource(MR.strings.in_library) } else { stringResource(MR.strings.add_to_library) }, icon = if (favorite) Icons.Filled.Favorite else Icons.Outlined.FavoriteBorder, color = if (favorite) MaterialTheme.colorScheme.primary else defaultActionButtonColor, onClick = onAddToLibraryClicked, onLongClick = onEditCategory, ) MangaActionButton( title = when (nextUpdateDays) { null -> stringResource(MR.strings.not_applicable) 0 -> stringResource(MR.strings.manga_interval_expected_update_soon) else -> pluralStringResource( MR.plurals.day, count = nextUpdateDays, nextUpdateDays, ) }, icon = Icons.Default.HourglassEmpty, color = if (isUserIntervalMode) MaterialTheme.colorScheme.primary else defaultActionButtonColor, onClick = { onEditIntervalClicked?.invoke() }, ) MangaActionButton( title = if (trackingCount == 0) { stringResource(MR.strings.manga_tracking_tab) } else { pluralStringResource(MR.plurals.num_trackers, count = trackingCount, trackingCount) }, icon = if (trackingCount == 0) Icons.Outlined.Sync else Icons.Outlined.Done, color = if (trackingCount == 0) defaultActionButtonColor else MaterialTheme.colorScheme.primary, onClick = onTrackingClicked, ) if (onWebViewClicked != null) { MangaActionButton( title = stringResource(MR.strings.action_web_view), icon = Icons.Outlined.Public, color = defaultActionButtonColor, onClick = onWebViewClicked, onLongClick = onWebViewLongClicked, ) } } } @Composable fun ExpandableMangaDescription( defaultExpandState: Boolean, description: String?, tagsProvider: () -> List?, onTagSearch: (String) -> Unit, onCopyTagToClipboard: (tag: String) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier = modifier) { val (expanded, onExpanded) = rememberSaveable { mutableStateOf(defaultExpandState) } val desc = description.takeIf { !it.isNullOrBlank() } ?: stringResource( MR.strings.description_placeholder, ) val trimmedDescription = remember(desc) { desc .replace(whitespaceLineRegex, "\n") .trimEnd() } MangaSummary( expandedDescription = desc, shrunkDescription = trimmedDescription, expanded = expanded, modifier = Modifier .padding(top = 8.dp) .padding(horizontal = 16.dp) .clickableNoIndication { onExpanded(!expanded) }, ) val tags = tagsProvider() if (!tags.isNullOrEmpty()) { Box( modifier = Modifier .padding(top = 8.dp) .padding(vertical = 12.dp) .animateContentSize(animationSpec = spring()) .fillMaxWidth(), ) { var showMenu by remember { mutableStateOf(false) } var tagSelected by remember { mutableStateOf("") } DropdownMenu( expanded = showMenu, onDismissRequest = { showMenu = false }, ) { DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_search)) }, onClick = { onTagSearch(tagSelected) showMenu = false }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_copy_to_clipboard)) }, onClick = { onCopyTagToClipboard(tagSelected) showMenu = false }, ) } if (expanded) { FlowRow( modifier = Modifier.padding(horizontal = 16.dp), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { tags.forEach { TagsChip( modifier = DefaultTagChipModifier, text = it, onClick = { tagSelected = it showMenu = true }, ) } } } else { LazyRow( contentPadding = PaddingValues(horizontal = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { items(items = tags) { TagsChip( modifier = DefaultTagChipModifier, text = it, onClick = { tagSelected = it showMenu = true }, ) } } } } } } } @Composable private fun MangaAndSourceTitlesLarge( appBarPadding: Dp, manga: Manga, sourceName: String, isStubSource: Boolean, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, ) { Column( modifier = Modifier .fillMaxWidth() .padding(start = 16.dp, top = appBarPadding + 16.dp, end = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { ItemCover.Book( modifier = Modifier.fillMaxWidth(0.65f), data = ImageRequest.Builder(LocalContext.current) .data(manga) .crossfade(true) .build(), contentDescription = stringResource(MR.strings.manga_cover), onClick = onCoverClick, ) Spacer(modifier = Modifier.height(16.dp)) MangaContentInfo( title = manga.title, author = manga.author, artist = manga.artist, status = manga.status, sourceName = sourceName, isStubSource = isStubSource, doSearch = doSearch, textAlign = TextAlign.Center, ) } } @Composable private fun MangaAndSourceTitlesSmall( appBarPadding: Dp, manga: Manga, sourceName: String, isStubSource: Boolean, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, ) { Row( modifier = Modifier .fillMaxWidth() .padding(start = 16.dp, top = appBarPadding + 16.dp, end = 16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Book( modifier = Modifier .sizeIn(maxWidth = 100.dp) .align(Alignment.Top), data = ImageRequest.Builder(LocalContext.current) .data(manga) .crossfade(true) .build(), contentDescription = stringResource(MR.strings.manga_cover), onClick = onCoverClick, ) Column( verticalArrangement = Arrangement.spacedBy(2.dp), ) { MangaContentInfo( title = manga.title, author = manga.author, artist = manga.artist, status = manga.status, sourceName = sourceName, isStubSource = isStubSource, doSearch = doSearch, ) } } } @Composable private fun ColumnScope.MangaContentInfo( title: String, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, doSearch: (query: String, global: Boolean) -> Unit, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) { val context = LocalContext.current Text( text = title.ifBlank { stringResource(MR.strings.unknown_title) }, style = MaterialTheme.typography.titleLarge, modifier = Modifier.clickableNoIndication( onLongClick = { if (title.isNotBlank()) { context.copyToClipboard( title, title, ) } }, onClick = { if (title.isNotBlank()) doSearch(title, true) }, ), textAlign = textAlign, ) Spacer(modifier = Modifier.height(2.dp)) Row( modifier = Modifier.secondaryItemAlpha(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Filled.PersonOutline, contentDescription = null, modifier = Modifier.size(16.dp), ) Text( text = author?.takeIf { it.isNotBlank() } ?: stringResource(MR.strings.unknown_author), style = MaterialTheme.typography.titleSmall, modifier = Modifier .clickableNoIndication( onLongClick = { if (!author.isNullOrBlank()) { context.copyToClipboard( author, author, ) } }, onClick = { if (!author.isNullOrBlank()) doSearch(author, true) }, ), textAlign = textAlign, ) } if (!artist.isNullOrBlank() && author != artist) { Row( modifier = Modifier.secondaryItemAlpha(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Filled.Brush, contentDescription = null, modifier = Modifier.size(16.dp), ) Text( text = artist, style = MaterialTheme.typography.titleSmall, modifier = Modifier .clickableNoIndication( onLongClick = { context.copyToClipboard(artist, artist) }, onClick = { doSearch(artist, true) }, ), textAlign = textAlign, ) } } Spacer(modifier = Modifier.height(2.dp)) Row( modifier = Modifier.secondaryItemAlpha(), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = when (status) { SManga.ONGOING.toLong() -> Icons.Outlined.Schedule SManga.COMPLETED.toLong() -> Icons.Outlined.DoneAll SManga.LICENSED.toLong() -> Icons.Outlined.AttachMoney SManga.PUBLISHING_FINISHED.toLong() -> Icons.Outlined.Done SManga.CANCELLED.toLong() -> Icons.Outlined.Close SManga.ON_HIATUS.toLong() -> Icons.Outlined.Pause else -> Icons.Outlined.Block }, contentDescription = null, modifier = Modifier .padding(end = 4.dp) .size(16.dp), ) ProvideTextStyle(MaterialTheme.typography.bodyMedium) { Text( text = when (status) { SManga.ONGOING.toLong() -> stringResource(MR.strings.ongoing) SManga.COMPLETED.toLong() -> stringResource(MR.strings.completed) SManga.LICENSED.toLong() -> stringResource(MR.strings.licensed) SManga.PUBLISHING_FINISHED.toLong() -> stringResource(MR.strings.publishing_finished) SManga.CANCELLED.toLong() -> stringResource(MR.strings.cancelled) SManga.ON_HIATUS.toLong() -> stringResource(MR.strings.on_hiatus) else -> stringResource(MR.strings.unknown) }, overflow = TextOverflow.Ellipsis, maxLines = 1, ) DotSeparatorText() if (isStubSource) { Icon( imageVector = Icons.Filled.Warning, contentDescription = null, modifier = Modifier .padding(end = 4.dp) .size(16.dp), tint = MaterialTheme.colorScheme.error, ) } Text( text = sourceName, modifier = Modifier.clickableNoIndication { doSearch( sourceName, false, ) }, overflow = TextOverflow.Ellipsis, maxLines = 1, ) } } } @Composable private fun MangaSummary( expandedDescription: String, shrunkDescription: String, expanded: Boolean, modifier: Modifier = Modifier, ) { val animProgress by animateFloatAsState( targetValue = if (expanded) 1f else 0f, label = "summary", ) Layout( modifier = modifier.clipToBounds(), contents = listOf( { Text( text = "\n\n", // Shows at least 3 lines style = MaterialTheme.typography.bodyMedium, ) }, { Text( text = expandedDescription, style = MaterialTheme.typography.bodyMedium, ) }, { SelectionContainer { Text( text = if (expanded) expandedDescription else shrunkDescription, maxLines = Int.MAX_VALUE, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onBackground, modifier = Modifier.secondaryItemAlpha(), ) } }, { val colors = listOf(Color.Transparent, MaterialTheme.colorScheme.background) Box( modifier = Modifier.background(Brush.verticalGradient(colors = colors)), contentAlignment = Alignment.Center, ) { val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_caret_down) Icon( painter = rememberAnimatedVectorPainter(image, !expanded), contentDescription = stringResource( if (expanded) MR.strings.manga_info_collapse else MR.strings.manga_info_expand, ), tint = MaterialTheme.colorScheme.onBackground, modifier = Modifier.background(Brush.radialGradient(colors = colors.asReversed())), ) } }, ), ) { (shrunk, expanded, actual, scrim), constraints -> val shrunkHeight = shrunk.single() .measure(constraints) .height val expandedHeight = expanded.single() .measure(constraints) .height val heightDelta = expandedHeight - shrunkHeight val scrimHeight = 24.dp.roundToPx() val actualPlaceable = actual.single() .measure(constraints) val scrimPlaceable = scrim.single() .measure(Constraints.fixed(width = constraints.maxWidth, height = scrimHeight)) val currentHeight = shrunkHeight + ((heightDelta + scrimHeight) * animProgress).roundToInt() layout(constraints.maxWidth, currentHeight) { actualPlaceable.place(0, 0) val scrimY = currentHeight - scrimHeight scrimPlaceable.place(0, scrimY) } } } private val DefaultTagChipModifier = Modifier.padding(vertical = 4.dp) @Composable private fun TagsChip( text: String, modifier: Modifier = Modifier, onClick: () -> Unit, ) { CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) { SuggestionChip( modifier = modifier, onClick = onClick, label = { Text(text = text, style = MaterialTheme.typography.bodySmall) }, ) } } @Composable private fun RowScope.MangaActionButton( title: String, icon: ImageVector, color: Color, onClick: () -> Unit, onLongClick: (() -> Unit)? = null, ) { TextButton( onClick = onClick, modifier = Modifier.weight(1f), onLongClick = onLongClick, ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon( imageVector = icon, contentDescription = null, tint = color, modifier = Modifier.size(20.dp), ) Spacer(Modifier.height(4.dp)) Text( text = title, color = color, fontSize = 12.sp, textAlign = TextAlign.Center, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/entries/manga/components/ScanlatorFilterDialog.kt ================================================ package eu.kanade.presentation.entries.manga.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.CheckBoxOutlineBlank import androidx.compose.material.icons.rounded.DisabledByDefault import androidx.compose.material3.AlertDialog import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ScanlatorFilterDialog( availableScanlators: Set, excludedScanlators: Set, onDismissRequest: () -> Unit, onConfirm: (Set) -> Unit, ) { val sortedAvailableScanlators = remember(availableScanlators) { availableScanlators.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it }) } val mutableExcludedScanlators = remember(excludedScanlators) { excludedScanlators.toMutableStateList() } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(MR.strings.exclude_scanlators)) }, text = textFunc@{ if (sortedAvailableScanlators.isEmpty()) { Text(text = stringResource(MR.strings.no_scanlators_found)) return@textFunc } Box { val state = rememberLazyListState() LazyColumn(state = state) { sortedAvailableScanlators.forEach { scanlator -> item { val isExcluded = mutableExcludedScanlators.contains(scanlator) Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .clickable { if (isExcluded) { mutableExcludedScanlators.remove(scanlator) } else { mutableExcludedScanlators.add(scanlator) } } .minimumInteractiveComponentSize() .clip(MaterialTheme.shapes.small) .fillMaxWidth() .padding(horizontal = MaterialTheme.padding.small), ) { Icon( imageVector = if (isExcluded) { Icons.Rounded.DisabledByDefault } else { Icons.Rounded.CheckBoxOutlineBlank }, tint = if (isExcluded) { MaterialTheme.colorScheme.primary } else { LocalContentColor.current }, contentDescription = null, ) Text( text = scanlator, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(start = 24.dp), ) } } } } if (state.canScrollBackward) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter)) if (state.canScrollForward) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter)) } }, properties = DialogProperties( usePlatformDefaultWidth = true, ), confirmButton = { if (sortedAvailableScanlators.isEmpty()) { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } } else { FlowRow { if (mutableExcludedScanlators.isEmpty()) { TextButton(onClick = { mutableExcludedScanlators.addAll(availableScanlators) }) { Text(text = stringResource(MR.strings.action_select_all)) } } else { TextButton(onClick = mutableExcludedScanlators::clear) { Text(text = stringResource(MR.strings.action_reset)) } } Spacer(modifier = Modifier.weight(1f)) TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } TextButton( onClick = { onConfirm(mutableExcludedScanlators.toSet()) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_ok)) } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/HistoryDialogs.kt ================================================ package eu.kanade.presentation.history import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import kotlin.random.Random @Composable fun HistoryDeleteDialog( onDismissRequest: () -> Unit, onDelete: (Boolean) -> Unit, isManga: Boolean, ) { var removeEverything by remember { mutableStateOf(false) } AlertDialog( title = { Text(text = stringResource(MR.strings.action_remove)) }, text = { Column( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { val subtitle = if (isManga) { MR.strings.dialog_with_checkbox_remove_description } else { AYMR.strings.dialog_with_checkbox_remove_description_anime } Text(text = stringResource(subtitle)) LabeledCheckbox( label = if (isManga) { stringResource(AYMR.strings.dialog_with_checkbox_reset) } else { stringResource(AYMR.strings.dialog_with_checkbox_reset_anime) }, checked = removeEverything, onCheckedChange = { removeEverything = it }, ) } }, onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete(removeEverything) onDismissRequest() }) { Text(text = stringResource(MR.strings.action_remove)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } @Composable fun HistoryDeleteAllDialog( onDismissRequest: () -> Unit, onDelete: () -> Unit, ) { AlertDialog( title = { Text(text = stringResource(MR.strings.action_remove_everything)) }, text = { Text(text = stringResource(MR.strings.clear_history_confirmation)) }, onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } @PreviewLightDark @Composable private fun HistoryDeleteDialogPreview() { TachiyomiPreviewTheme { HistoryDeleteDialog( onDismissRequest = {}, onDelete = {}, isManga = Random.nextBoolean(), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreen.kt ================================================ package eu.kanade.presentation.history.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import eu.kanade.presentation.components.relativeDateText import eu.kanade.presentation.history.anime.components.AnimeHistoryItem import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.ListGroupHeader import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import java.time.LocalDate @Composable fun AnimeHistoryScreen( state: AnimeHistoryScreenModel.State, snackbarHostState: SnackbarHostState, onClickCover: (animeId: Long) -> Unit, onClickResume: (animeId: Long, episodeId: Long) -> Unit, onClickFavorite: (animeId: Long) -> Unit, onDialogChange: (AnimeHistoryScreenModel.Dialog?) -> Unit, searchQuery: String? = null, ) { Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> state.list.let { if (it == null) { LoadingScreen(Modifier.padding(contentPadding)) } else if (it.isEmpty()) { val msg = if (!searchQuery.isNullOrEmpty()) { MR.strings.no_results_found } else { AYMR.strings.information_no_recent_anime } EmptyScreen( stringRes = msg, modifier = Modifier.padding(contentPadding), ) } else { AnimeHistoryScreenContent( history = it, contentPadding = contentPadding, onClickCover = { history -> onClickCover(history.animeId) }, onClickResume = { history -> onClickResume(history.animeId, history.episodeId) }, onClickDelete = { item -> onDialogChange(AnimeHistoryScreenModel.Dialog.Delete(item)) }, onClickFavorite = { history -> onClickFavorite(history.animeId) }, ) } } } } @Composable private fun AnimeHistoryScreenContent( history: List, contentPadding: PaddingValues, onClickCover: (AnimeHistoryWithRelations) -> Unit, onClickResume: (AnimeHistoryWithRelations) -> Unit, onClickDelete: (AnimeHistoryWithRelations) -> Unit, onClickFavorite: (AnimeHistoryWithRelations) -> Unit, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { items( items = history, key = { "history-${it.hashCode()}" }, contentType = { when (it) { is AnimeHistoryUiModel.Header -> "header" is AnimeHistoryUiModel.Item -> "item" } }, ) { item -> when (item) { is AnimeHistoryUiModel.Header -> { ListGroupHeader( modifier = Modifier.animateItemFastScroll(), text = relativeDateText(item.date), ) } is AnimeHistoryUiModel.Item -> { val value = item.item AnimeHistoryItem( modifier = Modifier.animateItemFastScroll(), history = value, onClickCover = { onClickCover(value) }, onClickResume = { onClickResume(value) }, onClickDelete = { onClickDelete(value) }, onClickFavorite = { onClickFavorite(value) }, ) } } } } } sealed interface AnimeHistoryUiModel { data class Header(val date: LocalDate) : AnimeHistoryUiModel data class Item(val item: AnimeHistoryWithRelations) : AnimeHistoryUiModel } @PreviewLightDark @Composable internal fun HistoryScreenPreviews( @PreviewParameter(AnimeHistoryScreenModelStateProvider::class) historyState: AnimeHistoryScreenModel.State, ) { TachiyomiPreviewTheme { AnimeHistoryScreen( state = historyState, snackbarHostState = SnackbarHostState(), searchQuery = null, onClickCover = {}, onClickResume = { _, _ -> run {} }, onDialogChange = {}, onClickFavorite = {}, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/anime/AnimeHistoryScreenModelStateProvider.kt ================================================ package eu.kanade.presentation.history.anime import androidx.compose.ui.tooling.preview.PreviewParameterProvider import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations import java.time.Instant import java.time.LocalDate import java.time.temporal.ChronoUnit import java.util.Date import kotlin.random.Random class AnimeHistoryScreenModelStateProvider : PreviewParameterProvider { private val multiPage = AnimeHistoryScreenModel.State( searchQuery = null, list = listOf(HistoryUiModelExamples.headerToday) .asSequence() .plus(HistoryUiModelExamples.items().take(3)) .plus(HistoryUiModelExamples.header { it.minus(1, ChronoUnit.DAYS) }) .plus(HistoryUiModelExamples.items().take(1)) .plus(HistoryUiModelExamples.header { it.minus(2, ChronoUnit.DAYS) }) .plus(HistoryUiModelExamples.items().take(7)) .toList(), dialog = null, ) private val shortRecent = AnimeHistoryScreenModel.State( searchQuery = null, list = listOf( HistoryUiModelExamples.headerToday, HistoryUiModelExamples.items().first(), ), dialog = null, ) private val shortFuture = AnimeHistoryScreenModel.State( searchQuery = null, list = listOf( HistoryUiModelExamples.headerTomorrow, HistoryUiModelExamples.items().first(), ), dialog = null, ) private val empty = AnimeHistoryScreenModel.State( searchQuery = null, list = listOf(), dialog = null, ) private val loadingWithSearchQuery = AnimeHistoryScreenModel.State( searchQuery = "Example Search Query", ) private val loading = AnimeHistoryScreenModel.State( searchQuery = null, list = null, dialog = null, ) override val values: Sequence = sequenceOf( multiPage, shortRecent, shortFuture, empty, loadingWithSearchQuery, loading, ) private object HistoryUiModelExamples { val headerToday = header() val headerTomorrow = AnimeHistoryUiModel.Header(LocalDate.now().plusDays(1)) fun header(instantBuilder: (Instant) -> Instant = { it }) = AnimeHistoryUiModel.Header(LocalDate.from(instantBuilder(Instant.now()))) fun items() = sequence { var count = 1 while (true) { yield(randItem { it.copy(title = "Example Title $count") }) count += 1 } } fun randItem(historyBuilder: (AnimeHistoryWithRelations) -> AnimeHistoryWithRelations = { it }) = AnimeHistoryUiModel.Item( historyBuilder( AnimeHistoryWithRelations( id = Random.nextLong(), episodeId = Random.nextLong(), animeId = Random.nextLong(), title = "Test Title", episodeNumber = Random.nextDouble(), seenAt = Date.from(Instant.now()), coverData = AnimeCover( animeId = Random.nextLong(), sourceId = Random.nextLong(), isAnimeFavorite = Random.nextBoolean(), url = "https://example.com/cover.png", lastModified = Random.nextLong(), ), ), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/anime/components/AnimeHistoryItem.kt ================================================ package eu.kanade.presentation.history.anime.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.util.formatEpisodeNumber import eu.kanade.tachiyomi.util.lang.toTimestampString import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource private val HistoryItemHeight = 96.dp @Composable fun AnimeHistoryItem( history: AnimeHistoryWithRelations, onClickCover: () -> Unit, onClickResume: () -> Unit, onClickDelete: () -> Unit, onClickFavorite: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier .clickable(onClick = onClickResume) .height(HistoryItemHeight) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Book( modifier = Modifier.fillMaxHeight(), data = history.coverData, onClick = onClickCover, ) Column( modifier = Modifier .weight(1f) .padding(start = MaterialTheme.padding.medium, end = MaterialTheme.padding.small), ) { val textStyle = MaterialTheme.typography.bodyMedium Text( text = history.title, fontWeight = FontWeight.SemiBold, maxLines = 2, overflow = TextOverflow.Ellipsis, style = textStyle, ) val seenAt = remember { history.seenAt?.toTimestampString() ?: "" } Text( text = if (history.episodeNumber > -1) { stringResource( AYMR.strings.recent_anime_time, formatEpisodeNumber(history.episodeNumber), seenAt, ) } else { seenAt }, modifier = Modifier.padding(top = 4.dp), style = textStyle, ) } if (!history.coverData.isAnimeFavorite) { IconButton(onClick = onClickFavorite) { Icon( imageVector = Icons.Outlined.FavoriteBorder, contentDescription = stringResource(MR.strings.add_to_library), tint = MaterialTheme.colorScheme.onSurface, ) } } IconButton(onClick = onClickDelete) { Icon( imageVector = Icons.Outlined.Delete, contentDescription = stringResource(MR.strings.action_delete), tint = MaterialTheme.colorScheme.onSurface, ) } } } @PreviewLightDark @Composable private fun HistoryItemPreviews( @PreviewParameter(AnimeHistoryWithRelationsProvider::class) historyWithRelations: AnimeHistoryWithRelations, ) { TachiyomiPreviewTheme { Surface { AnimeHistoryItem( history = historyWithRelations, onClickCover = {}, onClickResume = {}, onClickDelete = {}, onClickFavorite = {}, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/anime/components/AnimeHistoryWithRelationsProvider.kt ================================================ package eu.kanade.presentation.history.anime.components import androidx.compose.ui.tooling.preview.PreviewParameterProvider import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations import java.util.Date internal class AnimeHistoryWithRelationsProvider : PreviewParameterProvider { private val simple = AnimeHistoryWithRelations( id = 1L, episodeId = 2L, animeId = 3L, title = "Test Title", episodeNumber = 10.2, seenAt = Date(1697247357L), coverData = tachiyomi.domain.entries.anime.model.AnimeCover( animeId = 3L, sourceId = 4L, isAnimeFavorite = false, url = "https://example.com/cover.png", lastModified = 5L, ), ) private val historyWithoutReadAt = AnimeHistoryWithRelations( id = 1L, episodeId = 2L, animeId = 3L, title = "Test Title", episodeNumber = 10.2, seenAt = null, coverData = tachiyomi.domain.entries.anime.model.AnimeCover( animeId = 3L, sourceId = 4L, isAnimeFavorite = false, url = "https://example.com/cover.png", lastModified = 5L, ), ) private val historyWithNegativeChapterNumber = AnimeHistoryWithRelations( id = 1L, episodeId = 2L, animeId = 3L, title = "Test Title", episodeNumber = -2.0, seenAt = Date(1697247357L), coverData = tachiyomi.domain.entries.anime.model.AnimeCover( animeId = 3L, sourceId = 4L, isAnimeFavorite = false, url = "https://example.com/cover.png", lastModified = 5L, ), ) override val values: Sequence get() = sequenceOf(simple, historyWithoutReadAt, historyWithNegativeChapterNumber) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreen.kt ================================================ package eu.kanade.presentation.history.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import eu.kanade.presentation.components.relativeDateText import eu.kanade.presentation.history.manga.components.MangaHistoryItem import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.ListGroupHeader import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import java.time.LocalDate @Composable fun MangaHistoryScreen( state: MangaHistoryScreenModel.State, snackbarHostState: SnackbarHostState, onClickCover: (mangaId: Long) -> Unit, onClickResume: (mangaId: Long, chapterId: Long) -> Unit, onClickFavorite: (mangaId: Long) -> Unit, onDialogChange: (MangaHistoryScreenModel.Dialog?) -> Unit, searchQuery: String? = null, ) { Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> state.list.let { if (it == null) { LoadingScreen(Modifier.padding(contentPadding)) } else if (it.isEmpty()) { val msg = if (!searchQuery.isNullOrEmpty()) { MR.strings.no_results_found } else { MR.strings.information_no_recent_manga } EmptyScreen( stringRes = msg, modifier = Modifier.padding(contentPadding), ) } else { MangaHistoryScreenContent( history = it, contentPadding = contentPadding, onClickCover = { history -> onClickCover(history.mangaId) }, onClickResume = { history -> onClickResume(history.mangaId, history.chapterId) }, onClickDelete = { item -> onDialogChange(MangaHistoryScreenModel.Dialog.Delete(item)) }, onClickFavorite = { history -> onClickFavorite(history.mangaId) }, ) } } } } @Composable private fun MangaHistoryScreenContent( history: List, contentPadding: PaddingValues, onClickCover: (MangaHistoryWithRelations) -> Unit, onClickResume: (MangaHistoryWithRelations) -> Unit, onClickDelete: (MangaHistoryWithRelations) -> Unit, onClickFavorite: (MangaHistoryWithRelations) -> Unit, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { items( items = history, key = { "history-${it.hashCode()}" }, contentType = { when (it) { is MangaHistoryUiModel.Header -> "header" is MangaHistoryUiModel.Item -> "item" } }, ) { item -> when (item) { is MangaHistoryUiModel.Header -> { ListGroupHeader( modifier = Modifier.animateItemFastScroll(), text = relativeDateText(item.date), ) } is MangaHistoryUiModel.Item -> { val value = item.item MangaHistoryItem( modifier = Modifier.animateItemFastScroll(), history = value, onClickCover = { onClickCover(value) }, onClickResume = { onClickResume(value) }, onClickDelete = { onClickDelete(value) }, onClickFavorite = { onClickFavorite(value) }, ) } } } } } sealed interface MangaHistoryUiModel { data class Header(val date: LocalDate) : MangaHistoryUiModel data class Item(val item: MangaHistoryWithRelations) : MangaHistoryUiModel } @PreviewLightDark @Composable internal fun HistoryScreenPreviews( @PreviewParameter(MangaHistoryScreenModelStateProvider::class) historyState: MangaHistoryScreenModel.State, ) { TachiyomiPreviewTheme { MangaHistoryScreen( state = historyState, snackbarHostState = SnackbarHostState(), searchQuery = null, onClickCover = {}, onClickResume = { _, _ -> run {} }, onDialogChange = {}, onClickFavorite = {}, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/manga/MangaHistoryScreenModelStateProvider.kt ================================================ package eu.kanade.presentation.history.manga import androidx.compose.ui.tooling.preview.PreviewParameterProvider import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations import java.time.Instant import java.time.LocalDate import java.time.temporal.ChronoUnit import java.util.Date import kotlin.random.Random class MangaHistoryScreenModelStateProvider : PreviewParameterProvider { private val multiPage = MangaHistoryScreenModel.State( searchQuery = null, list = listOf(HistoryUiModelExamples.headerToday) .asSequence() .plus(HistoryUiModelExamples.items().take(3)) .plus(HistoryUiModelExamples.header { it.minus(1, ChronoUnit.DAYS) }) .plus(HistoryUiModelExamples.items().take(1)) .plus(HistoryUiModelExamples.header { it.minus(2, ChronoUnit.DAYS) }) .plus(HistoryUiModelExamples.items().take(7)) .toList(), dialog = null, ) private val shortRecent = MangaHistoryScreenModel.State( searchQuery = null, list = listOf( HistoryUiModelExamples.headerToday, HistoryUiModelExamples.items().first(), ), dialog = null, ) private val shortFuture = MangaHistoryScreenModel.State( searchQuery = null, list = listOf( HistoryUiModelExamples.headerTomorrow, HistoryUiModelExamples.items().first(), ), dialog = null, ) private val empty = MangaHistoryScreenModel.State( searchQuery = null, list = listOf(), dialog = null, ) private val loadingWithSearchQuery = MangaHistoryScreenModel.State( searchQuery = "Example Search Query", ) private val loading = MangaHistoryScreenModel.State( searchQuery = null, list = null, dialog = null, ) override val values: Sequence = sequenceOf( multiPage, shortRecent, shortFuture, empty, loadingWithSearchQuery, loading, ) private object HistoryUiModelExamples { val headerToday = header() val headerTomorrow = MangaHistoryUiModel.Header(LocalDate.now().plusDays(1)) fun header(instantBuilder: (Instant) -> Instant = { it }) = MangaHistoryUiModel.Header(LocalDate.from(instantBuilder(Instant.now()))) fun items() = sequence { var count = 1 while (true) { yield(randItem { it.copy(title = "Example Title $count") }) count += 1 } } fun randItem(historyBuilder: (MangaHistoryWithRelations) -> MangaHistoryWithRelations = { it }) = MangaHistoryUiModel.Item( historyBuilder( MangaHistoryWithRelations( id = Random.nextLong(), chapterId = Random.nextLong(), mangaId = Random.nextLong(), title = "Test Title", chapterNumber = Random.nextDouble(), readAt = Date.from(Instant.now()), readDuration = Random.nextLong(), coverData = MangaCover( mangaId = Random.nextLong(), sourceId = Random.nextLong(), isMangaFavorite = Random.nextBoolean(), url = "https://example.com/cover.png", lastModified = Random.nextLong(), ), ), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/manga/components/MangaHistoryItem.kt ================================================ package eu.kanade.presentation.history.manga.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.util.formatChapterNumber import eu.kanade.tachiyomi.util.lang.toTimestampString import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource private val HISTORY_ITEM_HEIGHT = 96.dp @Composable fun MangaHistoryItem( history: MangaHistoryWithRelations, onClickCover: () -> Unit, onClickResume: () -> Unit, onClickDelete: () -> Unit, onClickFavorite: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier .clickable(onClick = onClickResume) .height(HISTORY_ITEM_HEIGHT) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Book( modifier = Modifier.fillMaxHeight(), data = history.coverData, onClick = onClickCover, ) Column( modifier = Modifier .weight(1f) .padding(start = MaterialTheme.padding.medium, end = MaterialTheme.padding.small), ) { val textStyle = MaterialTheme.typography.bodyMedium Text( text = history.title, fontWeight = FontWeight.SemiBold, maxLines = 2, overflow = TextOverflow.Ellipsis, style = textStyle, ) val readAt = remember { history.readAt?.toTimestampString() ?: "" } Text( text = if (history.chapterNumber > -1) { stringResource( MR.strings.recent_manga_time, formatChapterNumber(history.chapterNumber), readAt, ) } else { readAt }, modifier = Modifier.padding(top = 4.dp), style = textStyle, ) } if (!history.coverData.isMangaFavorite) { IconButton(onClick = onClickFavorite) { Icon( imageVector = Icons.Outlined.FavoriteBorder, contentDescription = stringResource(MR.strings.add_to_library), tint = MaterialTheme.colorScheme.onSurface, ) } } IconButton(onClick = onClickDelete) { Icon( imageVector = Icons.Outlined.Delete, contentDescription = stringResource(MR.strings.action_delete), tint = MaterialTheme.colorScheme.onSurface, ) } } } @PreviewLightDark @Composable internal fun HistoryItemPreviews( @PreviewParameter(MangaHistoryWithRelationsProvider::class) historyWithRelations: MangaHistoryWithRelations, ) { TachiyomiPreviewTheme { Surface { MangaHistoryItem( history = historyWithRelations, onClickCover = {}, onClickResume = {}, onClickDelete = {}, onClickFavorite = {}, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/history/manga/components/MangaHistoryWithRelationsProvider.kt ================================================ package eu.kanade.presentation.history.manga.components import androidx.compose.ui.tooling.preview.PreviewParameterProvider import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations import java.util.Date internal class MangaHistoryWithRelationsProvider : PreviewParameterProvider { private val simple = MangaHistoryWithRelations( id = 1L, chapterId = 2L, mangaId = 3L, title = "Test Title", chapterNumber = 10.2, readAt = Date(1697247357L), readDuration = 123L, coverData = tachiyomi.domain.entries.manga.model.MangaCover( mangaId = 3L, sourceId = 4L, isMangaFavorite = false, url = "https://example.com/cover.png", lastModified = 5L, ), ) private val historyWithoutReadAt = MangaHistoryWithRelations( id = 1L, chapterId = 2L, mangaId = 3L, title = "Test Title", chapterNumber = 10.2, readAt = null, readDuration = 123L, coverData = tachiyomi.domain.entries.manga.model.MangaCover( mangaId = 3L, sourceId = 4L, isMangaFavorite = false, url = "https://example.com/cover.png", lastModified = 5L, ), ) private val historyWithNegativeChapterNumber = MangaHistoryWithRelations( id = 1L, chapterId = 2L, mangaId = 3L, title = "Test Title", chapterNumber = -2.0, readAt = Date(1697247357L), readDuration = 123L, coverData = tachiyomi.domain.entries.manga.model.MangaCover( mangaId = 3L, sourceId = 4L, isMangaFavorite = false, url = "https://example.com/cover.png", lastModified = 5L, ), ) override val values: Sequence get() = sequenceOf(simple, historyWithoutReadAt, historyWithNegativeChapterNumber) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/DeleteLibraryEntryDialog.kt ================================================ package eu.kanade.presentation.library import androidx.compose.foundation.layout.Column import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import dev.icerock.moko.resources.StringResource import tachiyomi.core.common.preference.CheckboxState import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.i18n.stringResource @Composable fun DeleteLibraryEntryDialog( containsLocalEntry: Boolean, onDismissRequest: () -> Unit, onConfirm: (Boolean, Boolean) -> Unit, isManga: Boolean, ) { var list by remember { mutableStateOf( buildList> { val checkbox1 = if (isManga) AYMR.strings.manga_from_library else AYMR.strings.anime_from_library add(CheckboxState.State.None(checkbox1)) if (!containsLocalEntry) { val checkbox2 = if (isManga) MR.strings.downloaded_chapters else AYMR.strings.downloaded_episodes add(CheckboxState.State.None(checkbox2)) } }, ) } AlertDialog( onDismissRequest = onDismissRequest, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( enabled = list.any { it.isChecked }, onClick = { onDismissRequest() onConfirm( list[0].isChecked, list.getOrElse(1) { CheckboxState.State.None(0) }.isChecked, ) }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, title = { Text(text = stringResource(MR.strings.action_remove)) }, text = { Column { list.forEach { state -> LabeledCheckbox( label = stringResource(state.value), checked = state.isChecked, onCheckedChange = { val index = list.indexOf(state) if (index != -1) { val mutableList = list.toMutableList() mutableList[index] = state.next() as CheckboxState.State list = mutableList.toList() } }, ) } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/anime/AnimeLibraryComfortableGrid.kt ================================================ package eu.kanade.presentation.library.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.grid.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastAny import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryComfortableGridItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.LazyLibraryGrid import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.presentation.library.components.globalSearchItem import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryItem import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.domain.library.anime.LibraryAnime @Composable internal fun AnimeLibraryComfortableGrid( items: List, columns: Int, contentPadding: PaddingValues, selection: List, onClick: (LibraryAnime) -> Unit, onLongClick: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { LazyLibraryGrid( modifier = Modifier.fillMaxSize(), columns = columns, contentPadding = contentPadding, ) { globalSearchItem(searchQuery, onGlobalSearchClicked) items( items = items, contentType = { "anime_library_comfortable_grid_item" }, ) { libraryItem -> val anime = libraryItem.libraryAnime.anime EntryComfortableGridItem( isSelected = selection.fastAny { it.id == libraryItem.libraryAnime.id }, title = anime.title, coverData = AnimeCover( animeId = anime.id, sourceId = anime.source, isAnimeFavorite = anime.favorite, url = anime.thumbnailUrl, lastModified = anime.coverLastModified, ), coverBadgeStart = { DownloadsBadge(count = libraryItem.downloadCount) UnviewedBadge(count = libraryItem.unseenCount) }, coverBadgeEnd = { LanguageBadge( isLocal = libraryItem.isLocal, sourceLanguage = libraryItem.sourceLanguage, ) }, onLongClick = { onLongClick(libraryItem.libraryAnime) }, onClick = { onClick(libraryItem.libraryAnime) }, onClickContinueViewing = if (onClickContinueWatching != null && libraryItem.unseenCount > 0) { { onClickContinueWatching(libraryItem.libraryAnime) } } else { null }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/anime/AnimeLibraryCompactGrid.kt ================================================ package eu.kanade.presentation.library.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.grid.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastAny import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryCompactGridItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.LazyLibraryGrid import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.presentation.library.components.globalSearchItem import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryItem import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.domain.library.anime.LibraryAnime @Composable fun AnimeLibraryCompactGrid( items: List, showTitle: Boolean, columns: Int, contentPadding: PaddingValues, selection: List, onClick: (LibraryAnime) -> Unit, onLongClick: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { LazyLibraryGrid( modifier = Modifier.fillMaxSize(), columns = columns, contentPadding = contentPadding, ) { globalSearchItem(searchQuery, onGlobalSearchClicked) items( items = items, contentType = { "anime_library_compact_grid_item" }, ) { libraryItem -> val anime = libraryItem.libraryAnime.anime EntryCompactGridItem( isSelected = selection.fastAny { it.id == libraryItem.libraryAnime.id }, title = anime.title.takeIf { showTitle }, coverData = AnimeCover( animeId = anime.id, sourceId = anime.source, isAnimeFavorite = anime.favorite, url = anime.thumbnailUrl, lastModified = anime.coverLastModified, ), coverBadgeStart = { DownloadsBadge(count = libraryItem.downloadCount) UnviewedBadge(count = libraryItem.unseenCount) }, coverBadgeEnd = { LanguageBadge( isLocal = libraryItem.isLocal, sourceLanguage = libraryItem.sourceLanguage, ) }, onLongClick = { onLongClick(libraryItem.libraryAnime) }, onClick = { onClick(libraryItem.libraryAnime) }, onClickContinueViewing = if (onClickContinueWatching != null && libraryItem.unseenCount > 0) { { onClickContinueWatching(libraryItem.libraryAnime) } } else { null }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/anime/AnimeLibraryContent.kt ================================================ package eu.kanade.presentation.library.anime import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalLayoutDirection import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.presentation.library.components.LibraryTabs import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryItem import kotlinx.coroutines.delay import kotlinx.coroutines.launch import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.presentation.core.components.material.PullRefresh import kotlin.time.Duration.Companion.seconds @Composable fun AnimeLibraryContent( categories: List, searchQuery: String?, selection: List, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onAnimeClicked: (Long) -> Unit, onContinueWatchingClicked: ((LibraryAnime) -> Unit)?, onToggleSelection: (LibraryAnime) -> Unit, onToggleRangeSelection: (LibraryAnime) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfAnimeForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState, getColumnsForOrientation: (Boolean) -> PreferenceMutableState, getAnimeLibraryForPage: (Int) -> List, ) { Column( modifier = Modifier.padding( top = contentPadding.calculateTopPadding(), start = contentPadding.calculateStartPadding(LocalLayoutDirection.current), end = contentPadding.calculateEndPadding(LocalLayoutDirection.current), ), ) { val coercedCurrentPage = remember { currentPage().coerceAtMost(categories.lastIndex) } val pagerState = rememberPagerState(coercedCurrentPage) { categories.size } val scope = rememberCoroutineScope() var isRefreshing by remember(pagerState.currentPage) { mutableStateOf(false) } if (showPageTabs && categories.size > 1) { LaunchedEffect(categories) { if (categories.size <= pagerState.currentPage) { pagerState.scrollToPage(categories.size - 1) } } LibraryTabs( categories = categories, pagerState = pagerState, getNumberOfItemsForCategory = getNumberOfAnimeForCategory, ) { scope.launch { pagerState.animateScrollToPage(it) } } } val notSelectionMode = selection.isEmpty() val onClickAnime = { anime: LibraryAnime -> if (notSelectionMode) { onAnimeClicked(anime.anime.id) } else { onToggleSelection(anime) } } PullRefresh( refreshing = isRefreshing, onRefresh = { val started = onRefresh(categories[currentPage()]) if (!started) return@PullRefresh scope.launch { // Fake refresh status but hide it after a second as it's a long running task isRefreshing = true delay(1.seconds) isRefreshing = false } }, enabled = notSelectionMode, ) { AnimeLibraryPager( state = pagerState, contentPadding = PaddingValues(bottom = contentPadding.calculateBottomPadding()), hasActiveFilters = hasActiveFilters, selectedAnime = selection, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, getDisplayMode = getDisplayMode, getColumnsForOrientation = getColumnsForOrientation, getLibraryForPage = getAnimeLibraryForPage, onClickAnime = onClickAnime, onLongClickAnime = onToggleRangeSelection, onClickContinueWatching = onContinueWatchingClicked, ) } LaunchedEffect(pagerState.currentPage) { onChangeCurrentPage(pagerState.currentPage) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/anime/AnimeLibraryList.kt ================================================ package eu.kanade.presentation.library.anime import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastAny import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryListItem import eu.kanade.presentation.library.components.GlobalSearchItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryItem import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.util.plus @Composable internal fun AnimeLibraryList( items: List, entries: Int, containerHeight: Int, contentPadding: PaddingValues, selection: List, onClick: (LibraryAnime) -> Unit, onLongClick: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { FastScrollLazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = contentPadding + PaddingValues(vertical = 8.dp), ) { item { if (!searchQuery.isNullOrEmpty()) { GlobalSearchItem( modifier = Modifier.fillMaxWidth(), searchQuery = searchQuery, onClick = onGlobalSearchClicked, ) } } items( items = items, contentType = { "anime_library_list_item" }, ) { libraryItem -> val anime = libraryItem.libraryAnime.anime EntryListItem( isSelected = selection.fastAny { it.id == libraryItem.libraryAnime.id }, title = anime.title, coverData = AnimeCover( animeId = anime.id, sourceId = anime.source, isAnimeFavorite = anime.favorite, url = anime.thumbnailUrl, lastModified = anime.coverLastModified, ), badge = { DownloadsBadge(count = libraryItem.downloadCount) UnviewedBadge(count = libraryItem.unseenCount) LanguageBadge( isLocal = libraryItem.isLocal, sourceLanguage = libraryItem.sourceLanguage, ) }, onLongClick = { onLongClick(libraryItem.libraryAnime) }, onClick = { onClick(libraryItem.libraryAnime) }, onClickContinueViewing = if (onClickContinueWatching != null && libraryItem.unseenCount > 0) { { onClickContinueWatching(libraryItem.libraryAnime) } } else { null }, entries = entries, containerHeight = containerHeight, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/anime/AnimeLibraryPager.kt ================================================ package eu.kanade.presentation.library.anime import android.content.res.Configuration import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.presentation.library.components.GlobalSearchItem import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryItem import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @Composable fun AnimeLibraryPager( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedAnime: List, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState, getColumnsForOrientation: (Boolean) -> PreferenceMutableState, getLibraryForPage: (Int) -> List, onClickAnime: (LibraryAnime) -> Unit, onLongClickAnime: (LibraryAnime) -> Unit, onClickContinueWatching: ((LibraryAnime) -> Unit)?, ) { BoxWithConstraints { val density = LocalDensity.current val containerHeightPx = with(density) { this@BoxWithConstraints.maxHeight.roundToPx() } HorizontalPager( modifier = Modifier.fillMaxSize(), state = state, verticalAlignment = Alignment.Top, ) { page -> if (page !in ((state.currentPage - 1)..(state.currentPage + 1))) { // To make sure only one offscreen page is being composed return@HorizontalPager } val library = getLibraryForPage(page) if (library.isEmpty()) { LibraryPagerEmptyScreen( searchQuery = searchQuery, hasActiveFilters = hasActiveFilters, contentPadding = contentPadding, onGlobalSearchClicked = onGlobalSearchClicked, ) return@HorizontalPager } val displayMode by getDisplayMode(page) val configuration = LocalConfiguration.current val isLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val columns by remember(isLandscape) { getColumnsForOrientation(isLandscape) } when (displayMode) { LibraryDisplayMode.List -> { AnimeLibraryList( items = library, entries = columns, containerHeight = containerHeightPx, contentPadding = contentPadding, selection = selectedAnime, onClick = onClickAnime, onClickContinueWatching = onClickContinueWatching, onLongClick = onLongClickAnime, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, ) } LibraryDisplayMode.CompactGrid, LibraryDisplayMode.CoverOnlyGrid -> { AnimeLibraryCompactGrid( items = library, showTitle = displayMode is LibraryDisplayMode.CompactGrid, columns = columns, contentPadding = contentPadding, selection = selectedAnime, onClick = onClickAnime, onClickContinueWatching = onClickContinueWatching, onLongClick = onLongClickAnime, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, ) } LibraryDisplayMode.ComfortableGrid -> { AnimeLibraryComfortableGrid( items = library, columns = columns, contentPadding = contentPadding, selection = selectedAnime, onClick = onClickAnime, onLongClick = onLongClickAnime, onClickContinueWatching = onClickContinueWatching, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, ) } } } } } @Composable private fun LibraryPagerEmptyScreen( searchQuery: String?, hasActiveFilters: Boolean, contentPadding: PaddingValues, onGlobalSearchClicked: () -> Unit, ) { val msg = when { !searchQuery.isNullOrEmpty() -> MR.strings.no_results_found hasActiveFilters -> MR.strings.error_no_match else -> MR.strings.information_no_manga_category } Column( modifier = Modifier .padding(contentPadding + PaddingValues(8.dp)) .fillMaxSize() .verticalScroll(rememberScrollState()), ) { if (!searchQuery.isNullOrEmpty()) { GlobalSearchItem( modifier = Modifier .fillMaxWidth() .align(Alignment.CenterHorizontally), searchQuery = searchQuery, onClick = onGlobalSearchClicked, ) } EmptyScreen( stringRes = msg, modifier = Modifier.weight(1f), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/anime/AnimeLibrarySettingsDialog.kt ================================================ package eu.kanade.presentation.library.anime import android.content.res.Configuration import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.FilterChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.tachiyomi.ui.library.anime.AnimeLibrarySettingsScreenModel import eu.kanade.tachiyomi.util.system.isReleaseBuildType import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.preference.TriState import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.anime.model.AnimeLibrarySort import tachiyomi.domain.library.anime.model.sort import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.BaseSortItem import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState @Composable fun AnimeLibrarySettingsDialog( onDismissRequest: () -> Unit, screenModel: AnimeLibrarySettingsScreenModel, category: Category?, ) { TabbedDialog( onDismissRequest = onDismissRequest, tabTitles = persistentListOf( stringResource(MR.strings.action_filter), stringResource(MR.strings.action_sort), stringResource(MR.strings.action_display), ), ) { page -> Column( modifier = Modifier .padding(vertical = TabbedDialogPaddings.Vertical) .verticalScroll(rememberScrollState()), ) { when (page) { 0 -> FilterPage( screenModel = screenModel, ) 1 -> SortPage( category = category, screenModel = screenModel, ) 2 -> DisplayPage( screenModel = screenModel, ) } } } } @Composable private fun ColumnScope.FilterPage( screenModel: AnimeLibrarySettingsScreenModel, ) { val filterDownloaded by screenModel.libraryPreferences.filterDownloadedAnime().collectAsState() val downloadedOnly by screenModel.preferences.downloadedOnly().collectAsState() val autoUpdateAnimeRestrictions by screenModel.libraryPreferences.autoUpdateItemRestrictions().collectAsState() TriStateItem( label = stringResource(MR.strings.label_downloaded), state = if (downloadedOnly) { TriState.ENABLED_IS } else { filterDownloaded }, enabled = !downloadedOnly, onClick = { screenModel.toggleFilter(LibraryPreferences::filterDownloadedAnime) }, ) val filterUnseen by screenModel.libraryPreferences.filterUnseen().collectAsState() TriStateItem( label = stringResource(AYMR.strings.action_filter_unseen), state = filterUnseen, onClick = { screenModel.toggleFilter(LibraryPreferences::filterUnseen) }, ) val filterStarted by screenModel.libraryPreferences.filterStartedAnime().collectAsState() TriStateItem( label = stringResource(MR.strings.label_started), state = filterStarted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterStartedAnime) }, ) val filterBookmarked by screenModel.libraryPreferences.filterBookmarkedAnime().collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_bookmarked), state = filterBookmarked, onClick = { screenModel.toggleFilter(LibraryPreferences::filterBookmarkedAnime) }, ) val filterCompleted by screenModel.libraryPreferences.filterCompletedAnime().collectAsState() TriStateItem( label = stringResource(MR.strings.completed), state = filterCompleted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompletedAnime) }, ) // TODO: re-enable when custom intervals are ready for stable if ((!isReleaseBuildType) && LibraryPreferences.ENTRY_OUTSIDE_RELEASE_PERIOD in autoUpdateAnimeRestrictions) { val filterIntervalCustom by screenModel.libraryPreferences.filterIntervalCustom().collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_interval_custom), state = filterIntervalCustom, onClick = { screenModel.toggleFilter(LibraryPreferences::filterIntervalCustom) }, ) } val trackers by screenModel.trackersFlow.collectAsState() when (trackers.size) { 0 -> { // No trackers } 1 -> { val service = trackers[0] val filterTracker by screenModel.libraryPreferences.filterTrackedAnime( service.id.toInt(), ).collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_tracked), state = filterTracker, onClick = { screenModel.toggleTracker(service.id.toInt()) }, ) } else -> { HeadingItem(MR.strings.action_filter_tracked) trackers.map { service -> val filterTracker by screenModel.libraryPreferences.filterTrackedAnime( service.id.toInt(), ).collectAsState() TriStateItem( label = service.name, state = filterTracker, onClick = { screenModel.toggleTracker(service.id.toInt()) }, ) } } } } @Composable private fun ColumnScope.SortPage( category: Category?, screenModel: AnimeLibrarySettingsScreenModel, ) { val trackers by screenModel.trackersFlow.collectAsState() val sortingMode = category.sort.type val sortDescending = !category.sort.isAscending val options = remember(trackers.isEmpty()) { val trackerMeanPair = if (trackers.isNotEmpty()) { MR.strings.action_sort_tracker_score to AnimeLibrarySort.Type.TrackerMean } else { null } listOfNotNull( MR.strings.action_sort_alpha to AnimeLibrarySort.Type.Alphabetical, AYMR.strings.action_sort_total_episodes to AnimeLibrarySort.Type.TotalEpisodes, AYMR.strings.action_sort_last_seen to AnimeLibrarySort.Type.LastSeen, AYMR.strings.action_sort_last_anime_update to AnimeLibrarySort.Type.LastUpdate, AYMR.strings.action_sort_unseen_count to AnimeLibrarySort.Type.UnseenCount, AYMR.strings.action_sort_latest_episode to AnimeLibrarySort.Type.LatestEpisode, AYMR.strings.action_sort_episode_fetch_date to AnimeLibrarySort.Type.EpisodeFetchDate, MR.strings.action_sort_date_added to AnimeLibrarySort.Type.DateAdded, trackerMeanPair, AYMR.strings.action_sort_airing_time to AnimeLibrarySort.Type.AiringTime, MR.strings.action_sort_random to AnimeLibrarySort.Type.Random, ) } options.map { (titleRes, mode) -> if (mode == AnimeLibrarySort.Type.Random) { BaseSortItem( label = stringResource(titleRes), icon = Icons.Default.Refresh .takeIf { sortingMode == AnimeLibrarySort.Type.Random }, onClick = { screenModel.setSort(category, mode, AnimeLibrarySort.Direction.Ascending) }, ) return@map } SortItem( label = stringResource(titleRes), sortDescending = sortDescending.takeIf { sortingMode == mode }, onClick = { val isTogglingDirection = sortingMode == mode val direction = when { isTogglingDirection -> if (sortDescending) { AnimeLibrarySort.Direction.Ascending } else { AnimeLibrarySort.Direction.Descending } else -> if (sortDescending) { AnimeLibrarySort.Direction.Descending } else { AnimeLibrarySort.Direction.Ascending } } screenModel.setSort(category, mode, direction) }, ) } } private val displayModes = listOf( MR.strings.action_display_grid to LibraryDisplayMode.CompactGrid, MR.strings.action_display_comfortable_grid to LibraryDisplayMode.ComfortableGrid, MR.strings.action_display_cover_only_grid to LibraryDisplayMode.CoverOnlyGrid, MR.strings.action_display_list to LibraryDisplayMode.List, ) @Composable private fun ColumnScope.DisplayPage( screenModel: AnimeLibrarySettingsScreenModel, ) { val displayMode by screenModel.libraryPreferences.displayMode().collectAsState() SettingsChipRow(MR.strings.action_display_mode) { displayModes.map { (titleRes, mode) -> FilterChip( selected = displayMode == mode, onClick = { screenModel.setDisplayMode(mode) }, label = { Text(stringResource(titleRes)) }, ) } } val configuration = LocalConfiguration.current val columnPreference = remember { if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { screenModel.libraryPreferences.animeLandscapeColumns() } else { screenModel.libraryPreferences.animePortraitColumns() } } val columns by columnPreference.collectAsState() if (displayMode == LibraryDisplayMode.List) { SliderItem( value = columns, valueRange = 0..10, label = stringResource(AYMR.strings.pref_library_rows), valueText = if (columns > 0) { columns.toString() } else { stringResource(MR.strings.label_auto) }, onChange = columnPreference::set, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } else { SliderItem( value = columns, valueRange = 0..10, label = stringResource(MR.strings.pref_library_columns), valueText = if (columns > 0) { columns.toString() } else { stringResource(MR.strings.label_auto) }, onChange = columnPreference::set, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } HeadingItem(MR.strings.overlay_header) CheckboxItem( label = stringResource(AYMR.strings.action_display_download_badge_anime), pref = screenModel.libraryPreferences.downloadBadge(), ) CheckboxItem( label = stringResource(AYMR.strings.action_display_unseen_badge), pref = screenModel.libraryPreferences.unreadBadge(), ) CheckboxItem( label = stringResource(MR.strings.action_display_local_badge), pref = screenModel.libraryPreferences.localBadge(), ) CheckboxItem( label = stringResource(MR.strings.action_display_language_badge), pref = screenModel.libraryPreferences.languageBadge(), ) CheckboxItem( label = stringResource(AYMR.strings.action_display_show_continue_reading_button), pref = screenModel.libraryPreferences.showContinueViewingButton(), ) HeadingItem(MR.strings.tabs_header) CheckboxItem( label = stringResource(MR.strings.action_display_show_tabs), pref = screenModel.libraryPreferences.categoryTabs(), ) CheckboxItem( label = stringResource(MR.strings.action_display_show_number_of_items), pref = screenModel.libraryPreferences.categoryNumberOfItems(), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/components/CommonEntryItem.kt ================================================ package eu.kanade.presentation.library.components import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material3.FilledIconButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.entries.components.ItemCover import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.BadgeGroup import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground import tachiyomi.domain.entries.EntryCover as EntryCoverModel object CommonEntryItemDefaults { val GridHorizontalSpacer = 4.dp val GridVerticalSpacer = 4.dp @Suppress("ConstPropertyName") const val BrowseFavoriteCoverAlpha = 0.34f } private val ContinueViewingButtonSizeSmall = 28.dp private val ContinueViewingButtonSizeLarge = 32.dp private val ContinueViewingButtonIconSizeSmall = 16.dp private val ContinueViewingButtonIconSizeLarge = 20.dp private val ContinueViewingButtonGridPadding = 6.dp private val ContinueViewingButtonListSpacing = 8.dp private const val GRID_SELECTED_COVER_ALPHA = 0.76f /** * Layout of grid list item with title overlaying the cover. * Accepts null [title] for a cover-only view. */ @Composable fun EntryCompactGridItem( coverData: EntryCoverModel, onClick: () -> Unit, onLongClick: () -> Unit, isSelected: Boolean = false, title: String? = null, onClickContinueViewing: (() -> Unit)? = null, coverAlpha: Float = 1f, coverBadgeStart: @Composable (RowScope.() -> Unit)? = null, coverBadgeEnd: @Composable (RowScope.() -> Unit)? = null, ) { GridItemSelectable( isSelected = isSelected, onClick = onClick, onLongClick = onLongClick, ) { EntryGridCover( cover = { ItemCover.Book( modifier = Modifier .fillMaxWidth() .alpha(if (isSelected) GRID_SELECTED_COVER_ALPHA else coverAlpha), data = coverData, ) }, badgesStart = coverBadgeStart, badgesEnd = coverBadgeEnd, content = { if (title != null) { CoverTextOverlay( title = title, onClickContinueViewing = onClickContinueViewing, ) } else if (onClickContinueViewing != null) { ContinueViewingButton( size = ContinueViewingButtonSizeLarge, iconSize = ContinueViewingButtonIconSizeLarge, onClick = onClickContinueViewing, modifier = Modifier .padding(ContinueViewingButtonGridPadding) .align(Alignment.BottomEnd), ) } }, ) } } /** * Title overlay for [EntryCompactGridItem] */ @Composable private fun BoxScope.CoverTextOverlay( title: String, onClickContinueViewing: (() -> Unit)? = null, ) { Box( modifier = Modifier .clip(RoundedCornerShape(bottomStart = 4.dp, bottomEnd = 4.dp)) .background( Brush.verticalGradient( 0f to Color.Transparent, 1f to Color(0xAA000000), ), ) .fillMaxHeight(0.33f) .fillMaxWidth() .align(Alignment.BottomCenter), ) Row( modifier = Modifier.align(Alignment.BottomStart), verticalAlignment = Alignment.Bottom, ) { GridItemTitle( modifier = Modifier .weight(1f) .padding(8.dp), title = title, style = MaterialTheme.typography.titleSmall.copy( color = Color.White, shadow = Shadow( color = Color.Black, blurRadius = 4f, ), ), minLines = 1, ) if (onClickContinueViewing != null) { ContinueViewingButton( size = ContinueViewingButtonSizeSmall, iconSize = ContinueViewingButtonIconSizeSmall, onClick = onClickContinueViewing, modifier = Modifier.padding( end = ContinueViewingButtonGridPadding, bottom = ContinueViewingButtonGridPadding, ), ) } } } /** * Layout of grid list item with title below the cover. */ @Composable fun EntryComfortableGridItem( isSelected: Boolean = false, title: String, onClick: () -> Unit, onLongClick: () -> Unit, titleMaxLines: Int = 2, coverData: EntryCoverModel, coverAlpha: Float = 1f, coverBadgeStart: (@Composable RowScope.() -> Unit)? = null, coverBadgeEnd: (@Composable RowScope.() -> Unit)? = null, onClickContinueViewing: (() -> Unit)? = null, ) { GridItemSelectable( isSelected = isSelected, onClick = onClick, onLongClick = onLongClick, ) { Column { EntryGridCover( cover = { ItemCover.Book( modifier = Modifier .fillMaxWidth() .alpha(if (isSelected) GRID_SELECTED_COVER_ALPHA else coverAlpha), data = coverData, ) }, badgesStart = coverBadgeStart, badgesEnd = coverBadgeEnd, content = { if (onClickContinueViewing != null) { ContinueViewingButton( size = ContinueViewingButtonSizeLarge, iconSize = ContinueViewingButtonIconSizeLarge, onClick = onClickContinueViewing, modifier = Modifier .padding(ContinueViewingButtonGridPadding) .align(Alignment.BottomEnd), ) } }, ) GridItemTitle( modifier = Modifier.padding(4.dp), title = title, style = MaterialTheme.typography.titleSmall, minLines = 2, maxLines = titleMaxLines, ) } } } /** * Common cover layout to add contents to be drawn on top of the cover. */ @Composable private fun EntryGridCover( modifier: Modifier = Modifier, cover: @Composable BoxScope.() -> Unit = {}, badgesStart: (@Composable RowScope.() -> Unit)? = null, badgesEnd: (@Composable RowScope.() -> Unit)? = null, content: @Composable (BoxScope.() -> Unit)? = null, ) { Box( modifier = modifier .fillMaxWidth() .aspectRatio(ItemCover.Book.ratio), ) { cover() content?.invoke(this) if (badgesStart != null) { BadgeGroup( modifier = Modifier .padding(4.dp) .align(Alignment.TopStart), content = badgesStart, ) } if (badgesEnd != null) { BadgeGroup( modifier = Modifier .padding(4.dp) .align(Alignment.TopEnd), content = badgesEnd, ) } } } @Composable private fun GridItemTitle( title: String, style: TextStyle, minLines: Int, modifier: Modifier = Modifier, maxLines: Int = 2, ) { Text( modifier = modifier, text = title, fontSize = 12.sp, lineHeight = 18.sp, minLines = minLines, maxLines = maxLines, overflow = TextOverflow.Ellipsis, style = style, ) } /** * Wrapper for grid items to handle selection state, click and long click. */ @Composable private fun GridItemSelectable( isSelected: Boolean, onClick: () -> Unit, onLongClick: () -> Unit, modifier: Modifier = Modifier, content: @Composable () -> Unit, ) { Box( modifier = modifier .clip(MaterialTheme.shapes.small) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .selectedOutline(isSelected = isSelected, color = MaterialTheme.colorScheme.secondary) .padding(4.dp), ) { val contentColor = if (isSelected) { MaterialTheme.colorScheme.onSecondary } else { LocalContentColor.current } CompositionLocalProvider(LocalContentColor provides contentColor) { content() } } } /** * @see GridItemSelectable */ private fun Modifier.selectedOutline( isSelected: Boolean, color: Color, ) = drawBehind { if (isSelected) drawRect(color = color) } /** * Layout of list item. */ @Composable fun EntryListItem( isSelected: Boolean = false, title: String, coverData: EntryCoverModel, coverAlpha: Float = 1f, onLongClick: () -> Unit, onClick: () -> Unit, badge: @Composable (RowScope.() -> Unit), onClickContinueViewing: (() -> Unit)? = null, entries: Int = 0, containerHeight: Int = 0, modifier: Modifier = Modifier, ) { Row( modifier = modifier .selectedBackground(isSelected) .height( when (entries) { 0 -> 76.dp else -> { val density = LocalDensity.current with(density) { (containerHeight / entries).toDp() } - (3 / entries).dp } }, ) .combinedClickable( onClick = onClick, onLongClick = onLongClick, ) .padding(horizontal = 16.dp, vertical = 3.dp), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Book( modifier = Modifier .fillMaxHeight() .alpha(coverAlpha), data = coverData, ) Text( text = title, modifier = Modifier .padding(horizontal = 16.dp) .weight(1f), overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) BadgeGroup(content = badge) if (onClickContinueViewing != null) { ContinueViewingButton( size = ContinueViewingButtonSizeSmall, iconSize = ContinueViewingButtonIconSizeSmall, onClick = onClickContinueViewing, modifier = Modifier.padding(start = ContinueViewingButtonListSpacing), ) } } } @Composable private fun ContinueViewingButton( size: Dp, iconSize: Dp, onClick: () -> Unit, modifier: Modifier = Modifier, ) { Box(modifier = modifier) { FilledIconButton( onClick = onClick, shape = MaterialTheme.shapes.small, colors = IconButtonDefaults.filledIconButtonColors( containerColor = MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.9f), contentColor = contentColorFor(MaterialTheme.colorScheme.primaryContainer), ), modifier = Modifier.size(size), ) { Icon( imageVector = Icons.Filled.PlayArrow, contentDescription = stringResource(MR.strings.action_resume), modifier = Modifier.size(iconSize), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/components/GlobalSearchItem.kt ================================================ package eu.kanade.presentation.library.components import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.zIndex import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable internal fun GlobalSearchItem( searchQuery: String, onClick: () -> Unit, modifier: Modifier = Modifier, ) { TextButton( modifier = modifier, onClick = onClick, ) { Text( text = stringResource(MR.strings.action_global_search_query, searchQuery), modifier = Modifier.zIndex(99f), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/components/LazyLibraryGrid.kt ================================================ package eu.kanade.presentation.library.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import tachiyomi.presentation.core.components.FastScrollLazyVerticalGrid import tachiyomi.presentation.core.util.plus @Composable internal fun LazyLibraryGrid( modifier: Modifier = Modifier, columns: Int, contentPadding: PaddingValues, content: LazyGridScope.() -> Unit, ) { FastScrollLazyVerticalGrid( columns = if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns), modifier = modifier, contentPadding = contentPadding + PaddingValues(8.dp), verticalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridVerticalSpacer), horizontalArrangement = Arrangement.spacedBy(CommonEntryItemDefaults.GridHorizontalSpacer), content = content, ) } fun LazyGridScope.globalSearchItem( searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { if (!searchQuery.isNullOrEmpty()) { item( span = { GridItemSpan(maxLineSpan) }, contentType = { "library_global_search_item" }, ) { GlobalSearchItem( searchQuery = searchQuery, onClick = onGlobalSearchClicked, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/components/LibraryBadges.kt ================================================ package eu.kanade.presentation.library.components import androidx.compose.foundation.layout.Column import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Folder import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.presentation.core.components.Badge @Composable internal fun DownloadsBadge(count: Long) { if (count > 0) { Badge( text = "$count", color = MaterialTheme.colorScheme.tertiary, textColor = MaterialTheme.colorScheme.onTertiary, ) } } @Composable internal fun UnviewedBadge(count: Long) { if (count > 0) { Badge(text = "$count") } } @Composable internal fun LanguageBadge( isLocal: Boolean, sourceLanguage: String, ) { if (isLocal) { Badge( imageVector = Icons.Outlined.Folder, color = MaterialTheme.colorScheme.tertiary, iconColor = MaterialTheme.colorScheme.onTertiary, ) } else if (sourceLanguage.isNotEmpty()) { Badge( text = sourceLanguage.uppercase(), color = MaterialTheme.colorScheme.tertiary, textColor = MaterialTheme.colorScheme.onTertiary, ) } } @PreviewLightDark @Composable private fun BadgePreview() { TachiyomiPreviewTheme { Column { DownloadsBadge(count = 10) UnviewedBadge(count = 10) LanguageBadge(isLocal = true, sourceLanguage = "EN") LanguageBadge(isLocal = false, sourceLanguage = "EN") } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/components/LibraryTabs.kt ================================================ package eu.kanade.presentation.library.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.pager.PagerState import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.Tab import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import eu.kanade.presentation.category.visualName import tachiyomi.domain.category.model.Category import tachiyomi.presentation.core.components.material.TabText @Composable internal fun LibraryTabs( categories: List, pagerState: PagerState, getNumberOfItemsForCategory: (Category) -> Int?, onTabItemClick: (Int) -> Unit, ) { val currentPageIndex = pagerState.currentPage.coerceAtMost(categories.lastIndex) Column( modifier = Modifier.zIndex(1f), ) { PrimaryScrollableTabRow( selectedTabIndex = currentPageIndex, edgePadding = 0.dp, // TODO: use default when width is fixed upstream // https://issuetracker.google.com/issues/242879624 divider = {}, ) { categories.forEachIndexed { index, category -> Tab( selected = currentPageIndex == index, onClick = { onTabItemClick(index) }, text = { TabText( text = category.visualName, badgeCount = getNumberOfItemsForCategory(category), ) }, unselectedContentColor = MaterialTheme.colorScheme.onSurface, ) } } HorizontalDivider() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/components/LibraryToolbar.kt ================================================ package eu.kanade.presentation.library.components import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Row import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.FlipToBack import androidx.compose.material.icons.outlined.SelectAll import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.sp import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.SearchToolbar import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.Pill import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.active @Composable fun LibraryToolbar( hasActiveFilters: Boolean, selectedCount: Int, title: LibraryToolbarTitle, onClickUnselectAll: () -> Unit, onClickSelectAll: () -> Unit, onClickInvertSelection: () -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, onClickGlobalUpdate: () -> Unit, onClickOpenRandomEntry: () -> Unit, searchQuery: String?, onSearchQueryChange: (String?) -> Unit, scrollBehavior: TopAppBarScrollBehavior?, navigateUp: (() -> Unit)? = null, ) = when { selectedCount > 0 -> LibrarySelectionToolbar( selectedCount = selectedCount, onClickUnselectAll = onClickUnselectAll, onClickSelectAll = onClickSelectAll, onClickInvertSelection = onClickInvertSelection, ) else -> LibraryRegularToolbar( title = title, hasFilters = hasActiveFilters, searchQuery = searchQuery, onSearchQueryChange = onSearchQueryChange, onClickFilter = onClickFilter, onClickRefresh = onClickRefresh, onClickGlobalUpdate = onClickGlobalUpdate, onClickOpenRandomEntry = onClickOpenRandomEntry, scrollBehavior = scrollBehavior, navigateUp = navigateUp, ) } @Composable private fun LibraryRegularToolbar( title: LibraryToolbarTitle, hasFilters: Boolean, searchQuery: String?, onSearchQueryChange: (String?) -> Unit, onClickFilter: () -> Unit, onClickRefresh: () -> Unit, onClickGlobalUpdate: () -> Unit, onClickOpenRandomEntry: () -> Unit, scrollBehavior: TopAppBarScrollBehavior?, navigateUp: (() -> Unit)?, ) { val pillAlpha = if (isSystemInDarkTheme()) 0.12f else 0.08f SearchToolbar( titleContent = { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = title.text, maxLines = 1, modifier = Modifier.weight(1f, false), overflow = TextOverflow.Ellipsis, ) if (title.numberOfEntries != null) { Pill( text = "${title.numberOfEntries}", color = MaterialTheme.colorScheme.onBackground.copy(alpha = pillAlpha), fontSize = 14.sp, ) } } }, searchQuery = searchQuery, onChangeSearchQuery = onSearchQueryChange, actions = { val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_filter), icon = Icons.Outlined.FilterList, iconTint = filterTint, onClick = onClickFilter, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_update_library), onClick = onClickGlobalUpdate, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_update_category), onClick = onClickRefresh, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_open_random_manga), onClick = onClickOpenRandomEntry, ), ), ) }, scrollBehavior = scrollBehavior, navigateUp = navigateUp, ) } @Composable private fun LibrarySelectionToolbar( selectedCount: Int, onClickUnselectAll: () -> Unit, onClickSelectAll: () -> Unit, onClickInvertSelection: () -> Unit, ) { AppBar( titleContent = { Text(text = "$selectedCount") }, actions = { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.SelectAll, onClick = onClickSelectAll, ), AppBar.Action( title = stringResource(MR.strings.action_select_inverse), icon = Icons.Outlined.FlipToBack, onClick = onClickInvertSelection, ), ), ) }, isActionMode = true, onCancelActionMode = onClickUnselectAll, ) } @Immutable data class LibraryToolbarTitle( val text: String, val numberOfEntries: Int? = null, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/manga/MangaLibraryComfortableGrid.kt ================================================ package eu.kanade.presentation.library.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.grid.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastAny import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryComfortableGridItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.LazyLibraryGrid import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.presentation.library.components.globalSearchItem import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryItem import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.domain.library.manga.LibraryManga @Composable internal fun MangaLibraryComfortableGrid( items: List, columns: Int, contentPadding: PaddingValues, selection: List, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { LazyLibraryGrid( modifier = Modifier.fillMaxSize(), columns = columns, contentPadding = contentPadding, ) { globalSearchItem(searchQuery, onGlobalSearchClicked) items( items = items, contentType = { "manga_library_comfortable_grid_item" }, ) { libraryItem -> val manga = libraryItem.libraryManga.manga EntryComfortableGridItem( isSelected = selection.fastAny { it.id == libraryItem.libraryManga.id }, title = manga.title, coverData = MangaCover( mangaId = manga.id, sourceId = manga.source, isMangaFavorite = manga.favorite, url = manga.thumbnailUrl, lastModified = manga.coverLastModified, ), coverBadgeStart = { DownloadsBadge(count = libraryItem.downloadCount) UnviewedBadge(count = libraryItem.unreadCount) }, coverBadgeEnd = { LanguageBadge( isLocal = libraryItem.isLocal, sourceLanguage = libraryItem.sourceLanguage, ) }, onLongClick = { onLongClick(libraryItem.libraryManga) }, onClick = { onClick(libraryItem.libraryManga) }, onClickContinueViewing = if (onClickContinueReading != null && libraryItem.unreadCount > 0) { { onClickContinueReading(libraryItem.libraryManga) } } else { null }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/manga/MangaLibraryCompactGrid.kt ================================================ package eu.kanade.presentation.library.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.grid.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastAny import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryCompactGridItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.LazyLibraryGrid import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.presentation.library.components.globalSearchItem import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryItem import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.domain.library.manga.LibraryManga @Composable internal fun MangaLibraryCompactGrid( items: List, showTitle: Boolean, columns: Int, contentPadding: PaddingValues, selection: List, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { LazyLibraryGrid( modifier = Modifier.fillMaxSize(), columns = columns, contentPadding = contentPadding, ) { globalSearchItem(searchQuery, onGlobalSearchClicked) items( items = items, contentType = { "manga_library_compact_grid_item" }, ) { libraryItem -> val manga = libraryItem.libraryManga.manga EntryCompactGridItem( isSelected = selection.fastAny { it.id == libraryItem.libraryManga.id }, title = manga.title.takeIf { showTitle }, coverData = MangaCover( mangaId = manga.id, sourceId = manga.source, isMangaFavorite = manga.favorite, url = manga.thumbnailUrl, lastModified = manga.coverLastModified, ), coverBadgeStart = { DownloadsBadge(count = libraryItem.downloadCount) UnviewedBadge(count = libraryItem.unreadCount) }, coverBadgeEnd = { LanguageBadge( isLocal = libraryItem.isLocal, sourceLanguage = libraryItem.sourceLanguage, ) }, onLongClick = { onLongClick(libraryItem.libraryManga) }, onClick = { onClick(libraryItem.libraryManga) }, onClickContinueViewing = if (onClickContinueReading != null && libraryItem.unreadCount > 0) { { onClickContinueReading(libraryItem.libraryManga) } } else { null }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/manga/MangaLibraryContent.kt ================================================ package eu.kanade.presentation.library.manga import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalLayoutDirection import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.presentation.library.components.LibraryTabs import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryItem import kotlinx.coroutines.delay import kotlinx.coroutines.launch import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.presentation.core.components.material.PullRefresh import kotlin.time.Duration.Companion.seconds @Composable fun MangaLibraryContent( categories: List, searchQuery: String?, selection: List, contentPadding: PaddingValues, currentPage: () -> Int, hasActiveFilters: Boolean, showPageTabs: Boolean, onChangeCurrentPage: (Int) -> Unit, onMangaClicked: (Long) -> Unit, onContinueReadingClicked: ((LibraryManga) -> Unit)?, onToggleSelection: (LibraryManga) -> Unit, onToggleRangeSelection: (LibraryManga) -> Unit, onRefresh: (Category?) -> Boolean, onGlobalSearchClicked: () -> Unit, getNumberOfMangaForCategory: (Category) -> Int?, getDisplayMode: (Int) -> PreferenceMutableState, getColumnsForOrientation: (Boolean) -> PreferenceMutableState, getLibraryForPage: (Int) -> List, ) { Column( modifier = Modifier.padding( top = contentPadding.calculateTopPadding(), start = contentPadding.calculateStartPadding(LocalLayoutDirection.current), end = contentPadding.calculateEndPadding(LocalLayoutDirection.current), ), ) { val coercedCurrentPage = remember { currentPage().coerceAtMost(categories.lastIndex) } val pagerState = rememberPagerState(coercedCurrentPage) { categories.size } val scope = rememberCoroutineScope() var isRefreshing by remember(pagerState.currentPage) { mutableStateOf(false) } if (showPageTabs && categories.size > 1) { LaunchedEffect(categories) { if (categories.size <= pagerState.currentPage) { pagerState.scrollToPage(categories.size - 1) } } LibraryTabs( categories = categories, pagerState = pagerState, getNumberOfItemsForCategory = getNumberOfMangaForCategory, ) { scope.launch { pagerState.animateScrollToPage(it) } } } val notSelectionMode = selection.isEmpty() val onClickManga = { manga: LibraryManga -> if (notSelectionMode) { onMangaClicked(manga.manga.id) } else { onToggleSelection(manga) } } PullRefresh( refreshing = isRefreshing, onRefresh = { val started = onRefresh(categories[currentPage()]) if (!started) return@PullRefresh scope.launch { // Fake refresh status but hide it after a second as it's a long running task isRefreshing = true delay(1.seconds) isRefreshing = false } }, enabled = notSelectionMode, ) { MangaLibraryPager( state = pagerState, contentPadding = PaddingValues(bottom = contentPadding.calculateBottomPadding()), hasActiveFilters = hasActiveFilters, selectedManga = selection, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, getDisplayMode = getDisplayMode, getColumnsForOrientation = getColumnsForOrientation, getLibraryForPage = getLibraryForPage, onClickManga = onClickManga, onLongClickManga = onToggleRangeSelection, onClickContinueReading = onContinueReadingClicked, ) } LaunchedEffect(pagerState.currentPage) { onChangeCurrentPage(pagerState.currentPage) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/manga/MangaLibraryList.kt ================================================ package eu.kanade.presentation.library.manga import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastAny import eu.kanade.presentation.library.components.DownloadsBadge import eu.kanade.presentation.library.components.EntryListItem import eu.kanade.presentation.library.components.GlobalSearchItem import eu.kanade.presentation.library.components.LanguageBadge import eu.kanade.presentation.library.components.UnviewedBadge import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryItem import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.util.plus @Composable internal fun MangaLibraryList( items: List, entries: Int, containerHeight: Int, contentPadding: PaddingValues, selection: List, onClick: (LibraryManga) -> Unit, onLongClick: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, searchQuery: String?, onGlobalSearchClicked: () -> Unit, ) { FastScrollLazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = contentPadding + PaddingValues(vertical = 8.dp), ) { item { if (!searchQuery.isNullOrEmpty()) { GlobalSearchItem( modifier = Modifier.fillMaxWidth(), searchQuery = searchQuery, onClick = onGlobalSearchClicked, ) } } items( items = items, contentType = { "manga_library_list_item" }, ) { libraryItem -> val manga = libraryItem.libraryManga.manga EntryListItem( isSelected = selection.fastAny { it.id == libraryItem.libraryManga.id }, title = manga.title, coverData = MangaCover( mangaId = manga.id, sourceId = manga.source, isMangaFavorite = manga.favorite, url = manga.thumbnailUrl, lastModified = manga.coverLastModified, ), badge = { DownloadsBadge(count = libraryItem.downloadCount) UnviewedBadge(count = libraryItem.unreadCount) LanguageBadge( isLocal = libraryItem.isLocal, sourceLanguage = libraryItem.sourceLanguage, ) }, onLongClick = { onLongClick(libraryItem.libraryManga) }, onClick = { onClick(libraryItem.libraryManga) }, onClickContinueViewing = if (onClickContinueReading != null && libraryItem.unreadCount > 0) { { onClickContinueReading(libraryItem.libraryManga) } } else { null }, entries = entries, containerHeight = containerHeight, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/manga/MangaLibraryPager.kt ================================================ package eu.kanade.presentation.library.manga import android.content.res.Configuration import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.presentation.library.components.GlobalSearchItem import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryItem import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @Composable fun MangaLibraryPager( state: PagerState, contentPadding: PaddingValues, hasActiveFilters: Boolean, selectedManga: List, searchQuery: String?, onGlobalSearchClicked: () -> Unit, getDisplayMode: (Int) -> PreferenceMutableState, getColumnsForOrientation: (Boolean) -> PreferenceMutableState, getLibraryForPage: (Int) -> List, onClickManga: (LibraryManga) -> Unit, onLongClickManga: (LibraryManga) -> Unit, onClickContinueReading: ((LibraryManga) -> Unit)?, ) { BoxWithConstraints { val density = LocalDensity.current val containerHeightPx = with(density) { this@BoxWithConstraints.maxHeight.roundToPx() } HorizontalPager( modifier = Modifier.fillMaxSize(), state = state, verticalAlignment = Alignment.Top, ) { page -> if (page !in ((state.currentPage - 1)..(state.currentPage + 1))) { // To make sure only one offscreen page is being composed return@HorizontalPager } val library = getLibraryForPage(page) if (library.isEmpty()) { LibraryPagerEmptyScreen( searchQuery = searchQuery, hasActiveFilters = hasActiveFilters, contentPadding = contentPadding, onGlobalSearchClicked = onGlobalSearchClicked, ) return@HorizontalPager } val displayMode by getDisplayMode(page) val configuration = LocalConfiguration.current val isLandscape = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE val columns by remember(isLandscape) { getColumnsForOrientation(isLandscape) } when (displayMode) { LibraryDisplayMode.List -> { MangaLibraryList( items = library, entries = columns, containerHeight = containerHeightPx, contentPadding = contentPadding, selection = selectedManga, onClick = onClickManga, onLongClick = onLongClickManga, onClickContinueReading = onClickContinueReading, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, ) } LibraryDisplayMode.CompactGrid, LibraryDisplayMode.CoverOnlyGrid -> { MangaLibraryCompactGrid( items = library, showTitle = displayMode is LibraryDisplayMode.CompactGrid, columns = columns, contentPadding = contentPadding, selection = selectedManga, onClick = onClickManga, onLongClick = onLongClickManga, onClickContinueReading = onClickContinueReading, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, ) } LibraryDisplayMode.ComfortableGrid -> { MangaLibraryComfortableGrid( items = library, columns = columns, contentPadding = contentPadding, selection = selectedManga, onClick = onClickManga, onLongClick = onLongClickManga, onClickContinueReading = onClickContinueReading, searchQuery = searchQuery, onGlobalSearchClicked = onGlobalSearchClicked, ) } } } } } @Composable private fun LibraryPagerEmptyScreen( searchQuery: String?, hasActiveFilters: Boolean, contentPadding: PaddingValues, onGlobalSearchClicked: () -> Unit, ) { val msg = when { !searchQuery.isNullOrEmpty() -> MR.strings.no_results_found hasActiveFilters -> MR.strings.error_no_match else -> MR.strings.information_no_manga_category } Column( modifier = Modifier .padding(contentPadding + PaddingValues(8.dp)) .fillMaxSize() .verticalScroll(rememberScrollState()), ) { if (!searchQuery.isNullOrEmpty()) { GlobalSearchItem( modifier = Modifier .fillMaxWidth() .align(Alignment.CenterHorizontally), searchQuery = searchQuery, onClick = onGlobalSearchClicked, ) } EmptyScreen( stringRes = msg, modifier = Modifier.weight(1f), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/library/manga/MangaLibrarySettingsDialog.kt ================================================ package eu.kanade.presentation.library.manga import android.content.res.Configuration import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.FilterChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.tachiyomi.ui.library.manga.MangaLibrarySettingsScreenModel import eu.kanade.tachiyomi.util.system.isReleaseBuildType import kotlinx.collections.immutable.persistentListOf import tachiyomi.core.common.preference.TriState import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.manga.model.MangaLibrarySort import tachiyomi.domain.library.manga.model.sort import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.BaseSortItem import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState @Composable fun MangaLibrarySettingsDialog( onDismissRequest: () -> Unit, screenModel: MangaLibrarySettingsScreenModel, category: Category?, ) { TabbedDialog( onDismissRequest = onDismissRequest, tabTitles = persistentListOf( stringResource(MR.strings.action_filter), stringResource(MR.strings.action_sort), stringResource(MR.strings.action_display), ), ) { page -> Column( modifier = Modifier .padding(vertical = TabbedDialogPaddings.Vertical) .verticalScroll(rememberScrollState()), ) { when (page) { 0 -> FilterPage( screenModel = screenModel, ) 1 -> SortPage( category = category, screenModel = screenModel, ) 2 -> DisplayPage( screenModel = screenModel, ) } } } } @Composable private fun ColumnScope.FilterPage( screenModel: MangaLibrarySettingsScreenModel, ) { val filterDownloaded by screenModel.libraryPreferences.filterDownloadedManga().collectAsState() val downloadedOnly by screenModel.preferences.downloadedOnly().collectAsState() val autoUpdateMangaRestrictions by screenModel.libraryPreferences.autoUpdateItemRestrictions().collectAsState() TriStateItem( label = stringResource(MR.strings.label_downloaded), state = if (downloadedOnly) { TriState.ENABLED_IS } else { filterDownloaded }, enabled = !downloadedOnly, onClick = { screenModel.toggleFilter(LibraryPreferences::filterDownloadedManga) }, ) val filterUnread by screenModel.libraryPreferences.filterUnread().collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_unread), state = filterUnread, onClick = { screenModel.toggleFilter(LibraryPreferences::filterUnread) }, ) val filterStarted by screenModel.libraryPreferences.filterStartedManga().collectAsState() TriStateItem( label = stringResource(MR.strings.label_started), state = filterStarted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterStartedManga) }, ) val filterBookmarked by screenModel.libraryPreferences.filterBookmarkedManga().collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_bookmarked), state = filterBookmarked, onClick = { screenModel.toggleFilter(LibraryPreferences::filterBookmarkedManga) }, ) val filterCompleted by screenModel.libraryPreferences.filterCompletedManga().collectAsState() TriStateItem( label = stringResource(MR.strings.completed), state = filterCompleted, onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompletedManga) }, ) // TODO: re-enable when custom intervals are ready for stable if ((!isReleaseBuildType) && LibraryPreferences.ENTRY_OUTSIDE_RELEASE_PERIOD in autoUpdateMangaRestrictions) { val filterIntervalCustom by screenModel.libraryPreferences.filterIntervalCustom().collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_interval_custom), state = filterIntervalCustom, onClick = { screenModel.toggleFilter(LibraryPreferences::filterIntervalCustom) }, ) } val trackers by screenModel.trackersFlow.collectAsState() when (trackers.size) { 0 -> { // No trackers } 1 -> { val service = trackers[0] val filterTracker by screenModel.libraryPreferences.filterTrackedManga( service.id.toInt(), ).collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_tracked), state = filterTracker, onClick = { screenModel.toggleTracker(service.id.toInt()) }, ) } else -> { HeadingItem(MR.strings.action_filter_tracked) trackers.map { service -> val filterTracker by screenModel.libraryPreferences.filterTrackedManga( service.id.toInt(), ).collectAsState() TriStateItem( label = service.name, state = filterTracker, onClick = { screenModel.toggleTracker(service.id.toInt()) }, ) } } } } @Composable private fun ColumnScope.SortPage( category: Category?, screenModel: MangaLibrarySettingsScreenModel, ) { val trackers by screenModel.trackersFlow.collectAsState() val sortingMode = category.sort.type val sortDescending = !category.sort.isAscending val options = remember(trackers.isEmpty()) { val trackerMeanPair = if (trackers.isNotEmpty()) { MR.strings.action_sort_tracker_score to MangaLibrarySort.Type.TrackerMean } else { null } listOfNotNull( MR.strings.action_sort_alpha to MangaLibrarySort.Type.Alphabetical, MR.strings.action_sort_total to MangaLibrarySort.Type.TotalChapters, MR.strings.action_sort_last_read to MangaLibrarySort.Type.LastRead, AYMR.strings.action_sort_last_manga_update to MangaLibrarySort.Type.LastUpdate, MR.strings.action_sort_unread_count to MangaLibrarySort.Type.UnreadCount, MR.strings.action_sort_latest_chapter to MangaLibrarySort.Type.LatestChapter, MR.strings.action_sort_chapter_fetch_date to MangaLibrarySort.Type.ChapterFetchDate, MR.strings.action_sort_date_added to MangaLibrarySort.Type.DateAdded, trackerMeanPair, MR.strings.action_sort_random to MangaLibrarySort.Type.Random, ) } options.map { (titleRes, mode) -> if (mode == MangaLibrarySort.Type.Random) { BaseSortItem( label = stringResource(titleRes), icon = Icons.Default.Refresh .takeIf { sortingMode == MangaLibrarySort.Type.Random }, onClick = { screenModel.setSort(category, mode, MangaLibrarySort.Direction.Ascending) }, ) return@map } SortItem( label = stringResource(titleRes), sortDescending = sortDescending.takeIf { sortingMode == mode }, onClick = { val isTogglingDirection = sortingMode == mode val direction = when { isTogglingDirection -> if (sortDescending) { MangaLibrarySort.Direction.Ascending } else { MangaLibrarySort.Direction.Descending } else -> if (sortDescending) { MangaLibrarySort.Direction.Descending } else { MangaLibrarySort.Direction.Ascending } } screenModel.setSort(category, mode, direction) }, ) } } private val displayModes = listOf( MR.strings.action_display_grid to LibraryDisplayMode.CompactGrid, MR.strings.action_display_comfortable_grid to LibraryDisplayMode.ComfortableGrid, MR.strings.action_display_cover_only_grid to LibraryDisplayMode.CoverOnlyGrid, MR.strings.action_display_list to LibraryDisplayMode.List, ) @Composable private fun ColumnScope.DisplayPage( screenModel: MangaLibrarySettingsScreenModel, ) { val displayMode by screenModel.libraryPreferences.displayMode().collectAsState() SettingsChipRow(MR.strings.action_display_mode) { displayModes.map { (titleRes, mode) -> FilterChip( selected = displayMode == mode, onClick = { screenModel.setDisplayMode(mode) }, label = { Text(stringResource(titleRes)) }, ) } } val configuration = LocalConfiguration.current val columnPreference = remember { if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { screenModel.libraryPreferences.mangaLandscapeColumns() } else { screenModel.libraryPreferences.mangaPortraitColumns() } } val columns by columnPreference.collectAsState() if (displayMode == LibraryDisplayMode.List) { SliderItem( value = columns, valueRange = 0..10, label = stringResource(AYMR.strings.pref_library_rows), valueText = if (columns > 0) { columns.toString() } else { stringResource(MR.strings.label_auto) }, onChange = columnPreference::set, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } else { SliderItem( value = columns, valueRange = 0..10, label = stringResource(MR.strings.pref_library_columns), valueText = if (columns > 0) { columns.toString() } else { stringResource(MR.strings.label_auto) }, onChange = columnPreference::set, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } HeadingItem(MR.strings.overlay_header) CheckboxItem( label = stringResource(MR.strings.action_display_download_badge), pref = screenModel.libraryPreferences.downloadBadge(), ) CheckboxItem( label = stringResource(MR.strings.action_display_unread_badge), pref = screenModel.libraryPreferences.unreadBadge(), ) CheckboxItem( label = stringResource(MR.strings.action_display_local_badge), pref = screenModel.libraryPreferences.localBadge(), ) CheckboxItem( label = stringResource(MR.strings.action_display_language_badge), pref = screenModel.libraryPreferences.languageBadge(), ) CheckboxItem( label = stringResource(AYMR.strings.action_display_show_continue_reading_button), pref = screenModel.libraryPreferences.showContinueViewingButton(), ) HeadingItem(MR.strings.tabs_header) CheckboxItem( label = stringResource(MR.strings.action_display_show_tabs), pref = screenModel.libraryPreferences.categoryTabs(), ) CheckboxItem( label = stringResource(MR.strings.action_display_show_number_of_items), pref = screenModel.libraryPreferences.categoryNumberOfItems(), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/LogoHeader.kt ================================================ package eu.kanade.presentation.more import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.R @Composable fun LogoHeader() { Column( modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally, ) { Icon( painter = painterResource(R.drawable.ic_ani), contentDescription = null, tint = MaterialTheme.colorScheme.onSurface, modifier = Modifier .padding(vertical = 56.dp) .size(64.dp), ) HorizontalDivider() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt ================================================ package eu.kanade.presentation.more import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.outlined.CloudOff import androidx.compose.material.icons.outlined.GetApp import androidx.compose.material.icons.outlined.Info import androidx.compose.material.icons.outlined.QueryStats import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.Storage import androidx.compose.material.icons.outlined.VideoSettings import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.vectorResource import eu.kanade.domain.ui.model.NavStyle import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.ui.more.DownloadQueueState import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource @Composable fun MoreScreen( downloadQueueStateProvider: () -> DownloadQueueState, downloadedOnly: Boolean, onDownloadedOnlyChange: (Boolean) -> Unit, incognitoMode: Boolean, onIncognitoModeChange: (Boolean) -> Unit, navStyle: NavStyle, onClickAlt: () -> Unit, onClickDownloadQueue: () -> Unit, onClickCategories: () -> Unit, onClickStats: () -> Unit, onClickStorage: () -> Unit, onClickDataAndStorage: () -> Unit, onClickPlayerSettings: () -> Unit, onClickSettings: () -> Unit, onClickAbout: () -> Unit, ) { val uriHandler = LocalUriHandler.current Scaffold { contentPadding -> ScrollbarLazyColumn( modifier = Modifier.padding(contentPadding), ) { item { LogoHeader() } item { SwitchPreferenceWidget( title = stringResource(MR.strings.label_downloaded_only), subtitle = stringResource(MR.strings.downloaded_only_summary), icon = Icons.Outlined.CloudOff, checked = downloadedOnly, onCheckedChanged = onDownloadedOnlyChange, ) } item { SwitchPreferenceWidget( title = stringResource(MR.strings.pref_incognito_mode), subtitle = stringResource(AYMR.strings.pref_incognito_mode_summary), icon = ImageVector.vectorResource(R.drawable.ic_glasses_24dp), checked = incognitoMode, onCheckedChanged = onIncognitoModeChange, ) } item { HorizontalDivider() } item { TextPreferenceWidget( title = navStyle.moreTab.options.title, icon = navStyle.moreIcon, onPreferenceClick = onClickAlt, ) } item { val downloadQueueState = downloadQueueStateProvider() TextPreferenceWidget( title = stringResource(MR.strings.label_download_queue), subtitle = when (downloadQueueState) { DownloadQueueState.Stopped -> null is DownloadQueueState.Paused -> { val pending = downloadQueueState.pending if (pending == 0) { stringResource(MR.strings.paused) } else { "${stringResource(MR.strings.paused)} • ${ pluralStringResource( MR.plurals.download_queue_summary, count = pending, pending, ) }" } } is DownloadQueueState.Downloading -> { val pending = downloadQueueState.pending pluralStringResource( MR.plurals.download_queue_summary, count = pending, pending, ) } }, icon = Icons.Outlined.GetApp, onPreferenceClick = onClickDownloadQueue, ) } item { TextPreferenceWidget( title = stringResource(AYMR.strings.general_categories), icon = Icons.AutoMirrored.Outlined.Label, onPreferenceClick = onClickCategories, ) } item { TextPreferenceWidget( title = stringResource(MR.strings.label_stats), icon = Icons.Outlined.QueryStats, onPreferenceClick = onClickStats, ) } item { TextPreferenceWidget( title = stringResource(MR.strings.label_data_storage), icon = Icons.Outlined.Storage, onPreferenceClick = onClickDataAndStorage, ) } item { HorizontalDivider() } item { TextPreferenceWidget( title = stringResource(MR.strings.label_settings), icon = Icons.Outlined.Settings, onPreferenceClick = onClickSettings, ) } item { TextPreferenceWidget( title = stringResource(AYMR.strings.label_player_settings), icon = Icons.Outlined.VideoSettings, onPreferenceClick = onClickPlayerSettings, ) } item { TextPreferenceWidget( title = stringResource(MR.strings.pref_category_about), icon = Icons.Outlined.Info, onPreferenceClick = onClickAbout, ) } item { TextPreferenceWidget( title = stringResource(MR.strings.label_help), icon = Icons.AutoMirrored.Outlined.HelpOutline, onPreferenceClick = { uriHandler.openUri(Constants.URL_HELP) }, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/NewUpdateScreen.kt ================================================ package eu.kanade.presentation.more import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.OpenInNew import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.tooling.preview.PreviewLightDark import com.halilibo.richtext.markdown.Markdown import com.halilibo.richtext.ui.RichTextStyle import com.halilibo.richtext.ui.material3.RichText import com.halilibo.richtext.ui.string.RichTextStringStyle import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.InfoScreen @Composable fun NewUpdateScreen( versionName: String, changelogInfo: String, onOpenInBrowser: () -> Unit, onRejectUpdate: () -> Unit, onAcceptUpdate: () -> Unit, ) { InfoScreen( icon = Icons.Outlined.NewReleases, headingText = stringResource(MR.strings.update_check_notification_update_available), subtitleText = versionName, acceptText = stringResource(MR.strings.update_check_confirm), onAcceptClick = onAcceptUpdate, rejectText = stringResource(MR.strings.action_not_now), onRejectClick = onRejectUpdate, ) { RichText( modifier = Modifier .fillMaxWidth() .padding(vertical = MaterialTheme.padding.large), style = RichTextStyle( stringStyle = RichTextStringStyle( linkStyle = SpanStyle(color = MaterialTheme.colorScheme.primary), ), ), ) { Markdown(content = changelogInfo) TextButton( onClick = onOpenInBrowser, modifier = Modifier.padding(top = MaterialTheme.padding.small), ) { Text(text = stringResource(MR.strings.update_check_open)) Spacer(modifier = Modifier.width(MaterialTheme.padding.extraSmall)) Icon(imageVector = Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = null) } } } } @PreviewLightDark @Composable private fun NewUpdateScreenPreview() { TachiyomiPreviewTheme { NewUpdateScreen( versionName = "v0.99.9", changelogInfo = """ ## Yay Foobar ### More info - Hello - World """.trimIndent(), onOpenInBrowser = {}, onRejectUpdate = {}, onAcceptUpdate = {}, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/onboarding/GuidesStep.kt ================================================ package eu.kanade.presentation.more.onboarding import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource internal class GuidesStep( private val onRestoreBackup: () -> Unit, ) : OnboardingStep { override val isComplete: Boolean = true @Composable override fun Content() { val handler = LocalUriHandler.current Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Text(stringResource(MR.strings.onboarding_guides_new_user, stringResource(MR.strings.app_name))) Button( modifier = Modifier.fillMaxWidth(), onClick = { handler.openUri(GETTING_STARTED_URL) }, ) { Text(stringResource(MR.strings.getting_started_guide)) } HorizontalDivider( modifier = Modifier.padding(vertical = 8.dp), color = MaterialTheme.colorScheme.onPrimaryContainer, ) Text(stringResource(MR.strings.onboarding_guides_returning_user, stringResource(MR.strings.app_name))) Button( modifier = Modifier.fillMaxWidth(), onClick = onRestoreBackup, ) { Text(stringResource(MR.strings.pref_restore_backup)) } } } } const val GETTING_STARTED_URL = "https://aniyomi.org/docs/guides/getting-started" @PreviewLightDark @Composable private fun GuidesStepPreview() { TachiyomiPreviewTheme { GuidesStep( onRestoreBackup = {}, ).Content() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/onboarding/OnboardingScreen.kt ================================================ package eu.kanade.presentation.more.onboarding import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.RocketLaunch import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import soup.compose.material.motion.animation.materialSharedAxisX import soup.compose.material.motion.animation.rememberSlideDistance import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.InfoScreen @Composable fun OnboardingScreen( onComplete: () -> Unit, onRestoreBackup: () -> Unit, ) { val slideDistance = rememberSlideDistance() var currentStep by rememberSaveable { mutableIntStateOf(0) } val steps = remember { listOf( ThemeStep(), StorageStep(), PermissionStep(), GuidesStep(onRestoreBackup = onRestoreBackup), ) } val isLastStep = currentStep == steps.lastIndex BackHandler(enabled = currentStep != 0, onBack = { currentStep-- }) InfoScreen( icon = Icons.Outlined.RocketLaunch, headingText = stringResource(MR.strings.onboarding_heading), subtitleText = stringResource(MR.strings.onboarding_description), acceptText = stringResource( if (isLastStep) { MR.strings.onboarding_action_finish } else { MR.strings.onboarding_action_next }, ), canAccept = steps[currentStep].isComplete, onAcceptClick = { if (isLastStep) { onComplete() } else { currentStep++ } }, ) { Box( modifier = Modifier .padding(vertical = MaterialTheme.padding.small) .clip(MaterialTheme.shapes.small) .fillMaxSize() .background(MaterialTheme.colorScheme.surfaceVariant), ) { AnimatedContent( targetState = currentStep, transitionSpec = { materialSharedAxisX( forward = targetState > initialState, slideDistance = slideDistance, ) }, label = "stepContent", ) { steps[it].Content() } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/onboarding/OnboardingStep.kt ================================================ package eu.kanade.presentation.more.onboarding import androidx.compose.runtime.Composable internal interface OnboardingStep { val isComplete: Boolean @Composable fun Content() } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt ================================================ package eu.kanade.presentation.more.onboarding import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.content.pm.PackageManager import android.os.Build import android.os.PowerManager import android.provider.Settings import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.core.content.getSystemService import androidx.core.net.toUri import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha internal class PermissionStep : OnboardingStep { private var notificationGranted by mutableStateOf(false) private var batteryGranted by mutableStateOf(false) override val isComplete: Boolean = true @Composable override fun Content() { val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current val installGranted = rememberRequestPackageInstallsPermissionState() DisposableEffect(lifecycleOwner.lifecycle) { val observer = object : DefaultLifecycleObserver { override fun onResume(owner: LifecycleOwner) { notificationGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { context.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED } else { true } batteryGranted = context.getSystemService()!! .isIgnoringBatteryOptimizations(context.packageName) } } lifecycleOwner.lifecycle.addObserver(observer) onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } } Column { PermissionItem( title = stringResource(MR.strings.onboarding_permission_install_apps), subtitle = stringResource(MR.strings.onboarding_permission_install_apps_description), granted = installGranted, onButtonClick = { context.launchRequestPackageInstallsPermission() }, ) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { val permissionRequester = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission(), onResult = { // no-op. resulting checks is being done on resume }, ) PermissionItem( title = stringResource(MR.strings.onboarding_permission_notifications), subtitle = stringResource(MR.strings.onboarding_permission_notifications_description), granted = notificationGranted, onButtonClick = { permissionRequester.launch(Manifest.permission.POST_NOTIFICATIONS) }, ) } PermissionItem( title = stringResource(MR.strings.onboarding_permission_ignore_battery_opts), subtitle = stringResource(MR.strings.onboarding_permission_ignore_battery_opts_description), granted = batteryGranted, onButtonClick = { @SuppressLint("BatteryLife") val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { data = "package:${context.packageName}".toUri() } context.startActivity(intent) }, ) } } @Composable private fun SectionHeader( text: String, modifier: Modifier = Modifier, ) { Text( text = text, style = MaterialTheme.typography.titleLarge, modifier = modifier .padding(horizontal = 16.dp) .secondaryItemAlpha(), ) } @Composable private fun PermissionItem( title: String, subtitle: String, granted: Boolean, modifier: Modifier = Modifier, onButtonClick: () -> Unit, ) { ListItem( modifier = modifier, headlineContent = { Text(text = title) }, supportingContent = { Text(text = subtitle) }, trailingContent = { OutlinedButton( enabled = !granted, onClick = onButtonClick, ) { if (granted) { Icon( imageVector = Icons.Default.Check, contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) } else { Text(stringResource(MR.strings.onboarding_permission_action_grant)) } } }, colors = ListItemDefaults.colors(containerColor = Color.Transparent), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/onboarding/StorageStep.kt ================================================ package eu.kanade.presentation.more.onboarding import android.content.ActivityNotFoundException import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import eu.kanade.presentation.more.settings.screen.SettingsDataScreen import eu.kanade.tachiyomi.util.system.isTvBox import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest import tachiyomi.core.common.storage.AndroidStorageFolderProvider import tachiyomi.domain.storage.service.StoragePreferences import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Button import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get internal class StorageStep : OnboardingStep { private val storagePref = Injekt.get().baseStorageDirectory() private val folderProvider = Injekt.get() private var _isComplete by mutableStateOf(false) override val isComplete: Boolean get() = _isComplete @Composable override fun Content() { val context = LocalContext.current val handler = LocalUriHandler.current val isTvBox = isTvBox(LocalContext.current) val pickStorageLocation = SettingsDataScreen.storageLocationPicker(storagePref) Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Text( stringResource( MR.strings.onboarding_storage_info, stringResource(MR.strings.app_name), SettingsDataScreen.storageLocationText(storagePref), ), ) if (isTvBox) { if (!storagePref.isSet()) { Button( modifier = Modifier.fillMaxWidth(), onClick = { val storage = folderProvider.directory() if (!storage.exists()) { storage.mkdirs() } storagePref.set(storagePref.get()) }, ) { Text(stringResource(AYMR.strings.onboarding_storage_action_create_folder)) } } } else { Button( modifier = Modifier.fillMaxWidth(), onClick = { try { pickStorageLocation.launch(null) } catch (e: ActivityNotFoundException) { context.toast(MR.strings.file_picker_error) } }, ) { Text(stringResource(MR.strings.onboarding_storage_action_select)) } } HorizontalDivider( modifier = Modifier.padding(vertical = 8.dp), color = MaterialTheme.colorScheme.onPrimaryContainer, ) Text(stringResource(MR.strings.onboarding_storage_help_info, stringResource(MR.strings.app_name))) Button( modifier = Modifier.fillMaxWidth(), onClick = { handler.openUri(SettingsDataScreen.HELP_URL) }, ) { Text(stringResource(MR.strings.onboarding_storage_help_action)) } } LaunchedEffect(Unit) { storagePref.changes() .collectLatest { _isComplete = storagePref.isSet() } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/onboarding/ThemeStep.kt ================================================ package eu.kanade.presentation.more.onboarding import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode import eu.kanade.presentation.more.settings.widget.AppThemeModePreferenceWidget import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get internal class ThemeStep : OnboardingStep { override val isComplete: Boolean = true private val uiPreferences: UiPreferences = Injekt.get() @Composable override fun Content() { val themeModePref = uiPreferences.themeMode() val themeMode by themeModePref.collectAsState() val appThemePref = uiPreferences.appTheme() val appTheme by appThemePref.collectAsState() val amoledPref = uiPreferences.themeDarkAmoled() val amoled by amoledPref.collectAsState() Column { AppThemeModePreferenceWidget( value = themeMode, onItemClick = { themeModePref.set(it) setAppCompatDelegateThemeMode(it) }, ) AppThemePreferenceWidget( value = appTheme, amoled = amoled, onItemClick = { appThemePref.set(it) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt ================================================ package eu.kanade.presentation.more.settings import android.content.Context import android.os.Build import android.os.Environment import androidx.annotation.IntRange import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.graphics.vector.ImageVector import eu.kanade.core.preference.asState import eu.kanade.presentation.more.settings.Preference.PreferenceItem import eu.kanade.tachiyomi.data.track.Tracker import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableMap import kotlinx.coroutines.CoroutineScope import mihon.core.archive.openFileDescriptor import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.FileOutputStream import tachiyomi.core.common.preference.Preference as PreferenceData sealed class Preference { abstract val title: String abstract val enabled: Boolean sealed class PreferenceItem : Preference() { abstract val subtitle: String? abstract val icon: ImageVector? abstract val onValueChanged: suspend (value: T) -> Boolean /** * A basic [PreferenceItem] that only displays texts. */ data class TextPreference( override val title: String, override val subtitle: String? = null, override val icon: ImageVector? = null, override val enabled: Boolean = true, val onClick: (() -> Unit)? = null, ) : PreferenceItem() { override val onValueChanged: suspend (value: String) -> Boolean = { true } } /** * A [PreferenceItem] that provides a two-state toggleable option. */ data class SwitchPreference( val preference: PreferenceData, override val title: String, override val subtitle: String? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: Boolean) -> Boolean = { true }, ) : PreferenceItem() { override val icon: ImageVector? = null } /** * A [PreferenceItem] that provides a slider to select an integer number. */ data class SliderPreference( val value: Int, override val title: String, val valueRange: IntProgression = 0..1, @IntRange(from = 0) val steps: Int = with(valueRange) { (last - first) - 1 }, override val subtitle: String? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: Int) -> Boolean = { true }, ) : PreferenceItem() { override val icon: ImageVector? = null } /** * A [PreferenceItem] that displays a list of entries as a dialog. */ @Suppress("UNCHECKED_CAST") data class ListPreference( val preference: PreferenceData, val entries: ImmutableMap, override val title: String, override val subtitle: String? = "%s", val subtitleProvider: @Composable (value: T, entries: ImmutableMap) -> String? = { v, e -> subtitle?.format(e[v]) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: T) -> Boolean = { true }, ) : PreferenceItem() { internal fun internalSet(value: Any) = preference.set(value as T) internal suspend fun internalOnValueChanged(value: Any) = onValueChanged(value as T) @Composable internal fun internalSubtitleProvider(value: Any?, entries: ImmutableMap) = subtitleProvider(value as T, entries as ImmutableMap) } /** * [ListPreference] but with no connection to a [PreferenceData] */ data class BasicListPreference( val value: String, val entries: ImmutableMap, override val title: String, override val subtitle: String? = "%s", val subtitleProvider: @Composable (value: String, entries: ImmutableMap) -> String? = { v, e -> subtitle?.format(e[v]) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, ) : PreferenceItem() /** * A [PreferenceItem] that displays a list of entries as a dialog. * Multiple entries can be selected at the same time. */ data class MultiSelectListPreference( val preference: PreferenceData>, val entries: ImmutableMap, override val title: String, override val subtitle: String? = "%s", val subtitleProvider: @Composable (value: Set, entries: ImmutableMap) -> String? = { v, e -> val combined = remember(v, e) { v.mapNotNull { e[it] } .joinToString() .takeUnless { it.isBlank() } } ?: stringResource(MR.strings.none) subtitle?.format(combined) }, override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: Set) -> Boolean = { true }, ) : PreferenceItem>() /** * A [PreferenceItem] that shows a EditText in the dialog. */ data class EditTextPreference( val preference: PreferenceData, override val title: String, override val subtitle: String? = "%s", override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, ) : PreferenceItem() { override val icon: ImageVector? = null } /** * A [PreferenceItem] that shows a multi-line EditText in the dialog. */ data class MultiLineEditTextPreference( val preference: PreferenceData, val canBeBlank: Boolean = false, override val title: String, override val subtitle: String? = "%s", override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, ) : PreferenceItem() /** * A [PreferenceItem] for editing MPV config files. * If [fileName] is not null, it will update this file in the config directory. */ data class MPVConfPreference( val preference: PreferenceData, val scope: CoroutineScope, val context: Context, val fileName: String? = null, val canBeBlank: Boolean = true, override val title: String, override val subtitle: String? = preference.asState(scope).value .lines().take(2) .joinToString( separator = "\n", postfix = if (preference.asState(scope).value.lines().size > 2) "\n..." else "", ), override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { value -> if (fileName != null) { val storageManager: StorageManager = Injekt.get() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && Environment.isExternalStorageManager()) { val inputFile = storageManager.getMPVConfigDirectory() ?.createFile(fileName) inputFile?.openFileDescriptor(context, "rwt")?.fileDescriptor ?.let { FileOutputStream(it).bufferedWriter().use { writer -> writer.write(value) } } preference.set(value) } } true }, ) : PreferenceItem() /** * A [PreferenceItem] that shows a EditText with a subtitle in the dialog. * Unlike [EditTextPreference], empty values can be set and a subtitle in the dialog can be show. */ data class EditTextInfoPreference( val preference: PreferenceData, val dialogSubtitle: String?, val validate: (String) -> Boolean = { true }, val errorMessage: @Composable ((String) -> String)? = null, override val title: String, override val subtitle: String? = "%s", override val icon: ImageVector? = null, override val enabled: Boolean = true, override val onValueChanged: suspend (value: String) -> Boolean = { true }, ) : PreferenceItem() /** * A [PreferenceItem] for individual tracker. */ data class TrackerPreference( val tracker: Tracker, val login: () -> Unit, val logout: () -> Unit, ) : PreferenceItem() { override val title: String = "" override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (value: String) -> Boolean = { true } } data class InfoPreference( override val title: String, override val enabled: Boolean = true, ) : PreferenceItem() { override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (value: String) -> Boolean = { true } } data class CustomPreference( override val title: String, val content: @Composable () -> Unit, ) : PreferenceItem() { override val enabled: Boolean = true override val subtitle: String? = null override val icon: ImageVector? = null override val onValueChanged: suspend (value: Unit) -> Boolean = { true } } } data class PreferenceGroup( override val title: String, override val enabled: Boolean = true, val preferenceItems: ImmutableList>, ) : Preference() } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt ================================================ package eu.kanade.presentation.more.settings import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.structuralEqualityPolicy import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.more.settings.widget.EditTextPreferenceWidget import eu.kanade.presentation.more.settings.widget.InfoWidget import eu.kanade.presentation.more.settings.widget.ListPreferenceWidget import eu.kanade.presentation.more.settings.widget.MultiSelectListPreferenceWidget import eu.kanade.presentation.more.settings.widget.PrefsHorizontalPadding import eu.kanade.presentation.more.settings.widget.PrefsVerticalPadding import eu.kanade.presentation.more.settings.widget.SwitchPreferenceWidget import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.more.settings.widget.TitleFontSize import eu.kanade.presentation.more.settings.widget.TrackingPreferenceWidget import kotlinx.coroutines.launch import tachiyomi.presentation.core.components.BaseSliderItem import tachiyomi.presentation.core.util.collectAsState val LocalPreferenceHighlighted = compositionLocalOf(structuralEqualityPolicy()) { false } val LocalPreferenceMinHeight = compositionLocalOf(structuralEqualityPolicy()) { 56.dp } @Composable fun StatusWrapper( item: Preference.PreferenceItem<*>, highlightKey: String?, content: @Composable () -> Unit, ) { val enabled = item.enabled val highlighted = item.title == highlightKey AnimatedVisibility( visible = enabled, enter = expandVertically() + fadeIn(), exit = shrinkVertically() + fadeOut(), content = { CompositionLocalProvider( LocalPreferenceHighlighted provides highlighted, content = content, ) }, ) } @Composable internal fun PreferenceItem( item: Preference.PreferenceItem<*>, highlightKey: String?, ) { val scope = rememberCoroutineScope() StatusWrapper( item = item, highlightKey = highlightKey, ) { when (item) { is Preference.PreferenceItem.SwitchPreference -> { val value by item.preference.collectAsState() SwitchPreferenceWidget( title = item.title, subtitle = item.subtitle, icon = item.icon, checked = value, onCheckedChanged = { newValue -> scope.launch { if (item.onValueChanged(newValue)) { item.preference.set(newValue) } } }, ) } is Preference.PreferenceItem.SliderPreference -> { BaseSliderItem( label = item.title, value = item.value, valueRange = item.valueRange, valueText = item.subtitle.takeUnless { it.isNullOrEmpty() } ?: item.value.toString(), steps = item.steps, labelStyle = MaterialTheme.typography.titleLarge.copy(fontSize = TitleFontSize), onChange = { scope.launch { item.onValueChanged(it) } }, modifier = Modifier.padding( horizontal = PrefsHorizontalPadding, vertical = PrefsVerticalPadding, ), ) } is Preference.PreferenceItem.ListPreference<*> -> { val value by item.preference.collectAsState() ListPreferenceWidget( value = value, title = item.title, subtitle = item.internalSubtitleProvider(value, item.entries), icon = item.icon, entries = item.entries, onValueChange = { newValue -> scope.launch { if (item.internalOnValueChanged(newValue!!)) { item.internalSet(newValue) } } }, ) } is Preference.PreferenceItem.BasicListPreference -> { ListPreferenceWidget( value = item.value, title = item.title, subtitle = item.subtitleProvider(item.value, item.entries), icon = item.icon, entries = item.entries, onValueChange = { scope.launch { item.onValueChanged(it) } }, ) } is Preference.PreferenceItem.MultiSelectListPreference -> { val values by item.preference.collectAsState() MultiSelectListPreferenceWidget( preference = item, values = values, onValuesChange = { newValues -> scope.launch { if (item.onValueChanged(newValues)) { item.preference.set(newValues.toMutableSet()) } } }, ) } is Preference.PreferenceItem.TextPreference -> { TextPreferenceWidget( title = item.title, subtitle = item.subtitle, icon = item.icon, onPreferenceClick = item.onClick, ) } is Preference.PreferenceItem.EditTextPreference -> { val values by item.preference.collectAsState() EditTextPreferenceWidget( title = item.title, subtitle = item.subtitle, icon = item.icon, value = values, onConfirm = { val accepted = item.onValueChanged(it) if (accepted) item.preference.set(it) accepted }, ) } is Preference.PreferenceItem.MultiLineEditTextPreference -> { val values by item.preference.collectAsState() EditTextPreferenceWidget( title = item.title, subtitle = item.subtitle, icon = item.icon, value = values, onConfirm = { val accepted = item.onValueChanged(it) if (accepted) item.preference.set(it) accepted }, singleLine = false, canBeBlank = item.canBeBlank, ) } is Preference.PreferenceItem.MPVConfPreference -> { val values by item.preference.collectAsState() EditTextPreferenceWidget( title = item.title, subtitle = item.subtitle, icon = item.icon, value = values, onConfirm = { val accepted = item.onValueChanged(it) if (accepted) item.preference.set(it) accepted }, singleLine = false, canBeBlank = item.canBeBlank, formatSubtitle = false, ) } is Preference.PreferenceItem.EditTextInfoPreference -> { val values by item.preference.collectAsState() EditTextPreferenceWidget( title = item.title, subtitle = item.subtitle, dialogSubtitle = item.dialogSubtitle, icon = item.icon, value = values, onConfirm = { val accepted = item.onValueChanged(it) if (accepted) item.preference.set(it) accepted }, singleLine = true, canBeBlank = true, validate = item.validate, errorMessage = item.errorMessage, ) } is Preference.PreferenceItem.TrackerPreference -> { val isLoggedIn by item.tracker.let { tracker -> tracker.isLoggedInFlow.collectAsState(tracker.isLoggedIn) } TrackingPreferenceWidget( tracker = item.tracker, checked = isLoggedIn, onClick = { if (isLoggedIn) item.logout() else item.login() }, ) } is Preference.PreferenceItem.InfoPreference -> { InfoWidget(text = item.title) } is Preference.PreferenceItem.CustomPreference -> { item.content() } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScaffold.kt ================================================ package eu.kanade.presentation.more.settings import androidx.compose.foundation.layout.RowScope import androidx.compose.runtime.Composable import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.components.AppBar import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource @Composable fun PreferenceScaffold( titleRes: StringResource, actions: @Composable RowScope.() -> Unit = {}, onBackPressed: (() -> Unit)? = null, itemsProvider: @Composable () -> List, ) { Scaffold( topBar = { AppBar( title = stringResource(titleRes), navigateUp = onBackPressed, actions = actions, scrollBehavior = it, ) }, content = { contentPadding -> PreferenceScreen( items = itemsProvider(), contentPadding = contentPadding, ) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/PreferenceScreen.kt ================================================ package eu.kanade.presentation.more.settings import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEachIndexed import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.presentation.more.settings.widget.PreferenceGroupHeader import kotlinx.coroutines.delay import tachiyomi.presentation.core.components.ScrollbarLazyColumn import kotlin.time.Duration.Companion.seconds /** * Preference Screen composable which contains a list of [Preference] items * @param items [Preference] items which should be displayed on the preference screen. An item can be a single [PreferenceItem] or a group ([Preference.PreferenceGroup]) * @param modifier [Modifier] to be applied to the preferenceScreen layout */ @Composable fun PreferenceScreen( items: List, modifier: Modifier = Modifier, contentPadding: PaddingValues = PaddingValues(0.dp), ) { val state = rememberLazyListState() val highlightKey = SearchableSettings.highlightKey if (highlightKey != null) { LaunchedEffect(Unit) { val i = items.findHighlightedIndex(highlightKey) if (i >= 0) { delay(0.5.seconds) state.animateScrollToItem(i) } SearchableSettings.highlightKey = null } } ScrollbarLazyColumn( modifier = modifier, state = state, contentPadding = contentPadding, ) { items.fastForEachIndexed { i, preference -> when (preference) { // Create Preference Group is Preference.PreferenceGroup -> { if (!preference.enabled) return@fastForEachIndexed item { Column { PreferenceGroupHeader(title = preference.title) } } items(preference.preferenceItems) { item -> PreferenceItem( item = item, highlightKey = highlightKey, ) } item { if (i < items.lastIndex) { Spacer(modifier = Modifier.height(12.dp)) } } } // Create Preference Item is Preference.PreferenceItem<*> -> item { PreferenceItem( item = preference, highlightKey = highlightKey, ) } } } } } private fun List.findHighlightedIndex(highlightKey: String): Int { return flatMap { if (it is Preference.PreferenceGroup) { buildList { add(null) // Header addAll(it.preferenceItems.map { groupItem -> groupItem.title }) add(null) // Spacer } } else { listOf(it.title) } }.indexOfFirst { it == highlightKey } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/Commons.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.category.visualName import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource /** * Returns a string of categories name for settings subtitle */ @ReadOnlyComposable @Composable fun getCategoriesLabel( allCategories: List, included: Set, excluded: Set, ): String { val context = LocalContext.current val includedCategories = included .mapNotNull { id -> allCategories.find { it.id == id.toLong() } } .sortedBy { it.order } val excludedCategories = excluded .mapNotNull { id -> allCategories.find { it.id == id.toLong() } } .sortedBy { it.order } val allExcluded = excludedCategories.size == allCategories.size val includedItemsText = when { // Some selected, but not all includedCategories.isNotEmpty() && includedCategories.size != allCategories.size -> includedCategories.joinToString { it.visualName( context, ) } // All explicitly selected includedCategories.size == allCategories.size -> stringResource(MR.strings.all) allExcluded -> stringResource(MR.strings.none) else -> stringResource(MR.strings.all) } val excludedItemsText = when { excludedCategories.isEmpty() -> stringResource(MR.strings.none) allExcluded -> stringResource(MR.strings.all) else -> excludedCategories.joinToString { it.visualName(context) } } return stringResource(MR.strings.include, includedItemsText) + "\n" + stringResource(MR.strings.exclude, excludedItemsText) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SearchableSettings.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.foundation.layout.RowScope import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import cafe.adriel.voyager.core.screen.Screen import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.PreferenceScaffold import eu.kanade.presentation.util.LocalBackPress interface SearchableSettings : Screen { @Composable @ReadOnlyComposable fun getTitleRes(): StringResource @Composable fun getPreferences(): List @Composable fun RowScope.AppBarAction() { } @Composable override fun Content() { val handleBack = LocalBackPress.current PreferenceScaffold( titleRes = getTitleRes(), onBackPressed = if (handleBack != null) handleBack::invoke else null, actions = { AppBarAction() }, itemsProvider = { getPreferences() }, ) } companion object { // HACK: for the background blipping thingy. // The title of the target PreferenceItem // Set before showing the destination screen and reset after // See BasePreferenceWidget.highlightBackground var highlightKey: String? = null } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent import android.provider.Settings import android.webkit.WebStorage import android.webkit.WebView import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.core.net.toUri import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.extension.anime.interactor.TrustAnimeExtension import eu.kanade.domain.extension.manga.interactor.TrustMangaExtension import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences.DataSaver import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.advanced.ClearAnimeDatabaseScreen import eu.kanade.presentation.more.settings.screen.advanced.ClearDatabaseScreen import eu.kanade.presentation.more.settings.screen.debug.DebugInfoScreen import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateJob import eu.kanade.tachiyomi.data.library.anime.AnimeMetadataUpdateJob import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateJob import eu.kanade.tachiyomi.data.library.manga.MangaMetadataUpdateJob import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.network.PREF_DOH_360 import eu.kanade.tachiyomi.network.PREF_DOH_ADGUARD import eu.kanade.tachiyomi.network.PREF_DOH_ALIDNS import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE import eu.kanade.tachiyomi.network.PREF_DOH_CONTROLD import eu.kanade.tachiyomi.network.PREF_DOH_DNSPOD import eu.kanade.tachiyomi.network.PREF_DOH_GOOGLE import eu.kanade.tachiyomi.network.PREF_DOH_LIBREDNS import eu.kanade.tachiyomi.network.PREF_DOH_MULLVAD import eu.kanade.tachiyomi.network.PREF_DOH_NJALLA import eu.kanade.tachiyomi.network.PREF_DOH_QUAD101 import eu.kanade.tachiyomi.network.PREF_DOH_QUAD9 import eu.kanade.tachiyomi.network.PREF_DOH_SHECAN import eu.kanade.tachiyomi.ui.more.OnboardingScreen import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.system.GLUtil import eu.kanade.tachiyomi.util.system.isReleaseBuildType import eu.kanade.tachiyomi.util.system.isShizukuInstalled import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.setDefaultSettings import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toPersistentMap import kotlinx.coroutines.launch import logcat.LogPriority import okhttp3.Headers import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.interactor.ResetMangaViewerFlags import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File object SettingsAdvancedScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.pref_category_advanced @Composable override fun getPreferences(): List { val scope = rememberCoroutineScope() val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val basePreferences = remember { Injekt.get() } val networkPreferences = remember { Injekt.get() } return listOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_dump_crash_logs), subtitle = stringResource(MR.strings.pref_dump_crash_logs_summary), onClick = { scope.launch { CrashLogUtil(context).dumpLogs() } }, ), Preference.PreferenceItem.SwitchPreference( preference = networkPreferences.verboseLogging(), title = stringResource(MR.strings.pref_verbose_logging), subtitle = stringResource(MR.strings.pref_verbose_logging_summary), onValueChanged = { context.toast(MR.strings.requires_app_restart) true }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_debug_info), onClick = { navigator.push(DebugInfoScreen()) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_onboarding_guide), onClick = { navigator.push(OnboardingScreen()) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_manage_notifications), onClick = { val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) } context.startActivity(intent) }, ), getBackgroundActivityGroup(), getDataGroup(), getNetworkGroup(networkPreferences = networkPreferences), getLibraryGroup(), getReaderGroup(basePreferences = basePreferences), getExtensionsGroup(basePreferences = basePreferences), // SY --> getDataSaverGroup(), // SY <-- ) } @Composable private fun getBackgroundActivityGroup(): Preference.PreferenceGroup { val context = LocalContext.current val uriHandler = LocalUriHandler.current return Preference.PreferenceGroup( title = stringResource(MR.strings.label_background_activity), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_disable_battery_optimization), subtitle = stringResource(MR.strings.pref_disable_battery_optimization_summary), onClick = { val packageName: String = context.packageName if (!context.powerManager.isIgnoringBatteryOptimizations(packageName)) { try { @SuppressLint("BatteryLife") val intent = Intent().apply { action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS data = "package:$packageName".toUri() addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } context.startActivity(intent) } catch (e: ActivityNotFoundException) { context.toast(MR.strings.battery_optimization_setting_activity_not_found) } } else { context.toast(MR.strings.battery_optimization_disabled) } }, ), Preference.PreferenceItem.TextPreference( title = "Don't kill my app!", subtitle = stringResource(MR.strings.about_dont_kill_my_app), onClick = { uriHandler.openUri("https://dontkillmyapp.com/") }, ), ), ) } @Composable private fun getDataGroup(): Preference.PreferenceGroup { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow return Preference.PreferenceGroup( title = stringResource(MR.strings.label_data), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_invalidate_download_cache), subtitle = stringResource(AYMR.strings.pref_invalidate_download_cache_summary), onClick = { Injekt.get().invalidateCache() Injekt.get().invalidateCache() context.toast(MR.strings.download_cache_invalidated) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.pref_clear_manga_database), subtitle = stringResource(AYMR.strings.pref_clear_manga_database_summary), onClick = { navigator.push(ClearDatabaseScreen()) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.pref_clear_anime_database), subtitle = stringResource(AYMR.strings.pref_clear_anime_database_summary), onClick = { navigator.push(ClearAnimeDatabaseScreen()) }, ), ), ) } @Composable private fun getNetworkGroup( networkPreferences: NetworkPreferences, ): Preference.PreferenceGroup { val context = LocalContext.current val networkHelper = remember { Injekt.get() } val userAgentPref = networkPreferences.defaultUserAgent() val userAgent by userAgentPref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.label_network), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_clear_cookies), onClick = { networkHelper.cookieJar.removeAll() context.toast(MR.strings.cookies_cleared) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_clear_webview_data), onClick = { try { WebView(context).run { setDefaultSettings() clearCache(true) clearFormData() clearHistory() clearSslPreferences() } WebStorage.getInstance().deleteAllData() context.applicationInfo?.dataDir?.let { File("$it/app_webview/").deleteRecursively() } context.toast(MR.strings.webview_data_deleted) } catch (e: Throwable) { logcat(LogPriority.ERROR, e) context.toast(MR.strings.cache_delete_error) } }, ), Preference.PreferenceItem.ListPreference( preference = networkPreferences.dohProvider(), entries = persistentMapOf( -1 to stringResource(MR.strings.disabled), PREF_DOH_CLOUDFLARE to "Cloudflare", PREF_DOH_GOOGLE to "Google", PREF_DOH_ADGUARD to "AdGuard", PREF_DOH_QUAD9 to "Quad9", PREF_DOH_ALIDNS to "AliDNS", PREF_DOH_DNSPOD to "DNSPod", PREF_DOH_360 to "360", PREF_DOH_QUAD101 to "Quad 101", PREF_DOH_MULLVAD to "Mullvad", PREF_DOH_CONTROLD to "Control D", PREF_DOH_NJALLA to "Njalla", PREF_DOH_SHECAN to "Shecan", PREF_DOH_LIBREDNS to "LibreDNS", ), title = stringResource(MR.strings.pref_dns_over_https), onValueChanged = { context.toast(MR.strings.requires_app_restart) true }, ), Preference.PreferenceItem.EditTextPreference( preference = userAgentPref, title = stringResource(MR.strings.pref_user_agent_string), onValueChanged = { try { // OkHttp checks for valid values internally Headers.Builder().add("User-Agent", it) context.toast(MR.strings.requires_app_restart) } catch (_: IllegalArgumentException) { context.toast(MR.strings.error_user_agent_string_invalid) return@EditTextPreference false } true }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_reset_user_agent_string), enabled = remember(userAgent) { userAgent != userAgentPref.defaultValue() }, onClick = { userAgentPref.delete() context.toast(MR.strings.requires_app_restart) }, ), ), ) } @Composable private fun getLibraryGroup(): Preference.PreferenceGroup { val scope = rememberCoroutineScope() val context = LocalContext.current return Preference.PreferenceGroup( title = stringResource(MR.strings.label_library), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_refresh_library_covers), onClick = { AnimeLibraryUpdateJob.startNow(context) MangaLibraryUpdateJob.startNow(context) AnimeMetadataUpdateJob.startNow(context) MangaMetadataUpdateJob.startNow(context) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_reset_viewer_flags), subtitle = stringResource(MR.strings.pref_reset_viewer_flags_summary), onClick = { scope.launchNonCancellable { val success = Injekt.get().await() withUIContext { val message = if (success) { MR.strings.pref_reset_viewer_flags_success } else { MR.strings.pref_reset_viewer_flags_error } context.toast(message) } } }, ), ), ) } @Composable private fun getReaderGroup( basePreferences: BasePreferences, ): Preference.PreferenceGroup { val context = LocalContext.current val chooseColorProfile = rememberLauncherForActivityResult( contract = ActivityResultContracts.OpenDocument(), ) { uri -> uri?.let { val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION context.contentResolver.takePersistableUriPermission(uri, flags) basePreferences.displayProfile().set(uri.toString()) } } return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_reader), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = basePreferences.hardwareBitmapThreshold(), entries = GLUtil.CUSTOM_TEXTURE_LIMIT_OPTIONS .mapIndexed { index, option -> val display = if (index == 0) { stringResource(MR.strings.pref_hardware_bitmap_threshold_default, option) } else { option.toString() } option to display } .toMap() .toImmutableMap(), title = stringResource(MR.strings.pref_hardware_bitmap_threshold), subtitleProvider = { value, options -> stringResource(MR.strings.pref_hardware_bitmap_threshold_summary, options[value].orEmpty()) }, enabled = !ImageUtil.HARDWARE_BITMAP_UNSUPPORTED && GLUtil.DEVICE_TEXTURE_LIMIT > GLUtil.SAFE_TEXTURE_LIMIT, ), Preference.PreferenceItem.SwitchPreference( preference = basePreferences.alwaysDecodeLongStripWithSSIV(), title = stringResource(MR.strings.pref_always_decode_long_strip_with_ssiv_2), subtitle = stringResource(MR.strings.pref_always_decode_long_strip_with_ssiv_summary), ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_display_profile), subtitle = basePreferences.displayProfile().get(), onClick = { chooseColorProfile.launch(arrayOf("*/*")) }, ), ), ) } @Composable private fun getExtensionsGroup( basePreferences: BasePreferences, ): Preference.PreferenceGroup { val context = LocalContext.current val uriHandler = LocalUriHandler.current val extensionInstallerPref = basePreferences.extensionInstaller() var shizukuMissing by rememberSaveable { mutableStateOf(false) } val trustAnimeExtension = remember { Injekt.get() } val trustMangaExtension = remember { Injekt.get() } if (shizukuMissing) { val dismiss = { shizukuMissing = false } AlertDialog( onDismissRequest = dismiss, title = { Text(text = stringResource(MR.strings.ext_installer_shizuku)) }, text = { Text( text = stringResource(MR.strings.ext_installer_shizuku_unavailable_dialog), ) }, dismissButton = { TextButton(onClick = dismiss) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { dismiss() uriHandler.openUri("https://shizuku.rikka.app/download") }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } return Preference.PreferenceGroup( title = stringResource(MR.strings.label_extensions), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = extensionInstallerPref, entries = extensionInstallerPref.entries .filter { // TODO: allow private option in stable versions once URL handling is more fleshed out if (isReleaseBuildType) { it != BasePreferences.ExtensionInstaller.PRIVATE } else { true } } .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = stringResource(MR.strings.ext_installer_pref), onValueChanged = { if (it == BasePreferences.ExtensionInstaller.SHIZUKU && !context.isShizukuInstalled ) { shizukuMissing = true false } else { true } }, ), Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.ext_revoke_trust), onClick = { trustMangaExtension.revokeAll() trustAnimeExtension.revokeAll() context.toast(MR.strings.requires_app_restart) }, ), ), ) } // SY --> @Composable private fun getDataSaverGroup(): Preference.PreferenceGroup { val sourcePreferences = remember { Injekt.get() } val dataSaver by sourcePreferences.dataSaver().collectAsState() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.data_saver), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = sourcePreferences.dataSaver(), entries = persistentMapOf( DataSaver.NONE to stringResource(MR.strings.disabled), DataSaver.BANDWIDTH_HERO to stringResource(AYMR.strings.bandwidth_hero), DataSaver.WSRV_NL to stringResource(AYMR.strings.wsrv), DataSaver.RESMUSH_IT to stringResource(AYMR.strings.resmush), ), title = stringResource(AYMR.strings.data_saver), subtitle = stringResource(AYMR.strings.data_saver_summary), ), Preference.PreferenceItem.EditTextPreference( preference = sourcePreferences.dataSaverServer(), title = stringResource(AYMR.strings.bandwidth_data_saver_server), subtitle = stringResource(AYMR.strings.data_saver_server_summary), enabled = dataSaver == DataSaver.BANDWIDTH_HERO, ), Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.dataSaverDownloader(), title = stringResource(AYMR.strings.data_saver_downloader), enabled = dataSaver != DataSaver.NONE, ), Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.dataSaverIgnoreJpeg(), title = stringResource(AYMR.strings.data_saver_ignore_jpeg), enabled = dataSaver != DataSaver.NONE, ), Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.dataSaverIgnoreGif(), title = stringResource(AYMR.strings.data_saver_ignore_gif), enabled = dataSaver != DataSaver.NONE, ), Preference.PreferenceItem.ListPreference( preference = sourcePreferences.dataSaverImageQuality(), entries = listOf( "10%", "20%", "40%", "50%", "70%", "80%", "90%", "95%", ).associateBy { it.trimEnd('%').toInt() }.toPersistentMap(), title = stringResource(AYMR.strings.data_saver_image_quality), subtitle = stringResource(AYMR.strings.data_saver_image_quality_summary), enabled = dataSaver != DataSaver.NONE, ), kotlin.run { val dataSaverImageFormatJpeg by sourcePreferences.dataSaverImageFormatJpeg().collectAsState() Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.dataSaverImageFormatJpeg(), title = stringResource(AYMR.strings.data_saver_image_format), subtitle = if (dataSaverImageFormatJpeg) { stringResource(AYMR.strings.data_saver_image_format_summary_on) } else { stringResource(AYMR.strings.data_saver_image_format_summary_off) }, enabled = dataSaver != DataSaver.NONE && dataSaver != DataSaver.RESMUSH_IT, ) }, Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.dataSaverColorBW(), title = stringResource(AYMR.strings.data_saver_color_bw), enabled = dataSaver == DataSaver.BANDWIDTH_HERO, ), ), ) } // SY <-- } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAppearanceScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import android.app.Activity import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.core.app.ActivityCompat import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.NavStyle import eu.kanade.domain.ui.model.StartScreen import eu.kanade.domain.ui.model.TabletUiMode import eu.kanade.domain.ui.model.ThemeMode import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.appearance.AppLanguageScreen import eu.kanade.presentation.more.settings.widget.AppThemeModePreferenceWidget import eu.kanade.presentation.more.settings.widget.AppThemePreferenceWidget import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableMap import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.LocalDate object SettingsAppearanceScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.pref_category_appearance @Composable override fun getPreferences(): List { val uiPreferences = remember { Injekt.get() } return listOf( getThemeGroup(uiPreferences = uiPreferences), getDisplayGroup(uiPreferences = uiPreferences), ) } @Composable private fun getThemeGroup( uiPreferences: UiPreferences, ): Preference.PreferenceGroup { val context = LocalContext.current val themeModePref = uiPreferences.themeMode() val themeMode by themeModePref.collectAsState() val appThemePref = uiPreferences.appTheme() val appTheme by appThemePref.collectAsState() val amoledPref = uiPreferences.themeDarkAmoled() val amoled by amoledPref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_theme), preferenceItems = persistentListOf( Preference.PreferenceItem.CustomPreference( title = stringResource(MR.strings.pref_app_theme), ) { Column { AppThemeModePreferenceWidget( value = themeMode, onItemClick = { themeModePref.set(it) setAppCompatDelegateThemeMode(it) }, ) AppThemePreferenceWidget( value = appTheme, amoled = amoled, onItemClick = { appThemePref.set(it) }, ) } }, Preference.PreferenceItem.SwitchPreference( preference = amoledPref, title = stringResource(MR.strings.pref_dark_theme_pure_black), enabled = themeMode != ThemeMode.LIGHT, onValueChanged = { (context as? Activity)?.let { ActivityCompat.recreate(it) } true }, ), ), ) } @Composable private fun getDisplayGroup( uiPreferences: UiPreferences, ): Preference.PreferenceGroup { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val now = remember { LocalDate.now() } val dateFormat by uiPreferences.dateFormat().collectAsState() val formattedNow = remember(dateFormat) { UiPreferences.dateFormat(dateFormat).format(now) } return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_display), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_app_language), onClick = { navigator.push(AppLanguageScreen()) }, ), Preference.PreferenceItem.ListPreference( preference = uiPreferences.tabletUiMode(), entries = TabletUiMode.entries .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = stringResource(MR.strings.pref_tablet_ui_mode), onValueChanged = { context.toast(MR.strings.requires_app_restart) true }, ), Preference.PreferenceItem.ListPreference( preference = uiPreferences.startScreen(), entries = StartScreen.entries .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = stringResource(AYMR.strings.pref_start_screen), onValueChanged = { context.toast(MR.strings.requires_app_restart) true }, ), Preference.PreferenceItem.ListPreference( preference = uiPreferences.navStyle(), entries = NavStyle.entries .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = "Navigation Style", onValueChanged = { true }, ), Preference.PreferenceItem.ListPreference( preference = uiPreferences.dateFormat(), entries = DateFormats .associateWith { val formattedDate = UiPreferences.dateFormat(it).format(now) "${it.ifEmpty { stringResource(MR.strings.label_default) }} ($formattedDate)" } .toImmutableMap(), title = stringResource(MR.strings.pref_date_format), ), Preference.PreferenceItem.SwitchPreference( preference = uiPreferences.relativeTime(), title = stringResource(MR.strings.pref_relative_format), subtitle = stringResource( MR.strings.pref_relative_format_summary, stringResource(MR.strings.relative_time_today), formattedNow, ), ), ), ) } } private val DateFormats = listOf( "", // Default "MM/dd/yy", "dd/MM/yy", "yyyy-MM-dd", "dd MMM yyyy", "MMM dd, yyyy", ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.fragment.app.FragmentActivity import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.browse.AnimeExtensionReposScreen import eu.kanade.presentation.more.settings.screen.browse.MangaExtensionReposScreen import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import kotlinx.collections.immutable.persistentListOf import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepoCount import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepoCount import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsBrowseScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.browse @Composable override fun getPreferences(): List { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val sourcePreferences = remember { Injekt.get() } val getMangaExtensionRepoCount = remember { Injekt.get() } val getAnimeExtensionRepoCount = remember { Injekt.get() } val mangaReposCount by getMangaExtensionRepoCount.subscribe().collectAsState(0) val animeReposCount by getAnimeExtensionRepoCount.subscribe().collectAsState(0) return listOf( Preference.PreferenceGroup( title = stringResource(MR.strings.label_sources), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.hideInAnimeLibraryItems(), title = stringResource(AYMR.strings.pref_hide_in_anime_library_items), ), Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.hideInMangaLibraryItems(), title = stringResource(AYMR.strings.pref_hide_in_manga_library_items), ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.label_anime_extension_repos), subtitle = pluralStringResource( MR.plurals.num_repos, animeReposCount, animeReposCount, ), onClick = { navigator.push(AnimeExtensionReposScreen()) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.label_manga_extension_repos), subtitle = pluralStringResource( MR.plurals.num_repos, mangaReposCount, mangaReposCount, ), onClick = { navigator.push(MangaExtensionReposScreen()) }, ), ), ), Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_nsfw_content), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = sourcePreferences.showNsfwSource(), title = stringResource(MR.strings.pref_show_nsfw_source), subtitle = stringResource(MR.strings.requires_app_restart), onValueChanged = { (context as FragmentActivity).authenticate( title = context.stringResource(MR.strings.pref_category_nsfw_content), ) }, ), Preference.PreferenceItem.InfoPreference( stringResource(MR.strings.parental_controls_info), ), ), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.net.Uri import androidx.activity.compose.ManagedActivityResultLauncher import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material.icons.outlined.Storage import androidx.compose.material3.AlertDialog import androidx.compose.material3.Checkbox import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MultiChoiceSegmentedButtonRow import androidx.compose.material3.SegmentedButton import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.core.net.toUri import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import com.hippo.unifile.UniFile import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.data.CreateBackupScreen import eu.kanade.presentation.more.settings.screen.data.RestoreBackupScreen import eu.kanade.presentation.more.settings.screen.data.StorageInfo import eu.kanade.presentation.more.settings.widget.BasePreferenceWidget import eu.kanade.presentation.more.settings.widget.PrefsHorizontalPadding import eu.kanade.presentation.util.relativeTimeSpanString import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob import eu.kanade.tachiyomi.data.backup.restore.BackupRestoreJob import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.export.ExportEntry import eu.kanade.tachiyomi.data.export.ExportEntry.Companion.toExportEntry import eu.kanade.tachiyomi.data.export.LibraryExporter import eu.kanade.tachiyomi.data.export.LibraryExporter.ExportOptions import eu.kanade.tachiyomi.ui.storage.StorageTab import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.displayablePath import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.entries.anime.interactor.GetAnimeFavorites import tachiyomi.domain.entries.manga.interactor.GetMangaFavorites import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.storage.service.StoragePreferences import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsDataScreen : SearchableSettings { val restorePreferenceKeyString = MR.strings.label_backup const val HELP_URL = "https://aniyomi.org/docs/faq/storage" @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.label_data_storage @Composable override fun RowScope.AppBarAction() { val uriHandler = LocalUriHandler.current IconButton(onClick = { uriHandler.openUri(HELP_URL) }) { Icon( imageVector = Icons.AutoMirrored.Outlined.HelpOutline, contentDescription = stringResource(MR.strings.tracking_guide), ) } } @Composable override fun getPreferences(): List { val backupPreferences = Injekt.get() val storagePreferences = Injekt.get() return persistentListOf( getStorageLocationPref(storagePreferences = storagePreferences), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.pref_storage_location_info)), getBackupAndRestoreGroup(backupPreferences = backupPreferences), getDataGroup(), getExportGroup(), ) } @Composable fun storageLocationPicker( storageDirPref: tachiyomi.core.common.preference.Preference, ): ManagedActivityResultLauncher { val context = LocalContext.current return rememberLauncherForActivityResult( contract = ActivityResultContracts.OpenDocumentTree(), ) { uri -> if (uri != null) { val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION // For some reason InkBook devices do not implement the SAF properly. Persistable URI grants do not // work. However, simply retrieving the URI and using it works fine for these devices. Access is not // revoked after the app is closed or the device is restarted. // This also holds for some Samsung devices. Thus, we simply execute inside of a try-catch block and // ignore the exception if it is thrown. try { context.contentResolver.takePersistableUriPermission(uri, flags) } catch (e: SecurityException) { logcat(LogPriority.ERROR, e) context.toast(MR.strings.file_picker_uri_permission_unsupported) } UniFile.fromUri(context, uri)?.let { storageDirPref.set(it.uri.toString()) } } } } @Composable fun storageLocationText( storageDirPref: tachiyomi.core.common.preference.Preference, ): String { val context = LocalContext.current val storageDir by storageDirPref.collectAsState() if (!storageDirPref.isSet()) { return stringResource(MR.strings.no_location_set) } return remember(storageDir) { val file = UniFile.fromUri(context, storageDir.toUri()) file?.displayablePath } ?: stringResource(MR.strings.invalid_location, storageDir) } @Composable private fun getStorageLocationPref( storagePreferences: StoragePreferences, ): Preference.PreferenceItem.TextPreference { val context = LocalContext.current val pickStorageLocation = storageLocationPicker(storagePreferences.baseStorageDirectory()) return Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.pref_storage_location), subtitle = storageLocationText(storagePreferences.baseStorageDirectory()), onClick = { try { pickStorageLocation.launch(null) } catch (e: ActivityNotFoundException) { context.toast(MR.strings.file_picker_error) } }, ) } @Composable private fun getBackupAndRestoreGroup(backupPreferences: BackupPreferences): Preference.PreferenceGroup { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val lastAutoBackup by backupPreferences.lastAutoBackupTimestamp().collectAsState() val chooseBackup = rememberLauncherForActivityResult( object : ActivityResultContracts.GetContent() { override fun createIntent(context: Context, input: String): Intent { val intent = super.createIntent(context, input) return Intent.createChooser(intent, context.stringResource(MR.strings.file_select_backup)) } }, ) { if (it == null) { context.toast(MR.strings.file_null_uri_error) return@rememberLauncherForActivityResult } navigator.push(RestoreBackupScreen(it.toString())) } return Preference.PreferenceGroup( title = stringResource(MR.strings.label_backup), preferenceItems = persistentListOf( // Manual actions Preference.PreferenceItem.CustomPreference( title = stringResource(restorePreferenceKeyString), ) { BasePreferenceWidget( subcomponent = { MultiChoiceSegmentedButtonRow( modifier = Modifier .fillMaxWidth() .height(intrinsicSize = IntrinsicSize.Min) .padding(horizontal = PrefsHorizontalPadding), ) { SegmentedButton( modifier = Modifier.fillMaxHeight(), checked = false, onCheckedChange = { navigator.push(CreateBackupScreen()) }, shape = SegmentedButtonDefaults.itemShape(0, 2), ) { Text(stringResource(MR.strings.pref_create_backup)) } SegmentedButton( modifier = Modifier.fillMaxHeight(), checked = false, onCheckedChange = { if (!BackupRestoreJob.isRunning(context)) { if (DeviceUtil.isMiui && DeviceUtil.isMiuiOptimizationDisabled()) { context.toast(MR.strings.restore_miui_warning) } // no need to catch because it's wrapped with a chooser chooseBackup.launch("*/*") } else { context.toast(MR.strings.restore_in_progress) } }, shape = SegmentedButtonDefaults.itemShape(1, 2), ) { Text(stringResource(MR.strings.pref_restore_backup)) } } }, ) }, // Automatic backups Preference.PreferenceItem.ListPreference( preference = backupPreferences.backupInterval(), entries = persistentMapOf( 0 to stringResource(MR.strings.off), 6 to stringResource(MR.strings.update_6hour), 12 to stringResource(MR.strings.update_12hour), 24 to stringResource(MR.strings.update_24hour), 48 to stringResource(MR.strings.update_48hour), 168 to stringResource(MR.strings.update_weekly), ), title = stringResource(MR.strings.pref_backup_interval), onValueChanged = { BackupCreateJob.setupTask(context, it) true }, ), Preference.PreferenceItem.InfoPreference( stringResource(MR.strings.backup_info) + "\n\n" + stringResource(MR.strings.last_auto_backup_info, relativeTimeSpanString(lastAutoBackup)), ), ), ) } @Composable private fun getDataGroup(): Preference.PreferenceGroup { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val libraryPreferences = remember { Injekt.get() } val chapterCache = remember { Injekt.get() } var cacheReadableSizeSema by remember { mutableIntStateOf(0) } val cacheReadableSize = remember(cacheReadableSizeSema) { chapterCache.readableSize } return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_storage_usage), preferenceItems = persistentListOf( Preference.PreferenceItem.CustomPreference( title = stringResource(MR.strings.pref_storage_usage), ) { BasePreferenceWidget( subcomponent = { StorageInfo( modifier = Modifier.padding(horizontal = PrefsHorizontalPadding), ) }, ) }, Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.label_storage), icon = Icons.Outlined.Storage, onClick = { navigator.push(StorageTab) }, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.pref_clear_chapter_cache), subtitle = stringResource(MR.strings.used_cache, cacheReadableSize), onClick = { scope.launchNonCancellable { try { val deletedFiles = chapterCache.clear() withUIContext { context.toast(context.stringResource(MR.strings.cache_deleted, deletedFiles)) cacheReadableSizeSema++ } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) withUIContext { context.toast(MR.strings.cache_delete_error) } } } }, ), Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.autoClearItemCache(), title = stringResource(AYMR.strings.pref_auto_clear_chapter_cache), ), ), ) } @Composable private fun getExportGroup(): Preference.PreferenceGroup { var showDialog by remember { mutableStateOf(false) } var exportOptions by remember { mutableStateOf( ExportOptions( includeTitle = true, includeType = true, includeAuthor = true, includeArtist = true, ), ) } val context = LocalContext.current val scope = rememberCoroutineScope() val getAnimeFavorites = remember { Injekt.get() } val getMangaFavorites = remember { Injekt.get() } var favorites by remember { mutableStateOf>(emptyList()) } LaunchedEffect(Unit) { favorites = getAnimeFavorites.await().map { it.toExportEntry() } + getMangaFavorites.await().map { it.toExportEntry() } } val saveFileLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.CreateDocument("text/csv"), ) { uri -> uri?.let { scope.launch { LibraryExporter.exportToCsv( context = context, uri = it, favorites = favorites, options = exportOptions, onExportComplete = { scope.launch(Dispatchers.Main) { context.toast(MR.strings.library_exported) } }, ) } } } if (showDialog) { ColumnSelectionDialog( options = exportOptions, onConfirm = { options -> exportOptions = options saveFileLauncher.launch("aniyomi_library.csv") }, onDismissRequest = { showDialog = false }, ) } return Preference.PreferenceGroup( title = stringResource(MR.strings.export), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(MR.strings.library_list), onClick = { showDialog = true }, ), ), ) } @Composable private fun ColumnSelectionDialog( options: ExportOptions, onConfirm: (ExportOptions) -> Unit, onDismissRequest: () -> Unit, ) { var titleSelected by remember { mutableStateOf(options.includeTitle) } var typeSelected by remember { mutableStateOf(options.includeType) } var authorSelected by remember { mutableStateOf(options.includeAuthor) } var artistSelected by remember { mutableStateOf(options.includeArtist) } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(MR.strings.migration_dialog_what_to_include)) }, text = { Column { Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( checked = titleSelected, onCheckedChange = { checked -> titleSelected = checked if (!checked) { authorSelected = false artistSelected = false typeSelected = false } }, ) Text(text = stringResource(MR.strings.title)) } Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( checked = typeSelected, onCheckedChange = { typeSelected = it }, enabled = titleSelected, ) Text(text = stringResource(AYMR.strings.type)) } Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( checked = authorSelected, onCheckedChange = { authorSelected = it }, enabled = titleSelected, ) Text(text = stringResource(MR.strings.author)) } Row(verticalAlignment = Alignment.CenterVertically) { Checkbox( checked = artistSelected, onCheckedChange = { artistSelected = it }, enabled = titleSelected, ) Text(text = stringResource(MR.strings.artist)) } } }, confirmButton = { TextButton( onClick = { onConfirm( ExportOptions( includeTitle = titleSelected, includeType = typeSelected, includeAuthor = authorSelected, includeArtist = artistSelected, ), ) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_save)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDownloadScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastMap import eu.kanade.domain.base.BasePreferences import eu.kanade.presentation.category.visualName import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.widget.TriStateListDialog import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toPersistentMap import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.OutlinedNumericChooser import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsDownloadScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.pref_category_downloads @Composable override fun getPreferences(): List { val getMangaCategories = remember { Injekt.get() } val allMangaCategories by getMangaCategories.subscribe().collectAsState(initial = emptyList()) val getAnimeCategories = remember { Injekt.get() } val allAnimeCategories by getAnimeCategories.subscribe().collectAsState(initial = emptyList()) val downloadPreferences = remember { Injekt.get() } val basePreferences = remember { Injekt.get() } val speedLimit by downloadPreferences.downloadSpeedLimit().collectAsState() var currentSpeedLimit by remember { mutableIntStateOf(speedLimit) } var showDownloadLimitDialog by rememberSaveable { mutableStateOf(false) } if (showDownloadLimitDialog) { DownloadLimitDialog( initialValue = currentSpeedLimit, onDismissRequest = { showDownloadLimitDialog = false }, onValueChanged = { currentSpeedLimit = it }, onConfirm = { downloadPreferences.downloadSpeedLimit().set(currentSpeedLimit) showDownloadLimitDialog = false }, ) } return listOf( Preference.PreferenceItem.SwitchPreference( preference = downloadPreferences.downloadOnlyOverWifi(), title = stringResource(MR.strings.connected_to_wifi), ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.download_speed_limit), subtitle = if (speedLimit == 0) { stringResource(MR.strings.off) } else { "$speedLimit KiB/s" }, onClick = { showDownloadLimitDialog = true }, ), Preference.PreferenceItem.SwitchPreference( preference = downloadPreferences.saveChaptersAsCBZ(), title = stringResource(MR.strings.save_chapter_as_cbz), ), Preference.PreferenceItem.SwitchPreference( preference = downloadPreferences.splitTallImages(), title = stringResource(MR.strings.split_tall_images), subtitle = stringResource(MR.strings.split_tall_images_summary), ), Preference.PreferenceItem.ListPreference( preference = downloadPreferences.numberOfDownloads(), entries = (1..5).associateWith { it.toString() }.toImmutableMap(), title = stringResource(AYMR.strings.pref_download_slots), ), Preference.PreferenceItem.InfoPreference(stringResource(AYMR.strings.download_slots_info)), getDeleteChaptersGroup( downloadPreferences = downloadPreferences, animeCategories = allAnimeCategories.toImmutableList(), mangaCategories = allMangaCategories.toImmutableList(), ), getAutoDownloadGroup( downloadPreferences = downloadPreferences, allAnimeCategories = allAnimeCategories.toImmutableList(), allMangaCategories = allMangaCategories.toImmutableList(), ), getDownloadAheadGroup(downloadPreferences = downloadPreferences), getExternalDownloaderGroup( downloadPreferences = downloadPreferences, basePreferences = basePreferences, ), ) } @Composable private fun getDeleteChaptersGroup( downloadPreferences: DownloadPreferences, animeCategories: ImmutableList, mangaCategories: ImmutableList, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_delete_chapters), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = downloadPreferences.removeAfterMarkedAsRead(), title = stringResource(AYMR.strings.pref_remove_after_marked_as_read), ), Preference.PreferenceItem.ListPreference( preference = downloadPreferences.removeAfterReadSlots(), entries = persistentMapOf( -1 to stringResource(MR.strings.disabled), 0 to stringResource(MR.strings.last_read_chapter), 1 to stringResource(MR.strings.second_to_last), 2 to stringResource(MR.strings.third_to_last), 3 to stringResource(MR.strings.fourth_to_last), 4 to stringResource(MR.strings.fifth_to_last), ), title = stringResource(AYMR.strings.pref_remove_after_read), ), Preference.PreferenceItem.SwitchPreference( preference = downloadPreferences.removeBookmarkedChapters(), title = stringResource(AYMR.strings.pref_remove_bookmarked_chapters), ), Preference.PreferenceItem.SwitchPreference( preference = downloadPreferences.downloadFillermarkedItems(), title = stringResource(AYMR.strings.pref_download_fillermarked_items), ), getExcludedAnimeCategoriesPreference( downloadPreferences = downloadPreferences, categories = { animeCategories }, ), getExcludedCategoriesPreference( downloadPreferences = downloadPreferences, categories = { mangaCategories }, ), ), ) } @Composable private fun getExcludedCategoriesPreference( downloadPreferences: DownloadPreferences, categories: () -> List, ): Preference.PreferenceItem.MultiSelectListPreference { return Preference.PreferenceItem.MultiSelectListPreference( preference = downloadPreferences.removeExcludeCategories(), entries = categories() .associate { it.id.toString() to it.visualName } .toImmutableMap(), title = stringResource(AYMR.strings.pref_remove_exclude_categories_manga), ) } @Composable private fun getExcludedAnimeCategoriesPreference( downloadPreferences: DownloadPreferences, categories: () -> List, ): Preference.PreferenceItem.MultiSelectListPreference { return Preference.PreferenceItem.MultiSelectListPreference( preference = downloadPreferences.removeExcludeAnimeCategories(), entries = categories() .associate { it.id.toString() to it.visualName } .toImmutableMap(), title = stringResource(AYMR.strings.pref_remove_exclude_categories_anime), ) } @Composable private fun getAutoDownloadGroup( downloadPreferences: DownloadPreferences, allAnimeCategories: ImmutableList, allMangaCategories: ImmutableList, ): Preference.PreferenceGroup { val downloadNewEpisodesPref = downloadPreferences.downloadNewEpisodes() val downloadNewUnseenEpisodesOnlyPref = downloadPreferences.downloadNewUnseenEpisodesOnly() val downloadNewEpisodeCategoriesPref = downloadPreferences.downloadNewEpisodeCategories() val downloadNewEpisodeCategoriesExcludePref = downloadPreferences.downloadNewEpisodeCategoriesExclude() val downloadNewEpisodes by downloadNewEpisodesPref.collectAsState() val includedAnime by downloadNewEpisodeCategoriesPref.collectAsState() val excludedAnime by downloadNewEpisodeCategoriesExcludePref.collectAsState() var showAnimeDialog by rememberSaveable { mutableStateOf(false) } if (showAnimeDialog) { TriStateListDialog( title = stringResource(AYMR.strings.anime_categories), message = stringResource(MR.strings.pref_download_new_categories_details), items = allAnimeCategories, initialChecked = includedAnime.mapNotNull { id -> allAnimeCategories.find { it.id.toString() == id } }, initialInversed = excludedAnime.mapNotNull { id -> allAnimeCategories.find { it.id.toString() == id } }, itemLabel = { it.visualName }, onDismissRequest = { showAnimeDialog = false }, onValueChanged = { newIncluded, newExcluded -> downloadNewEpisodeCategoriesPref.set( newIncluded.fastMap { it.id.toString() }.toSet(), ) downloadNewEpisodeCategoriesExcludePref.set( newExcluded.fastMap { it.id.toString() }.toSet(), ) showAnimeDialog = false }, ) } val downloadNewChaptersPref = downloadPreferences.downloadNewChapters() val downloadNewUnreadChaptersOnlyPref = downloadPreferences.downloadNewUnreadChaptersOnly() val downloadNewChapterCategoriesPref = downloadPreferences.downloadNewChapterCategories() val downloadNewChapterCategoriesExcludePref = downloadPreferences.downloadNewChapterCategoriesExclude() val downloadNewChapters by downloadNewChaptersPref.collectAsState() val included by downloadNewChapterCategoriesPref.collectAsState() val excluded by downloadNewChapterCategoriesExcludePref.collectAsState() var showDialog by rememberSaveable { mutableStateOf(false) } if (showDialog) { TriStateListDialog( title = stringResource(AYMR.strings.manga_categories), message = stringResource(MR.strings.pref_download_new_categories_details), items = allMangaCategories, initialChecked = included.mapNotNull { id -> allMangaCategories.find { it.id.toString() == id } }, initialInversed = excluded.mapNotNull { id -> allMangaCategories.find { it.id.toString() == id } }, itemLabel = { it.visualName }, onDismissRequest = { showDialog = false }, onValueChanged = { newIncluded, newExcluded -> downloadNewChapterCategoriesPref.set( newIncluded.fastMap { it.id.toString() }.toSet(), ) downloadNewChapterCategoriesExcludePref.set( newExcluded.fastMap { it.id.toString() }.toSet(), ) showDialog = false }, ) } return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_auto_download), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = downloadNewEpisodesPref, title = stringResource(AYMR.strings.pref_download_new_episodes), ), Preference.PreferenceItem.SwitchPreference( preference = downloadNewUnseenEpisodesOnlyPref, title = stringResource(AYMR.strings.pref_download_new_unseen_episodes_only), enabled = downloadNewEpisodes, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.anime_categories), subtitle = getCategoriesLabel( allCategories = allAnimeCategories, included = includedAnime, excluded = excludedAnime, ), enabled = downloadNewEpisodes, onClick = { showAnimeDialog = true }, ), Preference.PreferenceItem.SwitchPreference( preference = downloadNewChaptersPref, title = stringResource(MR.strings.pref_download_new), ), Preference.PreferenceItem.SwitchPreference( preference = downloadNewUnreadChaptersOnlyPref, title = stringResource(MR.strings.pref_download_new_unread_chapters_only), enabled = downloadNewChapters, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.manga_categories), subtitle = getCategoriesLabel( allCategories = allMangaCategories, included = included, excluded = excluded, ), enabled = downloadNewChapters, onClick = { showDialog = true }, ), ), ) } @Composable private fun getDownloadAheadGroup( downloadPreferences: DownloadPreferences, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(MR.strings.download_ahead), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = downloadPreferences.autoDownloadWhileWatching(), entries = listOf(0, 2, 3, 5, 10) .associateWith { if (it == 0) { stringResource(MR.strings.disabled) } else { pluralStringResource(AYMR.plurals.next_unseen_episodes, count = it, it) } } .toImmutableMap(), title = stringResource(AYMR.strings.auto_download_while_watching), ), Preference.PreferenceItem.ListPreference( preference = downloadPreferences.autoDownloadWhileReading(), entries = listOf(0, 2, 3, 5, 10) .associateWith { if (it == 0) { stringResource(MR.strings.disabled) } else { pluralStringResource(MR.plurals.next_unread_chapters, count = it, it) } } .toImmutableMap(), title = stringResource(MR.strings.auto_download_while_reading), ), Preference.PreferenceItem.InfoPreference( stringResource(AYMR.strings.download_ahead_info), ), ), ) } @Composable private fun getExternalDownloaderGroup( downloadPreferences: DownloadPreferences, basePreferences: BasePreferences, ): Preference.PreferenceGroup { val useExternalDownloader = downloadPreferences.useExternalDownloader() val externalDownloaderPreference = downloadPreferences.externalDownloaderSelection() val pm = basePreferences.context.packageManager val installedPackages = pm.getInstalledPackages(0) val supportedDownloaders = installedPackages.filter { when (it.packageName) { "idm.internet.download.manager" -> true "idm.internet.download.manager.plus" -> true "idm.internet.download.manager.adm.lite" -> true "com.dv.adm" -> true else -> false } } val packageNames = supportedDownloaders.map { it.packageName } val packageNamesReadable = supportedDownloaders .map { pm.getApplicationLabel(it.applicationInfo!!).toString() } val packageNamesMap: Map = mapOf("" to "None") + packageNames.zip(packageNamesReadable).toMap() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_external_downloader), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = useExternalDownloader, title = stringResource(AYMR.strings.pref_use_external_downloader), ), Preference.PreferenceItem.ListPreference( preference = externalDownloaderPreference, entries = packageNamesMap.toPersistentMap(), title = stringResource(AYMR.strings.pref_external_downloader_selection), ), ), ) } @Composable private fun DownloadLimitDialog( initialValue: Int, onDismissRequest: () -> Unit, onValueChanged: (newValue: Int) -> Unit, onConfirm: () -> Unit, ) { AlertDialog( onDismissRequest = onDismissRequest, title = { Text(stringResource(AYMR.strings.download_speed_limit)) }, text = { Column { Row( modifier = Modifier .padding(bottom = MaterialTheme.padding.medium) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceEvenly, ) { OutlinedNumericChooser( label = stringResource(AYMR.strings.download_speed_limit), placeholder = "0", suffix = "KiB/s", value = initialValue, step = 100, min = 0, onValueChanged = onValueChanged, ) } Text(text = stringResource(AYMR.strings.download_speed_limit_hint)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { onConfirm() }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.util.fastMap import androidx.core.content.ContextCompat import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.visualName import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.PreferenceItem import eu.kanade.presentation.more.settings.widget.TriStateListDialog import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateJob import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateJob import eu.kanade.tachiyomi.ui.category.CategoriesTab import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableMap import kotlinx.coroutines.launch import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.ResetMangaCategoryFlags import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_CHARGING import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_NETWORK_NOT_METERED import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_ONLY_ON_WIFI import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_HAS_UNVIEWED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_NON_COMPLETED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_NON_VIEWED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_OUTSIDE_RELEASE_PERIOD import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_CHAPTER_READ_EXISTING import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_CHAPTER_READ_NEW import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_EPISODE_SEEN_EXISTING import tachiyomi.domain.library.service.LibraryPreferences.Companion.MARK_DUPLICATE_EPISODE_SEEN_NEW import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsLibraryScreen : SearchableSettings { @Composable @ReadOnlyComposable override fun getTitleRes() = MR.strings.pref_category_library @Composable override fun getPreferences(): List { val getCategories = remember { Injekt.get() } val allCategories by getCategories.subscribe().collectAsState(initial = emptyList()) val getAnimeCategories = remember { Injekt.get() } val allAnimeCategories by getAnimeCategories.subscribe().collectAsState(initial = emptyList()) val libraryPreferences = remember { Injekt.get() } return listOf( getCategoriesGroup( LocalNavigator.currentOrThrow, allCategories, allAnimeCategories, libraryPreferences, ), getGlobalUpdateGroup(allCategories, allAnimeCategories, libraryPreferences), getSeasonBehaviorGroup(libraryPreferences), getAnimeBehaviorGroup(libraryPreferences), getBehaviorGroup(libraryPreferences), ) } @Composable private fun getCategoriesGroup( navigator: Navigator, allCategories: List, allAnimeCategories: List, libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { val scope = rememberCoroutineScope() val userCategoriesCount = allCategories.filterNot(Category::isSystemCategory).size val userAnimeCategoriesCount = allAnimeCategories.filterNot(Category::isSystemCategory).size // For default category val mangaIds = listOf(libraryPreferences.defaultMangaCategory().defaultValue()) + allCategories.fastMap { it.id.toInt() } val animeIds = listOf(libraryPreferences.defaultAnimeCategory().defaultValue()) + allAnimeCategories.fastMap { it.id.toInt() } val mangaLabels = listOf(stringResource(MR.strings.default_category_summary)) + allCategories.fastMap { it.visualName } val animeLabels = listOf(stringResource(MR.strings.default_category_summary)) + allAnimeCategories.fastMap { it.visualName } return Preference.PreferenceGroup( title = stringResource(AYMR.strings.general_categories), preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.action_edit_anime_categories), subtitle = pluralStringResource( MR.plurals.num_categories, count = userAnimeCategoriesCount, userAnimeCategoriesCount, ), onClick = { navigator.push(CategoriesTab) }, ), Preference.PreferenceItem.ListPreference( preference = libraryPreferences.defaultAnimeCategory(), entries = animeIds.zip(animeLabels).toMap().toImmutableMap(), title = stringResource(AYMR.strings.default_anime_category), ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.action_edit_manga_categories), subtitle = pluralStringResource( MR.plurals.num_categories, count = userCategoriesCount, userCategoriesCount, ), onClick = { navigator.push(CategoriesTab) CategoriesTab.showMangaCategory() }, ), Preference.PreferenceItem.ListPreference( preference = libraryPreferences.defaultMangaCategory(), entries = mangaIds.zip(mangaLabels).toMap().toImmutableMap(), title = stringResource(AYMR.strings.default_manga_category), ), Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.categorizedDisplaySettings(), title = stringResource(MR.strings.categorized_display_settings), onValueChanged = { if (!it) { scope.launch { Injekt.get().await() } } true }, ), Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.hideHiddenCategoriesSettings(), title = stringResource(AYMR.strings.pref_category_hide_hidden), ), ), ) } @Composable private fun getGlobalUpdateGroup( allMangaCategories: List, allAnimeCategories: List, libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { val context = LocalContext.current val autoUpdateIntervalPref = libraryPreferences.autoUpdateInterval() val autoUpdateInterval by autoUpdateIntervalPref.collectAsState() val animeAutoUpdateCategoriesPref = libraryPreferences.animeUpdateCategories() val animeAutoUpdateCategoriesExcludePref = libraryPreferences.animeUpdateCategoriesExclude() val includedAnime by animeAutoUpdateCategoriesPref.collectAsState() val excludedAnime by animeAutoUpdateCategoriesExcludePref.collectAsState() var showAnimeCategoriesDialog by rememberSaveable { mutableStateOf(false) } if (showAnimeCategoriesDialog) { TriStateListDialog( title = stringResource(AYMR.strings.anime_categories), message = stringResource(AYMR.strings.pref_anime_library_update_categories_details), items = allAnimeCategories, initialChecked = includedAnime.mapNotNull { id -> allAnimeCategories.find { it.id.toString() == id } }, initialInversed = excludedAnime.mapNotNull { id -> allAnimeCategories.find { it.id.toString() == id } }, itemLabel = { it.visualName }, onDismissRequest = { showAnimeCategoriesDialog = false }, onValueChanged = { newIncluded, newExcluded -> animeAutoUpdateCategoriesPref.set(newIncluded.map { it.id.toString() }.toSet()) animeAutoUpdateCategoriesExcludePref.set( newExcluded.map { it.id.toString() } .toSet(), ) showAnimeCategoriesDialog = false }, ) } val autoUpdateCategoriesPref = libraryPreferences.mangaUpdateCategories() val autoUpdateCategoriesExcludePref = libraryPreferences.mangaUpdateCategoriesExclude() val includedManga by autoUpdateCategoriesPref.collectAsState() val excludedManga by autoUpdateCategoriesExcludePref.collectAsState() var showMangaCategoriesDialog by rememberSaveable { mutableStateOf(false) } if (showMangaCategoriesDialog) { TriStateListDialog( title = stringResource(AYMR.strings.manga_categories), message = stringResource(AYMR.strings.pref_manga_library_update_categories_details), items = allMangaCategories, initialChecked = includedManga.mapNotNull { id -> allMangaCategories.find { it.id.toString() == id } }, initialInversed = excludedManga.mapNotNull { id -> allMangaCategories.find { it.id.toString() == id } }, itemLabel = { it.visualName }, onDismissRequest = { showMangaCategoriesDialog = false }, onValueChanged = { newIncluded, newExcluded -> autoUpdateCategoriesPref.set(newIncluded.map { it.id.toString() }.toSet()) autoUpdateCategoriesExcludePref.set( newExcluded.map { it.id.toString() } .toSet(), ) showMangaCategoriesDialog = false }, ) } return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_library_update), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = autoUpdateIntervalPref, entries = persistentMapOf( 0 to stringResource(MR.strings.update_never), 12 to stringResource(MR.strings.update_12hour), 24 to stringResource(MR.strings.update_24hour), 48 to stringResource(MR.strings.update_48hour), 72 to stringResource(MR.strings.update_72hour), 168 to stringResource(MR.strings.update_weekly), ), title = stringResource(MR.strings.pref_library_update_interval), onValueChanged = { MangaLibraryUpdateJob.setupTask(context, it) AnimeLibraryUpdateJob.setupTask(context, it) true }, ), Preference.PreferenceItem.MultiSelectListPreference( preference = libraryPreferences.autoUpdateDeviceRestrictions(), entries = persistentMapOf( DEVICE_ONLY_ON_WIFI to stringResource(MR.strings.connected_to_wifi), DEVICE_NETWORK_NOT_METERED to stringResource(MR.strings.network_not_metered), DEVICE_CHARGING to stringResource(MR.strings.charging), ), title = stringResource(MR.strings.pref_library_update_restriction), subtitle = stringResource(MR.strings.restrictions), enabled = autoUpdateInterval > 0, onValueChanged = { // Post to event looper to allow the preference to be updated. ContextCompat.getMainExecutor(context).execute { MangaLibraryUpdateJob.setupTask(context) AnimeLibraryUpdateJob.setupTask(context) } true }, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.anime_categories), subtitle = getCategoriesLabel( allCategories = allAnimeCategories, included = includedAnime, excluded = excludedAnime, ), onClick = { showAnimeCategoriesDialog = true }, ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.manga_categories), subtitle = getCategoriesLabel( allCategories = allMangaCategories, included = includedManga, excluded = excludedManga, ), onClick = { showMangaCategoriesDialog = true }, ), Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.autoUpdateMetadata(), title = stringResource(MR.strings.pref_library_update_refresh_metadata), subtitle = stringResource(MR.strings.pref_library_update_refresh_metadata_summary), ), Preference.PreferenceItem.MultiSelectListPreference( preference = libraryPreferences.autoUpdateItemRestrictions(), entries = persistentMapOf( ENTRY_HAS_UNVIEWED to stringResource(AYMR.strings.pref_update_only_completely_read), ENTRY_NON_VIEWED to stringResource(MR.strings.pref_update_only_started), ENTRY_NON_COMPLETED to stringResource(MR.strings.pref_update_only_non_completed), ENTRY_OUTSIDE_RELEASE_PERIOD to stringResource(MR.strings.pref_update_only_in_release_period), ), title = stringResource(MR.strings.pref_library_update_smart_update), ), Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.newShowUpdatesCount(), title = stringResource(AYMR.strings.pref_library_update_show_tab_badge), ), ), ) } @Composable private fun getSeasonBehaviorGroup( libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_library_season), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.updateSeasonOnRefresh(), title = stringResource(AYMR.strings.pref_update_seasons_refresh), ), Preference.PreferenceItem.SwitchPreference( preference = libraryPreferences.updateSeasonOnLibraryUpdate(), title = stringResource(AYMR.strings.pref_update_seasons_update), ), ), ) } @Composable private fun getBehaviorGroup( libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_behavior), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = libraryPreferences.swipeChapterStartAction(), entries = persistentMapOf( LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(MR.strings.disabled), LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(MR.strings.action_bookmark), LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(MR.strings.action_mark_as_read), LibraryPreferences.ChapterSwipeAction.Download to stringResource(MR.strings.action_download), ), title = stringResource(MR.strings.pref_chapter_swipe_start), ), Preference.PreferenceItem.ListPreference( preference = libraryPreferences.swipeChapterEndAction(), entries = persistentMapOf( LibraryPreferences.ChapterSwipeAction.Disabled to stringResource(MR.strings.disabled), LibraryPreferences.ChapterSwipeAction.ToggleBookmark to stringResource(MR.strings.action_bookmark), LibraryPreferences.ChapterSwipeAction.ToggleRead to stringResource(MR.strings.action_mark_as_read), LibraryPreferences.ChapterSwipeAction.Download to stringResource(MR.strings.action_download), ), title = stringResource(MR.strings.pref_chapter_swipe_end), ), Preference.PreferenceItem.MultiSelectListPreference( preference = libraryPreferences.markDuplicateReadChapterAsRead(), entries = persistentMapOf( MARK_DUPLICATE_CHAPTER_READ_EXISTING to stringResource(MR.strings.pref_mark_duplicate_read_chapter_read_existing), MARK_DUPLICATE_CHAPTER_READ_NEW to stringResource(MR.strings.pref_mark_duplicate_read_chapter_read_new), ), title = stringResource(MR.strings.pref_mark_duplicate_read_chapter_read), ), ), ) } @Composable private fun getAnimeBehaviorGroup( libraryPreferences: LibraryPreferences, ): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_behavior_episode), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = libraryPreferences.swipeEpisodeStartAction(), entries = persistentMapOf( LibraryPreferences.EpisodeSwipeAction.Disabled to stringResource(MR.strings.disabled), LibraryPreferences.EpisodeSwipeAction.ToggleBookmark to stringResource(AYMR.strings.action_bookmark_episode), LibraryPreferences.EpisodeSwipeAction.ToggleFillermark to stringResource(AYMR.strings.action_fillermark_episode), LibraryPreferences.EpisodeSwipeAction.ToggleSeen to stringResource(AYMR.strings.action_mark_as_seen), LibraryPreferences.EpisodeSwipeAction.Download to stringResource(MR.strings.action_download), ), title = stringResource(AYMR.strings.pref_episode_swipe_start), ), Preference.PreferenceItem.ListPreference( preference = libraryPreferences.swipeEpisodeEndAction(), entries = persistentMapOf( LibraryPreferences.EpisodeSwipeAction.Disabled to stringResource(MR.strings.disabled), LibraryPreferences.EpisodeSwipeAction.ToggleBookmark to stringResource(AYMR.strings.action_bookmark_episode), LibraryPreferences.EpisodeSwipeAction.ToggleFillermark to stringResource(AYMR.strings.action_fillermark_episode), LibraryPreferences.EpisodeSwipeAction.ToggleSeen to stringResource(AYMR.strings.action_mark_as_seen), LibraryPreferences.EpisodeSwipeAction.Download to stringResource(MR.strings.action_download), ), title = stringResource(AYMR.strings.pref_episode_swipe_end), ), Preference.PreferenceItem.MultiSelectListPreference( preference = libraryPreferences.markDuplicateSeenEpisodeAsSeen(), entries = persistentMapOf( MARK_DUPLICATE_EPISODE_SEEN_EXISTING to stringResource(AYMR.strings.pref_mark_duplicate_seen_episode_seen_existing), MARK_DUPLICATE_EPISODE_SEEN_NEW to stringResource(AYMR.strings.pref_mark_duplicate_seen_episode_seen_new), ), title = stringResource(AYMR.strings.pref_mark_duplicate_seen_episode_seen), ), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ChromeReaderMode import androidx.compose.material.icons.outlined.Code import androidx.compose.material.icons.outlined.CollectionsBookmark import androidx.compose.material.icons.outlined.Explore import androidx.compose.material.icons.outlined.GetApp import androidx.compose.material.icons.outlined.Info import androidx.compose.material.icons.outlined.Palette import androidx.compose.material.icons.outlined.Search import androidx.compose.material.icons.outlined.Security import androidx.compose.material.icons.outlined.Storage import androidx.compose.material.icons.outlined.Sync import androidx.compose.material.icons.outlined.VideoSettings import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import androidx.core.graphics.ColorUtils import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.more.settings.screen.about.AboutScreen import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.util.LocalBackPress import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.setting.PlayerSettingsScreen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen object SettingsMainScreen : Screen() { @Composable override fun Content() { Content(twoPane = false) } @Composable private fun getPalerSurface(): Color { val surface = MaterialTheme.colorScheme.surface val dark = isSystemInDarkTheme() return remember(surface, dark) { val arr = FloatArray(3) ColorUtils.colorToHSL(surface.toArgb(), arr) arr[2] = if (dark) { arr[2] - 0.05f } else { arr[2] + 0.02f }.coerceIn(0f, 1f) Color.hsl(arr[0], arr[1], arr[2]) } } @Composable fun Content(twoPane: Boolean) { val navigator = LocalNavigator.currentOrThrow val backPress = LocalBackPress.currentOrThrow val containerColor = if (twoPane) getPalerSurface() else MaterialTheme.colorScheme.surface val topBarState = rememberTopAppBarState() Scaffold( topBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topBarState), topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.label_settings), navigateUp = backPress::invoke, actions = { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_search), icon = Icons.Outlined.Search, onClick = { navigator.navigate(SettingsSearchScreen(), twoPane) }, ), ), ) }, scrollBehavior = scrollBehavior, ) }, containerColor = containerColor, content = { contentPadding -> val state = rememberLazyListState() val indexSelected = if (twoPane) { items.indexOfFirst { it.screen::class == navigator.items.first()::class } .also { LaunchedEffect(Unit) { state.animateScrollToItem(it) if (it > 0) { // Lift scroll topBarState.contentOffset = topBarState.heightOffsetLimit } } } } else { null } LazyColumn( state = state, contentPadding = contentPadding, ) { itemsIndexed( items = items, key = { _, item -> item.hashCode() }, ) { index, item -> val selected = indexSelected == index var modifier: Modifier = Modifier var contentColor = LocalContentColor.current if (twoPane) { modifier = Modifier .padding(horizontal = 8.dp) .clip(RoundedCornerShape(24.dp)) .then( if (selected) { Modifier.background( MaterialTheme.colorScheme.surfaceVariant, ) } else { Modifier }, ) if (selected) { contentColor = MaterialTheme.colorScheme.onSurfaceVariant } } CompositionLocalProvider(LocalContentColor provides contentColor) { TextPreferenceWidget( modifier = modifier, title = stringResource(item.titleRes), subtitle = item.formatSubtitle(), icon = item.icon, onPreferenceClick = { navigator.navigate(item.screen, twoPane) }, ) } } } }, ) } private fun Navigator.navigate(screen: VoyagerScreen, twoPane: Boolean) { if (twoPane) replaceAll(screen) else push(screen) } private data class Item( val titleRes: StringResource, val subtitleRes: StringResource? = null, val formatSubtitle: @Composable () -> String? = { subtitleRes?.let { stringResource(it) } }, val icon: ImageVector, val screen: VoyagerScreen, ) private val items = listOf( Item( titleRes = MR.strings.pref_category_appearance, subtitleRes = MR.strings.pref_appearance_summary, icon = Icons.Outlined.Palette, screen = SettingsAppearanceScreen, ), Item( titleRes = MR.strings.pref_category_library, subtitleRes = AYMR.strings.pref_library_summary, icon = Icons.Outlined.CollectionsBookmark, screen = SettingsLibraryScreen, ), Item( titleRes = MR.strings.pref_category_reader, subtitleRes = MR.strings.pref_reader_summary, icon = Icons.AutoMirrored.Outlined.ChromeReaderMode, screen = SettingsReaderScreen, ), Item( titleRes = AYMR.strings.label_player, subtitleRes = AYMR.strings.pref_player_settings_summary, icon = Icons.Outlined.VideoSettings, screen = PlayerSettingsScreen(mainSettings = true), ), Item( titleRes = MR.strings.pref_category_downloads, subtitleRes = MR.strings.pref_downloads_summary, icon = Icons.Outlined.GetApp, screen = SettingsDownloadScreen, ), Item( titleRes = MR.strings.pref_category_tracking, subtitleRes = MR.strings.pref_tracking_summary, icon = Icons.Outlined.Sync, screen = SettingsTrackingScreen, ), Item( titleRes = MR.strings.browse, subtitleRes = MR.strings.pref_browse_summary, icon = Icons.Outlined.Explore, screen = SettingsBrowseScreen, ), Item( titleRes = MR.strings.label_data_storage, subtitleRes = MR.strings.pref_backup_summary, icon = Icons.Outlined.Storage, screen = SettingsDataScreen, ), Item( titleRes = MR.strings.pref_category_security, subtitleRes = MR.strings.pref_security_summary, icon = Icons.Outlined.Security, screen = SettingsSecurityScreen, ), Item( titleRes = MR.strings.pref_category_advanced, subtitleRes = MR.strings.pref_advanced_summary, icon = Icons.Outlined.Code, screen = SettingsAdvancedScreen, ), Item( titleRes = MR.strings.pref_category_about, formatSubtitle = { "${stringResource(MR.strings.app_name)} ${AboutScreen.getVersionName( withBuildDate = false, )}" }, icon = Icons.Outlined.Info, screen = AboutScreen, ), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import android.os.Build import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalView import eu.kanade.presentation.more.settings.Preference import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableMap import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.NumberFormat object SettingsReaderScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.pref_category_reader @Composable override fun getPreferences(): List { val readerPref = remember { Injekt.get() } return listOf( Preference.PreferenceItem.ListPreference( preference = readerPref.defaultReadingMode(), entries = ReadingMode.entries.drop(1) .associate { it.flagValue to stringResource(it.stringRes) } .toImmutableMap(), title = stringResource(MR.strings.pref_viewer_type), ), Preference.PreferenceItem.ListPreference( preference = readerPref.doubleTapAnimSpeed(), entries = persistentMapOf( 1 to stringResource(MR.strings.double_tap_anim_speed_0), 500 to stringResource(MR.strings.double_tap_anim_speed_normal), 250 to stringResource(MR.strings.double_tap_anim_speed_fast), ), title = stringResource(MR.strings.pref_double_tap_anim_speed), ), Preference.PreferenceItem.SwitchPreference( preference = readerPref.showReadingMode(), title = stringResource(MR.strings.pref_show_reading_mode), subtitle = stringResource(MR.strings.pref_show_reading_mode_summary), ), Preference.PreferenceItem.SwitchPreference( preference = readerPref.showNavigationOverlayOnStart(), title = stringResource(MR.strings.pref_show_navigation_mode), subtitle = stringResource(MR.strings.pref_show_navigation_mode_summary), ), Preference.PreferenceItem.SwitchPreference( preference = readerPref.pageTransitions(), title = stringResource(MR.strings.pref_page_transitions), ), getDisplayGroup(readerPreferences = readerPref), getEInkGroup(readerPreferences = readerPref), getReadingGroup(readerPreferences = readerPref), getPagedGroup(readerPreferences = readerPref), getWebtoonGroup(readerPreferences = readerPref), getNavigationGroup(readerPreferences = readerPref), getActionsGroup(readerPreferences = readerPref), ) } @Composable private fun getDisplayGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { val fullscreenPref = readerPreferences.fullscreen() val fullscreen by fullscreenPref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_display), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = readerPreferences.defaultOrientationType(), entries = ReaderOrientation.entries.drop(1) .associate { it.flagValue to stringResource(it.stringRes) } .toImmutableMap(), title = stringResource(MR.strings.pref_rotation_type), ), Preference.PreferenceItem.ListPreference( preference = readerPreferences.readerTheme(), entries = persistentMapOf( 1 to stringResource(MR.strings.black_background), 2 to stringResource(MR.strings.gray_background), 0 to stringResource(MR.strings.white_background), 3 to stringResource(MR.strings.automatic_background), ), title = stringResource(MR.strings.pref_reader_theme), ), Preference.PreferenceItem.SwitchPreference( preference = fullscreenPref, title = stringResource(MR.strings.pref_fullscreen), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.cutoutShort(), title = stringResource(MR.strings.pref_cutout_short), enabled = fullscreen && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && LocalView.current.rootWindowInsets?.displayCutout != null, // has cutout ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.keepScreenOn(), title = stringResource(MR.strings.pref_keep_screen_on), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.showPageNumber(), title = stringResource(MR.strings.pref_show_page_number), ), ), ) } @Composable private fun getEInkGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { val flashPageState by readerPreferences.flashOnPageChange().collectAsState() val flashMillisPref = readerPreferences.flashDurationMillis() val flashMillis by flashMillisPref.collectAsState() val flashIntervalPref = readerPreferences.flashPageInterval() val flashInterval by flashIntervalPref.collectAsState() val flashColorPref = readerPreferences.flashColor() return Preference.PreferenceGroup( title = "E-Ink", preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.flashOnPageChange(), title = stringResource(MR.strings.pref_flash_page), subtitle = stringResource(MR.strings.pref_flash_page_summ), ), Preference.PreferenceItem.SliderPreference( value = flashMillis / ReaderPreferences.MILLI_CONVERSION, valueRange = 1..15, title = stringResource(MR.strings.pref_flash_duration), subtitle = stringResource(MR.strings.pref_flash_duration_summary, flashMillis), enabled = flashPageState, onValueChanged = { flashMillisPref.set(it * ReaderPreferences.MILLI_CONVERSION) true }, ), Preference.PreferenceItem.SliderPreference( value = flashInterval, valueRange = 1..10, title = stringResource(MR.strings.pref_flash_page_interval), subtitle = pluralStringResource(MR.plurals.pref_pages, flashInterval, flashInterval), enabled = flashPageState, onValueChanged = { flashIntervalPref.set(it) true }, ), Preference.PreferenceItem.ListPreference( preference = flashColorPref, entries = persistentMapOf( ReaderPreferences.FlashColor.BLACK to stringResource(MR.strings.pref_flash_style_black), ReaderPreferences.FlashColor.WHITE to stringResource(MR.strings.pref_flash_style_white), ReaderPreferences.FlashColor.WHITE_BLACK to stringResource(MR.strings.pref_flash_style_white_black), ), title = stringResource(MR.strings.pref_flash_with), enabled = flashPageState, ), ), ) } @Composable private fun getReadingGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_reading), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.skipRead(), title = stringResource(MR.strings.pref_skip_read_chapters), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.skipFiltered(), title = stringResource(MR.strings.pref_skip_filtered_chapters), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.skipDupe(), title = stringResource(MR.strings.pref_skip_dupe_chapters), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.alwaysShowChapterTransition(), title = stringResource(MR.strings.pref_always_show_chapter_transition), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.preserveReadingPosition(), title = stringResource(AYMR.strings.pref_preserve_reading_position), ), ), ) } @Composable private fun getPagedGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { val navModePref = readerPreferences.navigationModePager() val imageScaleTypePref = readerPreferences.imageScaleType() val dualPageSplitPref = readerPreferences.dualPageSplitPaged() val rotateToFitPref = readerPreferences.dualPageRotateToFit() val navMode by navModePref.collectAsState() val imageScaleType by imageScaleTypePref.collectAsState() val dualPageSplit by dualPageSplitPref.collectAsState() val rotateToFit by rotateToFitPref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.pager_viewer), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = navModePref, entries = ReaderPreferences.TapZones .mapIndexed { index, it -> index to stringResource(it) } .toMap() .toImmutableMap(), title = stringResource(MR.strings.pref_viewer_nav), ), Preference.PreferenceItem.ListPreference( preference = readerPreferences.pagerNavInverted(), entries = persistentListOf( ReaderPreferences.TappingInvertMode.NONE, ReaderPreferences.TappingInvertMode.HORIZONTAL, ReaderPreferences.TappingInvertMode.VERTICAL, ReaderPreferences.TappingInvertMode.BOTH, ) .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = stringResource(MR.strings.pref_read_with_tapping_inverted), enabled = navMode != 5, ), Preference.PreferenceItem.ListPreference( preference = imageScaleTypePref, entries = ReaderPreferences.ImageScaleType .mapIndexed { index, it -> index + 1 to stringResource(it) } .toMap() .toImmutableMap(), title = stringResource(MR.strings.pref_image_scale_type), ), Preference.PreferenceItem.ListPreference( preference = readerPreferences.zoomStart(), entries = ReaderPreferences.ZoomStart .mapIndexed { index, it -> index + 1 to stringResource(it) } .toMap() .toImmutableMap(), title = stringResource(MR.strings.pref_zoom_start), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.cropBorders(), title = stringResource(MR.strings.pref_crop_borders), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.landscapeZoom(), title = stringResource(MR.strings.pref_landscape_zoom), enabled = imageScaleType == 1, ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.navigateToPan(), title = stringResource(MR.strings.pref_navigate_pan), enabled = navMode != 5, ), Preference.PreferenceItem.SwitchPreference( preference = dualPageSplitPref, title = stringResource(MR.strings.pref_dual_page_split), onValueChanged = { rotateToFitPref.set(false) true }, ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.dualPageInvertPaged(), title = stringResource(MR.strings.pref_dual_page_invert), subtitle = stringResource(MR.strings.pref_dual_page_invert_summary), enabled = dualPageSplit, ), Preference.PreferenceItem.SwitchPreference( preference = rotateToFitPref, title = stringResource(MR.strings.pref_page_rotate), onValueChanged = { dualPageSplitPref.set(false) true }, ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.dualPageRotateToFitInvert(), title = stringResource(MR.strings.pref_page_rotate_invert), enabled = rotateToFit, ), ), ) } @Composable private fun getWebtoonGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { val numberFormat = remember { NumberFormat.getPercentInstance() } val navModePref = readerPreferences.navigationModeWebtoon() val dualPageSplitPref = readerPreferences.dualPageSplitWebtoon() val rotateToFitPref = readerPreferences.dualPageRotateToFitWebtoon() val webtoonSidePaddingPref = readerPreferences.webtoonSidePadding() val navMode by navModePref.collectAsState() val dualPageSplit by dualPageSplitPref.collectAsState() val rotateToFit by rotateToFitPref.collectAsState() val webtoonSidePadding by webtoonSidePaddingPref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.webtoon_viewer), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = navModePref, entries = ReaderPreferences.TapZones .mapIndexed { index, it -> index to stringResource(it) } .toMap() .toImmutableMap(), title = stringResource(MR.strings.pref_viewer_nav), ), Preference.PreferenceItem.ListPreference( preference = readerPreferences.webtoonNavInverted(), entries = persistentListOf( ReaderPreferences.TappingInvertMode.NONE, ReaderPreferences.TappingInvertMode.HORIZONTAL, ReaderPreferences.TappingInvertMode.VERTICAL, ReaderPreferences.TappingInvertMode.BOTH, ) .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = stringResource(MR.strings.pref_read_with_tapping_inverted), enabled = navMode != 5, ), Preference.PreferenceItem.SliderPreference( value = webtoonSidePadding, valueRange = ReaderPreferences.let { it.WEBTOON_PADDING_MIN..it.WEBTOON_PADDING_MAX }, title = stringResource(MR.strings.pref_webtoon_side_padding), subtitle = numberFormat.format(webtoonSidePadding / 100f), onValueChanged = { webtoonSidePaddingPref.set(it) true }, ), Preference.PreferenceItem.ListPreference( preference = readerPreferences.readerHideThreshold(), entries = persistentMapOf( ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(MR.strings.pref_highest), ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(MR.strings.pref_high), ReaderPreferences.ReaderHideThreshold.LOW to stringResource(MR.strings.pref_low), ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(MR.strings.pref_lowest), ), title = stringResource(MR.strings.pref_hide_threshold), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.cropBordersWebtoon(), title = stringResource(MR.strings.pref_crop_borders), ), Preference.PreferenceItem.SwitchPreference( preference = dualPageSplitPref, title = stringResource(MR.strings.pref_dual_page_split), onValueChanged = { rotateToFitPref.set(false) true }, ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.dualPageInvertWebtoon(), title = stringResource(MR.strings.pref_dual_page_invert), subtitle = stringResource(MR.strings.pref_dual_page_invert_summary), enabled = dualPageSplit, ), Preference.PreferenceItem.SwitchPreference( preference = rotateToFitPref, title = stringResource(MR.strings.pref_page_rotate), onValueChanged = { dualPageSplitPref.set(false) true }, ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.dualPageRotateToFitInvertWebtoon(), title = stringResource(MR.strings.pref_page_rotate_invert), enabled = rotateToFit, ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.webtoonDoubleTapZoomEnabled(), title = stringResource(MR.strings.pref_double_tap_zoom), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.webtoonDisableZoomOut(), title = stringResource(MR.strings.pref_webtoon_disable_zoom_out), ), ), ) } @Composable private fun getNavigationGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { val readWithVolumeKeysPref = readerPreferences.readWithVolumeKeys() val readWithVolumeKeys by readWithVolumeKeysPref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_reader_navigation), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = readWithVolumeKeysPref, title = stringResource(MR.strings.pref_read_with_volume_keys), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.readWithVolumeKeysInverted(), title = stringResource(MR.strings.pref_read_with_volume_keys_inverted), enabled = readWithVolumeKeys, ), ), ) } @Composable private fun getActionsGroup(readerPreferences: ReaderPreferences): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_reader_actions), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.readWithLongTap(), title = stringResource(MR.strings.pref_read_with_long_tap), ), Preference.PreferenceItem.SwitchPreference( preference = readerPreferences.folderPerManga(), title = stringResource(MR.strings.pref_create_folder_per_manga), subtitle = stringResource(MR.strings.pref_create_folder_per_manga_summary), ), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.animation.Crossfade import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.paddingFromBaseline import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.clearText import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Close import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.NonRestartableComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.UpIcon import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsAdvancedScreen import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsAudioScreen import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsDecoderScreen import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsGesturesScreen import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsPlayerScreen import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsSubtitleScreen import eu.kanade.presentation.util.Screen import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.runOnEnterKeyPressed import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen class SettingsSearchScreen( val isPlayer: Boolean = false, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val softKeyboardController = LocalSoftwareKeyboardController.current val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } val listState = rememberLazyListState() // Hide keyboard on change screen DisposableEffect(Unit) { onDispose { softKeyboardController?.hide() } } // Hide keyboard on outside text field is touched LaunchedEffect(listState.isScrollInProgress) { if (listState.isScrollInProgress) { focusManager.clearFocus() } } // Request text field focus on launch LaunchedEffect(focusRequester) { focusRequester.requestFocus() } val textFieldState = rememberTextFieldState() Scaffold( topBar = { Column { TopAppBar( navigationIcon = { val canPop = remember { navigator.canPop } if (canPop) { IconButton(onClick = navigator::pop) { UpIcon() } } }, title = { BasicTextField( state = textFieldState, modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester) .runOnEnterKeyPressed(action = focusManager::clearFocus), textStyle = MaterialTheme.typography.bodyLarge .copy(color = MaterialTheme.colorScheme.onSurface), lineLimits = TextFieldLineLimits.SingleLine, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), onKeyboardAction = { focusManager.clearFocus() }, cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), decorator = { if (textFieldState.text.isEmpty()) { Text( text = stringResource( resource = if (isPlayer) { AYMR.strings.action_search_player_settings } else { MR.strings.action_search_settings }, ), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyLarge, ) } it() }, ) }, actions = { if (textFieldState.text.isNotEmpty()) { IconButton(onClick = { textFieldState.clearText() }) { Icon( imageVector = Icons.Outlined.Close, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } }, ) HorizontalDivider() } }, ) { contentPadding -> SearchResult( searchKey = textFieldState.text.toString(), isPlayer = isPlayer, listState = listState, contentPadding = contentPadding, ) { result -> SearchableSettings.highlightKey = result.highlightKey navigator.replace(result.route) } } } } @Composable private fun SearchResult( searchKey: String, isPlayer: Boolean, modifier: Modifier = Modifier, listState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(), onItemClick: (SearchResultItem) -> Unit, ) { if (searchKey.isEmpty()) return val isLtr = LocalLayoutDirection.current == LayoutDirection.Ltr val context = LocalContext.current val index = if (isPlayer) getPlayerIndex() else getIndex() + getPlayerIndex() val result by produceState?>(initialValue = null, searchKey) { value = index.asSequence() .flatMap { settingsData -> settingsData.contents.asSequence() // Only search from enabled prefs and one with valid title .filter { it.enabled && it.title.isNotBlank() } // Flatten items contained inside *enabled* PreferenceGroup .flatMap { p -> when (p) { is Preference.PreferenceGroup -> { if (p.enabled) { p.preferenceItems.asSequence() .filter { it.enabled && it.title.isNotBlank() } .map { p.title to it } } else { emptySequence() } } is Preference.PreferenceItem<*> -> sequenceOf(null to p) } } // Don't show info preference .filterNot { it.second is Preference.PreferenceItem.InfoPreference } // Filter by search query .filter { (_, p) -> val inTitle = p.title.contains(searchKey, true) val inSummary = p.subtitle?.contains(searchKey, true) ?: false inTitle || inSummary } // Map result data .map { (categoryTitle, p) -> SearchResultItem( route = settingsData.route, title = p.title, breadcrumbs = getLocalizedBreadcrumb( nodes = buildList { if (!isPlayer && settingsData.playerSettings) { add(AYMR.strings.label_player_settings.getString(context)) } add(settingsData.title) if (categoryTitle != null) add(categoryTitle) }, isLtr = isLtr, ), highlightKey = p.title, ) } } .take(10) // Just take top 10 result for quicker result .toList() } Crossfade( targetState = result, label = "results", ) { when { it == null -> {} it.isEmpty() -> { EmptyScreen(stringResource(MR.strings.no_results_found)) } else -> { LazyColumn( modifier = modifier.fillMaxSize(), state = listState, contentPadding = contentPadding, horizontalAlignment = Alignment.CenterHorizontally, ) { items( items = it, key = { i -> i.hashCode() }, ) { item -> Column( modifier = Modifier .fillMaxWidth() .clickable { onItemClick(item) } .padding(horizontal = 24.dp, vertical = 14.dp), ) { Text( text = item.title, overflow = TextOverflow.Ellipsis, maxLines = 1, fontWeight = FontWeight.Normal, style = MaterialTheme.typography.titleMedium, ) Text( text = item.breadcrumbs, modifier = Modifier.paddingFromBaseline(top = 16.dp), maxLines = 1, color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodySmall, ) } } } } } } } @Composable @NonRestartableComposable private fun getIndex() = settingScreens .map { screen -> SettingsData( title = stringResource(screen.getTitleRes()), route = screen, contents = screen.getPreferences(), ) } @Composable @NonRestartableComposable private fun getPlayerIndex() = playerSettingScreens .map { screen -> SettingsData( title = stringResource(screen.getTitleRes()), route = screen, contents = screen.getPreferences(), playerSettings = true, ) } private fun getLocalizedBreadcrumb(nodes: List, isLtr: Boolean): String { return if (isLtr) { // This locale reads left to right. nodes.joinToString(" > ") } else { // This locale reads right to left. nodes.reversed().joinToString(" < ") } } private val playerSettingScreens = listOf( PlayerSettingsPlayerScreen, PlayerSettingsGesturesScreen, PlayerSettingsDecoderScreen, PlayerSettingsSubtitleScreen, PlayerSettingsAudioScreen, PlayerSettingsAdvancedScreen, ) private val settingScreens = listOf( SettingsAppearanceScreen, SettingsLibraryScreen, SettingsReaderScreen, SettingsDownloadScreen, SettingsTrackingScreen, SettingsBrowseScreen, SettingsDataScreen, SettingsSecurityScreen, SettingsAdvancedScreen, ) private data class SettingsData( val title: String, val route: VoyagerScreen, val contents: List, val playerSettings: Boolean = false, ) private data class SearchResultItem( val route: VoyagerScreen, val title: String, val breadcrumbs: String, val highlightKey: String, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.fragment.app.FragmentActivity import eu.kanade.presentation.more.settings.Preference import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableMap import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsSecurityScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.pref_category_security @Composable override fun getPreferences(): List { val context = LocalContext.current val securityPreferences = remember { Injekt.get() } val authSupported = remember { context.isAuthenticationSupported() } val useAuthPref = securityPreferences.useAuthenticator() val useAuth by useAuthPref.collectAsState() return listOf( Preference.PreferenceItem.SwitchPreference( preference = useAuthPref, title = stringResource(MR.strings.lock_with_biometrics), enabled = authSupported, onValueChanged = { (context as FragmentActivity).authenticate( title = context.stringResource(MR.strings.lock_with_biometrics), ) }, ), Preference.PreferenceItem.ListPreference( preference = securityPreferences.lockAppAfter(), entries = LockAfterValues .associateWith { when (it) { -1 -> stringResource(MR.strings.lock_never) 0 -> stringResource(MR.strings.lock_always) else -> pluralStringResource( MR.plurals.lock_after_mins, count = it, it, ) } } .toImmutableMap(), title = stringResource(MR.strings.lock_when_idle), enabled = authSupported && useAuth, onValueChanged = { (context as FragmentActivity).authenticate( title = context.stringResource(MR.strings.lock_when_idle), ) }, ), Preference.PreferenceItem.SwitchPreference( preference = securityPreferences.hideNotificationContent(), title = stringResource(MR.strings.hide_notification_content), ), Preference.PreferenceItem.ListPreference( preference = securityPreferences.secureScreen(), entries = SecurityPreferences.SecureScreenMode.entries .associateWith { stringResource(it.titleRes) } .toImmutableMap(), title = stringResource(MR.strings.secure_screen), ), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.secure_screen_summary)), ) } } private val LockAfterValues = persistentListOf( 0, // Always 1, 2, 5, 10, -1, // Never ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen import android.content.Context import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.HelpOutline import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.model.AutoTrackState import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.presentation.more.settings.Preference import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.anilist.AnilistApi import eu.kanade.tachiyomi.data.track.bangumi.BangumiApi import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeListApi import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi import eu.kanade.tachiyomi.data.track.simkl.SimklApi import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentMap import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object SettingsTrackingScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = MR.strings.pref_category_tracking @Composable override fun RowScope.AppBarAction() { val uriHandler = LocalUriHandler.current IconButton(onClick = { uriHandler.openUri("https://aniyomi.org/help/guides/tracking/") }) { Icon( imageVector = Icons.Outlined.HelpOutline, contentDescription = stringResource(MR.strings.tracking_guide), ) } } @Composable override fun getPreferences(): List { val context = LocalContext.current val trackPreferences = remember { Injekt.get() } val trackerManager = remember { Injekt.get() } val mangaSourceManager = remember { Injekt.get() } val animeSourceManager = remember { Injekt.get() } val autoTrackStatePref = trackPreferences.autoUpdateTrackOnMarkRead() var dialog by remember { mutableStateOf(null) } dialog?.run { when (this) { is LoginDialog -> { TrackingLoginDialog( tracker = tracker, uNameStringRes = uNameStringRes, onDismissRequest = { dialog = null }, ) } is LogoutDialog -> { TrackingLogoutDialog( tracker = tracker, onDismissRequest = { dialog = null }, ) } } } val enhancedMangaTrackers = trackerManager.trackers .filter { it is EnhancedMangaTracker } .partition { service -> val acceptedMangaSources = (service as EnhancedMangaTracker).getAcceptedSources() mangaSourceManager.getCatalogueSources().any { it::class.qualifiedName in acceptedMangaSources } } val enhancedAnimeTrackers = trackerManager.trackers .filter { it is EnhancedAnimeTracker } .partition { service -> val acceptedAnimeSources = (service as EnhancedAnimeTracker).getAcceptedSources() animeSourceManager.getCatalogueSources().any { it::class.qualifiedName in acceptedAnimeSources } } var enhancedTrackerInfo = stringResource(MR.strings.enhanced_tracking_info) if (enhancedMangaTrackers.second.isNotEmpty() || enhancedAnimeTrackers.second.isNotEmpty()) { val missingSourcesInfo = stringResource( MR.strings.enhanced_services_not_installed, (enhancedMangaTrackers.second + enhancedAnimeTrackers.second).joinToString { it.name }, ) enhancedTrackerInfo += "\n\n$missingSourcesInfo" } return listOf( Preference.PreferenceItem.SwitchPreference( preference = trackPreferences.autoUpdateTrack(), title = stringResource(AYMR.strings.pref_auto_update_manga_sync), ), Preference.PreferenceItem.SwitchPreference( preference = trackPreferences.trackOnAddingToLibrary(), title = stringResource(AYMR.strings.pref_track_on_add_library), ), Preference.PreferenceItem.SwitchPreference( preference = trackPreferences.showNextEpisodeAiringTime(), title = stringResource(AYMR.strings.pref_show_next_episode_airing_time), ), Preference.PreferenceItem.ListPreference( preference = trackPreferences.autoUpdateTrackOnMarkRead(), entries = AutoTrackState.entries .associateWith { stringResource(it.titleRes) } .toPersistentMap(), title = stringResource(AYMR.strings.pref_auto_update_manga_on_mark_read), ), Preference.PreferenceGroup( title = stringResource(MR.strings.services), preferenceItems = persistentListOf( Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.myAnimeList, login = { context.openInBrowser( MyAnimeListApi.authUrl(), forceDefaultBrowser = true, ) }, logout = { dialog = LogoutDialog(trackerManager.myAnimeList) }, ), Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.aniList, login = { context.openInBrowser( AnilistApi.authUrl(), forceDefaultBrowser = true, ) }, logout = { dialog = LogoutDialog(trackerManager.aniList) }, ), Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.kitsu, login = { dialog = LoginDialog(trackerManager.kitsu, MR.strings.email) }, logout = { dialog = LogoutDialog(trackerManager.kitsu) }, ), Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.mangaUpdates, login = { dialog = LoginDialog(trackerManager.mangaUpdates, MR.strings.username) }, logout = { dialog = LogoutDialog(trackerManager.mangaUpdates) }, ), Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.shikimori, login = { context.openInBrowser( ShikimoriApi.authUrl(), forceDefaultBrowser = true, ) }, logout = { dialog = LogoutDialog(trackerManager.shikimori) }, ), Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.simkl, login = { context.openInBrowser( SimklApi.authUrl(), forceDefaultBrowser = true, ) }, logout = { dialog = LogoutDialog(trackerManager.simkl) }, ), Preference.PreferenceItem.TrackerPreference( tracker = trackerManager.bangumi, login = { context.openInBrowser( BangumiApi.authUrl(), forceDefaultBrowser = true, ) }, logout = { dialog = LogoutDialog(trackerManager.bangumi) }, ), Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.tracking_info)), ), ), Preference.PreferenceGroup( title = stringResource(MR.strings.enhanced_services), preferenceItems = ( enhancedMangaTrackers.first .map { service -> Preference.PreferenceItem.TrackerPreference( tracker = service, login = { (service as EnhancedMangaTracker).loginNoop() }, logout = service::logout, ) } + enhancedAnimeTrackers.first .map { service -> Preference.PreferenceItem.TrackerPreference( tracker = service, login = { (service as EnhancedAnimeTracker).loginNoop() }, logout = service::logout, ) } + listOf(Preference.PreferenceItem.InfoPreference(enhancedTrackerInfo)) ).toImmutableList(), ), ) } @Composable private fun TrackingLoginDialog( tracker: Tracker, uNameStringRes: StringResource, onDismissRequest: () -> Unit, ) { val context = LocalContext.current val scope = rememberCoroutineScope() var username by remember { mutableStateOf(TextFieldValue(tracker.getUsername())) } var password by remember { mutableStateOf(TextFieldValue(tracker.getPassword())) } var processing by remember { mutableStateOf(false) } var inputError by remember { mutableStateOf(false) } AlertDialog( onDismissRequest = onDismissRequest, title = { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = stringResource(MR.strings.login_title, tracker.name), modifier = Modifier.weight(1f), ) IconButton(onClick = onDismissRequest) { Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(MR.strings.action_close), ) } } }, text = { Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { OutlinedTextField( modifier = Modifier.fillMaxWidth(), value = username, onValueChange = { username = it }, label = { Text(text = stringResource(uNameStringRes)) }, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), singleLine = true, isError = inputError && !processing, ) var hidePassword by remember { mutableStateOf(true) } OutlinedTextField( modifier = Modifier.fillMaxWidth(), value = password, onValueChange = { password = it }, label = { Text(text = stringResource(MR.strings.password)) }, trailingIcon = { IconButton(onClick = { hidePassword = !hidePassword }) { Icon( imageVector = if (hidePassword) { Icons.Filled.Visibility } else { Icons.Filled.VisibilityOff }, contentDescription = null, ) } }, visualTransformation = if (hidePassword) { PasswordVisualTransformation() } else { VisualTransformation.None }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Password, imeAction = ImeAction.Done, ), singleLine = true, isError = inputError && !processing, ) } }, confirmButton = { Button( modifier = Modifier.fillMaxWidth(), enabled = !processing && username.text.isNotBlank() && password.text.isNotBlank(), onClick = { scope.launchIO { processing = true val result = checkLogin( context = context, tracker = tracker, username = username.text, password = password.text, ) inputError = !result if (result) onDismissRequest() processing = false } }, ) { val id = if (processing) MR.strings.loading else MR.strings.login Text(text = stringResource(id)) } }, ) } private suspend fun checkLogin( context: Context, tracker: Tracker, username: String, password: String, ): Boolean { return try { tracker.login(username, password) withUIContext { context.toast(MR.strings.login_success) } true } catch (e: Throwable) { tracker.logout() withUIContext { context.toast(e.message.toString()) } false } } @Composable private fun TrackingLogoutDialog( tracker: Tracker, onDismissRequest: () -> Unit, ) { val context = LocalContext.current AlertDialog( onDismissRequest = onDismissRequest, title = { Text( text = stringResource(MR.strings.logout_title, tracker.name), textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth(), ) }, confirmButton = { Row(horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall)) { OutlinedButton( modifier = Modifier.weight(1f), onClick = onDismissRequest, ) { Text(text = stringResource(MR.strings.action_cancel)) } Button( modifier = Modifier.weight(1f), onClick = { tracker.logout() onDismissRequest() context.toast(MR.strings.logout_success) }, colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError, ), ) { Text(text = stringResource(MR.strings.logout)) } } }, ) } } private data class LoginDialog( val tracker: Tracker, val uNameStringRes: StringResource, ) private data class LogoutDialog( val tracker: Tracker, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.about import android.content.Context import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Public import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.LogoHeader import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.util.LocalBackPress import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.updater.AppUpdateChecker import eu.kanade.tachiyomi.data.updater.RELEASE_URL import eu.kanade.tachiyomi.ui.more.NewUpdateScreen import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.lang.toDateTimestampString import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.isPreviewBuildType import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.updaterEnabled import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.release.interactor.GetApplicationRelease import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LinkIcon import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.icons.CustomIcons import tachiyomi.presentation.core.icons.Discord import tachiyomi.presentation.core.icons.Github import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId object AboutScreen : Screen() { @Composable override fun Content() { val scope = rememberCoroutineScope() val context = LocalContext.current val uriHandler = LocalUriHandler.current val handleBack = LocalBackPress.current val navigator = LocalNavigator.currentOrThrow var isCheckingUpdates by remember { mutableStateOf(false) } Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.pref_category_about), navigateUp = if (handleBack != null) handleBack::invoke else null, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> ScrollbarLazyColumn( contentPadding = contentPadding, ) { item { LogoHeader() } item { TextPreferenceWidget( title = stringResource(MR.strings.version), subtitle = getVersionName(withBuildDate = true), onPreferenceClick = { val deviceInfo = CrashLogUtil(context).getDebugInfo() context.copyToClipboard("Debug information", deviceInfo) }, ) } if (updaterEnabled) { item { TextPreferenceWidget( title = stringResource(MR.strings.check_for_updates), widget = { AnimatedVisibility(visible = isCheckingUpdates) { CircularProgressIndicator( modifier = Modifier.size(28.dp), strokeWidth = 3.dp, ) } }, onPreferenceClick = { if (!isCheckingUpdates) { scope.launch { isCheckingUpdates = true checkVersion( context = context, onAvailableUpdate = { result -> val updateScreen = NewUpdateScreen( versionName = result.release.version, changelogInfo = result.release.info, releaseLink = result.release.releaseLink, downloadLink = result.release.downloadLink, ) navigator.push(updateScreen) }, onFinish = { isCheckingUpdates = false }, ) } } }, ) } } if (!BuildConfig.DEBUG) { item { TextPreferenceWidget( title = stringResource(MR.strings.whats_new), onPreferenceClick = { uriHandler.openUri(RELEASE_URL) }, ) } } item { TextPreferenceWidget( title = stringResource(MR.strings.help_translate), onPreferenceClick = { uriHandler.openUri( "https://aniyomi.org/docs/contribute#translation", ) }, ) } item { TextPreferenceWidget( title = stringResource(MR.strings.licenses), onPreferenceClick = { navigator.push(OpenSourceLicensesScreen()) }, ) } item { TextPreferenceWidget( title = stringResource(MR.strings.privacy_policy), onPreferenceClick = { uriHandler.openUri("https://aniyomi.org/privacy/") }, ) } item { Row( modifier = Modifier .fillMaxWidth() .padding(vertical = 8.dp), horizontalArrangement = Arrangement.Center, ) { LinkIcon( label = stringResource(MR.strings.website), icon = Icons.Outlined.Public, url = "https://aniyomi.org", ) LinkIcon( label = "Discord", icon = CustomIcons.Discord, url = "https://discord.gg/F32UjdJZrR", ) LinkIcon( label = "GitHub", icon = CustomIcons.Github, url = "https://github.com/aniyomiorg/aniyomi", ) } } } } } /** * Checks version and shows a user prompt if an update is available. */ private suspend fun checkVersion( context: Context, onAvailableUpdate: (GetApplicationRelease.Result.NewUpdate) -> Unit, onFinish: () -> Unit, ) { val updateChecker = AppUpdateChecker() withUIContext { try { when ( val result = withIOContext { updateChecker.checkForUpdate( context, forceCheck = true, ) } ) { is GetApplicationRelease.Result.NewUpdate -> { onAvailableUpdate(result) } is GetApplicationRelease.Result.NoNewUpdate -> { context.toast(MR.strings.update_check_no_new_updates) } is GetApplicationRelease.Result.OsTooOld -> { context.toast(MR.strings.update_check_eol) } else -> {} } } catch (e: Exception) { context.toast(e.message) logcat(LogPriority.ERROR, e) } finally { onFinish() } } } fun getVersionName(withBuildDate: Boolean): String { return when { BuildConfig.DEBUG -> { "Debug ${BuildConfig.COMMIT_SHA}".let { if (withBuildDate) { "$it (${getFormattedBuildTime()})" } else { it } } } isPreviewBuildType -> { "Preview r${BuildConfig.COMMIT_COUNT}".let { if (withBuildDate) { "$it (${BuildConfig.COMMIT_SHA}, ${getFormattedBuildTime()})" } else { "$it (${BuildConfig.COMMIT_SHA})" } } } else -> { "Stable ${BuildConfig.VERSION_NAME}".let { if (withBuildDate) { "$it (${getFormattedBuildTime()})" } else { it } } } } } internal fun getFormattedBuildTime(): String { return try { LocalDateTime.ofInstant( Instant.parse(BuildConfig.BUILD_TIME), ZoneId.systemDefault(), ) .toDateTimestampString( UiPreferences.dateFormat( Injekt.get().dateFormat().get(), ), ) } catch (e: Exception) { BuildConfig.BUILD_TIME } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLibraryLicenseScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.about import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Public import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.text.HtmlCompat import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import com.google.android.material.textview.MaterialTextView import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource class OpenSourceLibraryLicenseScreen( private val name: String, private val website: String?, private val license: String, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val uriHandler = LocalUriHandler.current Scaffold( topBar = { AppBar( title = name, navigateUp = navigator::pop, actions = { if (!website.isNullOrEmpty()) { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.website), icon = Icons.Default.Public, onClick = { uriHandler.openUri(website) }, ), ), ) } }, scrollBehavior = it, ) }, ) { contentPadding -> Column( modifier = Modifier .verticalScroll(rememberScrollState()) .padding(contentPadding) .padding(16.dp), ) { HtmlLicenseText(html = license) } } } @Composable private fun HtmlLicenseText(html: String) { AndroidView( factory = { MaterialTextView(it) }, update = { it.text = HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_COMPACT) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.about import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer import com.mikepenz.aboutlibraries.ui.compose.m3.util.htmlReadyLicenseContent import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource class OpenSourceLicensesScreen : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.licenses), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> LibrariesContainer( modifier = Modifier .fillMaxSize(), contentPadding = contentPadding, onLibraryClick = { navigator.push( OpenSourceLibraryLicenseScreen( name = it.name, website = it.website, license = it.licenses.firstOrNull()?.htmlReadyLicenseContent.orEmpty(), ), ) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearAnimeDatabaseScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.advanced import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FlipToBack import androidx.compose.material.icons.outlined.SelectAll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.Checkbox import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.components.AnimeSourceIcon import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchUI import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.data.source.anime.mapSourceToDomainSource import tachiyomi.domain.source.anime.interactor.GetAnimeSourcesWithNonLibraryAnime import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.model.AnimeSourceWithIds import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.mi.data.AnimeDatabase import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.selectedBackground import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class ClearAnimeDatabaseScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val model = rememberScreenModel { ClearAnimeDatabaseScreenModel() } val state by model.state.collectAsState() val scope = rememberCoroutineScope() when (val s = state) { is ClearAnimeDatabaseScreenModel.State.Loading -> LoadingScreen() is ClearAnimeDatabaseScreenModel.State.Ready -> { if (s.showConfirmation) { AlertDialog( onDismissRequest = model::hideConfirmation, confirmButton = { TextButton( onClick = { scope.launchUI { model.removeAnimeBySourceId() model.clearSelection() model.hideConfirmation() context.toast(MR.strings.clear_database_completed) } }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = model::hideConfirmation) { Text(text = stringResource(MR.strings.action_cancel)) } }, text = { Text(text = stringResource(AYMR.strings.clear_database_confirmation)) }, ) } Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(AYMR.strings.pref_clear_anime_database), navigateUp = navigator::pop, actions = { if (s.items.isNotEmpty()) { AppBarActions( actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.SelectAll, onClick = model::selectAll, ), AppBar.Action( title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.FlipToBack, onClick = model::invertSelection, ), ), ) } }, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (s.items.isEmpty()) { EmptyScreen( message = stringResource(MR.strings.database_clean), modifier = Modifier.padding(contentPadding), ) } else { Column( modifier = Modifier .padding(contentPadding) .fillMaxSize(), ) { LazyColumn( modifier = Modifier.weight(1f), ) { items(s.items) { sourceWithCount -> ClearDatabaseItem( source = sourceWithCount.source, count = sourceWithCount.count, isSelected = s.selection.contains(sourceWithCount.id), onClickSelect = { model.toggleSelection( sourceWithCount.source, ) }, ) } } HorizontalDivider() Button( modifier = Modifier .padding(horizontal = 16.dp, vertical = 8.dp) .fillMaxWidth(), onClick = model::showConfirmation, enabled = s.selection.isNotEmpty(), ) { Text( text = stringResource(MR.strings.action_delete), color = MaterialTheme.colorScheme.onPrimary, ) } } } } } } } @Composable private fun ClearDatabaseItem( source: AnimeSource, count: Long, isSelected: Boolean, onClickSelect: () -> Unit, ) { Row( modifier = Modifier .selectedBackground(isSelected) .clickable(onClick = onClickSelect) .padding(horizontal = 8.dp) .height(56.dp), verticalAlignment = Alignment.CenterVertically, ) { AnimeSourceIcon(source = source) Column( modifier = Modifier .padding(start = 8.dp) .weight(1f), ) { Text( text = source.visualName, style = MaterialTheme.typography.bodyMedium, ) Text(text = stringResource(MR.strings.clear_database_source_item_count, count)) } Checkbox( checked = isSelected, onCheckedChange = { onClickSelect() }, ) } } } private class ClearAnimeDatabaseScreenModel : StateScreenModel( State.Loading, ) { private val getSourcesWithNonLibraryAnime: GetAnimeSourcesWithNonLibraryAnime = Injekt.get() private val database: AnimeDatabase = Injekt.get() private val sourceManager: AnimeSourceManager = Injekt.get() init { screenModelScope.launchIO { getSourcesWithNonLibraryAnime.subscribe() .collectLatest { list -> val items = list.groupBy { it.sourceId } .map { (sourceId, deletableAnime) -> val source = sourceManager.getOrStub(sourceId) val domainSource = mapSourceToDomainSource(source).copy( isStub = source is StubAnimeSource, ) val ids = mutableListOf() val orphaned = mutableListOf() deletableAnime.forEach { ids.add(it.animeId) if (it.fetchType == FetchType.Seasons) { val (childrenIds, orphanedIds) = getDeletableChildren(it.animeId) ids.addAll(childrenIds) orphaned.addAll(orphanedIds) } } AnimeSourceWithIds(domainSource, ids, orphaned) } mutableState.update { old -> val items = items.sortedBy { it.name } when (old) { State.Loading -> State.Ready(items) is State.Ready -> old.copy(items = items) } } } } } /** * Get all children of an anime that can be deleted, as well as any orphans. * Children that are favorited needs their parentId removed or else they won't be * able to be removed later. */ private suspend fun getDeletableChildren(animeId: Long): Pair, List> { val ids = mutableListOf() val orphaned = mutableListOf() val children = getSourcesWithNonLibraryAnime.getDeletableChildren(animeId) children.forEach { c -> if (c.favorite) { orphaned.add(c.id) } else { ids.add(c.id) if (c.fetchType == FetchType.Seasons) { val (childrenIds, orphanedIds) = getDeletableChildren(c.id) ids.addAll(childrenIds) orphaned.addAll(orphanedIds) } } } return Pair(ids, orphaned) } suspend fun removeAnimeBySourceId() = withNonCancellableContext { val state = state.value as? State.Ready ?: return@withNonCancellableContext val selected = state.items.filter { it.id in state.selection } val animeIds = selected.flatMap { it.ids } val orphaned = selected.flatMap { it.orphaned } .filterNot { it in animeIds } database.animesQueries.deleteAnimesNotInLibraryByAnimeIds(animeIds) database.animesQueries.removeParentIdByIds(orphaned) database.animehistoryQueries.removeResettedHistory() } fun toggleSelection(source: AnimeSource) = mutableState.update { state -> if (state !is State.Ready) return@update state val mutableList = state.selection.toMutableList() if (mutableList.contains(source.id)) { mutableList.remove(source.id) } else { mutableList.add(source.id) } state.copy(selection = mutableList) } fun clearSelection() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(selection = emptyList()) } fun selectAll() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(selection = state.items.fastMap { it.id }) } fun invertSelection() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy( selection = state.items .fastMap { it.id } .filterNot { it in state.selection }, ) } fun showConfirmation() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(showConfirmation = true) } fun hideConfirmation() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(showConfirmation = false) } sealed interface State { @Immutable data object Loading : State @Immutable data class Ready( val items: List, val selection: List = emptyList(), val showConfirmation: Boolean = false, ) : State } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.advanced import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FlipToBack import androidx.compose.material.icons.outlined.SelectAll import androidx.compose.material3.AlertDialog import androidx.compose.material3.Checkbox import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.components.MangaSourceIcon import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchUI import tachiyomi.core.common.util.lang.withNonCancellableContext import tachiyomi.data.Database import tachiyomi.domain.source.manga.interactor.GetMangaSourcesWithNonLibraryManga import tachiyomi.domain.source.manga.model.MangaSourceWithCount import tachiyomi.domain.source.manga.model.Source import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.LazyColumnWithAction import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.selectedBackground import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class ClearDatabaseScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val model = rememberScreenModel { ClearDatabaseScreenModel() } val state by model.state.collectAsState() val scope = rememberCoroutineScope() when (val s = state) { is ClearDatabaseScreenModel.State.Loading -> LoadingScreen() is ClearDatabaseScreenModel.State.Ready -> { if (s.showConfirmation) { AlertDialog( onDismissRequest = model::hideConfirmation, confirmButton = { TextButton( onClick = { scope.launchUI { model.removeMangaBySourceId() model.clearSelection() model.hideConfirmation() context.toast(MR.strings.clear_database_completed) } }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = model::hideConfirmation) { Text(text = stringResource(MR.strings.action_cancel)) } }, text = { Text(text = stringResource(AYMR.strings.clear_database_confirmation)) }, ) } Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(AYMR.strings.pref_clear_manga_database), navigateUp = navigator::pop, actions = { if (s.items.isNotEmpty()) { AppBarActions( actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_select_all), icon = Icons.Outlined.SelectAll, onClick = model::selectAll, ), AppBar.Action( title = stringResource(MR.strings.action_select_inverse), icon = Icons.Outlined.FlipToBack, onClick = model::invertSelection, ), ), ) } }, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> if (s.items.isEmpty()) { EmptyScreen( message = stringResource(MR.strings.database_clean), modifier = Modifier.padding(contentPadding), ) } else { LazyColumnWithAction( contentPadding = contentPadding, actionLabel = stringResource(MR.strings.action_delete), actionEnabled = s.selection.isNotEmpty(), onClickAction = model::showConfirmation, ) { items(s.items) { sourceWithCount -> ClearDatabaseItem( source = sourceWithCount.source, count = sourceWithCount.count, isSelected = s.selection.contains(sourceWithCount.id), onClickSelect = { model.toggleSelection(sourceWithCount.source) }, ) } } } } } } } @Composable private fun ClearDatabaseItem( source: Source, count: Long, isSelected: Boolean, onClickSelect: () -> Unit, ) { Row( modifier = Modifier .selectedBackground(isSelected) .clickable(onClick = onClickSelect) .padding(horizontal = 8.dp) .height(56.dp), verticalAlignment = Alignment.CenterVertically, ) { MangaSourceIcon(source = source) Column( modifier = Modifier .padding(start = 8.dp) .weight(1f), ) { Text( text = source.visualName, style = MaterialTheme.typography.bodyMedium, ) Text(text = stringResource(MR.strings.clear_database_source_item_count, count)) } Checkbox( checked = isSelected, onCheckedChange = { onClickSelect() }, ) } } } private class ClearDatabaseScreenModel : StateScreenModel( State.Loading, ) { private val getSourcesWithNonLibraryManga: GetMangaSourcesWithNonLibraryManga = Injekt.get() private val database: Database = Injekt.get() init { screenModelScope.launchIO { getSourcesWithNonLibraryManga.subscribe() .collectLatest { list -> mutableState.update { old -> val items = list.sortedBy { it.name } when (old) { State.Loading -> State.Ready(items) is State.Ready -> old.copy(items = items) } } } } } suspend fun removeMangaBySourceId() = withNonCancellableContext { val state = state.value as? State.Ready ?: return@withNonCancellableContext database.mangasQueries.deleteMangasNotInLibraryBySourceIds(state.selection) database.historyQueries.removeResettedHistory() } fun toggleSelection(source: Source) = mutableState.update { state -> if (state !is State.Ready) return@update state val mutableList = state.selection.toMutableList() if (mutableList.contains(source.id)) { mutableList.remove(source.id) } else { mutableList.add(source.id) } state.copy(selection = mutableList) } fun clearSelection() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(selection = emptyList()) } fun selectAll() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(selection = state.items.fastMap { it.id }) } fun invertSelection() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy( selection = state.items .fastMap { it.id } .filterNot { it in state.selection }, ) } fun showConfirmation() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(showConfirmation = true) } fun hideConfirmation() = mutableState.update { state -> if (state !is State.Ready) return@update state state.copy(showConfirmation = false) } sealed interface State { @Immutable data object Loading : State @Immutable data class Ready( val items: List, val selection: List = emptyList(), val showConfirmation: Boolean = false, ) : State } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/appearance/AppLanguageScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.appearance import android.content.Context import androidx.appcompat.app.AppCompatDelegate import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.core.os.LocaleListCompat import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import org.xmlpull.v1.XmlPullParser import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource class AppLanguageScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val langs = remember { getLangs(context) } var currentLanguage by remember { mutableStateOf(AppCompatDelegate.getApplicationLocales().get(0)?.toLanguageTag() ?: "") } LaunchedEffect(currentLanguage) { val locale = if (currentLanguage.isEmpty()) { LocaleListCompat.getEmptyLocaleList() } else { LocaleListCompat.forLanguageTags(currentLanguage) } AppCompatDelegate.setApplicationLocales(locale) } Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.pref_app_language), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> LazyColumn( modifier = Modifier.padding(contentPadding), ) { items(langs) { ListItem( modifier = Modifier.clickable { currentLanguage = it.langTag }, headlineContent = { Text(it.displayName) }, supportingContent = { it.localizedDisplayName?.let { Text(it) } }, trailingContent = { if (currentLanguage == it.langTag) { Icon( imageVector = Icons.Default.Check, contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) } }, ) } } } } private fun getLangs(context: Context): ImmutableList { val langs = mutableListOf() val parser = context.resources.getXml(R.xml.locales_config) var eventType = parser.eventType while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG && parser.name == "locale") { for (i in 0.. {} is RepoDialog.Create -> { ExtensionRepoCreateDialog( onDismissRequest = screenModel::dismissDialog, onCreate = { screenModel.createRepo(it) }, repoUrls = successState.repos.map { it.baseUrl }.toImmutableSet(), ) } is RepoDialog.Delete -> { ExtensionRepoDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteRepo(dialog.repo) }, repo = dialog.repo, ) } is RepoDialog.Conflict -> { ExtensionRepoConflictDialog( onDismissRequest = screenModel::dismissDialog, onMigrate = { screenModel.replaceRepo(dialog.newRepo) }, oldRepo = dialog.oldRepo, newRepo = dialog.newRepo, ) } is RepoDialog.Confirm -> { ExtensionRepoConfirmDialog( onDismissRequest = screenModel::dismissDialog, onCreate = { screenModel.createRepo(dialog.url) }, repo = dialog.url, ) } } LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> if (event is RepoEvent.LocalizedMessage) { context.toast(event.stringRes) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/AnimeExtensionReposScreenModel.kt ================================================ package eu.kanade.presentation.more.settings.screen.browse import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import mihon.domain.extensionrepo.anime.interactor.CreateAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.DeleteAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.ReplaceAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.UpdateAnimeExtensionRepo import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.core.common.util.lang.launchIO import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeExtensionReposScreenModel( private val getExtensionRepo: GetAnimeExtensionRepo = Injekt.get(), private val createExtensionRepo: CreateAnimeExtensionRepo = Injekt.get(), private val deleteExtensionRepo: DeleteAnimeExtensionRepo = Injekt.get(), private val replaceExtensionRepo: ReplaceAnimeExtensionRepo = Injekt.get(), private val updateExtensionRepo: UpdateAnimeExtensionRepo = Injekt.get(), ) : StateScreenModel(RepoScreenState.Loading) { private val _events: Channel = Channel(Int.MAX_VALUE) val events = _events.receiveAsFlow() init { screenModelScope.launchIO { getExtensionRepo.subscribeAll() .collectLatest { repos -> mutableState.update { RepoScreenState.Success( repos = repos.toImmutableSet(), ) } } } } /** * Creates and adds a new repo to the database. * * @param baseUrl The baseUrl of the repo to create. */ fun createRepo(baseUrl: String) { screenModelScope.launchIO { when (val result = createExtensionRepo.await(baseUrl)) { CreateAnimeExtensionRepo.Result.InvalidUrl -> _events.send(RepoEvent.InvalidUrl) CreateAnimeExtensionRepo.Result.RepoAlreadyExists -> _events.send(RepoEvent.RepoAlreadyExists) is CreateAnimeExtensionRepo.Result.DuplicateFingerprint -> { showDialog(RepoDialog.Conflict(result.oldRepo, result.newRepo)) } else -> {} } } } /** * Inserts a repo to the database, replace a matching repo with the same signing key fingerprint if found. * * @param newRepo The repo to insert */ fun replaceRepo(newRepo: ExtensionRepo) { screenModelScope.launchIO { replaceExtensionRepo.await(newRepo) } } /** * Refreshes information for each repository. */ fun refreshRepos() { val status = state.value if (status is RepoScreenState.Success) { screenModelScope.launchIO { updateExtensionRepo.awaitAll() } } } /** * Deletes the given repo from the database */ fun deleteRepo(baseUrl: String) { screenModelScope.launchIO { deleteExtensionRepo.await(baseUrl) } } fun showDialog(dialog: RepoDialog) { mutableState.update { when (it) { RepoScreenState.Loading -> it is RepoScreenState.Success -> it.copy(dialog = dialog) } } } fun dismissDialog() { mutableState.update { when (it) { RepoScreenState.Loading -> it is RepoScreenState.Success -> it.copy(dialog = null) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/MangaExtensionReposScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.browse import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.more.settings.screen.browse.components.ExtensionRepoConfirmDialog import eu.kanade.presentation.more.settings.screen.browse.components.ExtensionRepoConflictDialog import eu.kanade.presentation.more.settings.screen.browse.components.ExtensionRepoCreateDialog import eu.kanade.presentation.more.settings.screen.browse.components.ExtensionRepoDeleteDialog import eu.kanade.presentation.more.settings.screen.browse.components.ExtensionReposScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.flow.collectLatest import tachiyomi.presentation.core.screens.LoadingScreen class MangaExtensionReposScreen( private val url: String? = null, ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MangaExtensionReposScreenModel() } val state by screenModel.state.collectAsState() LaunchedEffect(url) { url?.let { screenModel.showDialog(RepoDialog.Confirm(it)) } } if (state is RepoScreenState.Loading) { LoadingScreen() return } val successState = state as RepoScreenState.Success ExtensionReposScreen( state = successState, onClickCreate = { screenModel.showDialog(RepoDialog.Create) }, onOpenWebsite = { context.openInBrowser(it.website) }, onClickDelete = { screenModel.showDialog(RepoDialog.Delete(it)) }, onClickRefresh = { screenModel.refreshRepos() }, navigateUp = navigator::pop, ) when (val dialog = successState.dialog) { null -> {} is RepoDialog.Create -> { ExtensionRepoCreateDialog( onDismissRequest = screenModel::dismissDialog, onCreate = { screenModel.createRepo(it) }, repoUrls = successState.repos.map { it.baseUrl }.toImmutableSet(), ) } is RepoDialog.Delete -> { ExtensionRepoDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteRepo(dialog.repo) }, repo = dialog.repo, ) } is RepoDialog.Conflict -> { ExtensionRepoConflictDialog( onDismissRequest = screenModel::dismissDialog, onMigrate = { screenModel.replaceRepo(dialog.newRepo) }, oldRepo = dialog.oldRepo, newRepo = dialog.newRepo, ) } is RepoDialog.Confirm -> { ExtensionRepoConfirmDialog( onDismissRequest = screenModel::dismissDialog, onCreate = { screenModel.createRepo(dialog.url) }, repo = dialog.url, ) } } LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> if (event is RepoEvent.LocalizedMessage) { context.toast(event.stringRes) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/MangaExtensionReposScreenModel.kt ================================================ package eu.kanade.presentation.more.settings.screen.browse import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import mihon.domain.extensionrepo.manga.interactor.CreateMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.DeleteMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.ReplaceMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.UpdateMangaExtensionRepo import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaExtensionReposScreenModel( private val getExtensionRepo: GetMangaExtensionRepo = Injekt.get(), private val createExtensionRepo: CreateMangaExtensionRepo = Injekt.get(), private val deleteExtensionRepo: DeleteMangaExtensionRepo = Injekt.get(), private val replaceExtensionRepo: ReplaceMangaExtensionRepo = Injekt.get(), private val updateExtensionRepo: UpdateMangaExtensionRepo = Injekt.get(), ) : StateScreenModel(RepoScreenState.Loading) { private val _events: Channel = Channel(Int.MAX_VALUE) val events = _events.receiveAsFlow() init { screenModelScope.launchIO { getExtensionRepo.subscribeAll() .collectLatest { repos -> mutableState.update { RepoScreenState.Success( repos = repos.toImmutableSet(), ) } } } } /** * Creates and adds a new repo to the database. * * @param baseUrl The baseUrl of the repo to create. */ fun createRepo(baseUrl: String) { screenModelScope.launchIO { when (val result = createExtensionRepo.await(baseUrl)) { CreateMangaExtensionRepo.Result.InvalidUrl -> _events.send(RepoEvent.InvalidUrl) CreateMangaExtensionRepo.Result.RepoAlreadyExists -> _events.send(RepoEvent.RepoAlreadyExists) is CreateMangaExtensionRepo.Result.DuplicateFingerprint -> { showDialog(RepoDialog.Conflict(result.oldRepo, result.newRepo)) } else -> {} } } } /** * Inserts a repo to the database, replace a matching repo with the same signing key fingerprint if found. * * @param newRepo The repo to insert */ fun replaceRepo(newRepo: ExtensionRepo) { screenModelScope.launchIO { replaceExtensionRepo.await(newRepo) } } /** * Refreshes information for each repository. */ fun refreshRepos() { val status = state.value if (status is RepoScreenState.Success) { screenModelScope.launchIO { updateExtensionRepo.awaitAll() } } } /** * Deletes the given repo from the database */ fun deleteRepo(baseUrl: String) { screenModelScope.launchIO { deleteExtensionRepo.await(baseUrl) } } fun showDialog(dialog: RepoDialog) { mutableState.update { when (it) { RepoScreenState.Loading -> it is RepoScreenState.Success -> it.copy(dialog = dialog) } } } fun dismissDialog() { mutableState.update { when (it) { RepoScreenState.Loading -> it is RepoScreenState.Success -> it.copy(dialog = null) } } } } sealed class RepoEvent { sealed class LocalizedMessage(val stringRes: StringResource) : RepoEvent() data object InvalidUrl : LocalizedMessage(MR.strings.invalid_repo_name) data object RepoAlreadyExists : LocalizedMessage(MR.strings.error_repo_exists) } sealed class RepoDialog { data object Create : RepoDialog() data class Delete(val repo: String) : RepoDialog() data class Conflict(val oldRepo: ExtensionRepo, val newRepo: ExtensionRepo) : RepoDialog() data class Confirm(val url: String) : RepoDialog() } sealed class RepoScreenState { @Immutable data object Loading : RepoScreenState() @Immutable data class Success( val repos: ImmutableSet, val oldRepos: ImmutableSet? = null, val dialog: RepoDialog? = null, ) : RepoScreenState() { val isEmpty: Boolean get() = repos.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/components/ExtensionReposContent.kt ================================================ package eu.kanade.presentation.more.settings.screen.browse.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Label import androidx.compose.material.icons.automirrored.outlined.OpenInNew import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.Delete import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.ImmutableSet import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ExtensionReposContent( repos: ImmutableSet, lazyListState: LazyListState, paddingValues: PaddingValues, onOpenWebsite: (ExtensionRepo) -> Unit, onClickDelete: (String) -> Unit, modifier: Modifier = Modifier, ) { LazyColumn( state = lazyListState, contentPadding = paddingValues, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), modifier = modifier, ) { repos.forEach { item { ExtensionRepoListItem( modifier = Modifier.animateItem(), repo = it, onOpenWebsite = { onOpenWebsite(it) }, onDelete = { onClickDelete(it.baseUrl) }, ) } } } } @Composable private fun ExtensionRepoListItem( repo: ExtensionRepo, onOpenWebsite: () -> Unit, onDelete: () -> Unit, modifier: Modifier = Modifier, ) { val context = LocalContext.current ElevatedCard( modifier = modifier, ) { Row( modifier = Modifier .fillMaxWidth() .padding( start = MaterialTheme.padding.medium, top = MaterialTheme.padding.medium, end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { Icon(imageVector = Icons.AutoMirrored.Outlined.Label, contentDescription = null) Text( text = repo.name, modifier = Modifier.padding(start = MaterialTheme.padding.medium), style = MaterialTheme.typography.titleMedium, ) } Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End, ) { IconButton(onClick = onOpenWebsite) { Icon( imageVector = Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = stringResource(MR.strings.action_open_in_browser), ) } IconButton( onClick = { val url = "${repo.baseUrl}/index.min.json" context.copyToClipboard(url, url) }, ) { Icon( imageVector = Icons.Outlined.ContentCopy, contentDescription = stringResource(MR.strings.action_copy_to_clipboard), ) } IconButton(onClick = onDelete) { Icon( imageVector = Icons.Outlined.Delete, contentDescription = stringResource(MR.strings.action_delete), ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/components/ExtensionReposDialogs.kt ================================================ package eu.kanade.presentation.more.settings.screen.browse.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.AlertDialog import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.text.input.KeyboardType import kotlinx.collections.immutable.ImmutableSet import kotlinx.coroutines.delay import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import kotlin.time.Duration.Companion.seconds @Composable fun ExtensionRepoCreateDialog( onDismissRequest: () -> Unit, onCreate: (String) -> Unit, repoUrls: ImmutableSet, ) { var name by remember { mutableStateOf("") } val focusRequester = remember { FocusRequester() } val nameAlreadyExists = remember(name) { repoUrls.contains(name) } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( enabled = name.isNotEmpty() && !nameAlreadyExists, onClick = { onCreate(name) onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_add)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_add_repo)) }, text = { Column { Text(text = stringResource(AYMR.strings.action_add_repo_message)) OutlinedTextField( modifier = Modifier .focusRequester(focusRequester), value = name, onValueChange = { name = it }, label = { Text(text = stringResource(MR.strings.label_add_repo_input)) }, supportingText = { val msgRes = if (name.isNotEmpty() && nameAlreadyExists) { MR.strings.error_repo_exists } else { MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, isError = name.isNotEmpty() && nameAlreadyExists, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri), singleLine = true, ) } }, ) LaunchedEffect(focusRequester) { // TODO: https://issuetracker.google.com/issues/204502668 delay(0.1.seconds) focusRequester.requestFocus() } } @Composable fun ExtensionRepoDeleteDialog( onDismissRequest: () -> Unit, onDelete: () -> Unit, repo: String, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_delete_repo)) }, text = { Text(text = stringResource(MR.strings.delete_repo_confirmation, repo)) }, ) } @Composable fun ExtensionRepoConflictDialog( oldRepo: ExtensionRepo, newRepo: ExtensionRepo, onDismissRequest: () -> Unit, onMigrate: () -> Unit, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( onClick = { onMigrate() onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_replace_repo)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.action_replace_repo_title)) }, text = { Text(text = stringResource(MR.strings.action_replace_repo_message, newRepo.name, oldRepo.name)) }, ) } @Composable fun ExtensionRepoConfirmDialog( onDismissRequest: () -> Unit, onCreate: () -> Unit, repo: String, ) { AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(MR.strings.action_add_repo)) }, text = { Text(text = stringResource(MR.strings.add_repo_confirmation, repo)) }, confirmButton = { TextButton( onClick = { onCreate() onDismissRequest() }, ) { Text(text = stringResource(MR.strings.action_add)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/browse/components/ExtensionReposScreen.kt ================================================ @file:JvmName("ExtensionReposScreenKt") package eu.kanade.presentation.more.settings.screen.browse.components import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.presentation.category.components.CategoryFloatingActionButton import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.more.settings.screen.browse.RepoScreenState import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @Composable fun ExtensionReposScreen( state: RepoScreenState.Success, onClickCreate: () -> Unit, onOpenWebsite: (ExtensionRepo) -> Unit, onClickDelete: (String) -> Unit, onClickRefresh: () -> Unit, navigateUp: () -> Unit, ) { val lazyListState = rememberLazyListState() Scaffold( topBar = { scrollBehavior -> AppBar( navigateUp = navigateUp, title = stringResource(MR.strings.label_extension_repos), scrollBehavior = scrollBehavior, actions = { IconButton(onClick = onClickRefresh) { Icon( imageVector = Icons.Outlined.Refresh, contentDescription = stringResource(resource = MR.strings.action_webview_refresh), ) } }, ) }, floatingActionButton = { CategoryFloatingActionButton( lazyListState = lazyListState, onCreate = onClickCreate, ) }, ) { paddingValues -> if (state.isEmpty) { EmptyScreen( MR.strings.information_empty_repos, modifier = Modifier.padding(paddingValues), ) return@Scaffold } ExtensionReposContent( repos = state.repos, lazyListState = lazyListState, paddingValues = paddingValues + topSmallPaddingValues + PaddingValues(horizontal = MaterialTheme.padding.medium), onOpenWebsite = onOpenWebsite, onClickDelete = onClickDelete, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.data import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob import eu.kanade.tachiyomi.data.backup.create.BackupCreator import eu.kanade.tachiyomi.data.backup.create.BackupOptions import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.update import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LazyColumnWithAction import tachiyomi.presentation.core.components.SectionCard import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource class CreateBackupScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val model = rememberScreenModel { CreateBackupScreenModel() } val state by model.state.collectAsState() val chooseBackupDir = rememberLauncherForActivityResult( contract = ActivityResultContracts.CreateDocument("application/*"), ) { if (it != null) { context.contentResolver.takePersistableUriPermission( it, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION, ) model.createBackup(context, it) navigator.pop() } } Scaffold( topBar = { AppBar( title = stringResource(MR.strings.pref_create_backup), navigateUp = navigator::pop, scrollBehavior = it, ) }, ) { contentPadding -> LazyColumnWithAction( contentPadding = contentPadding, actionLabel = stringResource(MR.strings.action_create), actionEnabled = state.options.canCreate(), onClickAction = { if (!BackupCreateJob.isManualJobRunning(context)) { try { chooseBackupDir.launch(BackupCreator.getFilename()) } catch (e: ActivityNotFoundException) { context.toast(MR.strings.file_picker_error) } } else { context.toast(MR.strings.backup_in_progress) } }, ) { if (DeviceUtil.isMiui && DeviceUtil.isMiuiOptimizationDisabled()) { item { WarningBanner(MR.strings.restore_miui_warning) } } item { SectionCard(MR.strings.label_library) { Options(BackupOptions.libraryOptions, state, model) } } item { SectionCard(MR.strings.label_settings) { Options(BackupOptions.settingsOptions, state, model) } } item { SectionCard(MR.strings.label_extensions) { Options(BackupOptions.extensionOptions, state, model) } } } } } @Composable private fun Options( options: ImmutableList, state: CreateBackupScreenModel.State, model: CreateBackupScreenModel, ) { options.forEach { option -> LabeledCheckbox( label = stringResource(option.label), checked = option.getter(state.options), onCheckedChange = { model.toggle(option.setter, it) }, enabled = option.enabled(state.options), ) } } } private class CreateBackupScreenModel : StateScreenModel(State()) { fun toggle(setter: (BackupOptions, Boolean) -> BackupOptions, enabled: Boolean) { mutableState.update { it.copy( options = setter(it.options, enabled), ) } } fun createBackup(context: Context, uri: Uri) { BackupCreateJob.startNow(context, uri, state.value.options) } @Immutable data class State( val options: BackupOptions = BackupOptions(), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/data/RestoreBackupScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.data import android.content.Context import android.net.Uri import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle import androidx.core.net.toUri import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.WarningBanner import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.backup.BackupFileValidator import eu.kanade.tachiyomi.data.backup.restore.BackupRestoreJob import eu.kanade.tachiyomi.data.backup.restore.RestoreOptions import eu.kanade.tachiyomi.util.system.DeviceUtil import kotlinx.coroutines.flow.update import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.LazyColumnWithAction import tachiyomi.presentation.core.components.SectionCard import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource class RestoreBackupScreen( private val uri: String, ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val model = rememberScreenModel { RestoreBackupScreenModel(context, uri) } val state by model.state.collectAsState() Scaffold( topBar = { AppBar( title = stringResource(MR.strings.pref_restore_backup), navigateUp = navigator::pop, scrollBehavior = it, ) }, ) { contentPadding -> LazyColumnWithAction( contentPadding = contentPadding, actionLabel = stringResource(MR.strings.action_restore), actionEnabled = state.canRestore && state.options.canRestore(), onClickAction = { model.startRestore() navigator.pop() }, ) { if (DeviceUtil.isMiui && DeviceUtil.isMiuiOptimizationDisabled()) { item { WarningBanner(MR.strings.restore_miui_warning) } } if (state.canRestore) { item { SectionCard { RestoreOptions.options.forEach { option -> LabeledCheckbox( label = stringResource(option.label), checked = option.getter(state.options), onCheckedChange = { model.toggle(option.setter, it) }, ) } } } } if (state.error != null) { errorMessageItem(state.error) } } } } private fun LazyListScope.errorMessageItem( error: Any?, ) { item { SectionCard { Column( modifier = Modifier.padding(horizontal = MaterialTheme.padding.medium), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { val msg = buildAnnotatedString { when (error) { is MissingRestoreComponents -> { appendLine(stringResource(MR.strings.backup_restore_content_full)) if (error.sources.isNotEmpty()) { appendLine() withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { appendLine(stringResource(MR.strings.backup_restore_missing_sources)) } error.sources.joinTo( this, separator = "\n- ", prefix = "- ", ) } if (error.trackers.isNotEmpty()) { appendLine() withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { appendLine(stringResource(MR.strings.backup_restore_missing_trackers)) } error.trackers.joinTo( this, separator = "\n- ", prefix = "- ", ) } } is InvalidRestore -> { withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { appendLine(stringResource(MR.strings.invalid_backup_file)) } appendLine(error.uri.toString()) appendLine() withStyle(SpanStyle(fontWeight = FontWeight.Bold)) { appendLine(stringResource(MR.strings.invalid_backup_file_error)) } appendLine(error.message) } else -> { appendLine(error.toString()) } } } SelectionContainer { Text(text = msg) } } } } } } private class RestoreBackupScreenModel( private val context: Context, private val uri: String, ) : StateScreenModel(State()) { init { validate(uri.toUri()) } fun toggle(setter: (RestoreOptions, Boolean) -> RestoreOptions, enabled: Boolean) { mutableState.update { it.copy( options = setter(it.options, enabled), ) } } fun startRestore() { BackupRestoreJob.start( context = context, uri = uri.toUri(), options = state.value.options, ) } private fun validate(uri: Uri) { val results = try { BackupFileValidator(context).validate(uri) } catch (e: Exception) { setError( error = InvalidRestore(uri, e.message.toString()), canRestore = false, ) return } if (results.missingSources.isNotEmpty() || results.missingTrackers.isNotEmpty()) { setError( error = MissingRestoreComponents(uri, results.missingSources, results.missingTrackers), canRestore = true, ) return } setError(error = null, canRestore = true) } private fun setError(error: Any?, canRestore: Boolean) { mutableState.update { it.copy( error = error, canRestore = canRestore, ) } } @Immutable data class State( val error: Any? = null, val canRestore: Boolean = false, val options: RestoreOptions = RestoreOptions(), ) } private data class MissingRestoreComponents( val uri: Uri, val sources: List, val trackers: List, ) private data class InvalidRestore( val uri: Uri? = null, val message: String, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/data/StorageInfo.kt ================================================ package eu.kanade.presentation.more.settings.screen.data import android.text.format.Formatter import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.util.storage.DiskUtil import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.theme.header import tachiyomi.presentation.core.util.secondaryItemAlpha import java.io.File @Composable fun StorageInfo( modifier: Modifier = Modifier, ) { val context = LocalContext.current val storages = remember { DiskUtil.getExternalStorages(context) } Column( modifier = modifier, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { storages.forEach { StorageInfo(it) } } } @Composable private fun StorageInfo( file: File, ) { val context = LocalContext.current val available = remember(file) { DiskUtil.getAvailableStorageSpace(file) } val availableText = remember(available) { Formatter.formatFileSize(context, available) } val total = remember(file) { DiskUtil.getTotalStorageSpace(file) } val totalText = remember(total) { Formatter.formatFileSize(context, total) } Column( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Text( text = file.absolutePath, style = MaterialTheme.typography.header, ) LinearProgressIndicator( modifier = Modifier .clip(MaterialTheme.shapes.small) .fillMaxWidth() .height(12.dp), progress = { (1 - (available / total.toFloat())) }, ) Text( text = stringResource(MR.strings.available_disk_space_info, availableText, totalText), modifier = Modifier.secondaryItemAlpha(), style = MaterialTheme.typography.bodySmall, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/BackupSchemaScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.debug import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ContentCopy import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.backup.models.Backup import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.collections.immutable.persistentListOf import kotlinx.serialization.protobuf.schema.ProtoBufSchemaGenerator import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource class BackupSchemaScreen : Screen() { companion object { const val TITLE = "Backup file schema" } @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val schema = remember { ProtoBufSchemaGenerator.generateSchemaText( Backup.serializer().descriptor, ) } Scaffold( topBar = { AppBar( title = TITLE, navigateUp = navigator::pop, actions = { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_copy_to_clipboard), icon = Icons.Default.ContentCopy, onClick = { context.copyToClipboard(TITLE, schema) }, ), ), ) }, scrollBehavior = it, ) }, ) { contentPadding -> Text( text = schema, modifier = Modifier .verticalScroll(rememberScrollState()) .padding(contentPadding) .padding(16.dp), fontFamily = FontFamily.Monospace, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.debug import android.os.Build import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.ui.platform.LocalContext import androidx.profileinstaller.ProfileVerifier import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.PreferenceScaffold import eu.kanade.presentation.more.settings.screen.about.AboutScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.WebViewUtil import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.guava.await import tachiyomi.i18n.MR class DebugInfoScreen : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow PreferenceScaffold( titleRes = MR.strings.pref_debug_info, onBackPressed = navigator::pop, itemsProvider = { listOf( Preference.PreferenceItem.TextPreference( title = WorkerInfoScreen.TITLE, onClick = { navigator.push(WorkerInfoScreen()) }, ), Preference.PreferenceItem.TextPreference( title = BackupSchemaScreen.TITLE, onClick = { navigator.push(BackupSchemaScreen()) }, ), getAppInfoGroup(), getDeviceInfoGroup(), ) }, ) } @Composable private fun getAppInfoGroup(): Preference.PreferenceGroup { return Preference.PreferenceGroup( title = "App info", preferenceItems = persistentListOf( Preference.PreferenceItem.TextPreference( title = "Version", subtitle = AboutScreen.getVersionName(false), ), Preference.PreferenceItem.TextPreference( title = "Build time", subtitle = AboutScreen.getFormattedBuildTime(), ), getProfileVerifierPreference(), Preference.PreferenceItem.TextPreference( title = "WebView version", subtitle = getWebViewVersion(), ), ), ) } @Composable @ReadOnlyComposable private fun getWebViewVersion(): String { return WebViewUtil.getVersion(LocalContext.current) } @Composable private fun getProfileVerifierPreference(): Preference.PreferenceItem.TextPreference { val status by produceState(initialValue = "-") { val result = ProfileVerifier.getCompilationStatusAsync().await().profileInstallResultCode value = when (result) { ProfileVerifier.CompilationStatus .RESULT_CODE_NO_PROFILE_INSTALLED, -> "No profile installed" ProfileVerifier.CompilationStatus .RESULT_CODE_COMPILED_WITH_PROFILE, -> "Compiled" ProfileVerifier.CompilationStatus .RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING, -> "Compiled non-matching" ProfileVerifier.CompilationStatus .RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ, ProfileVerifier.CompilationStatus .RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE, ProfileVerifier.CompilationStatus .RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST, -> "Error $result" ProfileVerifier.CompilationStatus .RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION, -> "Not supported" ProfileVerifier.CompilationStatus .RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION, -> "Pending compilation" ProfileVerifier.CompilationStatus.RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED -> "No profile embedded" else -> "Unknown code $result" } } return Preference.PreferenceItem.TextPreference( title = "Profile compilation status", subtitle = status, ) } private fun getDeviceInfoGroup(): Preference.PreferenceGroup { val items = persistentListOf>().mutate { it.add( Preference.PreferenceItem.TextPreference( title = "Model", subtitle = "${Build.MANUFACTURER} ${Build.MODEL} (${Build.DEVICE})", ), ) if (DeviceUtil.oneUiVersion != null) { it.add( Preference.PreferenceItem.TextPreference( title = "OneUI version", subtitle = "${DeviceUtil.oneUiVersion}", ), ) } else if (DeviceUtil.miuiMajorVersion != null) { it.add( Preference.PreferenceItem.TextPreference( title = "MIUI version", subtitle = "${DeviceUtil.miuiMajorVersion}", ), ) } val androidVersion = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { Build.VERSION.RELEASE_OR_PREVIEW_DISPLAY } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { Build.VERSION.RELEASE_OR_CODENAME } else { Build.VERSION.RELEASE } it.add( Preference.PreferenceItem.TextPreference( title = "Android version", subtitle = "$androidVersion (${Build.DISPLAY})", ), ) } return Preference.PreferenceGroup( title = "Device info", preferenceItems = items, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/WorkerInfoScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.debug import android.content.Context import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ContentCopy import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEach import androidx.work.WorkInfo import androidx.work.WorkQuery import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.util.lang.toDateTimestampString import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.workManager import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.plus import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId class WorkerInfoScreen : Screen() { companion object { const val TITLE = "Worker info" } @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model(context) } val enqueued by screenModel.enqueued.collectAsState() val finished by screenModel.finished.collectAsState() val running by screenModel.running.collectAsState() Scaffold( topBar = { AppBar( title = TITLE, navigateUp = navigator::pop, actions = { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_copy_to_clipboard), icon = Icons.Default.ContentCopy, onClick = { context.copyToClipboard( TITLE, enqueued + finished + running, ) }, ), ), ) }, scrollBehavior = it, ) }, ) { contentPadding -> LazyColumn( contentPadding = contentPadding + PaddingValues(horizontal = 16.dp), modifier = Modifier.horizontalScroll(rememberScrollState()), ) { item { SectionTitle(title = "Enqueued") } item { SectionText(text = enqueued) } item { SectionTitle(title = "Finished") } item { SectionText(text = finished) } item { SectionTitle(title = "Running") } item { SectionText(text = running) } } } } @Composable private fun SectionTitle(title: String) { Text( text = title, style = MaterialTheme.typography.titleMedium, modifier = Modifier.padding(vertical = 8.dp), ) } @Composable private fun SectionText(text: String) { Text( text = text, softWrap = false, fontFamily = FontFamily.Monospace, ) } private class Model(context: Context) : ScreenModel { private val workManager = context.workManager val finished = workManager .getWorkInfosFlow( WorkQuery.fromStates(WorkInfo.State.SUCCEEDED, WorkInfo.State.FAILED, WorkInfo.State.CANCELLED), ) .map(::constructString) .stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "") val running = workManager .getWorkInfosFlow(WorkQuery.fromStates(WorkInfo.State.RUNNING)) .map(::constructString) .stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "") val enqueued = workManager .getWorkInfosFlow(WorkQuery.fromStates(WorkInfo.State.ENQUEUED)) .map(::constructString) .stateIn(ioCoroutineScope, SharingStarted.WhileSubscribed(), "") private fun constructString(list: List) = buildString { if (list.isEmpty()) { appendLine("-") } else { list.fastForEach { workInfo -> appendLine("Id: ${workInfo.id}") appendLine("Tags:") workInfo.tags.forEach { appendLine(" - $it") } appendLine("State: ${workInfo.state}") if (workInfo.state == WorkInfo.State.ENQUEUED) { val timestamp = LocalDateTime.ofInstant( Instant.ofEpochMilli(workInfo.nextScheduleTimeMillis), ZoneId.systemDefault(), ) .toDateTimestampString( UiPreferences.dateFormat( Injekt.get().dateFormat().get(), ), ) appendLine("Next scheduled run: $timestamp") appendLine("Attempt #${workInfo.runAttemptCount + 1}") } appendLine() } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAdvancedScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.tachiyomi.ui.player.settings.AdvancedPlayerPreferences import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object PlayerSettingsAdvancedScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = AYMR.strings.pref_player_advanced @Composable override fun getPreferences(): List { val advancedPlayerPreferences = remember { Injekt.get() } val scope = rememberCoroutineScope() val context = LocalContext.current val enableUserFiles = advancedPlayerPreferences.mpvUserFiles() val mpvConf = advancedPlayerPreferences.mpvConf() val mpvInput = advancedPlayerPreferences.mpvInput() return listOf( Preference.PreferenceItem.SwitchPreference( preference = enableUserFiles, title = stringResource(AYMR.strings.pref_mpv_user_files), subtitle = stringResource(AYMR.strings.pref_mpv_user_files_summary), ), Preference.PreferenceItem.MPVConfPreference( preference = mpvConf, scope = scope, context = context, fileName = "mpv.conf", title = stringResource(AYMR.strings.pref_mpv_conf), ), Preference.PreferenceItem.MPVConfPreference( preference = mpvInput, scope = scope, context = context, fileName = "input.conf", title = stringResource(AYMR.strings.pref_mpv_input), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAudioScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.tachiyomi.ui.player.settings.AudioChannels import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import kotlinx.collections.immutable.toImmutableMap import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Locale import java.util.MissingResourceException object PlayerSettingsAudioScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = AYMR.strings.pref_player_audio @Composable override fun getPreferences(): List { val audioPreferences = remember { Injekt.get() } val prefLangs = audioPreferences.preferredAudioLanguages() val pitchCorrection = audioPreferences.enablePitchCorrection() val audioChannels = audioPreferences.audioChannels() val boostCapPref = audioPreferences.volumeBoostCap() val boostCap by boostCapPref.collectAsState() return listOf( Preference.PreferenceItem.EditTextInfoPreference( preference = prefLangs, dialogSubtitle = stringResource(AYMR.strings.pref_player_audio_lang_info), title = stringResource(AYMR.strings.pref_player_audio_lang), validate = { pref -> val langs = pref.split(",").filter(String::isNotEmpty).map(String::trim) langs.forEach { try { val locale = Locale(it) if (locale.isO3Language == locale.language && locale.language == locale.getDisplayName(Locale.ENGLISH) ) { throw MissingResourceException("", "", "") } } catch (_: MissingResourceException) { return@EditTextInfoPreference false } } true }, errorMessage = { pref -> val langs = pref.split(",").filter(String::isNotEmpty).map(String::trim) langs.forEach { try { val locale = Locale(it) if (locale.isO3Language == locale.language && locale.language == locale.getDisplayName(Locale.ENGLISH) ) { throw MissingResourceException("", "", "") } } catch (_: MissingResourceException) { return@EditTextInfoPreference stringResource( AYMR.strings.pref_player_subtitle_invalid_lang, it, ) } } "" }, ), Preference.PreferenceItem.SwitchPreference( preference = pitchCorrection, title = stringResource(AYMR.strings.pref_player_audio_pitch_correction), subtitle = stringResource(AYMR.strings.pref_player_audio_pitch_correction_summary), ), Preference.PreferenceItem.ListPreference( preference = audioChannels, entries = AudioChannels.entries.associateWith { stringResource(it.titleRes) }.toImmutableMap(), title = stringResource(AYMR.strings.pref_player_audio_channels), ), Preference.PreferenceItem.SliderPreference( value = boostCap, valueRange = 0..200, title = stringResource(AYMR.strings.pref_player_audio_boost_cap), subtitle = boostCap.toString(), onValueChanged = { boostCapPref.set(it) true }, ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsDecoderScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.remember import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.tachiyomi.ui.player.Debanding import eu.kanade.tachiyomi.ui.player.settings.DecoderPreferences import kotlinx.collections.immutable.toImmutableMap import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object PlayerSettingsDecoderScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = AYMR.strings.pref_player_decoder @Composable override fun getPreferences(): List { val decoderPreferences = remember { Injekt.get() } val tryHw = decoderPreferences.tryHWDecoding() val useGpuNext = decoderPreferences.gpuNext() val debanding = decoderPreferences.videoDebanding() val yuv420p = decoderPreferences.useYUV420P() return listOf( Preference.PreferenceItem.SwitchPreference( preference = tryHw, title = stringResource(AYMR.strings.pref_try_hw), ), Preference.PreferenceItem.SwitchPreference( preference = useGpuNext, title = stringResource(AYMR.strings.pref_gpu_next_title), subtitle = stringResource(AYMR.strings.pref_gpu_next_subtitle), ), Preference.PreferenceItem.ListPreference( preference = debanding, entries = Debanding.entries.associateWith { it.name // stringResource(it.) }.toImmutableMap(), title = stringResource(AYMR.strings.pref_debanding_title), ), Preference.PreferenceItem.SwitchPreference( preference = yuv420p, title = stringResource(AYMR.strings.pref_use_yuv420p_title), subtitle = stringResource(AYMR.strings.pref_use_yuv420p_subtitle), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsGesturesScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.tachiyomi.ui.player.SingleActionGesture import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toPersistentMap import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.WheelTextPicker import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get object PlayerSettingsGesturesScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = AYMR.strings.pref_player_gestures @Composable override fun getPreferences(): List { val gesturePreferences = remember { Injekt.get() } return listOf( getSlidersGroup(gesturePreferences = gesturePreferences), getSeekingGroup(gesturePreferences = gesturePreferences), getDoubleTapGroup(gesturePreferences = gesturePreferences), getMediaControlsGroup(gesturePreferences = gesturePreferences), ) } @Composable private fun getSlidersGroup(gesturePreferences: GesturePreferences): Preference.PreferenceGroup { val enableVolumeBrightnessGestures = gesturePreferences.gestureVolumeBrightness() val swapVol = gesturePreferences.swapVolumeBrightness() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_player_sliders), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = enableVolumeBrightnessGestures, title = stringResource(AYMR.strings.enable_volume_brightness_gestures), ), Preference.PreferenceItem.SwitchPreference( preference = swapVol, title = stringResource(AYMR.strings.pref_controls_swap_vol_brightness), ), ), ) } @Composable private fun getSeekingGroup(gesturePreferences: GesturePreferences): Preference.PreferenceGroup { val scope = rememberCoroutineScope() val enableHorizontalSeekGesture = gesturePreferences.gestureHorizontalSeek() val showSeekbar = gesturePreferences.showSeekBar() val defaultSkipIntroLength by gesturePreferences.defaultIntroLength().stateIn(scope).collectAsState() val skipLengthPreference = gesturePreferences.skipLengthPreference() val playerSmoothSeek = gesturePreferences.playerSmoothSeek() var showDialog by rememberSaveable { mutableStateOf(false) } if (showDialog) { SkipIntroLengthDialog( initialSkipIntroLength = defaultSkipIntroLength, onDismissRequest = { showDialog = false }, onValueChanged = { skipIntroLength -> gesturePreferences.defaultIntroLength().set(skipIntroLength) showDialog = false }, ) } return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_player_seeking), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = enableHorizontalSeekGesture, title = stringResource(AYMR.strings.enable_horizontal_seek_gesture), subtitle = stringResource(AYMR.strings.enable_horizontal_seek_gesture_summary), ), Preference.PreferenceItem.SwitchPreference( preference = showSeekbar, title = stringResource(AYMR.strings.pref_show_seekbar), ), Preference.PreferenceItem.TextPreference( title = stringResource(AYMR.strings.pref_default_intro_length), subtitle = "${defaultSkipIntroLength}s", onClick = { showDialog = true }, ), Preference.PreferenceItem.ListPreference( preference = skipLengthPreference, entries = persistentMapOf( 30 to stringResource(AYMR.strings.pref_skip_30), 20 to stringResource(AYMR.strings.pref_skip_20), 10 to stringResource(AYMR.strings.pref_skip_10), 5 to stringResource(AYMR.strings.pref_skip_5), 3 to stringResource(AYMR.strings.pref_skip_3), 0 to stringResource(AYMR.strings.pref_skip_disable), ), title = stringResource(AYMR.strings.pref_skip_length), ), Preference.PreferenceItem.SwitchPreference( preference = playerSmoothSeek, title = stringResource(AYMR.strings.pref_player_smooth_seek), subtitle = stringResource(AYMR.strings.pref_player_smooth_seek_summary), ), ), ) } @Composable private fun getDoubleTapGroup(gesturePreferences: GesturePreferences): Preference.PreferenceGroup { val leftDoubleTap = gesturePreferences.leftDoubleTapGesture() val centerDoubleTap = gesturePreferences.centerDoubleTapGesture() val rightDoubleTap = gesturePreferences.rightDoubleTapGesture() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_double_tap), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = leftDoubleTap, entries = listOf( SingleActionGesture.None, SingleActionGesture.Seek, SingleActionGesture.PlayPause, SingleActionGesture.Switch, SingleActionGesture.Custom, ).associateWith { stringResource(it.stringRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_left_double_tap), ), Preference.PreferenceItem.ListPreference( preference = centerDoubleTap, entries = listOf( SingleActionGesture.None, SingleActionGesture.PlayPause, SingleActionGesture.Custom, ).associateWith { stringResource(it.stringRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_center_double_tap), ), Preference.PreferenceItem.ListPreference( preference = rightDoubleTap, entries = listOf( SingleActionGesture.None, SingleActionGesture.Seek, SingleActionGesture.PlayPause, SingleActionGesture.Switch, SingleActionGesture.Custom, ).associateWith { stringResource(it.stringRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_right_double_tap), ), Preference.PreferenceItem.InfoPreference( title = stringResource(AYMR.strings.pref_double_tap_info), ), ), ) } @Composable private fun getMediaControlsGroup(gesturePreferences: GesturePreferences): Preference.PreferenceGroup { val mediaPrevious = gesturePreferences.mediaPreviousGesture() val mediaPlayPause = gesturePreferences.mediaPlayPauseGesture() val mediaNext = gesturePreferences.mediaNextGesture() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_media_controls), preferenceItems = persistentListOf( Preference.PreferenceItem.ListPreference( preference = mediaPrevious, entries = listOf( SingleActionGesture.None, SingleActionGesture.Seek, SingleActionGesture.PlayPause, SingleActionGesture.Switch, SingleActionGesture.Custom, ).associateWith { stringResource(it.stringRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_media_previous), ), Preference.PreferenceItem.ListPreference( preference = mediaPlayPause, entries = listOf( SingleActionGesture.None, SingleActionGesture.PlayPause, SingleActionGesture.Custom, ).associateWith { stringResource(it.stringRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_media_playpause), ), Preference.PreferenceItem.ListPreference( preference = mediaNext, entries = listOf( SingleActionGesture.None, SingleActionGesture.Seek, SingleActionGesture.PlayPause, SingleActionGesture.Switch, SingleActionGesture.Custom, ).associateWith { stringResource(it.stringRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_media_next), ), Preference.PreferenceItem.InfoPreference( title = stringResource(AYMR.strings.pref_media_info), ), ), ) } @Composable fun SkipIntroLengthDialog( initialSkipIntroLength: Int, onDismissRequest: () -> Unit, onValueChanged: (skipIntroLength: Int) -> Unit, ) { val skipIntroLengthValue by rememberSaveable { mutableStateOf(initialSkipIntroLength) } var newLength = 0 AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(AYMR.strings.pref_intro_length)) }, text = { Box( modifier = Modifier.fillMaxWidth(), content = { WheelTextPicker( modifier = Modifier.align(Alignment.Center), items = remember { 0..255 }.map { stringResource( MR.strings.seconds_short, it, ) }.toImmutableList(), onSelectionChanged = { newLength = it }, startIndex = skipIntroLengthValue, ) }, ) }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton(onClick = { onValueChanged(newLength) }) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsMainScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Audiotrack import androidx.compose.material.icons.outlined.Code import androidx.compose.material.icons.outlined.EditNote import androidx.compose.material.icons.outlined.Gesture import androidx.compose.material.icons.outlined.Memory import androidx.compose.material.icons.outlined.PlayCircleOutline import androidx.compose.material.icons.outlined.Search import androidx.compose.material.icons.outlined.Subtitles import androidx.compose.material.icons.outlined.Terminal import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import androidx.core.graphics.ColorUtils import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.more.settings.screen.SettingsSearchScreen import eu.kanade.presentation.more.settings.screen.player.custombutton.PlayerSettingsCustomButtonScreen import eu.kanade.presentation.more.settings.screen.player.editor.PlayerSettingsEditorScreen import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget import eu.kanade.presentation.util.LocalBackPress import eu.kanade.presentation.util.Screen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import cafe.adriel.voyager.core.screen.Screen as VoyagerScreen class PlayerSettingsMainScreen(private val mainSettings: Boolean) : Screen() { @Composable override fun Content() { Content(twoPane = false) } @Composable private fun getPalerSurface(): Color { val surface = MaterialTheme.colorScheme.surface val dark = isSystemInDarkTheme() return remember(surface, dark) { val arr = FloatArray(3) ColorUtils.colorToHSL(surface.toArgb(), arr) arr[2] = if (dark) { arr[2] - 0.05f } else { arr[2] + 0.02f }.coerceIn(0f, 1f) Color.hsl(arr[0], arr[1], arr[2]) } } @Composable fun Content(twoPane: Boolean) { val navigator = LocalNavigator.currentOrThrow val backPress = LocalBackPress.currentOrThrow val containerColor = if (twoPane) getPalerSurface() else MaterialTheme.colorScheme.surface val topBarState = rememberTopAppBarState() Scaffold( topBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(topBarState), topBar = { scrollBehavior -> AppBar( title = stringResource( if (mainSettings) { AYMR.strings.label_player } else { AYMR.strings.label_player_settings }, ), navigateUp = backPress::invoke, actions = { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_search), icon = Icons.Outlined.Search, onClick = { navigator.navigate(SettingsSearchScreen(true), twoPane) }, ), ), ) }, scrollBehavior = scrollBehavior, ) }, containerColor = containerColor, content = { contentPadding -> val state = rememberLazyListState() val indexSelected = if (twoPane) { items.indexOfFirst { it.screen::class == navigator.items.first()::class } .also { LaunchedEffect(Unit) { state.animateScrollToItem(it) if (it > 0) { // Lift scroll topBarState.contentOffset = topBarState.heightOffsetLimit } } } } else { null } LazyColumn( state = state, contentPadding = contentPadding, ) { itemsIndexed( items = items, key = { _, item -> item.hashCode() }, ) { index, item -> val selected = indexSelected == index var modifier: Modifier = Modifier var contentColor = LocalContentColor.current if (twoPane) { modifier = Modifier .padding(horizontal = 8.dp) .clip(RoundedCornerShape(24.dp)) .then( if (selected) { Modifier.background( MaterialTheme.colorScheme.surfaceVariant, ) } else { Modifier }, ) if (selected) { contentColor = MaterialTheme.colorScheme.onSurfaceVariant } } CompositionLocalProvider(LocalContentColor provides contentColor) { TextPreferenceWidget( modifier = modifier, title = stringResource(item.titleRes), subtitle = item.formatSubtitle(), icon = item.icon, onPreferenceClick = { navigator.navigate(item.screen, twoPane) }, ) } } } }, ) } private fun Navigator.navigate(screen: VoyagerScreen, twoPane: Boolean) { if (twoPane) replaceAll(screen) else push(screen) } private data class Item( val titleRes: StringResource, val subtitleRes: StringResource? = null, val formatSubtitle: @Composable () -> String? = { subtitleRes?.let { stringResource(it) } }, val icon: ImageVector, val screen: VoyagerScreen, ) private val items = listOf( Item( titleRes = AYMR.strings.pref_player_internal, subtitleRes = AYMR.strings.pref_player_internal_summary, icon = Icons.Outlined.PlayCircleOutline, screen = PlayerSettingsPlayerScreen, ), Item( titleRes = AYMR.strings.pref_player_gestures, subtitleRes = AYMR.strings.pref_player_gestures_summary, icon = Icons.Outlined.Gesture, screen = PlayerSettingsGesturesScreen, ), Item( titleRes = AYMR.strings.pref_player_decoder, subtitleRes = AYMR.strings.pref_player_decoder_summary, icon = Icons.Outlined.Memory, screen = PlayerSettingsDecoderScreen, ), Item( titleRes = AYMR.strings.pref_player_subtitle, subtitleRes = AYMR.strings.pref_player_subtitle_summary, icon = Icons.Outlined.Subtitles, screen = PlayerSettingsSubtitleScreen, ), Item( titleRes = AYMR.strings.pref_player_audio, subtitleRes = AYMR.strings.pref_player_audio_summary, icon = Icons.Outlined.Audiotrack, screen = PlayerSettingsAudioScreen, ), Item( titleRes = AYMR.strings.pref_player_custom_button, subtitleRes = AYMR.strings.pref_player_custom_button_summary, icon = Icons.Outlined.Terminal, screen = PlayerSettingsCustomButtonScreen, ), Item( titleRes = AYMR.strings.pref_player_editor, subtitleRes = AYMR.strings.pref_player_editor_summary, icon = Icons.Outlined.EditNote, screen = PlayerSettingsEditorScreen, ), Item( titleRes = AYMR.strings.pref_player_advanced, subtitleRes = AYMR.strings.pref_player_advanced_summary, icon = Icons.Outlined.Code, screen = PlayerSettingsAdvancedScreen, ), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsPlayerScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import android.os.Build import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import eu.kanade.domain.base.BasePreferences import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.tachiyomi.ui.player.JUST_PLAYER import eu.kanade.tachiyomi.ui.player.MPV_KT import eu.kanade.tachiyomi.ui.player.MPV_KT_PREVIEW import eu.kanade.tachiyomi.ui.player.MPV_PLAYER import eu.kanade.tachiyomi.ui.player.MPV_REMOTE import eu.kanade.tachiyomi.ui.player.MX_PLAYER import eu.kanade.tachiyomi.ui.player.MX_PLAYER_FREE import eu.kanade.tachiyomi.ui.player.MX_PLAYER_PRO import eu.kanade.tachiyomi.ui.player.NEXT_PLAYER import eu.kanade.tachiyomi.ui.player.PlayerOrientation import eu.kanade.tachiyomi.ui.player.VLC_PLAYER import eu.kanade.tachiyomi.ui.player.WEB_VIDEO_CASTER import eu.kanade.tachiyomi.ui.player.X_PLAYER import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toPersistentMap import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.NumberFormat object PlayerSettingsPlayerScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = AYMR.strings.pref_player_internal @Composable override fun getPreferences(): List { val playerPreferences = remember { Injekt.get() } val basePreferences = remember { Injekt.get() } val deviceSupportsPip = basePreferences.deviceHasPip() return listOfNotNull( Preference.PreferenceItem.ListPreference( preference = playerPreferences.progressPreference(), entries = persistentMapOf( 1.00F to stringResource(AYMR.strings.pref_progress_100), 0.95F to stringResource(AYMR.strings.pref_progress_95), 0.90F to stringResource(AYMR.strings.pref_progress_90), 0.85F to stringResource(AYMR.strings.pref_progress_85), 0.80F to stringResource(AYMR.strings.pref_progress_80), 0.75F to stringResource(AYMR.strings.pref_progress_75), 0.70F to stringResource(AYMR.strings.pref_progress_70), ), title = stringResource(AYMR.strings.pref_progress_mark_as_seen), ), Preference.PreferenceItem.SwitchPreference( preference = playerPreferences.preserveWatchingPosition(), title = stringResource(AYMR.strings.pref_preserve_watching_position), ), Preference.PreferenceItem.ListPreference( preference = playerPreferences.defaultPlayerOrientationType(), entries = PlayerOrientation.entries.associateWith { stringResource(it.titleRes) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_category_player_orientation), ), getControlsGroup(playerPreferences = playerPreferences), getHosterGroup(playerPreferences = playerPreferences), getDisplayGroup(playerPreferences = playerPreferences), getIntroSkipGroup(playerPreferences = playerPreferences), if (deviceSupportsPip) getPipGroup(playerPreferences = playerPreferences) else null, getExternalPlayerGroup( playerPreferences = playerPreferences, basePreferences = basePreferences, ), ) } @Composable private fun getControlsGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup { val allowGestures = playerPreferences.allowGestures() val showLoading = playerPreferences.showLoadingCircle() val showChapter = playerPreferences.showCurrentChapter() val rememberPlayerBrightness = playerPreferences.rememberPlayerBrightness() val rememberPlayerVolume = playerPreferences.rememberPlayerVolume() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_controls), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = allowGestures, title = stringResource(AYMR.strings.pref_controls_allow_gestures_in_panels), ), Preference.PreferenceItem.SwitchPreference( preference = showLoading, title = stringResource(AYMR.strings.pref_controls_show_loading), ), Preference.PreferenceItem.SwitchPreference( preference = showChapter, title = stringResource(AYMR.strings.pref_controls_show_chapter_indicator), subtitle = stringResource(AYMR.strings.pref_controls_show_chapter_indicator_info), ), Preference.PreferenceItem.SwitchPreference( preference = rememberPlayerBrightness, title = stringResource(AYMR.strings.pref_remember_brightness), ), Preference.PreferenceItem.SwitchPreference( preference = rememberPlayerVolume, title = stringResource(AYMR.strings.pref_remember_volume), ), ), ) } @Composable private fun getHosterGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup { val showFailure = playerPreferences.showFailedHosters() val showEmpty = playerPreferences.showEmptyHosters() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_hosters), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = showFailure, title = stringResource(AYMR.strings.pref_hosters_show_failure), ), Preference.PreferenceItem.SwitchPreference( preference = showEmpty, title = stringResource(AYMR.strings.pref_hosters_show_empty), ), ), ) } @Composable private fun getDisplayGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup { val fullScreen = playerPreferences.playerFullscreen() val hideControls = playerPreferences.hideControls() val displayVol = playerPreferences.displayVolPer() val showSystemBar = playerPreferences.showSystemStatusBar() val reduceMotion = playerPreferences.reduceMotion() val hideTime = playerPreferences.playerTimeToDisappear() val panelOpacityPref = playerPreferences.panelOpacity() val panelOpacity by panelOpacityPref.collectAsState() val numberFormat = remember { NumberFormat.getPercentInstance() } return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_category_display), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = fullScreen, title = stringResource(AYMR.strings.pref_player_fullscreen), enabled = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P, ), Preference.PreferenceItem.SwitchPreference( preference = hideControls, title = stringResource(AYMR.strings.pref_player_hide_controls), ), Preference.PreferenceItem.SwitchPreference( preference = displayVol, title = stringResource(AYMR.strings.pref_controls_display_volume_percentage), ), Preference.PreferenceItem.SwitchPreference( preference = showSystemBar, title = stringResource(AYMR.strings.pref_show_system_bar), ), Preference.PreferenceItem.SwitchPreference( preference = reduceMotion, title = stringResource(AYMR.strings.pref_reduce_motion), ), Preference.PreferenceItem.ListPreference( preference = hideTime, entries = listOf(500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000).associateWith { stringResource(AYMR.strings.pref_player_time_to_disappear_summary, it) }.toPersistentMap(), title = stringResource(AYMR.strings.pref_player_time_to_disappear), ), Preference.PreferenceItem.SliderPreference( value = panelOpacity, valueRange = 0..100, title = stringResource(AYMR.strings.pref_panel_opacity), subtitle = numberFormat.format(panelOpacity / 100f), onValueChanged = { panelOpacityPref.set(it) true }, ), ), ) } @Composable private fun getIntroSkipGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup { val enableSkipIntro = playerPreferences.enableSkipIntro() val isIntroSkipEnabled by enableSkipIntro.collectAsState() val enableAutoAniSkip = playerPreferences.autoSkipIntro() val enableNetflixAniSkip = playerPreferences.enableNetflixStyleIntroSkip() val waitingTimeAniSkip = playerPreferences.waitingTimeIntroSkip() // AniSkip val enableAniSkip = playerPreferences.aniSkipEnabled() val disableAniSkipChapters = playerPreferences.disableAniSkipOnChapters() val isAniSkipEnabled by enableAniSkip.collectAsState() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_intro_skip), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = enableSkipIntro, title = stringResource(AYMR.strings.pref_enable_intro_skip), ), Preference.PreferenceItem.SwitchPreference( preference = enableAutoAniSkip, title = stringResource(AYMR.strings.pref_enable_auto_skip_ani_skip), enabled = isIntroSkipEnabled, ), Preference.PreferenceItem.SwitchPreference( preference = enableNetflixAniSkip, title = stringResource(AYMR.strings.pref_enable_netflix_style_aniskip), enabled = isIntroSkipEnabled, ), Preference.PreferenceItem.ListPreference( preference = waitingTimeAniSkip, entries = persistentMapOf( 5 to stringResource(AYMR.strings.pref_waiting_time_aniskip_5), 6 to stringResource(AYMR.strings.pref_waiting_time_aniskip_6), 7 to stringResource(AYMR.strings.pref_waiting_time_aniskip_7), 8 to stringResource(AYMR.strings.pref_waiting_time_aniskip_8), 9 to stringResource(AYMR.strings.pref_waiting_time_aniskip_9), 10 to stringResource(AYMR.strings.pref_waiting_time_aniskip_10), ), title = stringResource(AYMR.strings.pref_waiting_time_aniskip), enabled = isIntroSkipEnabled, ), Preference.PreferenceItem.SwitchPreference( preference = enableAniSkip, title = stringResource(AYMR.strings.pref_enable_aniskip), enabled = isIntroSkipEnabled, ), Preference.PreferenceItem.SwitchPreference( preference = disableAniSkipChapters, title = stringResource(AYMR.strings.pref_disable_aniskip_chapter), enabled = isIntroSkipEnabled && isAniSkipEnabled, ), Preference.PreferenceItem.InfoPreference( title = stringResource(AYMR.strings.pref_category_player_aniskip_info), enabled = isIntroSkipEnabled, ), ), ) } @Composable private fun getPipGroup(playerPreferences: PlayerPreferences): Preference.PreferenceGroup { val enablePip = playerPreferences.enablePip() val pipEpisodeToasts = playerPreferences.pipEpisodeToasts() val pipOnExit = playerPreferences.pipOnExit() val pipReplaceWithPrevious = playerPreferences.pipReplaceWithPrevious() val isPipEnabled by enablePip.collectAsState() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_pip), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = enablePip, title = stringResource(AYMR.strings.pref_enable_pip), ), Preference.PreferenceItem.SwitchPreference( preference = pipEpisodeToasts, title = stringResource(AYMR.strings.pref_pip_episode_toasts), enabled = isPipEnabled, ), Preference.PreferenceItem.SwitchPreference( preference = pipOnExit, title = stringResource(AYMR.strings.pref_pip_on_exit), enabled = isPipEnabled, ), Preference.PreferenceItem.SwitchPreference( preference = pipReplaceWithPrevious, title = stringResource(AYMR.strings.pref_pip_replace_with_previous), enabled = isPipEnabled, ), ), ) } @Composable private fun getExternalPlayerGroup( playerPreferences: PlayerPreferences, basePreferences: BasePreferences, ): Preference.PreferenceGroup { val alwaysUseExternalPlayer = playerPreferences.alwaysUseExternalPlayer() val externalPlayerPreference = playerPreferences.externalPlayerPreference() val pm = basePreferences.context.packageManager val installedPackages = pm.getInstalledPackages(0) val supportedPlayers = installedPackages.filter { it.packageName in externalPlayers } val packageNames = supportedPlayers.map { it.packageName } val packageNamesReadable = supportedPlayers .map { pm.getApplicationLabel(it.applicationInfo!!).toString() } val packageNamesMap: Map = packageNames.zip(packageNamesReadable) .toMap() return Preference.PreferenceGroup( title = stringResource(AYMR.strings.pref_category_external_player), preferenceItems = persistentListOf( Preference.PreferenceItem.SwitchPreference( preference = alwaysUseExternalPlayer, title = stringResource(AYMR.strings.pref_always_use_external_player), ), Preference.PreferenceItem.ListPreference( preference = externalPlayerPreference, entries = (mapOf("" to "None") + packageNamesMap).toPersistentMap(), title = stringResource(AYMR.strings.pref_external_player_preference), ), ), ) } } val externalPlayers = listOf( MPV_PLAYER, MX_PLAYER, MX_PLAYER_FREE, MX_PLAYER_PRO, VLC_PLAYER, MPV_KT, MPV_KT_PREVIEW, MPV_REMOTE, JUST_PLAYER, NEXT_PLAYER, X_PLAYER, WEB_VIDEO_CASTER, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsSubtitleScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.remember import eu.kanade.presentation.more.settings.Preference import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Locale import java.util.MissingResourceException object PlayerSettingsSubtitleScreen : SearchableSettings { @ReadOnlyComposable @Composable override fun getTitleRes() = AYMR.strings.pref_player_subtitle @Composable override fun getPreferences(): List { val subtitlePreferences = remember { Injekt.get() } val langPref = subtitlePreferences.preferredSubLanguages() val whitelist = subtitlePreferences.subtitleWhitelist() val blacklist = subtitlePreferences.subtitleBlacklist() return listOf( Preference.PreferenceItem.EditTextInfoPreference( preference = langPref, dialogSubtitle = stringResource(AYMR.strings.pref_player_subtitle_lang_info), title = stringResource(AYMR.strings.pref_player_subtitle_lang), validate = { pref -> val langs = pref.split(",").filter(String::isNotEmpty).map(String::trim) langs.forEach { try { val locale = Locale(it) if (locale.isO3Language == locale.language && locale.language == locale.getDisplayName(Locale.ENGLISH) ) { throw MissingResourceException("", "", "") } } catch (_: MissingResourceException) { return@EditTextInfoPreference false } } true }, errorMessage = { pref -> val langs = pref.split(",").filter(String::isNotEmpty).map(String::trim) langs.forEach { try { val locale = Locale(it) if (locale.isO3Language == locale.language && locale.language == locale.getDisplayName(Locale.ENGLISH) ) { throw MissingResourceException("", "", "") } } catch (_: MissingResourceException) { return@EditTextInfoPreference stringResource( AYMR.strings.pref_player_subtitle_invalid_lang, it, ) } } "" }, ), Preference.PreferenceItem.EditTextInfoPreference( preference = whitelist, dialogSubtitle = stringResource(AYMR.strings.pref_player_subtitle_whitelist_info), title = stringResource(AYMR.strings.pref_player_subtitle_whitelist), ), Preference.PreferenceItem.EditTextInfoPreference( preference = blacklist, dialogSubtitle = stringResource(AYMR.strings.pref_player_subtitle_blacklist_info), title = stringResource(AYMR.strings.pref_player_subtitle_blacklist), ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/custombutton/PlayerSettingsCustomButtonScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.custombutton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.more.settings.screen.player.custombutton.components.CustomButtonCreateDialog import eu.kanade.presentation.more.settings.screen.player.custombutton.components.CustomButtonDeleteDialog import eu.kanade.presentation.more.settings.screen.player.custombutton.components.CustomButtonEditDialog import eu.kanade.presentation.more.settings.screen.player.custombutton.components.CustomButtonScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.collectLatest import tachiyomi.domain.custombuttons.model.CustomButtonUpdate import tachiyomi.presentation.core.screens.LoadingScreen object PlayerSettingsCustomButtonScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val uriHandler = LocalUriHandler.current val screenModel = rememberScreenModel { PlayerSettingsCustomButtonScreenModel() } val state by screenModel.state.collectAsState() if (state is CustomButtonScreenState.Loading) { LoadingScreen() return } val successState = state as CustomButtonScreenState.Success CustomButtonScreen( state = successState, onClickFAQ = { uriHandler.openUri("https://aniyomi.org/docs/guides/player-settings/custom-buttons") }, onClickCreate = { screenModel.showDialog(CustomButtonDialog.Create) }, onClickPrimary = { screenModel.togglePrimaryButton(it) }, onClickEdit = { screenModel.showDialog(CustomButtonDialog.Edit(it)) }, onClickDelete = { screenModel.showDialog(CustomButtonDialog.Delete(it)) }, onChangeOrder = screenModel::changeOrder, navigateUp = navigator::pop, ) when (val dialog = successState.dialog) { null -> {} CustomButtonDialog.Create -> { CustomButtonCreateDialog( onDismissRequest = screenModel::dismissDialog, onCreate = screenModel::createCustomButton, buttonNames = successState.customButtons.fastMap { it.name }.toImmutableList(), ) } is CustomButtonDialog.Delete -> { CustomButtonDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteCustomButton(dialog.customButton) }, buttonTitle = dialog.customButton.name, ) } is CustomButtonDialog.Edit -> { CustomButtonEditDialog( onDismissRequest = screenModel::dismissDialog, onEdit = { title, content, longPressContent, onStartup -> screenModel.editCustomButton( CustomButtonUpdate( id = dialog.customButton.id, name = title, sortIndex = dialog.customButton.sortIndex, content = content, longPressContent = longPressContent, onStartup = onStartup, ), ) }, buttonNames = (successState.customButtons - dialog.customButton).fastMap { it.name }.toImmutableList(), initialState = dialog.customButton, ) } } LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> if (event is CustomButtonEvent.LocalizedMessage) { context.toast(event.stringRes) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/custombutton/PlayerSettingsCustomButtonScreenModel.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.custombutton import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.custombuttons.interactor.CreateCustomButton import tachiyomi.domain.custombuttons.interactor.DeleteCustomButton import tachiyomi.domain.custombuttons.interactor.GetCustomButtons import tachiyomi.domain.custombuttons.interactor.ReorderCustomButton import tachiyomi.domain.custombuttons.interactor.ToggleFavoriteCustomButton import tachiyomi.domain.custombuttons.interactor.UpdateCustomButton import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.domain.custombuttons.model.CustomButtonUpdate import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class PlayerSettingsCustomButtonScreenModel( private val getCustomButtons: GetCustomButtons = Injekt.get(), private val createCustomButton: CreateCustomButton = Injekt.get(), private val deleteCustomButton: DeleteCustomButton = Injekt.get(), private val updateCustomButton: UpdateCustomButton = Injekt.get(), private val reorderCustomButton: ReorderCustomButton = Injekt.get(), private val toggleFavoriteCustomButton: ToggleFavoriteCustomButton = Injekt.get(), ) : StateScreenModel(CustomButtonScreenState.Loading) { private val _events: Channel = Channel() val events = _events.receiveAsFlow() init { screenModelScope.launch { getCustomButtons.subscribeAll() .collectLatest { customButtons -> mutableState.update { CustomButtonScreenState.Success( customButtons = customButtons.toImmutableList(), ) } } } } fun createCustomButton(name: String, content: String, longPressContent: String, onStartup: String) { screenModelScope.launch { when (createCustomButton.await(name, content, longPressContent, onStartup)) { is CreateCustomButton.Result.InternalError -> _events.send( CustomButtonEvent.InternalError, ) else -> {} } } } fun togglePrimaryButton(customButton: CustomButton) { screenModelScope.launch { when (toggleFavoriteCustomButton.await(customButton)) { is ToggleFavoriteCustomButton.Result.InternalError -> _events.send( CustomButtonEvent.InternalError, ) else -> {} } } } fun editCustomButton(customButtonUpdate: CustomButtonUpdate) { screenModelScope.launch { when (updateCustomButton.await(customButtonUpdate)) { is UpdateCustomButton.Result.InternalError -> _events.send( CustomButtonEvent.InternalError, ) else -> {} } } } fun deleteCustomButton(customButton: CustomButton) { screenModelScope.launch { when (deleteCustomButton.await(customButton.id)) { is DeleteCustomButton.Result.InternalError -> _events.send( CustomButtonEvent.InternalError, ) else -> {} } } } fun changeOrder(customButton: CustomButton, newIndex: Int) { screenModelScope.launch { when (reorderCustomButton.changeOrder(customButton, newIndex)) { is ReorderCustomButton.Result.InternalError -> _events.send( CustomButtonEvent.InternalError, ) else -> {} } } } fun showDialog(dialog: CustomButtonDialog) { mutableState.update { when (it) { CustomButtonScreenState.Loading -> it is CustomButtonScreenState.Success -> it.copy(dialog = dialog) } } } fun dismissDialog() { mutableState.update { when (it) { CustomButtonScreenState.Loading -> it is CustomButtonScreenState.Success -> it.copy(dialog = null) } } } } sealed interface CustomButtonDialog { data object Create : CustomButtonDialog data class Edit(val customButton: CustomButton) : CustomButtonDialog data class Delete(val customButton: CustomButton) : CustomButtonDialog } sealed interface CustomButtonEvent { sealed class LocalizedMessage(val stringRes: StringResource) : CustomButtonEvent data object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed interface CustomButtonScreenState { @Immutable data object Loading : CustomButtonScreenState @Immutable data class Success( val customButtons: ImmutableList, val dialog: CustomButtonDialog? = null, ) : CustomButtonScreenState { val isEmpty: Boolean get() = customButtons.isEmpty() } } sealed interface CustomButtonFetchState { @Immutable data object Loading : CustomButtonFetchState @Immutable data class Success(val customButtons: ImmutableList) : CustomButtonFetchState @Immutable data class Error(val errorMessage: String) : CustomButtonFetchState } fun CustomButtonFetchState.getButtons(): ImmutableList { return when (this) { is CustomButtonFetchState.Success -> this.customButtons else -> emptyList().toImmutableList() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/custombutton/components/CustomButtonDialogs.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.custombutton.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.text.input.TextFieldValue import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.more.settings.screen.player.editor.codeeditor.githubTheme import eu.kanade.presentation.more.settings.screen.player.editor.codeeditor.luaHighlight import eu.kanade.presentation.more.settings.screen.player.editor.codeeditor.toAnnotatedString import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.delay import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import kotlin.time.Duration.Companion.seconds @Composable fun CustomButtonButtonDialog( onDismissRequest: () -> Unit, onAction: (String, String, String, String) -> Unit, titleRes: StringResource, actionRes: StringResource, buttonNames: ImmutableList, initialState: CustomButton?, ) { var title by remember { mutableStateOf(initialState?.name ?: "") } val luaHighlight = remember { luaHighlight(githubTheme) } var content by remember { mutableStateOf( TextFieldValue( annotatedString = luaHighlight.toAnnotatedString(initialState?.content ?: ""), composition = null, ), ) } var longPressContent by remember { mutableStateOf( TextFieldValue( annotatedString = luaHighlight.toAnnotatedString(initialState?.longPressContent ?: ""), composition = null, ), ) } var startUp by remember { mutableStateOf( TextFieldValue( annotatedString = luaHighlight.toAnnotatedString(initialState?.onStartup ?: ""), composition = null, ), ) } val focusRequester = remember { FocusRequester() } val titleAlreadyExists = remember(title) { buttonNames.contains(title) } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( enabled = title.isNotEmpty() && content.text.isNotEmpty() && !titleAlreadyExists, onClick = { onAction(title, content.text, longPressContent.text, startUp.text) onDismissRequest() }, ) { Text(text = stringResource(actionRes)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Row { Text(text = stringResource(titleRes)) initialState?.id?.let { buttonId -> Spacer(Modifier.weight(1f)) Text( text = stringResource(AYMR.strings.pref_player_custom_button_id, buttonId), style = MaterialTheme.typography.bodyLarge, modifier = Modifier.alpha(alpha = DISABLED_ALPHA), ) } } }, text = { Column( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), modifier = Modifier.verticalScroll(rememberScrollState()), ) { OutlinedTextField( modifier = Modifier .focusRequester(focusRequester), value = title, onValueChange = { title = it }, label = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_title)) }, supportingText = { val msgRes = if (title.isNotEmpty() && titleAlreadyExists) { AYMR.strings.pref_player_custom_button_error_exists } else { MR.strings.information_required_plain } Text(text = stringResource(msgRes)) }, isError = title.isNotEmpty() && titleAlreadyExists, singleLine = true, ) OutlinedTextField( value = content, onValueChange = { content = it.copy(luaHighlight.toAnnotatedString(it.text)) }, label = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_content)) }, supportingText = { Text(text = stringResource(MR.strings.information_required_plain)) }, minLines = 3, maxLines = 5, ) OutlinedTextField( value = longPressContent, onValueChange = { longPressContent = it.copy(luaHighlight.toAnnotatedString(it.text)) }, label = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_content_long)) }, supportingText = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_optional)) }, minLines = 3, maxLines = 5, ) OutlinedTextField( value = startUp, onValueChange = { startUp = it.copy(luaHighlight.toAnnotatedString(it.text)) }, label = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_startup)) }, supportingText = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_optional)) }, minLines = 2, maxLines = 4, ) } }, ) LaunchedEffect(focusRequester) { // TODO: https://issuetracker.google.com/issues/204502668 delay(0.1.seconds) focusRequester.requestFocus() } } @Composable fun CustomButtonCreateDialog( onDismissRequest: () -> Unit, onCreate: (String, String, String, String) -> Unit, buttonNames: ImmutableList, ) { CustomButtonButtonDialog( onDismissRequest = onDismissRequest, onAction = onCreate, titleRes = AYMR.strings.pref_player_custom_button_add, actionRes = MR.strings.action_add, buttonNames = buttonNames, initialState = null, ) } @Composable fun CustomButtonEditDialog( onDismissRequest: () -> Unit, onEdit: (String, String, String, String) -> Unit, buttonNames: ImmutableList, initialState: CustomButton, ) { CustomButtonButtonDialog( onDismissRequest = onDismissRequest, onAction = onEdit, titleRes = AYMR.strings.pref_player_custom_button_edit, actionRes = MR.strings.action_edit, buttonNames = buttonNames, initialState = initialState, ) } @Composable fun CustomButtonDeleteDialog( onDismissRequest: () -> Unit, onDelete: () -> Unit, buttonTitle: String, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_delete)) }, text = { Text(text = stringResource(AYMR.strings.pref_player_custom_button_delete_confirm, buttonTitle)) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/custombutton/components/CustomButtonListItem.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.custombutton.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.DragHandle import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.Star import androidx.compose.material.icons.outlined.StarOutline import androidx.compose.material3.ElevatedCard import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import sh.calvin.reorderable.ReorderableCollectionItemScope import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ReorderableCollectionItemScope.CustomButtonListItem( customButton: CustomButton, isFavorite: Boolean, onTogglePrimary: () -> Unit, onEdit: () -> Unit, onDelete: () -> Unit, modifier: Modifier = Modifier, ) { ElevatedCard( modifier = modifier.clickable(onClick = onEdit), ) { Row( modifier = Modifier .fillMaxWidth() .padding(vertical = MaterialTheme.padding.small) .padding( start = MaterialTheme.padding.small, end = MaterialTheme.padding.medium, ), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Outlined.DragHandle, contentDescription = null, modifier = Modifier .padding(MaterialTheme.padding.medium) .draggableHandle(), ) Text( text = customButton.name, modifier = Modifier.weight(1f), ) val starColor = Color(0xFFFDD835) val starImage = if (isFavorite) Icons.Outlined.Star else Icons.Outlined.StarOutline IconButton(onClick = onTogglePrimary) { Icon( imageVector = starImage, tint = starColor, contentDescription = null, ) } IconButton(onClick = onEdit) { Icon( imageVector = Icons.Outlined.Edit, contentDescription = stringResource(MR.strings.action_edit), ) } IconButton(onClick = onDelete) { Icon( imageVector = Icons.Outlined.Delete, contentDescription = stringResource(MR.strings.action_delete), ) } } Text( text = customButton.content, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f), maxLines = 3, overflow = TextOverflow.Ellipsis, modifier = Modifier .padding( bottom = MaterialTheme.padding.medium, start = MaterialTheme.padding.medium, ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/custombutton/components/CustomButtonScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.custombutton.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Modifier import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.FloatingActionAddButton import eu.kanade.presentation.more.settings.screen.player.custombutton.CustomButtonScreenState import sh.calvin.reorderable.ReorderableItem import sh.calvin.reorderable.rememberReorderableLazyListState import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.components.material.topSmallPaddingValues import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.util.plus @Composable fun CustomButtonScreen( state: CustomButtonScreenState.Success, onClickFAQ: () -> Unit, onClickCreate: () -> Unit, onClickPrimary: (CustomButton) -> Unit, onClickEdit: (CustomButton) -> Unit, onClickDelete: (CustomButton) -> Unit, onChangeOrder: (CustomButton, Int) -> Unit, navigateUp: () -> Unit, ) { val lazyListState = rememberLazyListState() Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(AYMR.strings.pref_player_custom_button_header), navigateUp = navigateUp, actions = { IconButton(onClick = onClickFAQ) { Icon( imageVector = Icons.AutoMirrored.Outlined.HelpOutline, contentDescription = stringResource(AYMR.strings.pref_player_custom_button_guide), ) } }, scrollBehavior = scrollBehavior, ) }, floatingActionButton = { FloatingActionAddButton( lazyListState = lazyListState, onClick = onClickCreate, ) }, ) { paddingValues -> if (state.isEmpty) { EmptyScreen( stringRes = AYMR.strings.pref_player_custom_button_empty, modifier = Modifier.padding(paddingValues), ) return@Scaffold } CustomButtonContent( customButtons = state.customButtons, lazyListState = lazyListState, paddingValues = paddingValues, onClickPrimary = onClickPrimary, onClickEdit = onClickEdit, onClickDelete = onClickDelete, onChangeOrder = onChangeOrder, ) } } @Composable private fun CustomButtonContent( customButtons: List, lazyListState: LazyListState, paddingValues: PaddingValues, onClickPrimary: (CustomButton) -> Unit, onClickEdit: (CustomButton) -> Unit, onClickDelete: (CustomButton) -> Unit, onChangeOrder: (CustomButton, Int) -> Unit, ) { val customButtonsState = remember { customButtons.toMutableStateList() } val reorderableState = rememberReorderableLazyListState(lazyListState, paddingValues) { from, to -> val item = customButtonsState.removeAt(from.index) customButtonsState.add(to.index, item) onChangeOrder(item, to.index) } LaunchedEffect(customButtons) { if (!reorderableState.isAnyItemDragging) { customButtonsState.clear() customButtonsState.addAll(customButtons) } } LazyColumn( modifier = Modifier.fillMaxSize(), state = lazyListState, contentPadding = paddingValues + topSmallPaddingValues + PaddingValues(horizontal = MaterialTheme.padding.medium), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items( items = customButtonsState, key = { customButton -> customButton.key }, ) { customButton -> ReorderableItem(reorderableState, customButton.key) { CustomButtonListItem( modifier = Modifier.animateItem(), customButton = customButton, isFavorite = customButton.isFavorite, onTogglePrimary = { onClickPrimary(customButton) }, onEdit = { onClickEdit(customButton) }, onDelete = { onClickDelete(customButton) }, ) } } } } private val CustomButton.key inline get() = "custombutton-$id" ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/PlayerSettingsEditorScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.more.settings.screen.player.editor.codeeditor.CodeEditScreen import eu.kanade.presentation.more.settings.screen.player.editor.components.EditorScreen import eu.kanade.presentation.more.settings.screen.player.editor.components.FileCreateDialog import eu.kanade.presentation.more.settings.screen.player.editor.components.FileDeleteDialog import eu.kanade.presentation.util.Screen object PlayerSettingsEditorScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { PlayerSettingsEditorScreenModel(context) } val state by screenModel.state.collectAsState() val dialog by screenModel.dialogShown.collectAsState() val selectedType by screenModel.selectedType.collectAsState() when (dialog) { null -> {} EditorFileDialog.Create -> { FileCreateDialog( initialName = null, fileExtension = selectedType.fileExtension, onDismissRequest = screenModel::dismissDialog, isValid = screenModel::isValidName, onConfirm = screenModel::createFile, ) } is EditorFileDialog.Edit -> { val name = (dialog as EditorFileDialog.Edit).item.name FileCreateDialog( initialName = name, fileExtension = selectedType.fileExtension, onDismissRequest = screenModel::dismissDialog, isValid = screenModel::isValidName, onConfirm = { screenModel.editFile(name, it) }, ) } is EditorFileDialog.Delete -> { val name = (dialog as EditorFileDialog.Delete).item.name FileDeleteDialog( name = name, onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteFile(name) }, ) } } EditorScreen( state = state, selectedType = selectedType, onSelectType = screenModel::onSelectType, onClickItem = { screenModel.getFilePath(it.name).let { filePath -> navigator.push(CodeEditScreen(filePath)) } }, onRenameItem = { screenModel.showDialog(EditorFileDialog.Edit(it)) }, onDeleteItem = { screenModel.showDialog(EditorFileDialog.Delete(it)) }, onClickAdd = { screenModel.showDialog(EditorFileDialog.Create) }, navigateUp = navigator::pop, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/PlayerSettingsEditorScreenModel.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor import android.content.Context import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.util.size import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.toSize import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.update import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.storage.service.SCRIPTS_PATH import tachiyomi.domain.storage.service.SCRIPT_OPTS_PATH import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.text.SimpleDateFormat import java.util.Date import java.util.Locale class PlayerSettingsEditorScreenModel( private val context: Context, private val storageManager: StorageManager = Injekt.get(), ) : StateScreenModel(EditorScreenState.Loading) { private val _selectedType = MutableStateFlow(EditorListType.SCRIPTS) val selectedType = _selectedType.asStateFlow() private val _dialogShown = MutableStateFlow(null) val dialogShown = _dialogShown.asStateFlow() init { screenModelScope.launchIO { _selectedType.collectLatest { type -> updateItems(type) } } } private fun updateItems(type: EditorListType) { mutableState.update { EditorScreenState.Success( editorListItems = getEditorListItems(type), ) } } fun createFile(fileName: String) { storageManager.getMPVConfigDirectory() ?.createDirectory(selectedType.value.directoryName) ?.createFile(fileName) ?: run { context.toast(context.stringResource(AYMR.strings.editor_create_error)) return } updateItems(selectedType.value) } fun editFile(originalFile: String, fileName: String) { val file = storageManager.getMPVConfigDirectory() ?.createDirectory(selectedType.value.directoryName) ?.createFile(originalFile) if (file?.renameTo(fileName) == true) { updateItems(selectedType.value) } else { context.toast(context.stringResource(AYMR.strings.editor_rename_error)) } } fun deleteFile(name: String) { val file = storageManager.getMPVConfigDirectory() ?.createDirectory(selectedType.value.directoryName) ?.findFile(name) if (file?.delete() == true) { updateItems(selectedType.value) } else { context.toast(context.stringResource(AYMR.strings.editor_delete_error)) } } fun isValidName(name: String, initialName: String? = null): FileCreationResult { val names = (mutableState.value as? EditorScreenState.Success) ?.editorListItems ?.map { it.name } ?.filterNot { it == initialName } .orEmpty() if (names.any { it.equals(name, true) }) { return FileCreationResult.Failure(AYMR.strings.editor_file_already_exists) } if (name != DiskUtil.buildValidFilename(name)) { return FileCreationResult.Failure(AYMR.strings.editor_invalid_filename) } return FileCreationResult.Success } fun showDialog(dialog: EditorFileDialog) { _dialogShown.update { _ -> dialog } } fun dismissDialog() { _dialogShown.update { _ -> null } } fun onSelectType(type: EditorListType) { _selectedType.update { _ -> type } } fun getFilePath(name: String): String { return "${selectedType.value.directoryName}/$name" } private fun getEditorListItems(type: EditorListType): List { val directory = storageManager.getMPVConfigDirectory()?.createDirectory(type.directoryName) ?: return emptyList() val dateFormat = SimpleDateFormat("MMMM d, yyyy HH:mm", Locale.getDefault()) return directory.listFiles()?.mapNotNull { file -> if (file.isDirectory) { return@mapNotNull null } val lastModified = file.lastModified().takeIf { it != -1L }?.let { dateFormat.format(Date(it)) } EditorListItem( name = file.name ?: "", size = file.size().toSize(), lastModified = lastModified, ) }.orEmpty() } } sealed interface FileCreationResult { data object Success : FileCreationResult data class Failure(val stringRes: StringResource) : FileCreationResult } sealed interface EditorFileDialog { data object Create : EditorFileDialog data class Edit(val item: EditorListItem) : EditorFileDialog data class Delete(val item: EditorListItem) : EditorFileDialog } enum class EditorListType(val directoryName: String, val stringRes: StringResource, val fileExtension: String) { SCRIPTS(SCRIPTS_PATH, AYMR.strings.pref_player_editor_script, "lua"), SCRIPTS_OPTS(SCRIPT_OPTS_PATH, AYMR.strings.pref_player_editor_script_opts, "conf"), } data class EditorListItem( val name: String, val size: String? = null, val lastModified: String? = null, ) sealed interface EditorScreenState { @Immutable data object Loading : EditorScreenState @Immutable data class Success( val editorListItems: List, ) : EditorScreenState { val isEmpty: Boolean get() = editorListItems.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/codeeditor/CodeEditScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor.codeeditor import androidx.activity.compose.BackHandler import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Save import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.more.settings.screen.player.editor.components.UnsavedChangesDialog import eu.kanade.presentation.util.Screen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen class CodeEditScreen(private val filePath: String) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val screenModel = rememberScreenModel { CodeEditScreenModel(context, filePath) } val state by screenModel.state.collectAsState() val dialogShown by screenModel.dialogShown.collectAsState() val hasModified by screenModel.hasModified.collectAsState() BackHandler(enabled = hasModified) { screenModel.showDialog(CodeEditDialogs.GoBack) } when (dialogShown) { null -> {} CodeEditDialogs.GoBack -> { UnsavedChangesDialog( onDismissRequest = screenModel::dismissDialog, onConfirm = { navigator.pop() }, ) } } Scaffold( topBar = { scrollBehavior -> AppBar( navigateUp = { if (hasModified) { screenModel.showDialog(CodeEditDialogs.GoBack) } else { navigator.pop() } }, titleContent = { Text(text = filePath.substringAfter("/")) }, actions = { AppBarActions( actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_save), icon = Icons.Outlined.Save, onClick = screenModel::save, enabled = hasModified, ), ), ) }, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> when (state) { CodeEditScreenState.Loading -> { LoadingScreen() } is CodeEditScreenState.Error -> { EmptyScreen( message = (state as CodeEditScreenState.Error).throwable.message ?: "Unknown exception", ) } is CodeEditScreenState.Success -> { CodeEditorContent( state = state as CodeEditScreenState.Success, contentPadding = contentPadding, onEdit = screenModel::onEdit, ) } } } } } @Composable private fun CodeEditorContent( state: CodeEditScreenState.Success, contentPadding: PaddingValues, onEdit: (TextFieldValue) -> Unit, ) { val layoutDirection = LocalLayoutDirection.current val focusRequester = remember { FocusRequester() } var lineCount by remember { mutableIntStateOf(1) } val codeStyle = TextStyle( color = MaterialTheme.colorScheme.onBackground, fontFamily = FontFamily.Monospace, fontSize = 14.sp, lineHeight = 20.sp, ) Row( modifier = Modifier .verticalScroll(rememberScrollState()) .imePadding(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { BasicTextField( modifier = Modifier .padding( start = contentPadding.calculateLeftPadding(layoutDirection), top = contentPadding.calculateTopPadding(), bottom = contentPadding.calculateBottomPadding(), ) .fillMaxHeight() .width(12.dp * lineCount.toString().length), value = IntRange(1, lineCount).joinToString(separator = "\n"), readOnly = true, textStyle = codeStyle.copy( color = codeStyle.color.copy(alpha = DISABLED_ALPHA), textAlign = TextAlign.End, ), onValueChange = {}, ) BasicTextField( modifier = Modifier .focusRequester(focusRequester) .fillMaxSize() .horizontalScroll(rememberScrollState()) .padding( top = contentPadding.calculateTopPadding(), bottom = contentPadding.calculateBottomPadding(), ), value = state.content, onValueChange = { onEdit(it) }, onTextLayout = { result -> lineCount = result.lineCount }, textStyle = codeStyle, cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), ) } LaunchedEffect(focusRequester) { focusRequester.requestFocus() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/codeeditor/CodeEditScreenModel.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor.codeeditor import android.content.Context import androidx.compose.runtime.Immutable import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.TextFieldValue import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.FileOutputStream class CodeEditScreenModel( private val context: Context, private val filePath: String, private val storageManager: StorageManager = Injekt.get(), ) : StateScreenModel(CodeEditScreenState.Loading) { private val _hasModified = MutableStateFlow(false) val hasModified = _hasModified.asStateFlow() private val _dialogShown = MutableStateFlow(null) val dialogShown = _dialogShown.asStateFlow() private val currentFile = MutableStateFlow(null) init { screenModelScope.launchIO { try { val file = storageManager.getMPVConfigDirectory()?.findFile(filePath) ?: throw Exception("Unable to read file") currentFile.update { _ -> file } val content = file.openInputStream().use { it.readBytes().toString(Charsets.UTF_8) } mutableState.update { _ -> CodeEditScreenState.Success( TextFieldValue( annotatedString = content.highlightText(), composition = null, ), ) } } catch (e: Exception) { mutableState.update { _ -> CodeEditScreenState.Error(e) } } } } private val luaHighlight = luaHighlight(githubTheme) private val confHighlight = confHighlight(githubTheme) private fun String.highlightText(): AnnotatedString { return if (this.length > HIGHLIGHT_MAX_SIZE) { AnnotatedString(this) } else { when (filePath.substringAfterLast(".")) { "lua" -> luaHighlight.toAnnotatedString(this) "conf" -> confHighlight.toAnnotatedString(this) else -> AnnotatedString(this) } } } fun showDialog(dialog: CodeEditDialogs) { _dialogShown.update { _ -> dialog } } fun dismissDialog() { _dialogShown.update { _ -> null } } fun onEdit(value: TextFieldValue) { mutableState.update { current -> if (value.text != (current as? CodeEditScreenState.Success)?.content?.text) { _hasModified.update { _ -> true } CodeEditScreenState.Success( TextFieldValue( annotatedString = value.text.highlightText(), selection = value.selection, composition = null, ), ) } else { CodeEditScreenState.Success( TextFieldValue( annotatedString = current.content.annotatedString, selection = value.selection, composition = null, ), ) } } } fun save() { val file = currentFile.value ?: kotlin.run { context.toast(AYMR.strings.editor_save_error) return } val content = (mutableState.value as? CodeEditScreenState.Success) ?.content?.annotatedString?.text ?: kotlin.run { context.toast(AYMR.strings.editor_save_error) return } try { file.openOutputStream() .also { (it as? FileOutputStream)?.channel?.truncate(0) } .use { it.write(content.toByteArray()) } _hasModified.update { _ -> false } context.toast(context.stringResource(AYMR.strings.editor_save_success)) } catch (e: Exception) { logcat(LogPriority.ERROR, e) context.toast(e.message ?: context.stringResource(AYMR.strings.editor_save_error)) } } companion object { private const val HIGHLIGHT_MAX_SIZE = 15000 } } sealed interface CodeEditDialogs { data object GoBack : CodeEditDialogs } sealed interface CodeEditScreenState { @Immutable data object Loading : CodeEditScreenState @Immutable data class Success( val content: TextFieldValue, ) : CodeEditScreenState @Immutable data class Error( val throwable: Throwable, ) : CodeEditScreenState } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/codeeditor/Highlight.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor.codeeditor import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle sealed class HighlightType(open val regex: Regex, open val isString: Boolean) { data class Full( override val regex: Regex, override val isString: Boolean = false, val color: Color, ) : HighlightType(regex, isString) data class Groups( override val regex: Regex, override val isString: Boolean = false, val colors: List, ) : HighlightType(regex, isString) } data class Highlight( val rules: List, ) // From https://github.com/NeoUtils/Highlight fun Highlight.toAnnotatedString(text: String): AnnotatedString { val spanStyles = mutableListOf>() val stringRanges = mutableListOf() for (rule in rules) { for (result in rule.regex.findAll(text)) { for ((index, group) in result.groups.withIndex()) { if (group == null) continue if (rule is HighlightType.Groups && index == 0) continue if (stringRanges.any { it.contains(group.range.first) }) continue val color = when (rule) { is HighlightType.Full -> rule.color is HighlightType.Groups -> rule.colors[index - 1] } spanStyles.add( AnnotatedString.Range( item = SpanStyle(color = color), start = group.range.first, end = group.range.last + 1, ), ) if (rule.isString) { stringRanges.add(group.range) } } } } return AnnotatedString( text = text, spanStyles = spanStyles, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/codeeditor/SyntaxHighlight.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor.codeeditor import androidx.compose.ui.graphics.Color val githubTheme = SyntaxColors( keyword = Color(0xFFFF7B72), literal = Color(0xFF79C0FF), comment = Color(0xFF9198A1), string = Color(0xFFA5D6FF), definition = Color(0xFFD2A8FF), key = Color(0xFF7EE787), value = Color(0xFFD29922), ) // From https://github.com/Qawaz/compose-code-editor class SyntaxColors( val keyword: Color, val literal: Color, val comment: Color, val string: Color, val definition: Color, val key: Color, val value: Color, ) // Some rules taken from https://github.com/Qawaz/compose-code-editor fun luaHighlight(syntaxColors: SyntaxColors) = Highlight( rules = listOf( // Operators HighlightType.Full( regex = Regex("""(?~:/])(?:==|~=|<=|>=|\/\/|\.\.|[=+\-*/%^#<>])"""), color = syntaxColors.keyword, ), // Invocation with `:` HighlightType.Full( regex = Regex("""\b([a-zA-Z_]\w*)(?=\s*:)"""), color = syntaxColors.definition, ), // Function calls HighlightType.Groups( regex = Regex("""([a-zA-Z_]\w*)(?=\s*\()"""), colors = listOf(syntaxColors.literal), ), // Function definition HighlightType.Groups( regex = Regex("""function\s+([a-zA-Z_][\w.]*)(?=\s*\()"""), colors = listOf(syntaxColors.definition), ), // Keywords HighlightType.Groups( regex = Regex( """\b(and|break|do|else|elseif|end|for|function|if|in|local|not|or|repeat|return|then|until|while)\b""", ), colors = listOf(syntaxColors.keyword), ), // True/false/nil HighlightType.Groups( regex = Regex("""\b(true|false|nil)\b"""), colors = listOf(syntaxColors.literal), ), // A number is a hex integer literal, a decimal real literal, or in // scientific notation. HighlightType.Full( regex = Regex( """(? Unit, isValid: (String, String?) -> FileCreationResult, onConfirm: (String) -> Unit, ) { val initialTextValue = initialName ?: "file.$fileExtension" var fileName by remember { mutableStateOf( TextFieldValue( text = initialTextValue, selection = TextRange( 0, initialTextValue.indexOfLast { it == '.' }.takeUnless { it == -1 } ?: initialTextValue.length, ), ), ) } val result = remember(fileName.text) { isValid(fileName.text, initialName) } val focusRequester = remember { FocusRequester() } AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( enabled = result is FileCreationResult.Success, onClick = { onConfirm(fileName.text) onDismissRequest() }, ) { Text(text = stringResource(if (initialName == null) MR.strings.action_add else MR.strings.action_edit)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text( text = stringResource( if (initialName == null ) { AYMR.strings.editor_create_file } else { AYMR.strings.editor_edit_file }, ), ) }, text = { OutlinedTextField( modifier = Modifier.focusRequester(focusRequester), value = fileName, onValueChange = { fileName = it }, label = { Text(text = stringResource(AYMR.strings.editor_filename)) }, supportingText = { when (result) { is FileCreationResult.Failure -> { Text(text = stringResource(result.stringRes)) } FileCreationResult.Success -> {} } }, isError = result is FileCreationResult.Failure, singleLine = true, ) }, ) LaunchedEffect(focusRequester) { // TODO: https://issuetracker.google.com/issues/204502668 delay(0.1.seconds) focusRequester.requestFocus() } } @Composable fun FileDeleteDialog( name: String, onDismissRequest: () -> Unit, onDelete: () -> Unit, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onDelete() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(AYMR.strings.editor_delete_file)) }, text = { Text(text = stringResource(AYMR.strings.editor_delete_file_confirmation, name)) }, ) } @Composable fun UnsavedChangesDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onConfirm() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, title = { Text(text = stringResource(MR.strings.label_warning)) }, text = { Text(text = stringResource(AYMR.strings.editor_unsaved_progress)) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/components/EditorScreen.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreHoriz import androidx.compose.material.icons.outlined.Description import androidx.compose.material.icons.outlined.IntegrationInstructions import androidx.compose.material.icons.outlined.SettingsApplications import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.FloatingActionAddButton import eu.kanade.presentation.more.settings.screen.player.editor.EditorListItem import eu.kanade.presentation.more.settings.screen.player.editor.EditorListType import eu.kanade.presentation.more.settings.screen.player.editor.EditorScreenState import kotlinx.collections.immutable.toPersistentList import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen @Composable fun EditorScreen( state: EditorScreenState, selectedType: EditorListType, onSelectType: (EditorListType) -> Unit, onClickItem: (EditorListItem) -> Unit, onRenameItem: (EditorListItem) -> Unit, onDeleteItem: (EditorListItem) -> Unit, onClickAdd: () -> Unit, navigateUp: () -> Unit, ) { val lazyListState = rememberLazyListState() Scaffold( topBar = { scrollBehavior -> AppBar( navigateUp = navigateUp, titleContent = { EditorTypeDropDown( type = selectedType, values = EditorListType.entries.toPersistentList(), onSelect = onSelectType, ) }, scrollBehavior = scrollBehavior, ) }, floatingActionButton = { FloatingActionAddButton( lazyListState = lazyListState, onClick = onClickAdd, ) }, ) { paddingValues -> when (state) { EditorScreenState.Loading -> { LoadingScreen(modifier = Modifier.padding(paddingValues)) } is EditorScreenState.Success -> { if (state.isEmpty) { EmptyScreen( stringRes = AYMR.strings.pref_player_no_items, modifier = Modifier.padding(paddingValues), ) return@Scaffold } EditorListContent( items = state.editorListItems, lazyListState = lazyListState, paddingValues = paddingValues, onClickItem = onClickItem, onRenameItem = onRenameItem, onDeleteItem = onDeleteItem, ) } } } } @Composable private fun EditorListContent( items: List, lazyListState: LazyListState, paddingValues: PaddingValues, onClickItem: (EditorListItem) -> Unit, onRenameItem: (EditorListItem) -> Unit, onDeleteItem: (EditorListItem) -> Unit, ) { var expandedIndex by remember { mutableStateOf(null) } LazyColumn( state = lazyListState, contentPadding = paddingValues, ) { itemsIndexed( items = items, key = { _, item -> "editoritem-${item.name}" }, ) { index, item -> FileListItem( item = item, expanded = index == expandedIndex, modifier = Modifier.animateItem(), onClick = { onClickItem(item) }, onExpand = { expanded -> expandedIndex = index.takeIf { expanded } }, onRename = { onRenameItem(item) }, onDelete = { onDeleteItem(item) }, ) } } } @Composable private fun FileListItem( item: EditorListItem, expanded: Boolean, modifier: Modifier = Modifier, onClick: () -> Unit, onExpand: (Boolean) -> Unit, onRename: () -> Unit, onDelete: () -> Unit, ) { ListItem( modifier = modifier .clickable { onClick() }, leadingContent = { Icon( imageVector = when (item.name.substringAfterLast(".")) { "lua" -> Icons.Outlined.IntegrationInstructions "conf" -> Icons.Outlined.SettingsApplications else -> Icons.Outlined.Description }, null, ) }, trailingContent = { DropdownMenu( expanded = expanded, onDismissRequest = { onExpand(false) }, ) { DropdownMenuItem( text = { Text(text = stringResource(AYMR.strings.editor_action_rename)) }, onClick = { onRename() onExpand(false) }, ) DropdownMenuItem( text = { Text(text = stringResource(AYMR.strings.editor_action_delete)) }, onClick = { onDelete() onExpand(false) }, ) } IconButton(onClick = { onExpand(true) }) { Icon(Icons.Filled.MoreHoriz, null) } }, headlineContent = { Text(text = item.name) }, supportingContent = { Text( text = listOfNotNull(item.size, item.lastModified).joinToString(" - "), ) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/screen/player/editor/components/EditorTypeDropdown.kt ================================================ package eu.kanade.presentation.more.settings.screen.player.editor.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material.icons.filled.ArrowDropUp import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import eu.kanade.presentation.more.settings.screen.player.editor.EditorListType import kotlinx.collections.immutable.ImmutableList import tachiyomi.presentation.core.i18n.stringResource @Composable fun EditorTypeDropDown( type: EditorListType, values: ImmutableList, onSelect: (EditorListType) -> Unit, ) { val isDropDownExpanded = remember { mutableStateOf(false) } Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { Box { Row( horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clickable { isDropDownExpanded.value = !isDropDownExpanded.value }, ) { Text(text = stringResource(type.stringRes)) Icon(if (isDropDownExpanded.value) Icons.Filled.ArrowDropUp else Icons.Filled.ArrowDropDown, null) } DropdownMenu( expanded = isDropDownExpanded.value, onDismissRequest = { isDropDownExpanded.value = false }, ) { values.forEach { item -> DropdownMenuItem( text = { Text(text = stringResource(item.stringRes)) }, onClick = { isDropDownExpanded.value = false onSelect(item) }, ) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemeModePreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MultiChoiceSegmentedButtonRow import androidx.compose.material3.SegmentedButton import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.domain.ui.model.ThemeMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource private val options = mapOf( ThemeMode.SYSTEM to MR.strings.theme_system, ThemeMode.LIGHT to MR.strings.theme_light, ThemeMode.DARK to MR.strings.theme_dark, ) @Composable internal fun AppThemeModePreferenceWidget( value: ThemeMode, onItemClick: (ThemeMode) -> Unit, ) { BasePreferenceWidget( subcomponent = { MultiChoiceSegmentedButtonRow( modifier = Modifier .fillMaxWidth() .padding(horizontal = PrefsHorizontalPadding), ) { options.onEachIndexed { index, (mode, labelRes) -> SegmentedButton( checked = mode == value, onCheckedChange = { onItemClick(mode) }, shape = SegmentedButtonDefaults.itemShape( index, options.size, ), ) { Text(stringResource(labelRes)) } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/AppThemePreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import android.app.Activity import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material3.DividerDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.core.app.ActivityCompat import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.AppTheme import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable import tachiyomi.core.common.preference.InMemoryPreferenceStore import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.fullType @Composable internal fun AppThemePreferenceWidget( value: AppTheme, amoled: Boolean, onItemClick: (AppTheme) -> Unit, ) { BasePreferenceWidget( subcomponent = { AppThemesList( currentTheme = value, amoled = amoled, onItemClick = onItemClick, ) }, ) } @Composable private fun AppThemesList( currentTheme: AppTheme, amoled: Boolean, onItemClick: (AppTheme) -> Unit, ) { val context = LocalContext.current val appThemes = remember { AppTheme.entries .filterNot { it.titleRes == null || (it == AppTheme.MONET && !DeviceUtil.isDynamicColorAvailable) } } LazyRow( contentPadding = PaddingValues(horizontal = PrefsHorizontalPadding), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items( items = appThemes, key = { it.name }, ) { appTheme -> Column( modifier = Modifier .width(114.dp) .padding(top = 8.dp), ) { TachiyomiTheme( appTheme = appTheme, amoled = amoled, ) { AppThemePreviewItem( selected = currentTheme == appTheme, onClick = { onItemClick(appTheme) (context as? Activity)?.let { ActivityCompat.recreate(it) } }, ) } Spacer(modifier = Modifier.height(8.dp)) Text( text = stringResource(appTheme.titleRes!!), modifier = Modifier .fillMaxWidth() .secondaryItemAlpha(), textAlign = TextAlign.Center, maxLines = 2, minLines = 2, style = MaterialTheme.typography.bodyMedium, ) } } } } @Composable fun AppThemePreviewItem( selected: Boolean, onClick: () -> Unit, ) { Column( modifier = Modifier .fillMaxWidth() .aspectRatio(9f / 16f) .border( width = 4.dp, color = if (selected) { MaterialTheme.colorScheme.primary } else { DividerDefaults.color }, shape = RoundedCornerShape(17.dp), ) .padding(4.dp) .clip(RoundedCornerShape(13.dp)) .background(MaterialTheme.colorScheme.background) .clickable(onClick = onClick), ) { // App Bar Row( modifier = Modifier .fillMaxWidth() .height(40.dp) .padding(8.dp), verticalAlignment = Alignment.CenterVertically, ) { Box( modifier = Modifier .fillMaxHeight(0.8f) .weight(0.7f) .padding(end = 4.dp) .background( color = MaterialTheme.colorScheme.onSurface, shape = MaterialTheme.shapes.small, ), ) Box( modifier = Modifier.weight(0.3f), contentAlignment = Alignment.CenterEnd, ) { if (selected) { Icon( imageVector = Icons.Filled.CheckCircle, contentDescription = stringResource(MR.strings.selected), tint = MaterialTheme.colorScheme.primary, ) } } } // Cover Box( modifier = Modifier .padding(start = 8.dp, top = 2.dp) .background( color = DividerDefaults.color, shape = MaterialTheme.shapes.small, ) .fillMaxWidth(0.5f) .aspectRatio(ItemCover.Book.ratio), ) { Row( modifier = Modifier .padding(4.dp) .size(width = 24.dp, height = 16.dp) .clip(RoundedCornerShape(5.dp)), ) { Box( modifier = Modifier .fillMaxHeight() .width(12.dp) .background(MaterialTheme.colorScheme.tertiary), ) Box( modifier = Modifier .fillMaxHeight() .width(12.dp) .background(MaterialTheme.colorScheme.secondary), ) } } // Bottom bar Box( modifier = Modifier .fillMaxWidth() .weight(1f), contentAlignment = Alignment.BottomCenter, ) { Surface( color = MaterialTheme.colorScheme.surfaceContainer, ) { Row( modifier = Modifier .height(32.dp) .fillMaxWidth() .padding(horizontal = 8.dp), verticalAlignment = Alignment.CenterVertically, ) { Box( modifier = Modifier .size(17.dp) .background( color = MaterialTheme.colorScheme.primary, shape = CircleShape, ), ) Box( modifier = Modifier .padding(start = 8.dp) .alpha(0.6f) .height(17.dp) .weight(1f) .background( color = MaterialTheme.colorScheme.onSurface, shape = MaterialTheme.shapes.small, ), ) } } } } } @PreviewLightDark @Composable private fun AppThemesListPreview() { var appTheme by remember { mutableStateOf(AppTheme.DEFAULT) } Injekt.addSingleton(fullType(), UiPreferences(InMemoryPreferenceStore())) TachiyomiTheme(appTheme = appTheme) { Surface { AppThemesList( currentTheme = appTheme, amoled = false, onItemClick = { appTheme = it }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/BasePreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.RepeatMode import androidx.compose.animation.core.StartOffset import androidx.compose.animation.core.StartOffsetType import androidx.compose.animation.core.repeatable import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.more.settings.LocalPreferenceHighlighted import eu.kanade.presentation.more.settings.LocalPreferenceMinHeight import kotlinx.coroutines.delay import kotlin.time.Duration.Companion.seconds @Composable internal fun BasePreferenceWidget( modifier: Modifier = Modifier, title: String? = null, subcomponent: @Composable (ColumnScope.() -> Unit)? = null, icon: @Composable (() -> Unit)? = null, onClick: (() -> Unit)? = null, widget: @Composable (() -> Unit)? = null, ) { val highlighted = LocalPreferenceHighlighted.current val minHeight = LocalPreferenceMinHeight.current Row( modifier = modifier .highlightBackground(highlighted) .sizeIn(minHeight = minHeight) .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { if (icon != null) { Box( modifier = Modifier.padding(start = PrefsHorizontalPadding, end = 8.dp), content = { icon() }, ) } Column( modifier = Modifier .weight(1f) .padding(vertical = PrefsVerticalPadding), ) { if (!title.isNullOrBlank()) { Text( modifier = Modifier.padding(horizontal = PrefsHorizontalPadding), text = title, overflow = TextOverflow.Ellipsis, maxLines = 2, style = MaterialTheme.typography.titleLarge, fontSize = TitleFontSize, ) } subcomponent?.invoke(this) } if (widget != null) { Box( modifier = Modifier.padding(end = PrefsHorizontalPadding), content = { widget() }, ) } } } internal fun Modifier.highlightBackground(highlighted: Boolean): Modifier = composed { var highlightFlag by remember { mutableStateOf(false) } LaunchedEffect(Unit) { if (highlighted) { highlightFlag = true delay(3.seconds) highlightFlag = false } } val highlight by animateColorAsState( targetValue = if (highlightFlag) { MaterialTheme.colorScheme.surfaceTint.copy(alpha = .12f) } else { Color.Transparent }, animationSpec = if (highlightFlag) { repeatable( iterations = 5, animation = tween(durationMillis = 200), repeatMode = RepeatMode.Reverse, initialStartOffset = StartOffset( offsetMillis = 600, offsetType = StartOffsetType.Delay, ), ) } else { tween(200) }, label = "highlight", ) Modifier.background(color = highlight) } internal val TrailingWidgetBuffer = 16.dp internal val PrefsHorizontalPadding = 16.dp internal val PrefsVerticalPadding = 16.dp internal val TitleFontSize = 16.sp ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/EditTextPreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Cancel import androidx.compose.material.icons.filled.Error import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.window.DialogProperties import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable fun EditTextPreferenceWidget( title: String, subtitle: String?, dialogSubtitle: String? = null, icon: ImageVector?, value: String, onConfirm: suspend (String) -> Boolean, singleLine: Boolean = true, canBeBlank: Boolean = false, formatSubtitle: Boolean = true, validate: (String) -> Boolean = { true }, errorMessage: @Composable ((String) -> String)? = null, ) { var isDialogShown by remember { mutableStateOf(false) } TextPreferenceWidget( title = title, subtitle = if (formatSubtitle) subtitle?.format(value) else subtitle, icon = icon, onPreferenceClick = { isDialogShown = true }, ) if (isDialogShown) { val scope = rememberCoroutineScope() val onDismissRequest = { isDialogShown = false } var textFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { mutableStateOf(TextFieldValue(value)) } AlertDialog( onDismissRequest = onDismissRequest, title = { Column { Text(text = title) if (dialogSubtitle != null) { Text(text = dialogSubtitle, style = MaterialTheme.typography.bodyMedium) } } }, text = { OutlinedTextField( value = textFieldValue, onValueChange = { textFieldValue = it }, trailingIcon = { if ((textFieldValue.text.isBlank() && !canBeBlank) || !validate(textFieldValue.text)) { Icon(imageVector = Icons.Filled.Error, contentDescription = null) } else { IconButton(onClick = { textFieldValue = TextFieldValue("") }) { Icon(imageVector = Icons.Filled.Cancel, contentDescription = null) } } }, supportingText = { if (!validate(textFieldValue.text) && errorMessage != null) { Text(errorMessage(textFieldValue.text)) } }, isError = (textFieldValue.text.isBlank() && !canBeBlank) || !validate(textFieldValue.text), singleLine = singleLine, modifier = Modifier.fillMaxWidth(), ) }, properties = DialogProperties( usePlatformDefaultWidth = true, ), confirmButton = { TextButton( enabled = textFieldValue.text != value && (textFieldValue.text.isNotBlank() || canBeBlank) && validate(textFieldValue.text), onClick = { scope.launch { if (onConfirm(textFieldValue.text)) { onDismissRequest() } } }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/InfoWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Info import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable internal fun InfoWidget(text: String) { Column( modifier = Modifier .padding( horizontal = PrefsHorizontalPadding, vertical = MaterialTheme.padding.medium, ) .secondaryItemAlpha(), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { Icon( imageVector = Icons.Outlined.Info, contentDescription = null, ) Text( text = text, style = MaterialTheme.typography.bodySmall, ) } } @PreviewLightDark @Composable private fun InfoWidgetPreview() { TachiyomiPreviewTheme { Surface { InfoWidget(text = stringResource(AYMR.strings.download_ahead_info)) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/ListPreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.selection.selectable import androidx.compose.material3.AlertDialog import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.i18n.stringResource @Composable fun ListPreferenceWidget( value: T, title: String, subtitle: String?, icon: ImageVector?, entries: Map, onValueChange: (T) -> Unit, ) { var isDialogShown by remember { mutableStateOf(false) } TextPreferenceWidget( title = title, subtitle = subtitle, icon = icon, onPreferenceClick = { isDialogShown = true }, ) if (isDialogShown) { AlertDialog( onDismissRequest = { isDialogShown = false }, title = { Text(text = title) }, text = { Box { val state = rememberLazyListState() ScrollbarLazyColumn(state = state) { entries.forEach { current -> val isSelected = value == current.key item { DialogRow( label = current.value, isSelected = isSelected, onSelected = { onValueChange(current.key!!) isDialogShown = false }, ) } } } if (state.canScrollBackward) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter)) if (state.canScrollForward) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter)) } }, confirmButton = { TextButton(onClick = { isDialogShown = false }) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } } @Composable private fun DialogRow( label: String, isSelected: Boolean, onSelected: () -> Unit, ) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .clip(MaterialTheme.shapes.small) .selectable( selected = isSelected, onClick = { if (!isSelected) onSelected() }, ) .fillMaxWidth() .minimumInteractiveComponentSize(), ) { RadioButton( selected = isSelected, onClick = null, ) Text( text = label, style = MaterialTheme.typography.bodyLarge.merge(), modifier = Modifier.padding(start = 24.dp), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/MultiSelectListPreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.window.DialogProperties import eu.kanade.presentation.more.settings.Preference import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.i18n.stringResource @Composable fun MultiSelectListPreferenceWidget( preference: Preference.PreferenceItem.MultiSelectListPreference, values: Set, onValuesChange: (Set) -> Unit, ) { var isDialogShown by remember { mutableStateOf(false) } TextPreferenceWidget( title = preference.title, subtitle = preference.subtitleProvider(values, preference.entries), icon = preference.icon, onPreferenceClick = { isDialogShown = true }, ) if (isDialogShown) { val selected = remember { preference.entries.keys .filter { values.contains(it) } .toMutableStateList() } AlertDialog( onDismissRequest = { isDialogShown = false }, title = { Text(text = preference.title) }, text = { LazyColumn { preference.entries.forEach { current -> item { val isSelected = selected.contains(current.key) LabeledCheckbox( label = current.value, checked = isSelected, onCheckedChange = { if (it) { selected.add(current.key) } else { selected.remove(current.key) } }, ) } } } }, properties = DialogProperties( usePlatformDefaultWidth = true, ), confirmButton = { TextButton( onClick = { onValuesChange(selected.toMutableSet()) isDialogShown = false }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = { isDialogShown = false }) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/PreferenceGroupHeader.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable fun PreferenceGroupHeader(title: String) { Box( contentAlignment = Alignment.CenterStart, modifier = Modifier .fillMaxWidth() .padding(bottom = 8.dp, top = 14.dp), ) { Text( text = title, color = MaterialTheme.colorScheme.secondary, modifier = Modifier.padding(horizontal = PrefsHorizontalPadding), style = MaterialTheme.typography.bodyMedium, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/SwitchPreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Preview import androidx.compose.material3.Surface import androidx.compose.material3.Switch import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme @Composable fun SwitchPreferenceWidget( modifier: Modifier = Modifier, title: String, subtitle: String? = null, icon: ImageVector? = null, checked: Boolean = false, onCheckedChanged: (Boolean) -> Unit, ) { TextPreferenceWidget( modifier = modifier, title = title, subtitle = subtitle, icon = icon, widget = { Switch( checked = checked, onCheckedChange = null, modifier = Modifier.padding(start = TrailingWidgetBuffer), ) }, onPreferenceClick = { onCheckedChanged(!checked) }, ) } @PreviewLightDark @Composable private fun SwitchPreferenceWidgetPreview() { TachiyomiPreviewTheme { Surface { Column { SwitchPreferenceWidget( title = "Text preference with icon", subtitle = "Text preference summary", icon = Icons.Filled.Preview, checked = true, onCheckedChanged = {}, ) SwitchPreferenceWidget( title = "Text preference", subtitle = "Text preference summary", checked = false, onCheckedChanged = {}, ) SwitchPreferenceWidget( title = "Text preference no summary", checked = false, onCheckedChanged = {}, ) SwitchPreferenceWidget( title = "Another text preference no summary", checked = false, onCheckedChanged = {}, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/TextPreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Preview import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.PreviewLightDark import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun TextPreferenceWidget( modifier: Modifier = Modifier, title: String? = null, subtitle: String? = null, icon: ImageVector? = null, iconTint: Color = MaterialTheme.colorScheme.primary, widget: @Composable (() -> Unit)? = null, onPreferenceClick: (() -> Unit)? = null, ) { BasePreferenceWidget( modifier = modifier, title = title, subcomponent = if (!subtitle.isNullOrBlank()) { { Text( text = subtitle, modifier = Modifier .padding(horizontal = PrefsHorizontalPadding) .secondaryItemAlpha(), style = MaterialTheme.typography.bodySmall, maxLines = 10, ) } } else { null }, icon = if (icon != null) { { Icon( imageVector = icon, tint = iconTint, contentDescription = null, ) } } else { null }, onClick = onPreferenceClick, widget = widget, ) } @PreviewLightDark @Composable private fun TextPreferenceWidgetPreview() { TachiyomiPreviewTheme { Surface { Column { TextPreferenceWidget( title = "Text preference with icon", subtitle = "Text preference summary", icon = Icons.Filled.Preview, onPreferenceClick = {}, ) TextPreferenceWidget( title = "Text preference", subtitle = "Text preference summary", onPreferenceClick = {}, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/TrackingPreferenceWidget.kt ================================================ package eu.kanade.presentation.more.settings.widget import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Done import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import eu.kanade.presentation.more.settings.LocalPreferenceHighlighted import eu.kanade.presentation.track.components.TrackLogoIcon import eu.kanade.tachiyomi.data.track.Tracker import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable fun TrackingPreferenceWidget( modifier: Modifier = Modifier, tracker: Tracker, checked: Boolean, onClick: (() -> Unit)? = null, ) { val highlighted = LocalPreferenceHighlighted.current Box(modifier = Modifier.highlightBackground(highlighted)) { Row( modifier = modifier .clickable(enabled = onClick != null, onClick = { onClick?.invoke() }) .fillMaxWidth() .padding(horizontal = PrefsHorizontalPadding, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically, ) { TrackLogoIcon(tracker) Text( text = tracker.name, modifier = Modifier .weight(1f) .padding(horizontal = 16.dp), maxLines = 1, style = MaterialTheme.typography.titleLarge, fontSize = TitleFontSize, ) if (checked) { Icon( imageVector = Icons.Outlined.Done, modifier = Modifier .padding(4.dp) .size(32.dp), tint = Color(0xFF4CAF50), contentDescription = stringResource(MR.strings.login_success), ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/settings/widget/TriStateListDialog.kt ================================================ package eu.kanade.presentation.more.settings.widget import android.annotation.SuppressLint import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.CheckBox import androidx.compose.material.icons.rounded.CheckBoxOutlineBlank import androidx.compose.material.icons.rounded.DisabledByDefault import androidx.compose.material3.AlertDialog import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource private enum class State { CHECKED, INVERSED, UNCHECKED, } @SuppressLint("ComposeParameterOrder") @Composable fun TriStateListDialog( title: String, message: String? = null, items: List, initialChecked: List, initialInversed: List, itemLabel: @Composable (T) -> String, onDismissRequest: () -> Unit, onValueChanged: (newIncluded: List, newExcluded: List) -> Unit, ) { val selected = remember { items .map { when (it) { in initialChecked -> State.CHECKED in initialInversed -> State.INVERSED else -> State.UNCHECKED } } .toMutableStateList() } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = title) }, text = { Column { if (message != null) { Text( text = message, modifier = Modifier.padding(bottom = 8.dp), ) } Box { val listState = rememberLazyListState() LazyColumn(state = listState) { itemsIndexed(items = items) { index, item -> val state = selected[index] Row( modifier = Modifier .clip(MaterialTheme.shapes.small) .clickable { selected[index] = when (state) { State.UNCHECKED -> State.CHECKED State.CHECKED -> State.INVERSED State.INVERSED -> State.UNCHECKED } } .defaultMinSize(minHeight = 48.dp) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { Icon( modifier = Modifier.padding(end = 20.dp), imageVector = when (state) { State.UNCHECKED -> Icons.Rounded.CheckBoxOutlineBlank State.CHECKED -> Icons.Rounded.CheckBox State.INVERSED -> Icons.Rounded.DisabledByDefault }, tint = if (state == State.UNCHECKED) { LocalContentColor.current } else { MaterialTheme.colorScheme.primary }, contentDescription = stringResource( when (state) { State.UNCHECKED -> MR.strings.disabled State.CHECKED -> MR.strings.disabled State.INVERSED -> MR.strings.disabled }, ), ) Text(text = itemLabel(item)) } } } if (listState.canScrollBackward) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter)) if (listState.canScrollForward) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter)) } } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, confirmButton = { TextButton( onClick = { val included = items.mapIndexedNotNull { index, category -> if (selected[index] == State.CHECKED) category else null } val excluded = items.mapIndexedNotNull { index, category -> if (selected[index] == State.INVERSED) category else null } onValueChanged(included, excluded) }, ) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/stats/AnimeStatsScreenContent.kt ================================================ package eu.kanade.presentation.more.stats import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyItemScope import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.CollectionsBookmark import androidx.compose.material.icons.outlined.LocalLibrary import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.more.stats.components.StatsItem import eu.kanade.presentation.more.stats.components.StatsOverviewItem import eu.kanade.presentation.more.stats.data.StatsData import eu.kanade.presentation.util.toDurationString import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.SectionCard import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import java.util.Locale import kotlin.time.DurationUnit import kotlin.time.toDuration @Composable fun AnimeStatsScreenContent( state: StatsScreenState.SuccessAnime, paddingValues: PaddingValues, ) { val statListState = rememberLazyListState() LazyColumn( state = statListState, contentPadding = paddingValues, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { item { OverviewSection(state.overview) } item { TitlesStats(state.titles) } item { EpisodeStats(state.episodes) } item { TrackerStats(state.trackers) } } } @Composable private fun LazyItemScope.OverviewSection( data: StatsData.AnimeOverview, ) { val none = stringResource(MR.strings.none) val context = LocalContext.current val readDurationString = remember(data.totalSeenDuration) { data.totalSeenDuration .toDuration(DurationUnit.MILLISECONDS) .toDurationString(context, fallback = none) } SectionCard(MR.strings.label_overview_section) { Row( modifier = Modifier.height(IntrinsicSize.Min), ) { StatsOverviewItem( title = data.libraryAnimeCount.toString(), subtitle = stringResource(MR.strings.in_library), icon = Icons.Outlined.CollectionsBookmark, ) StatsOverviewItem( title = readDurationString, subtitle = stringResource(AYMR.strings.label_watched_duration), icon = Icons.Outlined.Schedule, ) StatsOverviewItem( title = data.completedAnimeCount.toString(), subtitle = stringResource(MR.strings.label_completed_titles), icon = Icons.Outlined.LocalLibrary, ) } } } @Composable private fun LazyItemScope.TitlesStats( data: StatsData.AnimeTitles, ) { SectionCard(MR.strings.label_titles_section) { Row { StatsItem( data.globalUpdateItemCount.toString(), stringResource(MR.strings.label_titles_in_global_update), ) StatsItem( data.startedAnimeCount.toString(), stringResource(MR.strings.label_started), ) StatsItem( data.localAnimeCount.toString(), stringResource(MR.strings.label_local), ) } } } @Composable private fun LazyItemScope.EpisodeStats( data: StatsData.Episodes, ) { SectionCard(AYMR.strings.episodes) { Row { StatsItem( data.totalEpisodeCount.toString(), stringResource(MR.strings.label_total_chapters), ) StatsItem( data.readEpisodeCount.toString(), stringResource(AYMR.strings.label_watched_episodes), ) StatsItem( data.downloadCount.toString(), stringResource(MR.strings.label_downloaded), ) } } } @Composable private fun LazyItemScope.TrackerStats( data: StatsData.Trackers, ) { val notApplicable = stringResource(MR.strings.not_applicable) val meanScoreStr = remember(data.trackedTitleCount, data.meanScore) { if (data.trackedTitleCount > 0 && !data.meanScore.isNaN()) { // All other numbers are localized in English "%.2f ★".format(Locale.ENGLISH, data.meanScore) } else { notApplicable } } SectionCard(MR.strings.label_tracker_section) { Row { StatsItem( data.trackedTitleCount.toString(), stringResource(MR.strings.label_tracked_titles), ) StatsItem( meanScoreStr, stringResource(MR.strings.label_mean_score), ) StatsItem( data.trackerCount.toString(), stringResource(MR.strings.label_used), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/stats/MangaStatsScreenContent.kt ================================================ package eu.kanade.presentation.more.stats import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyItemScope import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.CollectionsBookmark import androidx.compose.material.icons.outlined.LocalLibrary import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import eu.kanade.presentation.more.stats.components.StatsItem import eu.kanade.presentation.more.stats.components.StatsOverviewItem import eu.kanade.presentation.more.stats.data.StatsData import eu.kanade.presentation.util.toDurationString import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.SectionCard import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import java.util.Locale import kotlin.time.DurationUnit import kotlin.time.toDuration @Composable fun MangaStatsScreenContent( state: StatsScreenState.SuccessManga, paddingValues: PaddingValues, ) { LazyColumn( contentPadding = paddingValues, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { item { OverviewSection(state.overview) } item { TitlesStats(state.titles) } item { ChapterStats(state.chapters) } item { TrackerStats(state.trackers) } } } @Composable private fun LazyItemScope.OverviewSection( data: StatsData.MangaOverview, ) { val none = stringResource(MR.strings.none) val context = LocalContext.current val readDurationString = remember(data.totalReadDuration) { data.totalReadDuration .toDuration(DurationUnit.MILLISECONDS) .toDurationString(context, fallback = none) } SectionCard(MR.strings.label_overview_section) { Row( modifier = Modifier.height(IntrinsicSize.Min), ) { StatsOverviewItem( title = data.libraryMangaCount.toString(), subtitle = stringResource(MR.strings.in_library), icon = Icons.Outlined.CollectionsBookmark, ) StatsOverviewItem( title = readDurationString, subtitle = stringResource(MR.strings.label_read_duration), icon = Icons.Outlined.Schedule, ) StatsOverviewItem( title = data.completedMangaCount.toString(), subtitle = stringResource(MR.strings.label_completed_titles), icon = Icons.Outlined.LocalLibrary, ) } } } @Composable private fun LazyItemScope.TitlesStats( data: StatsData.MangaTitles, ) { SectionCard(MR.strings.label_titles_section) { Row { StatsItem( data.globalUpdateItemCount.toString(), stringResource(MR.strings.label_titles_in_global_update), ) StatsItem( data.startedMangaCount.toString(), stringResource(MR.strings.label_started), ) StatsItem( data.localMangaCount.toString(), stringResource(MR.strings.label_local), ) } } } @Composable private fun LazyItemScope.ChapterStats( data: StatsData.Chapters, ) { SectionCard(MR.strings.chapters) { Row { StatsItem( data.totalChapterCount.toString(), stringResource(MR.strings.label_total_chapters), ) StatsItem( data.readChapterCount.toString(), stringResource(MR.strings.label_read_chapters), ) StatsItem( data.downloadCount.toString(), stringResource(MR.strings.label_downloaded), ) } } } @Composable private fun LazyItemScope.TrackerStats( data: StatsData.Trackers, ) { val notApplicable = stringResource(MR.strings.not_applicable) val meanScoreStr = remember(data.trackedTitleCount, data.meanScore) { if (data.trackedTitleCount > 0 && !data.meanScore.isNaN()) { // All other numbers are localized in English "%.2f ★".format(Locale.ENGLISH, data.meanScore) } else { notApplicable } } SectionCard(MR.strings.label_tracker_section) { Row { StatsItem( data.trackedTitleCount.toString(), stringResource(MR.strings.label_tracked_titles), ) StatsItem( meanScoreStr, stringResource(MR.strings.label_mean_score), ) StatsItem( data.trackerCount.toString(), stringResource(MR.strings.label_used), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/stats/StatsScreenState.kt ================================================ package eu.kanade.presentation.more.stats import androidx.compose.runtime.Immutable import eu.kanade.presentation.more.stats.data.StatsData sealed interface StatsScreenState { @Immutable data object Loading : StatsScreenState @Immutable data class SuccessManga( val overview: StatsData.MangaOverview, val titles: StatsData.MangaTitles, val chapters: StatsData.Chapters, val trackers: StatsData.Trackers, ) : StatsScreenState @Immutable data class SuccessAnime( val overview: StatsData.AnimeOverview, val titles: StatsData.AnimeTitles, val episodes: StatsData.Episodes, val trackers: StatsData.Trackers, ) : StatsScreenState } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/stats/components/StatsItem.kt ================================================ package eu.kanade.presentation.more.stats.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import tachiyomi.presentation.core.components.material.SECONDARY_ALPHA import tachiyomi.presentation.core.components.material.padding @Composable fun RowScope.StatsOverviewItem( title: String, subtitle: String, icon: ImageVector, ) { BaseStatsItem( title = title, titleStyle = MaterialTheme.typography.titleLarge, subtitle = subtitle, subtitleStyle = MaterialTheme.typography.bodyMedium, icon = icon, ) } @Composable fun RowScope.StatsItem( title: String, subtitle: String, ) { BaseStatsItem( title = title, titleStyle = MaterialTheme.typography.bodyMedium, subtitle = subtitle, subtitleStyle = MaterialTheme.typography.labelSmall, ) } @Composable private fun RowScope.BaseStatsItem( title: String, titleStyle: TextStyle, subtitle: String, subtitleStyle: TextStyle, icon: ImageVector? = null, ) { Column( modifier = Modifier .weight(1f) .fillMaxHeight(), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), horizontalAlignment = Alignment.CenterHorizontally, ) { Text( text = title, style = titleStyle .copy(fontWeight = FontWeight.Bold), textAlign = TextAlign.Center, maxLines = 1, ) Text( text = subtitle, style = subtitleStyle .copy( color = MaterialTheme.colorScheme.onSurface .copy(alpha = SECONDARY_ALPHA), ), textAlign = TextAlign.Center, ) if (icon != null) { Spacer(modifier = Modifier.weight(1f)) Icon( imageVector = icon, contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/stats/data/StatsData.kt ================================================ package eu.kanade.presentation.more.stats.data sealed interface StatsData { data class MangaOverview( val libraryMangaCount: Int, val completedMangaCount: Int, val totalReadDuration: Long, ) : StatsData data class AnimeOverview( val libraryAnimeCount: Int, val completedAnimeCount: Int, val totalSeenDuration: Long, ) : StatsData data class MangaTitles( val globalUpdateItemCount: Int, val startedMangaCount: Int, val localMangaCount: Int, ) : StatsData data class AnimeTitles( val globalUpdateItemCount: Int, val startedAnimeCount: Int, val localAnimeCount: Int, ) : StatsData data class Chapters( val totalChapterCount: Int, val readChapterCount: Int, val downloadCount: Int, ) : StatsData data class Episodes( val totalEpisodeCount: Int, val readEpisodeCount: Int, val downloadCount: Int, ) : StatsData data class Trackers( val trackedTitleCount: Int, val meanScore: Double, val trackerCount: Int, ) : StatsData } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/storage/CumulativeStorage.kt ================================================ package eu.kanade.presentation.more.storage import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.aspectRatio import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.rotate import androidx.compose.ui.layout.Layout import eu.kanade.tachiyomi.util.toSize @Composable fun CumulativeStorage( items: List, modifier: Modifier = Modifier, borderWidth: Float = 15f, ) { val totalSize = remember(items) { items.sumOf { it.size }.toFloat() } val totalSizeString = remember(totalSize) { totalSize.toLong().toSize() } Layout( modifier = modifier, content = { Canvas( modifier = Modifier.aspectRatio(1f), onDraw = { // don't bother drawing if there's no data if (totalSize == 0f) return@Canvas val totalAngle = 180f var currentAngle = 0f rotate(180f) { for (item in items) { val itemAngle = (item.size / totalSize) * totalAngle drawArc( color = item.color, startAngle = currentAngle, sweepAngle = itemAngle, useCenter = false, style = Stroke(width = borderWidth, cap = StrokeCap.Round), ) currentAngle += itemAngle } } }, ) Text( text = totalSizeString, style = MaterialTheme.typography.displaySmall, ) }, measurePolicy = { measurables, constraints -> val placeables = measurables.map { measurable -> measurable.measure(constraints.copy(minWidth = 0, minHeight = 0)) } val canvas = placeables.first() val text = placeables.last() // use half the height of the canvas to avoid too much extra space layout(constraints.maxWidth, canvas.height / 2) { canvas.placeRelative(0, 0) text.placeRelative( (canvas.width / 2) - (text.width / 2), (canvas.height / 4) - (text.height / 2), ) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/storage/SelectStorageCategory.kt ================================================ package eu.kanade.presentation.more.storage import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import tachiyomi.domain.category.model.Category import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.SelectItem import tachiyomi.presentation.core.i18n.stringResource @Composable fun SelectStorageCategory( selectedCategory: Category, categories: List, modifier: Modifier = Modifier, onCategorySelected: (Category) -> Unit, ) { val all = stringResource(AYMR.strings.label_all) val default = stringResource(MR.strings.label_default) val mappedCategories = remember(categories) { categories.map { when (it.id) { -1L -> it.copy(name = all) Category.UNCATEGORIZED_ID -> it.copy(name = default) else -> it } }.toTypedArray() } SelectItem( modifier = modifier, label = stringResource(AYMR.strings.label_category), selectedIndex = mappedCategories.indexOfFirst { it.id == selectedCategory.id }, options = mappedCategories, onSelect = { index -> onCategorySelected(mappedCategories[index]) }, toString = { it.name }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/storage/StorageItem.kt ================================================ package eu.kanade.presentation.more.storage import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.tachiyomi.util.toSize import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource data class StorageItem( val id: Long, val title: String, val size: Long, val thumbnail: String?, val entriesCount: Int, val color: Color, ) @Composable fun StorageItem( item: StorageItem, isManga: Boolean, modifier: Modifier = Modifier, onDelete: (Long) -> Unit, ) { val pluralCount = if (isManga) MR.plurals.manga_num_chapters else AYMR.plurals.anime_num_episodes var showDeleteDialog by remember { mutableStateOf(false) } Row( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, content = { ItemCover.Square( modifier = Modifier.height(48.dp), data = item.thumbnail, contentDescription = item.title, ) Column( modifier = Modifier.weight(1f), content = { Text( text = item.title, style = MaterialTheme.typography.bodyMedium, overflow = TextOverflow.Ellipsis, fontWeight = FontWeight.W700, maxLines = 1, ) Row( verticalAlignment = Alignment.CenterVertically, content = { Box( modifier = Modifier .background(item.color, CircleShape) .size(12.dp), ) Spacer(Modifier.width(MaterialTheme.padding.small)) Text( text = item.size.toSize(), style = MaterialTheme.typography.bodySmall, ) Box( modifier = Modifier .padding(horizontal = MaterialTheme.padding.small / 2) .background(MaterialTheme.colorScheme.onSurface, CircleShape) .size(MaterialTheme.padding.small / 2), ) Text( text = pluralStringResource( pluralCount, count = item.entriesCount, item.entriesCount, ), style = MaterialTheme.typography.bodySmall, ) }, ) }, ) IconButton( onClick = { showDeleteDialog = true }, content = { Icon( imageVector = Icons.Default.Delete, contentDescription = stringResource(MR.strings.action_delete), ) }, ) }, ) if (showDeleteDialog) { ItemDeleteDialog( title = item.title, isManga = isManga, onDismissRequest = { showDeleteDialog = false }, onDelete = { onDelete(item.id) }, ) } } @Composable private fun ItemDeleteDialog( title: String, isManga: Boolean, onDismissRequest: () -> Unit, onDelete: () -> Unit, ) { AlertDialog( onDismissRequest = onDismissRequest, confirmButton = { TextButton( onClick = { onDelete() onDismissRequest() }, content = { Text(text = stringResource(MR.strings.action_ok)) }, ) }, dismissButton = { TextButton( onClick = onDismissRequest, content = { Text(text = stringResource(MR.strings.action_cancel)) }, ) }, title = { Text( text = stringResource( if (isManga) MR.strings.delete_downloads_for_manga else AYMR.strings.delete_downloads_for_anime, ), ) }, text = { Text( text = stringResource(AYMR.strings.delete_confirmation, title), ) }, ) } @Preview(showBackground = true) @Composable private fun StorageItemPreview() { StorageItem( item = StorageItem( id = 0L, title = "Manga Title", size = 123456789L, thumbnail = null, entriesCount = 123, color = Color.Red, ), isManga = true, onDelete = { }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/storage/StorageScreenContent.kt ================================================ package eu.kanade.presentation.more.storage import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Devices import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import eu.kanade.presentation.util.isTabletUi import tachiyomi.domain.category.model.Category import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.screens.LoadingScreen import kotlin.random.Random @Composable fun StorageScreenContent( state: StorageScreenState, isManga: Boolean, modifier: Modifier = Modifier, contentPadding: PaddingValues, onCategorySelected: (Category) -> Unit, onDelete: (Long) -> Unit, ) { when (state) { is StorageScreenState.Loading -> { LoadingScreen(modifier) } is StorageScreenState.Success -> { @Composable fun Info(modifier: Modifier = Modifier) { Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, content = { SelectStorageCategory( selectedCategory = state.selectedCategory, categories = state.categories, onCategorySelected = onCategorySelected, ) CumulativeStorage( modifier = Modifier .padding( horizontal = MaterialTheme.padding.small, vertical = MaterialTheme.padding.medium, ) .run { if (isTabletUi()) { this } else { padding(bottom = MaterialTheme.padding.medium) } }, items = state.items, ) }, ) } Row( modifier = modifier .padding(horizontal = MaterialTheme.padding.small) .padding(contentPadding), content = { if (isTabletUi()) { Info( modifier = Modifier .weight(2f) .padding(end = MaterialTheme.padding.extraLarge) .fillMaxHeight(), ) } LazyColumn( modifier = Modifier.weight(3f), content = { item { Spacer(Modifier.height(MaterialTheme.padding.small)) } item { if (!isTabletUi()) { Info() } } items( state.items.size, itemContent = { index -> StorageItem( item = state.items[index], isManga = isManga, onDelete = onDelete, ) Spacer(Modifier.height(MaterialTheme.padding.medium)) }, ) }, ) }, ) } } } @Preview(showBackground = true) @Composable private fun StorageScreenContentPreview() { val random = remember { Random(0) } val categories = remember { List(10) { Category( id = it.toLong(), name = "Category $it", 0L, 0L, false, ) } } StorageScreenContent( state = StorageScreenState.Success( items = List(20) { index -> StorageItem( id = index.toLong(), title = "Title $index", size = index * 10000000L, thumbnail = null, entriesCount = 100 * index, color = Color( random.nextInt(255), random.nextInt(255), random.nextInt(255), ), ) }, categories = categories, selectedCategory = categories[0], ), isManga = true, contentPadding = PaddingValues(0.dp), onCategorySelected = {}, onDelete = {}, ) } @Preview(showBackground = true, device = Devices.DESKTOP) @Composable private fun StorageTabletUiScreenContentPreview() { val random = remember { Random(0) } val categories = remember { List(10) { Category( id = it.toLong(), name = "Category $it", 0L, 0L, false, ) } } StorageScreenContent( state = StorageScreenState.Success( items = List(20) { index -> StorageItem( id = index.toLong(), title = "Title $index", size = index * 10000000L, thumbnail = null, entriesCount = 100 * index, color = Color( random.nextInt(255), random.nextInt(255), random.nextInt(255), ), ) }, categories = categories, selectedCategory = categories[0], ), isManga = true, contentPadding = PaddingValues(0.dp), onCategorySelected = {}, onDelete = {}, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/more/storage/StorageScreenState.kt ================================================ package eu.kanade.presentation.more.storage import androidx.compose.runtime.Immutable import tachiyomi.domain.category.model.Category sealed class StorageScreenState { @Immutable object Loading : StorageScreenState() @Immutable data class Success( val selectedCategory: Category, val items: List, val categories: List, ) : StorageScreenState() } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/ExpandableCard.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import android.annotation.SuppressLint import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material3.Card import androidx.compose.material3.CardColors import androidx.compose.material3.CardDefaults import androidx.compose.material3.CardElevation import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Shape import androidx.compose.ui.tooling.preview.Preview import tachiyomi.presentation.core.components.material.padding @SuppressLint("UnrememberedMutableState") @Composable fun ExpandableCard( isExpanded: Boolean, title: @Composable (Boolean) -> Unit, onExpand: (Boolean) -> Unit, modifier: Modifier = Modifier, colors: CardColors = CardDefaults.cardColors(), shape: Shape = CardDefaults.shape, border: BorderStroke? = null, elevation: CardElevation = CardDefaults.cardElevation(), content: @Composable () -> Unit, ) { val rotationState by animateFloatAsState(if (isExpanded) 0f else 180f, label = "card_rotation") Card( modifier = modifier.animateContentSize(), colors = colors, shape = shape, border = border, elevation = elevation, ) { Row( modifier = Modifier .clickable(onClick = { onExpand(!isExpanded) }) .padding(start = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { title(isExpanded) Spacer(Modifier.weight(1f)) IconButton( modifier = Modifier.rotate(rotationState), onClick = { onExpand(!isExpanded) }, ) { Icon(Icons.Default.ArrowDropDown, null) } } Box(Modifier.animateContentSize()) { if (isExpanded) content() } } } @Composable @Preview private fun PreviewExpandableCard() { var isExpanded by remember { mutableStateOf(true) } ExpandableCard( isExpanded, title = { Text("Hello World") }, content = { Text("SPOjao;sjd") }, onExpand = { isExpanded = it }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/ExposedTextDropDownMenu.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import kotlinx.collections.immutable.ImmutableList @Composable fun ExposedTextDropDownMenu( selectedValue: String, options: ImmutableList, label: String, onValueChangedEvent: (String) -> Unit, modifier: Modifier = Modifier, leadingIcon: (@Composable () -> Unit)? = null, ) { var expanded by remember { mutableStateOf(false) } ExposedDropdownMenuBox( expanded = expanded, onExpandedChange = { expanded = !expanded }, modifier = modifier, ) { OutlinedTextField( readOnly = true, value = selectedValue, onValueChange = {}, label = { Text(text = label) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, leadingIcon = leadingIcon, colors = OutlinedTextFieldDefaults.colors(), modifier = Modifier .menuAnchor(MenuAnchorType.PrimaryEditable) .fillMaxWidth(), ) ExposedDropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { options.forEach { option: String -> DropdownMenuItem( text = { Text(text = option) }, onClick = { expanded = false onValueChangedEvent(option) }, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/OutlinedNumericChooser.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AddCircle import androidx.compose.material.icons.filled.RemoveCircle import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.KeyboardType import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun OutlinedNumericChooser( value: Int, onChange: (Int) -> Unit, max: Int, step: Int, modifier: Modifier = Modifier, min: Int = 0, suffix: (@Composable () -> Unit)? = null, label: (@Composable () -> Unit)? = null, ) { assert(max > min) { "min can't be larger than max ($min > $max)" } Row( modifier = modifier, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { RepeatingIconButton(onClick = { onChange(value - step) }) { Icon(Icons.Filled.RemoveCircle, null) } var valueString by remember { mutableStateOf("$value") } LaunchedEffect(value) { if (valueString.isBlank() && value == 0) return@LaunchedEffect valueString = value.toString() } OutlinedTextField( label = label, value = valueString, onValueChange = { newValue -> if (newValue.isBlank()) { valueString = newValue onChange(0) } runCatching { val intValue = if (newValue.trimStart() == "-") -0 else newValue.toInt() onChange(intValue) valueString = newValue } }, isError = value > max || value < min, supportingText = { if (value > max) Text(stringResource(AYMR.strings.numeric_chooser_value_too_big)) if (value < min) Text(stringResource(AYMR.strings.numeric_chooser_value_too_small)) }, suffix = suffix, modifier = Modifier.weight(1f), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), ) RepeatingIconButton(onClick = { onChange(value + step) }) { Icon(Icons.Filled.AddCircle, null) } } } @Composable fun OutlinedNumericChooser( value: Float, onChange: (Float) -> Unit, max: Float, step: Float, modifier: Modifier = Modifier, min: Float = 0f, suffix: (@Composable () -> Unit)? = null, label: (@Composable () -> Unit)? = null, ) { assert(max > min) { "min can't be larger than max ($min > $max)" } Row( modifier, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { RepeatingIconButton(onClick = { onChange(value - step) }) { Icon(Icons.Filled.RemoveCircle, null) } var valueString by remember { mutableStateOf("$value") } LaunchedEffect(value) { if (valueString.isBlank() && value == 0f) return@LaunchedEffect valueString = value.toString().dropLastWhile { it == '0' }.dropLastWhile { it == '.' } } OutlinedTextField( value = valueString, label = label, onValueChange = { newValue -> if (newValue.isBlank()) { valueString = newValue onChange(0f) } runCatching { if (newValue.startsWith('.')) return@runCatching val floatValue = if (newValue.trimStart() == "-") -0f else newValue.toFloat() onChange(floatValue) valueString = newValue } }, isError = value > max || value < min, supportingText = { if (value > max) Text(stringResource(AYMR.strings.numeric_chooser_value_too_big)) if (value < min) Text(stringResource(AYMR.strings.numeric_chooser_value_too_small)) }, modifier = Modifier.weight(1f), maxLines = 1, suffix = suffix, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), ) RepeatingIconButton(onClick = { onChange(value + step) }) { Icon(Icons.Filled.AddCircle, null) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/OvalBox.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Outline import androidx.compose.ui.graphics.Path import androidx.compose.ui.graphics.Shape import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.LayoutDirection object RightSideOvalShape : Shape { override fun createOutline( size: Size, layoutDirection: LayoutDirection, density: Density, ): Outline { val path = Path().apply { moveTo(size.width, size.height) lineTo(size.width, 0f) lineTo(size.width / 10, 0f) cubicTo( size.width / 10, 0f, -30f, size.height / 2, size.width / 10, size.height, ) close() } return Outline.Generic(path) } } object LeftSideOvalShape : Shape { override fun createOutline( size: Size, layoutDirection: LayoutDirection, density: Density, ): Outline { val path = Path().apply { moveTo(0f, 0f) lineTo(0f, size.height) lineTo(size.width - size.width / 10, size.height) cubicTo( size.width - size.width / 10, size.height, size.width, size.height / 2, size.width - size.width / 10, 0f, ) close() } return Outline.Generic(path) } } @Preview @Composable private fun PreviewRightSideOvalBox() { Box( modifier = Modifier .fillMaxSize() .clip(RightSideOvalShape) .background(Color.Red), ) {} } @Preview @Composable private fun PreviewLeftSideOvalBox() { Box( modifier = Modifier .fillMaxSize() .clip(LeftSideOvalShape) .background(Color.Red), ) {} } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/PlayerSheet.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import android.content.res.Configuration.ORIENTATION_LANDSCAPE import androidx.activity.compose.BackHandler import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.animation.rememberSplineBasedDecay import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.AnchoredDraggableState import androidx.compose.foundation.gestures.DraggableAnchors import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.anchoredDraggable import androidx.compose.foundation.gestures.animateTo import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.shape.ZeroCornerSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch import kotlin.math.roundToInt private val sheetAnimationSpec = tween(350) @Composable fun PlayerSheet( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, tonalElevation: Dp = 1.dp, dismissEvent: Boolean = false, content: @Composable () -> Unit, ) { val scope = rememberCoroutineScope() val density = LocalDensity.current val latestOnDismissRequest by rememberUpdatedState(onDismissRequest) val maxWidth = if (LocalConfiguration.current.orientation == ORIENTATION_LANDSCAPE) { 720.dp } else { 420.dp } val maxHeight = LocalConfiguration.current.screenHeightDp.dp * .95f var backgroundAlpha by remember { mutableFloatStateOf(0f) } val alpha by animateFloatAsState( backgroundAlpha, animationSpec = sheetAnimationSpec, label = "alpha", ) val decayAnimationSpec = rememberSplineBasedDecay() val anchoredDraggableState = remember { AnchoredDraggableState( initialValue = 1, snapAnimationSpec = sheetAnimationSpec, decayAnimationSpec = decayAnimationSpec, positionalThreshold = { with(density) { 56.dp.toPx() } }, velocityThreshold = { with(density) { 125.dp.toPx() } }, ) } LaunchedEffect(dismissEvent) { if (dismissEvent) { backgroundAlpha = 0f anchoredDraggableState.animateTo(1) onDismissRequest() } } val internalOnDismissRequest = { if (anchoredDraggableState.currentValue == 0) { scope.launch { backgroundAlpha = 0f anchoredDraggableState.animateTo(1) } } } Box( modifier = Modifier .clickable( interactionSource = remember { MutableInteractionSource() }, indication = null, onClick = internalOnDismissRequest, ) .fillMaxSize() .background(Color.Black.copy(alpha)) .onSizeChanged { val anchors = DraggableAnchors { 0 at 0f 1 at it.height.toFloat() } anchoredDraggableState.updateAnchors(anchors) }, contentAlignment = Alignment.BottomCenter, ) { Surface( modifier = Modifier .sizeIn(maxWidth = maxWidth, maxHeight = maxHeight) .clickable( interactionSource = remember { MutableInteractionSource() }, indication = null, onClick = {}, ) .nestedScroll( remember(anchoredDraggableState) { anchoredDraggableState.preUpPostDownNestedScrollConnection() }, ) .then(modifier) .offset { IntOffset( 0, anchoredDraggableState.offset .takeIf { it.isFinite() } ?.roundToInt() ?: 0, ) } .anchoredDraggable( state = anchoredDraggableState, orientation = Orientation.Vertical, ) .windowInsetsPadding( WindowInsets.systemBars .only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal), ), shape = MaterialTheme.shapes.extraLarge.copy(bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize), tonalElevation = tonalElevation, content = { BackHandler( enabled = anchoredDraggableState.targetValue == 0, onBack = internalOnDismissRequest, ) content() }, ) LaunchedEffect(true) { backgroundAlpha = 0.5f } LaunchedEffect(anchoredDraggableState) { scope.launch { anchoredDraggableState.animateTo(0) } snapshotFlow { anchoredDraggableState.currentValue } .drop(1) .filter { it == 1 } .collectLatest { latestOnDismissRequest() } } } } private fun AnchoredDraggableState.preUpPostDownNestedScrollConnection() = object : NestedScrollConnection { override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { val delta = available.toFloat() return if (delta < 0 && source == NestedScrollSource.UserInput) { dispatchRawDelta(delta).toOffset() } else { Offset.Zero } } override fun onPostScroll( consumed: Offset, available: Offset, source: NestedScrollSource, ): Offset { return if (source == NestedScrollSource.UserInput) { dispatchRawDelta(available.toFloat()).toOffset() } else { Offset.Zero } } override suspend fun onPreFling(available: Velocity): Velocity { val toFling = available.toFloat() return if (toFling < 0 && offset > anchors.minAnchor()) { settle(toFling) available } else { Velocity.Zero } } override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { val toFling = available.toFloat() return if (toFling > 0) { settle(toFling) available } else { Velocity.Zero } } private fun Float.toOffset(): Offset = Offset(0f, this) @JvmName("velocityToFloat") private fun Velocity.toFloat() = y private fun Offset.toFloat(): Float = y } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/RepeatingIconButton.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import android.view.MotionEvent import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInteropFilter import kotlinx.coroutines.delay @OptIn(ExperimentalComposeUiApi::class) @Composable fun RepeatingIconButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, maxDelayMillis: Long = 750, minDelayMillis: Long = 5, delayDecayFactor: Float = .25f, content: @Composable () -> Unit, ) { val currentClickListener by rememberUpdatedState(onClick) var pressed by remember { mutableStateOf(false) } IconButton( modifier = modifier.pointerInteropFilter { pressed = when (it.action) { MotionEvent.ACTION_DOWN -> true else -> false } true }, onClick = {}, enabled = enabled, interactionSource = interactionSource, content = content, ) LaunchedEffect(pressed, enabled) { var currentDelayMillis = maxDelayMillis while (enabled && pressed) { currentClickListener() delay(currentDelayMillis) currentDelayMillis = (currentDelayMillis - (currentDelayMillis * delayDecayFactor)) .toLong().coerceAtLeast(minDelayMillis) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/SliderItem.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.TransformOrigin import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.dp import tachiyomi.presentation.core.components.material.padding @Composable fun SliderItem( label: String, value: Int, valueText: String, onChange: (Int) -> Unit, max: Int, modifier: Modifier = Modifier, min: Int = 0, icon: @Composable () -> Unit = {}, ) { val haptic = LocalHapticFeedback.current Row( modifier = modifier .fillMaxWidth() .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.large), ) { icon() Column(modifier = Modifier.weight(0.5f)) { Text( text = label, style = MaterialTheme.typography.bodyMedium, ) Text(valueText) } Slider( value = value.toFloat(), onValueChange = { val newValue = it.toInt() if (newValue != value) { onChange(newValue) haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) } }, modifier = Modifier.weight(1.5f), valueRange = min.toFloat()..max.toFloat(), steps = max - min, ) } } @Composable fun SliderItem( label: String, value: Float, valueText: String, onChange: (Float) -> Unit, max: Float, modifier: Modifier = Modifier, steps: Int = 0, min: Float = 0f, icon: @Composable () -> Unit = {}, ) { val haptic = LocalHapticFeedback.current Row( modifier = modifier .fillMaxWidth() .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.large), ) { icon() Column(modifier = Modifier.weight(0.5f)) { Text( text = label, style = MaterialTheme.typography.bodyMedium, ) Text(valueText) } Slider( value = value, onValueChange = { val newValue = it if (newValue != value) { onChange(newValue) haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) } }, modifier = Modifier.weight(1.5f), valueRange = min..max, steps = steps, ) } } @Composable fun VerticalSliderItem( label: String, value: Int, valueText: String, onChange: (Int) -> Unit, max: Int, modifier: Modifier = Modifier, min: Int = 0, icon: @Composable () -> Unit = {}, ) { val haptic = LocalHapticFeedback.current Column( modifier = modifier .fillMaxHeight() .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraLarge), horizontalAlignment = Alignment.CenterHorizontally, ) { icon() VerticalSlider( value = value, min = min, max = max, onValueChange = { haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) onChange(it) }, modifier = Modifier.weight(1f), ) Column { Text( text = label, style = MaterialTheme.typography.bodyMedium, ) Text(valueText) } } } @Composable fun VerticalSlider( value: Int, min: Int, max: Int, onValueChange: (Int) -> Unit, modifier: Modifier = Modifier, ) { Slider( modifier = modifier .graphicsLayer { rotationZ = 270f transformOrigin = TransformOrigin(0f, 0f) } .layout { measurable, constraints -> val placeable = measurable.measure( Constraints( minWidth = constraints.minHeight, maxWidth = constraints.maxHeight, minHeight = constraints.minWidth, maxHeight = constraints.maxWidth, ), ) layout(placeable.height, placeable.width) { placeable.place(-placeable.width, 0) } } .width(180.dp) .height(50.dp), value = value.toFloat(), valueRange = min.toFloat()..max.toFloat(), onValueChange = { onValueChange(it.toInt()) }, ) } @Preview @Composable private fun PreviewVerticalSliderItem() { VerticalSliderItem( "sex", 1, "2", {}, 5, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/SwitchPreference.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.selection.toggleable import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.Role import tachiyomi.presentation.core.components.material.padding @Composable fun SwitchPreference( value: Boolean, onValueChange: (Boolean) -> Unit, content: @Composable () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier .toggleable(value, true, Role.Switch, onValueChange) .padding(horizontal = MaterialTheme.padding.large, vertical = MaterialTheme.padding.small) .fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { content() Switch( checked = value, onCheckedChange = null, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/player/components/TintedSliderItem.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.presentation.player.components import androidx.annotation.IntRange import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider import androidx.compose.material3.SliderColors import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.tooling.preview.Preview import tachiyomi.presentation.core.components.material.padding import kotlin.math.max import kotlin.math.min @Composable fun TintedSliderItem( label: String, value: Int, valueText: String, onChange: (Int) -> Unit, max: Int, tint: Color, modifier: Modifier = Modifier, min: Int = 0, icon: @Composable () -> Unit = {}, ) { val haptic = LocalHapticFeedback.current Row( modifier = modifier .fillMaxWidth() .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.large), ) { icon() Column(modifier = Modifier.weight(0.5f)) { Text( text = label, style = MaterialTheme.typography.bodyMedium, ) Text(valueText) } TintedSlider( value = value.toFloat(), onValueChange = { val newValue = it.toInt() if (newValue != value) { onChange(newValue) haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) } }, modifier = Modifier.weight(1.5f), valueRange = min.toFloat()..max.toFloat(), steps = max - min, tint = tint, ) } } @Composable fun TintedSlider( value: Float, onValueChange: (Float) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, valueRange: ClosedFloatingPointRange = 0f..1f, @IntRange steps: Int = 0, onValueChangeFinished: (() -> Unit)? = null, tint: Color = MaterialTheme.colorScheme.primaryContainer, interactionSource: MutableInteractionSource = MutableInteractionSource(), ) { Slider( value = value, onValueChange = onValueChange, modifier = modifier, enabled = enabled, valueRange = valueRange, steps = steps, onValueChangeFinished = onValueChangeFinished, colors = generateSliderColors(tint), interactionSource = interactionSource, ) } @Preview @Composable private fun PreviewTintedSliderRed() { TintedSlider( 0.5f, {}, tint = Color.Red, ) } @Preview @Composable private fun PreviewTintedSliderItemRed() { TintedSliderItem( "slideritem red", 1, "1", {}, 20, tint = Color.Red, ) } fun generateSliderColors(baseColor: Color): SliderColors { // Utility function to darken a color fun darken(color: Color, factor: Float): Color { val red = max((color.red * factor), 0f) val green = max((color.green * factor), 0f) val blue = max((color.blue * factor), 0f) return Color(red, green, blue, color.alpha) } // Utility function to lighten a color fun lighten(color: Color, factor: Float): Color { val red = min((color.red + (1 - color.red) * factor), 255f) val green = min((color.green + (1 - color.green) * factor), 255f) val blue = min((color.blue + (1 - color.blue) * factor), 255f) return Color(red, green, blue, color.alpha) } return SliderColors( thumbColor = baseColor, activeTrackColor = lighten(baseColor, 0.2f), activeTickColor = lighten(baseColor, 0.4f), inactiveTrackColor = darken(baseColor, 0.2f), inactiveTickColor = darken(baseColor, 0.4f), disabledThumbColor = baseColor.copy(alpha = 0.5f), disabledActiveTrackColor = lighten(baseColor, 0.2f).copy(alpha = 0.5f), disabledActiveTickColor = lighten(baseColor, 0.4f).copy(alpha = 0.5f), disabledInactiveTrackColor = darken(baseColor, 0.2f).copy(alpha = 0.5f), disabledInactiveTickColor = darken(baseColor, 0.4f).copy(alpha = 0.5f), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/ChapterTransition.kt ================================================ package eu.kanade.presentation.reader import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.text.InlineTextContent import androidx.compose.foundation.text.appendInlineContent import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.outlined.Info import androidx.compose.material.icons.outlined.Warning import androidx.compose.material3.CardColors import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedCard import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.Placeholder import androidx.compose.ui.text.PlaceholderVerticalAlign import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.data.database.models.manga.toDomainChapter import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter import kotlinx.collections.immutable.persistentMapOf import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.service.calculateChapterGap import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun ChapterTransition( transition: ChapterTransition, currChapterDownloaded: Boolean, goingToChapterDownloaded: Boolean, ) { val currChapter = transition.from.chapter.toDomainChapter() val goingToChapter = transition.to?.chapter?.toDomainChapter() ProvideTextStyle(MaterialTheme.typography.bodyMedium) { when (transition) { is ChapterTransition.Prev -> { TransitionText( topLabel = stringResource(MR.strings.transition_previous), topChapter = goingToChapter, topChapterDownloaded = goingToChapterDownloaded, bottomLabel = stringResource(MR.strings.transition_current), bottomChapter = currChapter, bottomChapterDownloaded = currChapterDownloaded, fallbackLabel = stringResource(MR.strings.transition_no_previous), chapterGap = calculateChapterGap(currChapter, goingToChapter), ) } is ChapterTransition.Next -> { TransitionText( topLabel = stringResource(MR.strings.transition_finished), topChapter = currChapter, topChapterDownloaded = currChapterDownloaded, bottomLabel = stringResource(MR.strings.transition_next), bottomChapter = goingToChapter, bottomChapterDownloaded = goingToChapterDownloaded, fallbackLabel = stringResource(MR.strings.transition_no_next), chapterGap = calculateChapterGap(goingToChapter, currChapter), ) } } } } @Composable private fun TransitionText( topLabel: String, topChapter: Chapter?, topChapterDownloaded: Boolean, bottomLabel: String, bottomChapter: Chapter?, bottomChapterDownloaded: Boolean, fallbackLabel: String, chapterGap: Int, ) { Column( modifier = Modifier .widthIn(max = 460.dp) .fillMaxWidth(), ) { if (topChapter != null) { ChapterText( header = topLabel, name = topChapter.name, scanlator = topChapter.scanlator, downloaded = topChapterDownloaded, ) Spacer(Modifier.height(VerticalSpacerSize)) } else { NoChapterNotification( text = fallbackLabel, modifier = Modifier.align(Alignment.CenterHorizontally), ) } if (bottomChapter != null) { if (chapterGap > 0) { ChapterGapWarning( gapCount = chapterGap, modifier = Modifier.align(Alignment.CenterHorizontally), ) } Spacer(Modifier.height(VerticalSpacerSize)) ChapterText( header = bottomLabel, name = bottomChapter.name, scanlator = bottomChapter.scanlator, downloaded = bottomChapterDownloaded, ) } else { NoChapterNotification( text = fallbackLabel, modifier = Modifier.align(Alignment.CenterHorizontally), ) } } } @Composable private fun NoChapterNotification( text: String, modifier: Modifier = Modifier, ) { OutlinedCard( modifier = modifier, colors = CardColor, ) { Row( modifier = Modifier .padding(horizontal = 16.dp, vertical = 12.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Outlined.Info, tint = MaterialTheme.colorScheme.primary, contentDescription = null, ) Text( text = text, style = MaterialTheme.typography.bodyMedium, ) } } } @Composable private fun ChapterGapWarning( gapCount: Int, modifier: Modifier = Modifier, ) { OutlinedCard( modifier = modifier, colors = CardColor, ) { Row( modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Outlined.Warning, tint = MaterialTheme.colorScheme.error, contentDescription = null, ) Text( text = pluralStringResource( MR.plurals.missing_chapters_warning, count = gapCount, gapCount, ), style = MaterialTheme.typography.bodyMedium, ) } } } @Composable private fun ChapterHeaderText( text: String, modifier: Modifier = Modifier, ) { Text( text = text, modifier = modifier, style = MaterialTheme.typography.titleMedium, ) } @Composable private fun ChapterText( header: String, name: String, scanlator: String?, downloaded: Boolean, ) { Column { ChapterHeaderText( text = header, modifier = Modifier.padding(bottom = 4.dp), ) Text( text = buildAnnotatedString { if (downloaded) { appendInlineContent(DOWNLOADED_ICON_ID) append(' ') } append(name) }, fontSize = 20.sp, maxLines = 5, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleLarge, inlineContent = persistentMapOf( DOWNLOADED_ICON_ID to InlineTextContent( Placeholder( width = 22.sp, height = 22.sp, placeholderVerticalAlign = PlaceholderVerticalAlign.Center, ), ) { Icon( imageVector = Icons.Filled.CheckCircle, contentDescription = stringResource(MR.strings.label_downloaded), ) }, ), ) scanlator?.let { Text( text = it, modifier = Modifier .secondaryItemAlpha() .padding(top = 2.dp), maxLines = 2, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } } } private val CardColor: CardColors @Composable get() = CardDefaults.outlinedCardColors( containerColor = Color.Transparent, contentColor = MaterialTheme.colorScheme.onSurface, ) private val VerticalSpacerSize = 24.dp private const val DOWNLOADED_ICON_ID = "downloaded" private fun previewChapter(name: String, scanlator: String, chapterNumber: Double) = Chapter.create().copy( id = 0L, mangaId = 0L, url = "", name = name, scanlator = scanlator, chapterNumber = chapterNumber, ) private val FakeChapter = previewChapter( name = "Vol.1, Ch.1 - Fake Chapter Title", scanlator = "Scanlator Name", chapterNumber = 1.0, ) private val FakeGapChapter = previewChapter( name = "Vol.5, Ch.44 - Fake Gap Chapter Title", scanlator = "Scanlator Name", chapterNumber = 44.0, ) private val FakeChapterLongTitle = previewChapter( name = "Vol.1, Ch.0 - The Mundane Musings of a Metafictional Manga: A Chapter About a Chapter, Featuring" + " an Absurdly Long Title and a Surprisingly Normal Day in the Lives of Our Heroes, as They Grapple with the " + "Daily Challenges of Existence, from Paying Rent to Finding Love, All While Navigating the Strange World of " + "Fictional Realities and Reality-Bending Fiction, Where the Fourth Wall is Always in Danger of Being Broken " + "and the Line Between Author and Character is Forever Blurred.", scanlator = "Long Long Funny Scanlator Sniper Group Name Reborn", chapterNumber = 1.0, ) @PreviewLightDark @Composable private fun TransitionTextPreview() { TachiyomiPreviewTheme { Surface(modifier = Modifier.padding(48.dp)) { ChapterTransition( transition = ChapterTransition.Next( ReaderChapter(FakeChapter), ReaderChapter(FakeChapter), ), currChapterDownloaded = false, goingToChapterDownloaded = true, ) } } } @PreviewLightDark @Composable private fun TransitionTextLongTitlePreview() { TachiyomiPreviewTheme { Surface(modifier = Modifier.padding(48.dp)) { ChapterTransition( transition = ChapterTransition.Next( ReaderChapter(FakeChapterLongTitle), ReaderChapter(FakeChapter), ), currChapterDownloaded = true, goingToChapterDownloaded = true, ) } } } @PreviewLightDark @Composable private fun TransitionTextWithGapPreview() { TachiyomiPreviewTheme { Surface(modifier = Modifier.padding(48.dp)) { ChapterTransition( transition = ChapterTransition.Next( ReaderChapter(FakeChapter), ReaderChapter(FakeGapChapter), ), currChapterDownloaded = true, goingToChapterDownloaded = false, ) } } } @PreviewLightDark @Composable private fun TransitionTextNoNextPreview() { TachiyomiPreviewTheme { Surface(modifier = Modifier.padding(48.dp)) { ChapterTransition( transition = ChapterTransition.Next(ReaderChapter(FakeChapter), null), currChapterDownloaded = true, goingToChapterDownloaded = false, ) } } } @PreviewLightDark @Composable private fun TransitionTextNoPreviousPreview() { TachiyomiPreviewTheme { Surface(modifier = Modifier.padding(48.dp)) { ChapterTransition( transition = ChapterTransition.Prev(ReaderChapter(FakeChapter), null), currChapterDownloaded = true, goingToChapterDownloaded = false, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/DisplayRefreshHost.kt ================================================ package eu.kanade.presentation.reader import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import kotlinx.coroutines.delay import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.milliseconds @Stable class DisplayRefreshHost { internal var currentDisplayRefresh by mutableStateOf(false) private val readerPreferences = Injekt.get() internal val flashMillis = readerPreferences.flashDurationMillis() internal val flashMode = readerPreferences.flashColor() internal val flashIntervalPref = readerPreferences.flashPageInterval() // Internal State for Flash private var flashInterval = flashIntervalPref.get() private var timesCalled = 0 fun flash() { if (timesCalled % flashInterval == 0) { currentDisplayRefresh = true } timesCalled += 1 } fun setInterval(interval: Int) { flashInterval = interval timesCalled = 0 } } @Composable fun DisplayRefreshHost( hostState: DisplayRefreshHost, modifier: Modifier = Modifier, ) { val currentDisplayRefresh = hostState.currentDisplayRefresh val refreshDuration by hostState.flashMillis.collectAsState() val flashMode by hostState.flashMode.collectAsState() val flashInterval by hostState.flashIntervalPref.collectAsState() var currentColor by remember { mutableStateOf(null) } LaunchedEffect(currentDisplayRefresh) { if (!currentDisplayRefresh) { currentColor = null return@LaunchedEffect } val refreshDurationHalf = refreshDuration.milliseconds / 2 currentColor = if (flashMode == ReaderPreferences.FlashColor.BLACK) { Color.Black } else { Color.White } delay(refreshDurationHalf) if (flashMode == ReaderPreferences.FlashColor.WHITE_BLACK) { currentColor = Color.Black } delay(refreshDurationHalf) hostState.currentDisplayRefresh = false } LaunchedEffect(flashInterval) { hostState.setInterval(flashInterval) } Canvas( modifier = modifier.fillMaxSize(), ) { currentColor?.let { drawRect(it) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/OrientationSelectDialog.kt ================================================ package eu.kanade.presentation.reader import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import dev.icerock.moko.resources.StringResource import eu.kanade.domain.entries.manga.model.readerOrientation import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.presentation.reader.components.ModeSelectionDialog import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.SettingsIconGrid import tachiyomi.presentation.core.components.material.IconToggleButton import tachiyomi.presentation.core.i18n.stringResource private val ReaderOrientationsWithoutDefault = ReaderOrientation.entries - ReaderOrientation.DEFAULT @Composable fun OrientationSelectDialog( onDismissRequest: () -> Unit, screenModel: ReaderSettingsScreenModel, onChange: (StringResource) -> Unit, ) { val manga by screenModel.mangaFlow.collectAsState() val orientation = remember(manga) { ReaderOrientation.fromPreference( manga?.readerOrientation?.toInt(), ) } AdaptiveSheet(onDismissRequest = onDismissRequest) { DialogContent( orientation = orientation, onChangeOrientation = { screenModel.onChangeOrientation(it) onChange(it.stringRes) onDismissRequest() }, ) } } @Composable private fun DialogContent( orientation: ReaderOrientation, onChangeOrientation: (ReaderOrientation) -> Unit, ) { var selected by remember { mutableStateOf(orientation) } ModeSelectionDialog( onUseDefault = { onChangeOrientation( ReaderOrientation.DEFAULT, ) }.takeIf { orientation != ReaderOrientation.DEFAULT }, onApply = { onChangeOrientation(selected) }, ) { SettingsIconGrid(MR.strings.rotation_type) { items(ReaderOrientationsWithoutDefault) { mode -> IconToggleButton( checked = mode == selected, onCheckedChange = { selected = (mode) }, modifier = Modifier.fillMaxWidth(), imageVector = mode.icon, title = stringResource(mode.stringRes), ) } } } } @PreviewLightDark @Composable private fun DialogContentPreview() { TachiyomiPreviewTheme { Surface { Column { DialogContent( orientation = ReaderOrientation.DEFAULT, onChangeOrientation = {}, ) DialogContent( orientation = ReaderOrientation.FREE, onChangeOrientation = {}, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/PageIndicatorText.kt ================================================ package eu.kanade.presentation.reader import androidx.compose.foundation.layout.Box import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.sp import eu.kanade.presentation.theme.TachiyomiPreviewTheme @Composable fun PageIndicatorText( currentPage: Int, totalPages: Int, ) { if (currentPage <= 0 || totalPages <= 0) return val text = "$currentPage / $totalPages" val style = TextStyle( color = Color(235, 235, 235), fontSize = MaterialTheme.typography.bodySmall.fontSize, fontWeight = FontWeight.Bold, letterSpacing = 1.sp, ) val strokeStyle = style.copy( color = Color(45, 45, 45), drawStyle = Stroke(width = 4f), ) Box( contentAlignment = Alignment.Center, ) { Text( text = text, style = strokeStyle, ) Text( text = text, style = style, ) } } @PreviewLightDark @Composable private fun PageIndicatorTextPreview() { TachiyomiPreviewTheme { Surface { PageIndicatorText(currentPage = 10, totalPages = 69) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/ReaderContentOverlay.kt ================================================ package eu.kanade.presentation.reader import androidx.annotation.ColorInt import androidx.annotation.IntRange import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.BlendMode import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import kotlin.math.abs @Composable fun ReaderContentOverlay( @IntRange(from = -100, to = 100) brightness: Int, @ColorInt color: Int?, colorBlendMode: BlendMode?, modifier: Modifier = Modifier, ) { if (brightness < 0) { val brightnessAlpha = remember(brightness) { abs(brightness) / 100f } Canvas( modifier = modifier .fillMaxSize() .graphicsLayer { alpha = brightnessAlpha }, ) { drawRect(Color.Black) } } if (color != null) { Canvas( modifier = modifier .fillMaxSize(), ) { drawRect( color = Color(color), blendMode = colorBlendMode ?: BlendMode.SrcOver, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt ================================================ package eu.kanade.presentation.reader import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ContentCopy import androidx.compose.material.icons.outlined.Photo import androidx.compose.material.icons.outlined.Save import androidx.compose.material.icons.outlined.Share import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ActionButton import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ReaderPageActionsDialog( onDismissRequest: () -> Unit, onSetAsCover: () -> Unit, onShare: (Boolean) -> Unit, onSave: () -> Unit, ) { var showSetCoverDialog by remember { mutableStateOf(false) } AdaptiveSheet(onDismissRequest = onDismissRequest) { Row( modifier = Modifier.padding(vertical = 16.dp), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { ActionButton( modifier = Modifier.weight(1f), title = stringResource(MR.strings.set_as_cover), icon = Icons.Outlined.Photo, onClick = { showSetCoverDialog = true }, ) ActionButton( modifier = Modifier.weight(1f), title = stringResource(MR.strings.action_copy_to_clipboard), icon = Icons.Outlined.ContentCopy, onClick = { onShare(true) onDismissRequest() }, ) ActionButton( modifier = Modifier.weight(1f), title = stringResource(MR.strings.action_share), icon = Icons.Outlined.Share, onClick = { onShare(false) onDismissRequest() }, ) ActionButton( modifier = Modifier.weight(1f), title = stringResource(MR.strings.action_save), icon = Icons.Outlined.Save, onClick = { onSave() onDismissRequest() }, ) } } if (showSetCoverDialog) { SetCoverDialog( onConfirm = { onSetAsCover() showSetCoverDialog = false }, onDismiss = { showSetCoverDialog = false }, ) } } @Composable private fun SetCoverDialog( onConfirm: () -> Unit, onDismiss: () -> Unit, ) { AlertDialog( text = { Text(stringResource(MR.strings.confirm_set_image_as_cover)) }, confirmButton = { TextButton(onClick = onConfirm) { Text(stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismiss) { Text(stringResource(MR.strings.action_cancel)) } }, onDismissRequest = onDismiss, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/ReadingModeSelectDialog.kt ================================================ package eu.kanade.presentation.reader import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.PreviewLightDark import dev.icerock.moko.resources.StringResource import eu.kanade.domain.entries.manga.model.readingMode import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.presentation.reader.components.ModeSelectionDialog import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.SettingsIconGrid import tachiyomi.presentation.core.components.material.IconToggleButton import tachiyomi.presentation.core.i18n.stringResource private val ReadingModesWithoutDefault = ReadingMode.entries - ReadingMode.DEFAULT @Composable fun ReadingModeSelectDialog( onDismissRequest: () -> Unit, screenModel: ReaderSettingsScreenModel, onChange: (StringResource) -> Unit, ) { val manga by screenModel.mangaFlow.collectAsState() val readingMode = remember(manga) { ReadingMode.fromPreference( manga?.readingMode?.toInt(), ) } AdaptiveSheet(onDismissRequest = onDismissRequest) { DialogContent( readingMode = readingMode, onChangeReadingMode = { screenModel.onChangeReadingMode(it) onChange(it.stringRes) onDismissRequest() }, ) } } @Composable private fun DialogContent( readingMode: ReadingMode, onChangeReadingMode: (ReadingMode) -> Unit, ) { var selected by remember { mutableStateOf(readingMode) } ModeSelectionDialog( onUseDefault = { onChangeReadingMode(ReadingMode.DEFAULT) }.takeIf { readingMode != ReadingMode.DEFAULT }, onApply = { onChangeReadingMode(selected) }, ) { SettingsIconGrid(MR.strings.pref_category_reading_mode) { items(ReadingModesWithoutDefault) { mode -> IconToggleButton( checked = mode == selected, onCheckedChange = { selected = (mode) }, modifier = Modifier.fillMaxWidth(), imageVector = ImageVector.vectorResource(mode.iconRes), title = stringResource(mode.stringRes), ) } } } } @PreviewLightDark @Composable private fun DialogContentPreview() { TachiyomiPreviewTheme { Surface { Column { DialogContent( readingMode = ReadingMode.DEFAULT, onChangeReadingMode = {}, ) DialogContent( readingMode = ReadingMode.LEFT_TO_RIGHT, onChangeReadingMode = {}, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt ================================================ package eu.kanade.presentation.reader.appbars import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Settings import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable fun BottomReaderBar( backgroundColor: Color, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) { Row( modifier = Modifier .fillMaxWidth() .background(backgroundColor) .padding(8.dp), horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically, ) { IconButton(onClick = onClickReadingMode) { Icon( painter = painterResource(readingMode.iconRes), contentDescription = stringResource(MR.strings.viewer), ) } IconButton(onClick = onClickOrientation) { Icon( imageVector = orientation.icon, contentDescription = stringResource(MR.strings.rotation_type), ) } IconButton(onClick = onClickCropBorder) { Icon( painter = painterResource(if (cropEnabled) R.drawable.ic_crop_24dp else R.drawable.ic_crop_off_24dp), contentDescription = stringResource(MR.strings.pref_crop_borders), ) } IconButton(onClick = onClickSettings) { Icon( imageVector = Icons.Outlined.Settings, contentDescription = stringResource(MR.strings.action_settings), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt ================================================ package eu.kanade.presentation.reader.appbars import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.clickable import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Bookmark import androidx.compose.material.icons.outlined.BookmarkBorder import androidx.compose.material3.MaterialTheme import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.reader.components.ChapterNavigator import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.viewer.Viewer import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource private val animationSpec = tween(200) @Composable fun ReaderAppBars( visible: Boolean, fullscreen: Boolean, mangaTitle: String?, chapterTitle: String?, navigateUp: () -> Unit, onClickTopAppBar: () -> Unit, bookmarked: Boolean, onToggleBookmarked: () -> Unit, onOpenInWebView: (() -> Unit)?, onOpenInBrowser: (() -> Unit)?, onShare: (() -> Unit)?, viewer: Viewer?, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onPageIndexChange: (Int) -> Unit, readingMode: ReadingMode, onClickReadingMode: () -> Unit, orientation: ReaderOrientation, onClickOrientation: () -> Unit, cropEnabled: Boolean, onClickCropBorder: () -> Unit, onClickSettings: () -> Unit, ) { val isRtl = viewer is R2LPagerViewer val backgroundColor = MaterialTheme.colorScheme .surfaceColorAtElevation(3.dp) .copy(alpha = if (isSystemInDarkTheme()) 0.9f else 0.95f) val modifierWithInsetsPadding = if (fullscreen) { Modifier.systemBarsPadding() } else { Modifier } Column( modifier = Modifier.fillMaxHeight(), verticalArrangement = Arrangement.SpaceBetween, ) { AnimatedVisibility( visible = visible, enter = slideInVertically( initialOffsetY = { -it }, animationSpec = animationSpec, ), exit = slideOutVertically( targetOffsetY = { -it }, animationSpec = animationSpec, ), ) { AppBar( modifier = modifierWithInsetsPadding .clickable(onClick = onClickTopAppBar), backgroundColor = backgroundColor, title = mangaTitle, subtitle = chapterTitle, navigateUp = navigateUp, actions = { AppBarActions( actions = persistentListOf().builder() .apply { add( AppBar.Action( title = stringResource( if (bookmarked) { MR.strings.action_remove_bookmark } else { MR.strings.action_bookmark }, ), icon = if (bookmarked) { Icons.Outlined.Bookmark } else { Icons.Outlined.BookmarkBorder }, onClick = onToggleBookmarked, ), ) onOpenInWebView?.let { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_open_in_web_view), onClick = it, ), ) } onOpenInBrowser?.let { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_open_in_browser), onClick = it, ), ) } onShare?.let { add( AppBar.OverflowAction( title = stringResource(MR.strings.action_share), onClick = it, ), ) } } .build(), ) }, ) } Spacer(modifier = Modifier.weight(1f)) AnimatedVisibility( visible = visible, enter = slideInVertically( initialOffsetY = { it }, animationSpec = animationSpec, ), exit = slideOutVertically( targetOffsetY = { it }, animationSpec = animationSpec, ), ) { Column( modifier = modifierWithInsetsPadding, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { ChapterNavigator( isRtl = isRtl, onNextChapter = onNextChapter, enabledNext = enabledNext, onPreviousChapter = onPreviousChapter, enabledPrevious = enabledPrevious, currentPage = currentPage, totalPages = totalPages, onPageIndexChange = onPageIndexChange, ) BottomReaderBar( backgroundColor = backgroundColor, readingMode = readingMode, onClickReadingMode = onClickReadingMode, orientation = orientation, onClickOrientation = onClickOrientation, cropEnabled = cropEnabled, onClickCropBorder = onClickCropBorder, onClickSettings = onClickSettings, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt ================================================ package eu.kanade.presentation.reader.components import androidx.compose.foundation.background import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsDraggedAsState import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.SkipNext import androidx.compose.material.icons.outlined.SkipPrevious import androidx.compose.material3.FilledIconButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.util.isTabletUi import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Slider import tachiyomi.presentation.core.i18n.stringResource @Composable fun ChapterNavigator( isRtl: Boolean, onNextChapter: () -> Unit, enabledNext: Boolean, onPreviousChapter: () -> Unit, enabledPrevious: Boolean, currentPage: Int, totalPages: Int, onPageIndexChange: (Int) -> Unit, ) { val isTabletUi = isTabletUi() val horizontalPadding = if (isTabletUi) 24.dp else 8.dp val layoutDirection = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr val haptic = LocalHapticFeedback.current // Match with toolbar background color set in ReaderActivity val backgroundColor = MaterialTheme.colorScheme .surfaceColorAtElevation(3.dp) .copy(alpha = if (isSystemInDarkTheme()) 0.9f else 0.95f) val buttonColor = IconButtonDefaults.filledIconButtonColors( containerColor = backgroundColor, disabledContainerColor = backgroundColor, ) // We explicitly handle direction based on the reader viewer rather than the system direction CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = horizontalPadding), verticalAlignment = Alignment.CenterVertically, ) { FilledIconButton( enabled = if (isRtl) enabledNext else enabledPrevious, onClick = if (isRtl) onNextChapter else onPreviousChapter, colors = buttonColor, ) { Icon( imageVector = Icons.Outlined.SkipPrevious, contentDescription = stringResource( if (isRtl) MR.strings.action_next_chapter else MR.strings.action_previous_chapter, ), ) } if (totalPages > 1) { CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) { Row( modifier = Modifier .weight(1f) .clip(RoundedCornerShape(24.dp)) .background(backgroundColor) .padding(horizontal = 16.dp), verticalAlignment = Alignment.CenterVertically, ) { Box(contentAlignment = Alignment.CenterEnd) { Text(text = currentPage.toString()) // Taking up full length so the slider doesn't shift when 'currentPage' length changes Text(text = totalPages.toString(), color = Color.Transparent) } val interactionSource = remember { MutableInteractionSource() } val sliderDragged by interactionSource.collectIsDraggedAsState() LaunchedEffect(currentPage) { if (sliderDragged) { haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove) } } Slider( modifier = Modifier .weight(1f) .padding(horizontal = 8.dp), value = currentPage, valueRange = 1..totalPages, onValueChange = f@{ if (it == currentPage) return@f onPageIndexChange(it - 1) }, interactionSource = interactionSource, ) Text(text = totalPages.toString()) } } } else { Spacer(Modifier.weight(1f)) } FilledIconButton( enabled = if (isRtl) enabledPrevious else enabledNext, onClick = if (isRtl) onPreviousChapter else onNextChapter, colors = buttonColor, ) { Icon( imageVector = Icons.Outlined.SkipNext, contentDescription = stringResource( if (isRtl) MR.strings.action_previous_chapter else MR.strings.action_next_chapter, ), ) } } } } @Preview @Composable private fun ChapterNavigatorPreview() { var currentPage by remember { mutableIntStateOf(1) } TachiyomiPreviewTheme { ChapterNavigator( isRtl = false, onNextChapter = {}, enabledNext = true, onPreviousChapter = {}, enabledPrevious = true, currentPage = currentPage, totalPages = 10, onPageIndexChange = { currentPage = (it + 1) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/components/ModeSelectionDialog.kt ================================================ package eu.kanade.presentation.reader.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Check import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import eu.kanade.presentation.theme.TachiyomiPreviewTheme import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.SettingsItemsPaddings import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ModeSelectionDialog( onApply: () -> Unit, onUseDefault: (() -> Unit)? = null, content: @Composable () -> Unit, ) { Box(modifier = Modifier.padding(vertical = 16.dp)) { Column { content() Row( modifier = Modifier.padding( horizontal = SettingsItemsPaddings.Horizontal, ), ) { onUseDefault?.let { OutlinedButton(onClick = it) { Text(text = stringResource(MR.strings.action_revert_to_default)) } } Spacer(modifier = Modifier.weight(1f)) FilledTonalButton( onClick = onApply, ) { Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Outlined.Check, contentDescription = null, ) Text(text = stringResource(MR.strings.action_apply)) } } } } } } @PreviewLightDark @Composable private fun Preview() { TachiyomiPreviewTheme { Surface { Column { ModeSelectionDialog( onApply = {}, onUseDefault = {}, ) { Text("Dummy content") } ModeSelectionDialog( onApply = {}, ) { Text("Dummy content without default") } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/settings/ColorFilterPage.kt ================================================ package eu.kanade.presentation.reader.settings import androidx.compose.foundation.layout.ColumnScope import androidx.compose.material3.FilterChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.core.graphics.alpha import androidx.core.graphics.blue import androidx.core.graphics.green import androidx.core.graphics.red import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences.Companion.ColorFilterMode import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import tachiyomi.core.common.preference.getAndSet import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState @Composable internal fun ColumnScope.ColorFilterPage(screenModel: ReaderSettingsScreenModel) { val customBrightness by screenModel.preferences.customBrightness().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_custom_brightness), pref = screenModel.preferences.customBrightness(), ) /** * Sets the brightness of the screen. Range is [-75, 100]. * From -75 to -1 a semi-transparent black view is shown at the top with the minimum brightness. * From 1 to 100 it sets that value as brightness. * 0 sets system brightness and hides the overlay. */ if (customBrightness) { val customBrightnessValue by screenModel.preferences.customBrightnessValue().collectAsState() SliderItem( value = customBrightnessValue, valueRange = -75..100, steps = 0, label = stringResource(MR.strings.pref_custom_brightness), onChange = { screenModel.preferences.customBrightnessValue().set(it) }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) } val colorFilter by screenModel.preferences.colorFilter().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_custom_color_filter), pref = screenModel.preferences.colorFilter(), ) if (colorFilter) { val colorFilterValue by screenModel.preferences.colorFilterValue().collectAsState() SliderItem( value = colorFilterValue.red, valueRange = 0..255, steps = 0, label = stringResource(MR.strings.color_filter_r_value), onChange = { newRValue -> screenModel.preferences.colorFilterValue().getAndSet { getColorValue(it, newRValue, RED_MASK, 16) } }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) SliderItem( value = colorFilterValue.green, valueRange = 0..255, steps = 0, label = stringResource(MR.strings.color_filter_g_value), onChange = { newGValue -> screenModel.preferences.colorFilterValue().getAndSet { getColorValue(it, newGValue, GREEN_MASK, 8) } }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) SliderItem( value = colorFilterValue.blue, valueRange = 0..255, steps = 0, label = stringResource(MR.strings.color_filter_b_value), onChange = { newBValue -> screenModel.preferences.colorFilterValue().getAndSet { getColorValue(it, newBValue, BLUE_MASK, 0) } }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) SliderItem( value = colorFilterValue.alpha, valueRange = 0..255, steps = 0, label = stringResource(MR.strings.color_filter_a_value), onChange = { newAValue -> screenModel.preferences.colorFilterValue().getAndSet { getColorValue(it, newAValue, ALPHA_MASK, 24) } }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) val colorFilterMode by screenModel.preferences.colorFilterMode().collectAsState() SettingsChipRow(MR.strings.pref_color_filter_mode) { ColorFilterMode.mapIndexed { index, it -> FilterChip( selected = colorFilterMode == index, onClick = { screenModel.preferences.colorFilterMode().set(index) }, label = { Text(stringResource(it.first)) }, ) } } } CheckboxItem( label = stringResource(MR.strings.pref_grayscale), pref = screenModel.preferences.grayscale(), ) CheckboxItem( label = stringResource(MR.strings.pref_inverted_colors), pref = screenModel.preferences.invertedColors(), ) } private fun getColorValue(currentColor: Int, color: Int, mask: Long, bitShift: Int): Int { return (color shl bitShift) or (currentColor and mask.inv().toInt()) } private const val ALPHA_MASK: Long = 0xFF000000 private const val RED_MASK: Long = 0x00FF0000 private const val GREEN_MASK: Long = 0x0000FF00 private const val BLUE_MASK: Long = 0x000000FF ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt ================================================ package eu.kanade.presentation.reader.settings import androidx.compose.foundation.layout.ColumnScope import androidx.compose.material3.FilterChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState private val themes = listOf( MR.strings.black_background to 1, MR.strings.gray_background to 2, MR.strings.white_background to 0, MR.strings.automatic_background to 3, ) private val flashColors = listOf( MR.strings.pref_flash_style_black to ReaderPreferences.FlashColor.BLACK, MR.strings.pref_flash_style_white to ReaderPreferences.FlashColor.WHITE, MR.strings.pref_flash_style_white_black to ReaderPreferences.FlashColor.WHITE_BLACK, ) @Composable internal fun ColumnScope.GeneralPage(screenModel: ReaderSettingsScreenModel) { val readerTheme by screenModel.preferences.readerTheme().collectAsState() val flashPageState by screenModel.preferences.flashOnPageChange().collectAsState() val flashMillisPref = screenModel.preferences.flashDurationMillis() val flashMillis by flashMillisPref.collectAsState() val flashIntervalPref = screenModel.preferences.flashPageInterval() val flashInterval by flashIntervalPref.collectAsState() val flashColorPref = screenModel.preferences.flashColor() val flashColor by flashColorPref.collectAsState() SettingsChipRow(MR.strings.pref_reader_theme) { themes.map { (labelRes, value) -> FilterChip( selected = readerTheme == value, onClick = { screenModel.preferences.readerTheme().set(value) }, label = { Text(stringResource(labelRes)) }, ) } } CheckboxItem( label = stringResource(MR.strings.pref_show_page_number), pref = screenModel.preferences.showPageNumber(), ) CheckboxItem( label = stringResource(MR.strings.pref_fullscreen), pref = screenModel.preferences.fullscreen(), ) if (screenModel.hasDisplayCutout && screenModel.preferences.fullscreen().get()) { CheckboxItem( label = stringResource(MR.strings.pref_cutout_short), pref = screenModel.preferences.cutoutShort(), ) } CheckboxItem( label = stringResource(MR.strings.pref_keep_screen_on), pref = screenModel.preferences.keepScreenOn(), ) CheckboxItem( label = stringResource(MR.strings.pref_read_with_long_tap), pref = screenModel.preferences.readWithLongTap(), ) CheckboxItem( label = stringResource(MR.strings.pref_always_show_chapter_transition), pref = screenModel.preferences.alwaysShowChapterTransition(), ) CheckboxItem( label = stringResource(MR.strings.pref_page_transitions), pref = screenModel.preferences.pageTransitions(), ) CheckboxItem( label = stringResource(MR.strings.pref_flash_page), pref = screenModel.preferences.flashOnPageChange(), ) if (flashPageState) { SliderItem( value = flashMillis / ReaderPreferences.MILLI_CONVERSION, valueRange = 1..15, label = stringResource(MR.strings.pref_flash_duration), valueText = stringResource(MR.strings.pref_flash_duration_summary, flashMillis), onChange = { flashMillisPref.set(it * ReaderPreferences.MILLI_CONVERSION) }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) SliderItem( value = flashInterval, valueRange = 1..10, label = stringResource(MR.strings.pref_flash_page_interval), valueText = pluralStringResource(MR.plurals.pref_pages, flashInterval, flashInterval), onChange = { flashIntervalPref.set(it) }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) SettingsChipRow(MR.strings.pref_flash_with) { flashColors.map { (labelRes, value) -> FilterChip( selected = flashColor == value, onClick = { flashColorPref.set(value) }, label = { Text(stringResource(labelRes)) }, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/settings/ReaderSettingsDialog.kt ================================================ package eu.kanade.presentation.reader.settings import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalView import androidx.compose.ui.window.DialogWindowProvider import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable fun ReaderSettingsDialog( onDismissRequest: () -> Unit, onShowMenus: () -> Unit, onHideMenus: () -> Unit, screenModel: ReaderSettingsScreenModel, ) { val tabTitles = persistentListOf( stringResource(MR.strings.pref_category_reading_mode), stringResource(MR.strings.pref_category_general), stringResource(MR.strings.custom_filter), ) val pagerState = rememberPagerState { tabTitles.size } BoxWithConstraints { TabbedDialog( modifier = Modifier.heightIn(max = maxHeight * 0.75f), onDismissRequest = { onDismissRequest() onShowMenus() }, tabTitles = tabTitles, pagerState = pagerState, ) { page -> val window = (LocalView.current.parent as? DialogWindowProvider)?.window LaunchedEffect(pagerState.currentPage) { if (pagerState.currentPage == 2) { window?.setDimAmount(0f) onHideMenus() } else { window?.setDimAmount(0.5f) onShowMenus() } } Column( modifier = Modifier .padding(vertical = TabbedDialogPaddings.Vertical) .verticalScroll(rememberScrollState()), ) { when (page) { 0 -> ReadingModePage(screenModel) 1 -> GeneralPage(screenModel) 2 -> ColorFilterPage(screenModel) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/reader/settings/ReadingModePage.kt ================================================ package eu.kanade.presentation.reader.settings import androidx.compose.foundation.layout.ColumnScope import androidx.compose.material3.FilterChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import eu.kanade.domain.entries.manga.model.readerOrientation import eu.kanade.domain.entries.manga.model.readingMode import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.SettingsChipRow import tachiyomi.presentation.core.components.SliderItem import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import java.text.NumberFormat @Composable internal fun ColumnScope.ReadingModePage(screenModel: ReaderSettingsScreenModel) { HeadingItem(MR.strings.pref_category_for_this_series) val manga by screenModel.mangaFlow.collectAsState() val readingMode = remember(manga) { ReadingMode.fromPreference( manga?.readingMode?.toInt(), ) } SettingsChipRow(MR.strings.pref_category_reading_mode) { ReadingMode.entries.map { FilterChip( selected = it == readingMode, onClick = { screenModel.onChangeReadingMode(it) }, label = { Text(stringResource(it.stringRes)) }, ) } } val orientation = remember(manga) { ReaderOrientation.fromPreference( manga?.readerOrientation?.toInt(), ) } SettingsChipRow(MR.strings.rotation_type) { ReaderOrientation.entries.map { FilterChip( selected = it == orientation, onClick = { screenModel.onChangeOrientation(it) }, label = { Text(stringResource(it.stringRes)) }, ) } } val viewer by screenModel.viewerFlow.collectAsState() if (viewer is WebtoonViewer) { WebtoonViewerSettings(screenModel) } else { PagerViewerSettings(screenModel) } } @Composable private fun ColumnScope.PagerViewerSettings(screenModel: ReaderSettingsScreenModel) { HeadingItem(MR.strings.pager_viewer) val navigationModePager by screenModel.preferences.navigationModePager().collectAsState() val pagerNavInverted by screenModel.preferences.pagerNavInverted().collectAsState() TapZonesItems( selected = navigationModePager, onSelect = screenModel.preferences.navigationModePager()::set, invertMode = pagerNavInverted, onSelectInvertMode = screenModel.preferences.pagerNavInverted()::set, ) val imageScaleType by screenModel.preferences.imageScaleType().collectAsState() SettingsChipRow(MR.strings.pref_image_scale_type) { ReaderPreferences.ImageScaleType.mapIndexed { index, it -> FilterChip( selected = imageScaleType == index + 1, onClick = { screenModel.preferences.imageScaleType().set(index + 1) }, label = { Text(stringResource(it)) }, ) } } val zoomStart by screenModel.preferences.zoomStart().collectAsState() SettingsChipRow(MR.strings.pref_zoom_start) { ReaderPreferences.ZoomStart.mapIndexed { index, it -> FilterChip( selected = zoomStart == index + 1, onClick = { screenModel.preferences.zoomStart().set(index + 1) }, label = { Text(stringResource(it)) }, ) } } CheckboxItem( label = stringResource(MR.strings.pref_crop_borders), pref = screenModel.preferences.cropBorders(), ) CheckboxItem( label = stringResource(MR.strings.pref_landscape_zoom), pref = screenModel.preferences.landscapeZoom(), ) CheckboxItem( label = stringResource(MR.strings.pref_navigate_pan), pref = screenModel.preferences.navigateToPan(), ) val dualPageSplitPaged by screenModel.preferences.dualPageSplitPaged().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_dual_page_split), pref = screenModel.preferences.dualPageInvertPaged(), ) if (dualPageSplitPaged) { CheckboxItem( label = stringResource(MR.strings.pref_dual_page_invert), pref = screenModel.preferences.dualPageRotateToFitInvert(), ) } val dualPageRotateToFit by screenModel.preferences.dualPageRotateToFit().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_page_rotate), pref = screenModel.preferences.dualPageRotateToFit(), ) if (dualPageRotateToFit) { CheckboxItem( label = stringResource(MR.strings.pref_page_rotate_invert), pref = screenModel.preferences.dualPageRotateToFitInvert(), ) } } @Composable private fun ColumnScope.WebtoonViewerSettings(screenModel: ReaderSettingsScreenModel) { val numberFormat = remember { NumberFormat.getPercentInstance() } HeadingItem(MR.strings.webtoon_viewer) val navigationModeWebtoon by screenModel.preferences.navigationModeWebtoon().collectAsState() val webtoonNavInverted by screenModel.preferences.webtoonNavInverted().collectAsState() TapZonesItems( selected = navigationModeWebtoon, onSelect = screenModel.preferences.navigationModeWebtoon()::set, invertMode = webtoonNavInverted, onSelectInvertMode = screenModel.preferences.webtoonNavInverted()::set, ) val webtoonSidePadding by screenModel.preferences.webtoonSidePadding().collectAsState() SliderItem( value = webtoonSidePadding, valueRange = ReaderPreferences.let { it.WEBTOON_PADDING_MIN..it.WEBTOON_PADDING_MAX }, label = stringResource(MR.strings.pref_webtoon_side_padding), valueText = numberFormat.format(webtoonSidePadding / 100f), onChange = { screenModel.preferences.webtoonSidePadding().set(it) }, pillColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) CheckboxItem( label = stringResource(MR.strings.pref_crop_borders), pref = screenModel.preferences.cropBordersWebtoon(), ) val dualPageSplitWebtoon by screenModel.preferences.dualPageSplitWebtoon().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_dual_page_split), pref = screenModel.preferences.dualPageSplitWebtoon(), ) if (dualPageSplitWebtoon) { CheckboxItem( label = stringResource(MR.strings.pref_dual_page_invert), pref = screenModel.preferences.dualPageInvertWebtoon(), ) } val dualPageRotateToFitWebtoon by screenModel.preferences.dualPageRotateToFitWebtoon().collectAsState() CheckboxItem( label = stringResource(MR.strings.pref_page_rotate), pref = screenModel.preferences.dualPageRotateToFitWebtoon(), ) if (dualPageRotateToFitWebtoon) { CheckboxItem( label = stringResource(MR.strings.pref_page_rotate_invert), pref = screenModel.preferences.dualPageRotateToFitInvertWebtoon(), ) } CheckboxItem( label = stringResource(MR.strings.pref_double_tap_zoom), pref = screenModel.preferences.webtoonDoubleTapZoomEnabled(), ) CheckboxItem( label = stringResource(MR.strings.pref_webtoon_disable_zoom_out), pref = screenModel.preferences.webtoonDisableZoomOut(), ) } @Composable private fun ColumnScope.TapZonesItems( selected: Int, onSelect: (Int) -> Unit, invertMode: ReaderPreferences.TappingInvertMode, onSelectInvertMode: (ReaderPreferences.TappingInvertMode) -> Unit, ) { SettingsChipRow(MR.strings.pref_viewer_nav) { ReaderPreferences.TapZones.mapIndexed { index, it -> FilterChip( selected = selected == index, onClick = { onSelect(index) }, label = { Text(stringResource(it)) }, ) } } if (selected != 5) { SettingsChipRow(MR.strings.pref_read_with_tapping_inverted) { ReaderPreferences.TappingInvertMode.entries.map { FilterChip( selected = it == invertMode, onClick = { onSelectInvertMode(it) }, label = { Text(stringResource(it.titleRes)) }, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/TachiyomiTheme.kt ================================================ package eu.kanade.presentation.theme import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material3.ColorScheme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RippleConfiguration import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.AppTheme import eu.kanade.presentation.theme.colorscheme.BaseColorScheme import eu.kanade.presentation.theme.colorscheme.CloudflareColorScheme import eu.kanade.presentation.theme.colorscheme.CottoncandyColorScheme import eu.kanade.presentation.theme.colorscheme.DoomColorScheme import eu.kanade.presentation.theme.colorscheme.GreenAppleColorScheme import eu.kanade.presentation.theme.colorscheme.LavenderColorScheme import eu.kanade.presentation.theme.colorscheme.MatrixColorScheme import eu.kanade.presentation.theme.colorscheme.MidnightDuskColorScheme import eu.kanade.presentation.theme.colorscheme.MochaColorScheme import eu.kanade.presentation.theme.colorscheme.MonetColorScheme import eu.kanade.presentation.theme.colorscheme.MonochromeColorScheme import eu.kanade.presentation.theme.colorscheme.NordColorScheme import eu.kanade.presentation.theme.colorscheme.SapphireColorScheme import eu.kanade.presentation.theme.colorscheme.StrawberryColorScheme import eu.kanade.presentation.theme.colorscheme.TachiyomiColorScheme import eu.kanade.presentation.theme.colorscheme.TakoColorScheme import eu.kanade.presentation.theme.colorscheme.TealTurqoiseColorScheme import eu.kanade.presentation.theme.colorscheme.TidalWaveColorScheme import eu.kanade.presentation.theme.colorscheme.YinYangColorScheme import eu.kanade.presentation.theme.colorscheme.YotsubaColorScheme import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun TachiyomiTheme( appTheme: AppTheme? = null, amoled: Boolean? = null, content: @Composable () -> Unit, ) { val uiPreferences = Injekt.get() BaseTachiyomiTheme( appTheme = appTheme ?: uiPreferences.appTheme().get(), isAmoled = amoled ?: uiPreferences.themeDarkAmoled().get(), content = content, ) } @Composable fun TachiyomiPreviewTheme( appTheme: AppTheme = AppTheme.DEFAULT, isAmoled: Boolean = false, content: @Composable () -> Unit, ) = BaseTachiyomiTheme(appTheme, isAmoled, content) @Composable private fun BaseTachiyomiTheme( appTheme: AppTheme, isAmoled: Boolean, content: @Composable () -> Unit, ) { MaterialTheme( colorScheme = getThemeColorScheme(appTheme, isAmoled), content = content, ) } @Composable @ReadOnlyComposable private fun getThemeColorScheme( appTheme: AppTheme, isAmoled: Boolean, ): ColorScheme { val uiPreferences = Injekt.get() val colorScheme = if (appTheme == AppTheme.MONET) { MonetColorScheme(LocalContext.current) } else { colorSchemes.getOrDefault(appTheme, TachiyomiColorScheme) } return colorScheme.getColorScheme( isSystemInDarkTheme(), isAmoled, ) } private const val RIPPLE_DRAGGED_ALPHA = .1f private const val RIPPLE_FOCUSED_ALPHA = .1f private const val RIPPLE_HOVERED_ALPHA = .1f private const val RIPPLE_PRESSED_ALPHA = .1f val playerRippleConfiguration @Composable get() = RippleConfiguration( color = if (isSystemInDarkTheme()) Color.White else Color.Black, rippleAlpha = RippleAlpha( draggedAlpha = RIPPLE_DRAGGED_ALPHA, focusedAlpha = RIPPLE_FOCUSED_ALPHA, hoveredAlpha = RIPPLE_HOVERED_ALPHA, pressedAlpha = RIPPLE_PRESSED_ALPHA, ), ) private val colorSchemes: Map = mapOf( AppTheme.DEFAULT to TachiyomiColorScheme, AppTheme.CLOUDFLARE to CloudflareColorScheme, AppTheme.COTTONCANDY to CottoncandyColorScheme, AppTheme.DOOM to DoomColorScheme, AppTheme.GREEN_APPLE to GreenAppleColorScheme, AppTheme.LAVENDER to LavenderColorScheme, AppTheme.MATRIX to MatrixColorScheme, AppTheme.MIDNIGHT_DUSK to MidnightDuskColorScheme, AppTheme.MONOCHROME to MonochromeColorScheme, AppTheme.MOCHA to MochaColorScheme, AppTheme.SAPPHIRE to SapphireColorScheme, AppTheme.NORD to NordColorScheme, AppTheme.STRAWBERRY_DAIQUIRI to StrawberryColorScheme, AppTheme.TAKO to TakoColorScheme, AppTheme.TEALTURQUOISE to TealTurqoiseColorScheme, AppTheme.TIDAL_WAVE to TidalWaveColorScheme, AppTheme.YINYANG to YinYangColorScheme, AppTheme.YOTSUBA to YotsubaColorScheme, ) ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/BaseColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.ColorScheme import androidx.compose.ui.graphics.Color internal abstract class BaseColorScheme { abstract val darkScheme: ColorScheme abstract val lightScheme: ColorScheme // Cannot be pure black as there's content scrolling behind it // https://m3.material.io/components/navigation-bar/guidelines#90615a71-607e-485e-9e09-778bfc080563 private val surfaceContainer = Color(0xFF0C0C0C) private val surfaceContainerHigh = Color(0xFF131313) private val surfaceContainerHighest = Color(0xFF1B1B1B) fun getColorScheme(isDark: Boolean, isAmoled: Boolean): ColorScheme { if (!isDark) return lightScheme if (!isAmoled) return darkScheme return darkScheme.copy( background = Color.Black, onBackground = Color.White, surface = Color.Black, onSurface = Color.White, surfaceVariant = surfaceContainer, // Navigation bar background (ThemePrefWidget) surfaceContainerLowest = surfaceContainer, surfaceContainerLow = surfaceContainer, surfaceContainer = surfaceContainer, // Navigation bar background surfaceContainerHigh = surfaceContainerHigh, surfaceContainerHighest = surfaceContainerHighest, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/CloudflareColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Clouflare theme * Original color scheme by LuftVerbot * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFF38020 * Secondary 0xFFF38020 * Tertiary 0xFF1B1B22 * Neutral 0xFF655C5A */ internal object CloudflareColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFF38020), onPrimary = Color(0xFF1B1B22), primaryContainer = Color(0xFFF38020), onPrimaryContainer = Color(0xFF1B1B22), inversePrimary = Color(0xFFD6BAFF), // Assuming 'inversePrimary' maps to 'cloudflare_primaryInverse' secondary = Color(0xFFF38020), onSecondary = Color(0xFF1B1B22), secondaryContainer = Color(0xFFF38020), onSecondaryContainer = Color(0xFF1B1B22), tertiary = Color(0xFF1B1B22), onTertiary = Color(0xFFF38020), tertiaryContainer = Color(0xFF1B1B22), onTertiaryContainer = Color(0xFFF38020), background = Color(0xFF1B1B22), onBackground = Color(0xFFEFF2F5), surface = Color(0xFF1B1B22), onSurface = Color(0xFFEFF2F5), surfaceVariant = Color(0xFF3F3F46), onSurfaceVariant = Color(0xFFD8FFFFFF), surfaceTint = Color(0xFFF38020), // Assuming 'surfaceTint' maps to 'cloudflare_primary' or similar inverseSurface = Color(0xFFF3EFF4), inverseOnSurface = Color(0xFF313033), outline = Color(0xFFF38020), ) override val lightScheme = lightColorScheme( primary = Color(0xFFF38020), onPrimary = Color(0xFFEFF2F5), primaryContainer = Color(0xFFF38020), onPrimaryContainer = Color(0xFFEFF2F5), inversePrimary = Color(0xFFD6BAFF), // Assuming 'inversePrimary' maps to 'cloudflare_primaryInverse' secondary = Color(0xFFF38020), onSecondary = Color(0xFFEFF2F5), secondaryContainer = Color(0xFFF38020), onSecondaryContainer = Color(0xFFEFF2F5), tertiary = Color(0xFFEFF2F5), onTertiary = Color(0xFFF38020), tertiaryContainer = Color(0xFFEFF2F5), onTertiaryContainer = Color(0xFFF38020), background = Color(0xFFEFF2F5), onBackground = Color(0xFF1B1B22), surface = Color(0xFFEFF2F5), onSurface = Color(0xFF1B1B22), surfaceVariant = Color(0xFFB9B0CC), onSurfaceVariant = Color(0xFFD849454E), surfaceTint = Color(0xFFF38020), // Assuming 'surfaceTint' maps to 'cloudflare_primary' or similar inverseSurface = Color(0xFF313033), inverseOnSurface = Color(0xFFF3EFF4), outline = Color(0xFFF38020), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/CottoncandyColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Cottoncandy theme * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFF38020 * Secondary 0xFFF38020 * Tertiary 0xFF1B1B22 * Neutral 0xFF655C5A */ internal object CottoncandyColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFFFB1C1), onPrimary = Color(0xFF5F112B), primaryContainer = Color(0xFF7C2941), onPrimaryContainer = Color(0xFFFFD9DF), secondary = Color(0xFF64D3FF), onSecondary = Color(0xFF003546), secondaryContainer = Color(0xFF004D63), onSecondaryContainer = Color(0xFFBCE9FF), tertiary = Color(0xFFFFB1C1), onTertiary = Color(0xFF5F112B), // Note: onTertiary color is assumed tertiaryContainer = Color(0xFF7C2941), onTertiaryContainer = Color(0xFFFFD9DF), background = Color(0xFF201A1B), onBackground = Color(0xFFECE0E0), surface = Color(0xFF201A1B), onSurface = Color(0xFFECE0E0), surfaceVariant = Color(0xFF524345), onSurfaceVariant = Color(0xFFD6C2C4), surfaceTint = Color(0xFFFFB1C1), inverseSurface = Color(0xFFECE0E0), inverseOnSurface = Color(0xFF201A1B), outline = Color(0xFF9F8C8F), inversePrimary = Color(0xFF9A4058), ) override val lightScheme = lightColorScheme( primary = Color(0xFF9A4058), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFFFD9DF), onPrimaryContainer = Color(0xFF3F0017), secondary = Color(0xFF5BCEFA), onSecondary = Color(0xFFFFFFFF), secondaryContainer = Color(0xFFBCE9FF), onSecondaryContainer = Color(0xFF001F2A), tertiary = Color(0xFF9A4058), onTertiary = Color(0xFFFFFFFF), tertiaryContainer = Color(0xFFFFD9DF), onTertiaryContainer = Color(0xFF3F0017), background = Color(0xFFFFFBFF), onBackground = Color(0xFF201A1B), surface = Color(0xFFFFFBFF), onSurface = Color(0xFF201A1B), surfaceVariant = Color(0xFFF3DDE0), onSurfaceVariant = Color(0xFF524345), surfaceTint = Color(0xFF9A4058), inverseSurface = Color(0xFF352F30), inverseOnSurface = Color(0xFFFAEEEF), outline = Color(0xFF847375), inversePrimary = Color(0xFFFFB1C1), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/DoomColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Doom theme * Original color scheme by LuftVerbot * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFF38020 * Secondary 0xFFF38020 * Tertiary 0xFF1B1B22 * Neutral 0xFF655C5A */ internal object DoomColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFFF0000), onPrimary = Color(0xFFFAFAFA), primaryContainer = Color(0xFFFF0000), onPrimaryContainer = Color(0xFFFAFAFA), secondary = Color(0xFFFF0000), onSecondary = Color(0xFFFAFAFA), secondaryContainer = Color(0xFFFF0000), onSecondaryContainer = Color(0xFFFAFAFA), tertiary = Color(0xFFBFBFBF), onTertiary = Color(0xFFFF0000), tertiaryContainer = Color(0xFFBFBFBF), onTertiaryContainer = Color(0xFFFF0000), background = Color(0xFF1B1B1B), onBackground = Color(0xFFFFFFFF), surface = Color(0xFF1B1B1B), onSurface = Color(0xFFFFFFFF), surfaceVariant = Color(0xFF303030), onSurfaceVariant = Color(0xFFD8FFFFFF), surfaceTint = Color(0xFFFF0000), inverseSurface = Color(0xFFFAFAFA), inverseOnSurface = Color(0xFF313131), outline = Color(0xFFFF0000), inversePrimary = Color(0xFF6D0D0B), ) override val lightScheme = lightColorScheme( primary = Color(0xFFFF0000), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFFF0000), onPrimaryContainer = Color(0xFFFFFFFF), inversePrimary = Color(0xFF6D0D0B), // Assuming 'inversePrimary' maps to 'doom_primaryInverse' secondary = Color(0xFFFF0000), onSecondary = Color(0xFFFFFFFF), secondaryContainer = Color(0xFFFF0000), onSecondaryContainer = Color(0xFFFFFFFF), tertiary = Color(0xFFBFBFBF), onTertiary = Color(0xFFFF0000), tertiaryContainer = Color(0xFFBFBFBF), onTertiaryContainer = Color(0xFFFF0000), background = Color(0xFF212121), onBackground = Color(0xFFFFFFFF), surface = Color(0xFF212121), onSurface = Color(0xFFFFFFFF), surfaceVariant = Color(0xFF4D4D4D), onSurfaceVariant = Color(0xFFD849454E), surfaceTint = Color(0xFFFF0000), // Assuming 'surfaceTint' maps to 'doom_primary' or similar inverseSurface = Color(0xFF424242), inverseOnSurface = Color(0xFFFAFAFA), outline = Color(0xFFFF0000), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/GreenAppleColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Green Apple theme * Original color scheme by CarlosEsco, Jays2Kings and CrepeTF * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary #188140 * Secondary #188140 * Tertiary #D33131 * Neutral #5D5F5B */ internal object GreenAppleColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFF7ADB8F), onPrimary = Color(0xFF003917), primaryContainer = Color(0xFF017737), onPrimaryContainer = Color(0xFFFFFFFF), secondary = Color(0xFF7ADB8F), // Unread badge onSecondary = Color(0xFF003917), // Unread badge text secondaryContainer = Color(0xFF017737), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFFFFFFF), // Navigation bar selected icon tertiary = Color(0xFFFFB3AC), // Downloaded badge onTertiary = Color(0xFF680008), // Downloaded badge text tertiaryContainer = Color(0xFFC7282A), onTertiaryContainer = Color(0xFFFFFFFF), error = Color(0xFFFFB4AB), onError = Color(0xFF690005), errorContainer = Color(0xFF93000A), onErrorContainer = Color(0xFFFFDAD6), background = Color(0xFF0F1510), onBackground = Color(0xFFDFE4DB), surface = Color(0xFF0F1510), onSurface = Color(0xFFDFE4DB), surfaceVariant = Color(0xFF3F493F), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFBECABC), outline = Color(0xFF889487), outlineVariant = Color(0xFF3F493F), scrim = Color(0xFF000000), inverseSurface = Color(0xFFDFE4DB), inverseOnSurface = Color(0xFF2C322C), inversePrimary = Color(0xFF006D32), surfaceDim = Color(0xFF0F1510), surfaceBright = Color(0xFF353B35), surfaceContainerLowest = Color(0xFF0A0F0B), surfaceContainerLow = Color(0xFF181D18), surfaceContainer = Color(0xFF1C211C), // Navigation bar background surfaceContainerHigh = Color(0xFF262B26), surfaceContainerHighest = Color(0xFF313630), ) override val lightScheme = lightColorScheme( primary = Color(0xFF005927), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFF188140), onPrimaryContainer = Color(0xFFFFFFFF), secondary = Color(0xFF005927), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFF97f7a9), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF000000), // Navigation bar selected icon tertiary = Color(0xFF9D0012), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFFD33131), onTertiaryContainer = Color(0xFFFFFFFF), error = Color(0xFFBA1A1A), onError = Color(0xFFFFFFFF), errorContainer = Color(0xFFFFDAD6), onErrorContainer = Color(0xFF410002), background = Color(0xFFF6FBF2), onBackground = Color(0xFF181D18), surface = Color(0xFFF6FBF2), onSurface = Color(0xFF181D18), surfaceVariant = Color(0xFFDAE6D7), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF3F493F), outline = Color(0xFF6F7A6E), outlineVariant = Color(0xFFBECABC), scrim = Color(0xFF000000), inverseSurface = Color(0xFF2C322C), inverseOnSurface = Color(0xFFEDF2E9), inversePrimary = Color(0xFF7ADB8F), surfaceDim = Color(0xFFD6DCD3), surfaceBright = Color(0xFFF6FBF2), surfaceContainerLowest = Color(0xFFFFFFFF), surfaceContainerLow = Color(0xFFF0F5EC), surfaceContainer = Color(0xFFEAEFE6), // Navigation bar background surfaceContainerHigh = Color(0xFFE4EAE1), surfaceContainerHighest = Color(0xFFDFE4DB), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/LavenderColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Lavender theme * Color scheme by Osyx * * Key colors: * Primary #A177FF * Secondary #A177FF * Tertiary #5E25E1 * Neutral #111129 */ internal object LavenderColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFA177FF), onPrimary = Color(0xFF3D0090), primaryContainer = Color(0xFFA177FF), onPrimaryContainer = Color(0xFFFFFFFF), secondary = Color(0xFFA177FF), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFF423271), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFA177FF), // Navigation bar selected icon tertiary = Color(0xFFCDBDFF), // Downloaded badge onTertiary = Color(0xFF360096), // Downloaded badge text tertiaryContainer = Color(0xFF5512D8), onTertiaryContainer = Color(0xFFEFE6FF), error = Color(0xFFFFB4AB), onError = Color(0xFF690005), errorContainer = Color(0xFF93000A), onErrorContainer = Color(0xFFFFDAD6), background = Color(0xFF111129), onBackground = Color(0xFFE7E0EC), surface = Color(0xFF111129), onSurface = Color(0xFFE7E0EC), surfaceVariant = Color(0xFF3D2F6B), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFCBC3D6), outline = Color(0xFF958E9F), outlineVariant = Color(0xFF4A4453), scrim = Color(0xFF000000), inverseSurface = Color(0xFFE7E0EC), inverseOnSurface = Color(0xFF322F38), inversePrimary = Color(0xFF6D41C8), surfaceDim = Color(0xFF111129), surfaceBright = Color(0xFF3B3841), surfaceContainerLowest = Color(0xFF15132d), surfaceContainerLow = Color(0xFF171531), surfaceContainer = Color(0xFF1D193B), // Navigation bar background surfaceContainerHigh = Color(0xFF241f41), surfaceContainerHighest = Color(0xFF282446), ) override val lightScheme = lightColorScheme( primary = Color(0xFF6D41C8), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFF7B46AF), onPrimaryContainer = Color(0xFF130038), secondary = Color(0xFF7B46AF), // Unread badge onSecondary = Color(0xFFEDE2FF), // Unread badge text secondaryContainer = Color(0xFFC9B0E6), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF7B46AF), // Navigation bar selector icon tertiary = Color(0xFFEDE2FF), // Downloaded badge onTertiary = Color(0xFF7B46AF), // Downloaded badge text tertiaryContainer = Color(0xFF6D3BF0), onTertiaryContainer = Color(0xFFFFFFFF), error = Color(0xFFBA1A1A), onError = Color(0xFFFFFFFF), errorContainer = Color(0xFFFFDAD6), onErrorContainer = Color(0xFF410002), background = Color(0xFFEDE2FF), onBackground = Color(0xFF1D1A22), surface = Color(0xFFEDE2FF), onSurface = Color(0xFF1D1A22), surfaceVariant = Color(0xFFE4D5F8), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF4A4453), outline = Color(0xFF7B7485), outlineVariant = Color(0xFFCBC3D6), scrim = Color(0xFF000000), inverseSurface = Color(0xFF322F38), inverseOnSurface = Color(0xFFF5EEFA), inversePrimary = Color(0xFFA177FF), surfaceDim = Color(0xFFDED7E3), surfaceBright = Color(0xFFEDE2FF), surfaceContainerLowest = Color(0xFFDACCEC), surfaceContainerLow = Color(0xFFDED0F1), surfaceContainer = Color(0xFFE4D5F8), // Navigation bar background surfaceContainerHigh = Color(0xFFEADCFD), surfaceContainerHighest = Color(0xFFEEE2FF), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/MatrixColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Matrix theme * Original color scheme by LuftVerbot * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFF38020 * Secondary 0xFFF38020 * Tertiary 0xFF1B1B22 * Neutral 0xFF655C5A */ internal object MatrixColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFF00FF00), onPrimary = Color(0xFFFAFAFA), primaryContainer = Color(0xFF00FF00), onPrimaryContainer = Color(0xFFFAFAFA), secondary = Color(0xFF00FF00), onSecondary = Color(0xFFFAFAFA), secondaryContainer = Color(0xFF00FF00), onSecondaryContainer = Color(0xFFFAFAFA), tertiary = Color(0xFFFFFFFF), onTertiary = Color(0xFF00FF00), tertiaryContainer = Color(0xFFFFFFFF), onTertiaryContainer = Color(0xFF00FF00), background = Color(0xFF111111), onBackground = Color(0xFFFFFFFF), surface = Color(0xFF111111), onSurface = Color(0xFFFFFFFF), surfaceVariant = Color(0xFF212121), onSurfaceVariant = Color(0xFFD8FFFFFF), surfaceTint = Color(0xFF00FF00), inverseSurface = Color(0xFFFAFAFA), inverseOnSurface = Color(0xFF313131), outline = Color(0xFF00FF00), inversePrimary = Color(0xFF007700), ) override val lightScheme = lightColorScheme( primary = Color(0xFF00FF00), onPrimary = Color(0xFF000000), primaryContainer = Color(0xFF00FF00), onPrimaryContainer = Color(0xFF000000), secondary = Color(0xFF00FF00), onSecondary = Color(0xFF000000), secondaryContainer = Color(0xFF00FF00), onSecondaryContainer = Color(0xFF000000), tertiary = Color(0xFF000000), onTertiary = Color(0xFF00FF00), tertiaryContainer = Color(0xFF000000), onTertiaryContainer = Color(0xFF00FF00), background = Color(0xFF000000), onBackground = Color(0xFFFFFFFF), surface = Color(0xFF000000), onSurface = Color(0xFFFFFFFF), surfaceVariant = Color(0xFF111111), onSurfaceVariant = Color(0xFFD849454E), surfaceTint = Color(0xFF00FF00), inverseSurface = Color(0xFF424242), inverseOnSurface = Color(0xFFFAFAFA), outline = Color(0xFF00FF00), inversePrimary = Color(0xFF007700), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/MidnightDuskColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Midnight Dusk theme * Original color scheme by CrepeTF * M3 color scheme generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary #F02475 * Secondary #F02475 * Tertiary #7A5733 * Neutral #16151D */ internal object MidnightDuskColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFF02475), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFBD1C5C), onPrimaryContainer = Color(0xFFFFFFFF), inversePrimary = Color(0xFFF02475), secondary = Color(0xFFF02475), // Unread badge onSecondary = Color(0xFF16151D), // Unread badge text secondaryContainer = Color(0xFF66183C), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFF02475), // Navigation bar selector icon tertiary = Color(0xFF55971C), // Downloaded badge onTertiary = Color(0xFF16151D), // Downloaded badge text tertiaryContainer = Color(0xFF386412), onTertiaryContainer = Color(0xFFE5E1E5), background = Color(0xFF16151D), onBackground = Color(0xFFE5E1E5), surface = Color(0xFF16151D), onSurface = Color(0xFFE5E1E5), surfaceVariant = Color(0xFF281624), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFD6C1C4), surfaceTint = Color(0xFFF02475), inverseSurface = Color(0xFF333043), inverseOnSurface = Color(0xFFFFFFFF), outline = Color(0xFF9F8C8F), surfaceContainerLowest = Color(0xFF221320), surfaceContainerLow = Color(0xFF251522), surfaceContainer = Color(0xFF281624), // Navigation bar background surfaceContainerHigh = Color(0xFF2D1C2A), surfaceContainerHighest = Color(0xFF2F1F2C), ) override val lightScheme = lightColorScheme( primary = Color(0xFFBB0054), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFFFD9E1), onPrimaryContainer = Color(0xFF3F0017), inversePrimary = Color(0xFFFFB1C4), secondary = Color(0xFFBB0054), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFFEFBAD4), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFD1377C), // Navigation bar selector icon tertiary = Color(0xFF006638), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFF00894b), onTertiaryContainer = Color(0xFF2D1600), background = Color(0xFFFFFBFF), onBackground = Color(0xFF1C1B1F), surface = Color(0xFFFFFBFF), onSurface = Color(0xFF1C1B1F), surfaceVariant = Color(0xFFF9E6F1), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF524346), surfaceTint = Color(0xFFBB0054), inverseSurface = Color(0xFF313033), inverseOnSurface = Color(0xFFF4F0F4), outline = Color(0xFF847376), surfaceContainerLowest = Color(0xFFDAC0CD), surfaceContainerLow = Color(0xFFE8D1DD), surfaceContainer = Color(0xFFF9E6F1), // Navigation bar background surfaceContainerHigh = Color(0xFFFCF3F8), surfaceContainerHighest = Color(0xFFFEF9FC), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/MochaColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Mocha theme * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFF38020 * Secondary 0xFFF38020 * Tertiary 0xFF1B1B22 * Neutral 0xFF655C5A */ internal object MochaColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFEBC248), onPrimary = Color(0xFF3D2F00), primaryContainer = Color(0xFF584400), onPrimaryContainer = Color(0xFFFFE08D), secondary = Color(0xFFEBC248), onSecondary = Color(0xFF3D2F00), secondaryContainer = Color(0xFF584400), onSecondaryContainer = Color(0xFFFFE08D), tertiary = Color(0xFFADCFAD), onTertiary = Color(0xFF19361F), tertiaryContainer = Color(0xFF304D34), onTertiaryContainer = Color(0xFFC9ECC8), background = Color(0xFF1E1B16), onBackground = Color(0xFFE8E1D9), surface = Color(0xFF1E1B16), onSurface = Color(0xFFE8E1D9), surfaceVariant = Color(0xFF4C4639), onSurfaceVariant = Color(0xFFCFC5B4), surfaceTint = Color(0xFFEBC248), inverseSurface = Color(0xFFEDE0DD), inverseOnSurface = Color(0xFF211A18), outline = Color(0xFF989080), inversePrimary = Color(0xFFAE3200), ) override val lightScheme = lightColorScheme( primary = Color(0xFF745B00), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFFFE08D), onPrimaryContainer = Color(0xFF241A00), secondary = Color(0xFF745B00), onSecondary = Color(0xFFFFFFFF), secondaryContainer = Color(0xFFFFE08D), onSecondaryContainer = Color(0xFF241A00), tertiary = Color(0xFF47664A), onTertiary = Color(0xFFFFFFFF), tertiaryContainer = Color(0xFFC9ECC8), onTertiaryContainer = Color(0xFF04210B), background = Color(0xFFFFFBFF), onBackground = Color(0xFF1E1B16), surface = Color(0xFFFFFBFF), onSurface = Color(0xFF1E1B16), surfaceVariant = Color(0xFFEBE1CF), onSurfaceVariant = Color(0xFF4C4639), surfaceTint = Color(0xFF745B00), inverseSurface = Color(0xFF362F2D), inverseOnSurface = Color(0xFFFBEAEB), outline = Color(0xFF7E7667), inversePrimary = Color(0xFFFFB59D), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/MonetColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import android.annotation.SuppressLint import android.app.UiModeManager import android.app.WallpaperManager import android.content.Context import android.graphics.Bitmap import android.os.Build import androidx.annotation.RequiresApi import androidx.compose.material3.ColorScheme import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.ui.graphics.Color import androidx.core.content.getSystemService import com.google.android.material.color.utilities.Hct import com.google.android.material.color.utilities.MaterialDynamicColors import com.google.android.material.color.utilities.QuantizerCelebi import com.google.android.material.color.utilities.SchemeContent import com.google.android.material.color.utilities.Score internal class MonetColorScheme(context: Context) : BaseColorScheme() { private val monet = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { MonetSystemColorScheme(context) } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { val seed = WallpaperManager.getInstance(context) .getWallpaperColors(WallpaperManager.FLAG_SYSTEM) ?.primaryColor ?.toArgb() if (seed != null) { MonetCompatColorScheme(context, seed) } else { TachiyomiColorScheme } } else { TachiyomiColorScheme } override val darkScheme get() = monet.darkScheme override val lightScheme get() = monet.lightScheme companion object { @Suppress("Unused") @SuppressLint("RestrictedApi") fun extractSeedColorFromImage(bitmap: Bitmap): Int? { val width = bitmap.width val height = bitmap.height val bitmapPixels = IntArray(width * height) bitmap.getPixels(bitmapPixels, 0, width, 0, 0, width, height) return Score.score(QuantizerCelebi.quantize(bitmapPixels, 128), 1, 0)[0] .takeIf { it != 0 } // Don't take fallback color } } } @RequiresApi(Build.VERSION_CODES.S) private class MonetSystemColorScheme(context: Context) : BaseColorScheme() { override val lightScheme = dynamicLightColorScheme(context) override val darkScheme = dynamicDarkColorScheme(context) } private class MonetCompatColorScheme(context: Context, seed: Int) : BaseColorScheme() { override val lightScheme = generateColorSchemeFromSeed(context = context, seed = seed, dark = false) override val darkScheme = generateColorSchemeFromSeed(context = context, seed = seed, dark = true) companion object { private fun Int.toComposeColor(): Color = Color(this) @SuppressLint("PrivateResource", "RestrictedApi") private fun generateColorSchemeFromSeed(context: Context, seed: Int, dark: Boolean): ColorScheme { val scheme = SchemeContent( Hct.fromInt(seed), dark, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { context.getSystemService()?.contrast?.toDouble() ?: 0.0 } else { 0.0 }, ) val dynamicColors = MaterialDynamicColors() return ColorScheme( primary = dynamicColors.primary().getArgb(scheme).toComposeColor(), onPrimary = dynamicColors.onPrimary().getArgb(scheme).toComposeColor(), primaryContainer = dynamicColors.primaryContainer().getArgb(scheme).toComposeColor(), onPrimaryContainer = dynamicColors.onPrimaryContainer().getArgb(scheme).toComposeColor(), inversePrimary = dynamicColors.inversePrimary().getArgb(scheme).toComposeColor(), secondary = dynamicColors.secondary().getArgb(scheme).toComposeColor(), onSecondary = dynamicColors.onSecondary().getArgb(scheme).toComposeColor(), secondaryContainer = dynamicColors.secondaryContainer().getArgb(scheme).toComposeColor(), onSecondaryContainer = dynamicColors.onSecondaryContainer().getArgb(scheme).toComposeColor(), tertiary = dynamicColors.tertiary().getArgb(scheme).toComposeColor(), onTertiary = dynamicColors.onTertiary().getArgb(scheme).toComposeColor(), tertiaryContainer = dynamicColors.tertiary().getArgb(scheme).toComposeColor(), onTertiaryContainer = dynamicColors.onTertiaryContainer().getArgb(scheme).toComposeColor(), background = dynamicColors.background().getArgb(scheme).toComposeColor(), onBackground = dynamicColors.onBackground().getArgb(scheme).toComposeColor(), surface = dynamicColors.surface().getArgb(scheme).toComposeColor(), onSurface = dynamicColors.onSurface().getArgb(scheme).toComposeColor(), surfaceVariant = dynamicColors.surfaceVariant().getArgb(scheme).toComposeColor(), onSurfaceVariant = dynamicColors.onSurfaceVariant().getArgb(scheme).toComposeColor(), surfaceTint = dynamicColors.surfaceTint().getArgb(scheme).toComposeColor(), inverseSurface = dynamicColors.inverseSurface().getArgb(scheme).toComposeColor(), inverseOnSurface = dynamicColors.inverseOnSurface().getArgb(scheme).toComposeColor(), error = dynamicColors.error().getArgb(scheme).toComposeColor(), onError = dynamicColors.onError().getArgb(scheme).toComposeColor(), errorContainer = dynamicColors.errorContainer().getArgb(scheme).toComposeColor(), onErrorContainer = dynamicColors.onErrorContainer().getArgb(scheme).toComposeColor(), outline = dynamicColors.outline().getArgb(scheme).toComposeColor(), outlineVariant = dynamicColors.outlineVariant().getArgb(scheme).toComposeColor(), scrim = Color.Black, surfaceBright = dynamicColors.surfaceBright().getArgb(scheme).toComposeColor(), surfaceDim = dynamicColors.surfaceDim().getArgb(scheme).toComposeColor(), surfaceContainer = dynamicColors.surfaceContainer().getArgb(scheme).toComposeColor(), surfaceContainerHigh = dynamicColors.surfaceContainerHigh().getArgb(scheme).toComposeColor(), surfaceContainerHighest = dynamicColors.surfaceContainerHighest().getArgb(scheme).toComposeColor(), surfaceContainerLow = dynamicColors.surfaceContainerLow().getArgb(scheme).toComposeColor(), surfaceContainerLowest = dynamicColors.surfaceContainerLowest().getArgb(scheme).toComposeColor(), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/MonochromeColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color internal object MonochromeColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFFFFFFF), onPrimary = Color(0xFF000000), primaryContainer = Color(0xFFFFFFFF), onPrimaryContainer = Color(0xFF000000), secondary = Color(0xFFFFFFFF), onSecondary = Color(0xFF000000), secondaryContainer = Color(0xFF777777), onSecondaryContainer = Color(0xFF000000), tertiary = Color(0xFF777777), onTertiary = Color(0xFFFFFFFF), tertiaryContainer = Color(0xFFFFFFFF), onTertiaryContainer = Color(0xFF000000), error = Color(0xFFFFFFFF), onError = Color(0xFF000000), errorContainer = Color(0xFFFFFFFF), onErrorContainer = Color(0xFF000000), background = Color(0xFF000000), onBackground = Color(0xFFFFFFFF), surface = Color(0xFF000000), onSurface = Color(0xFFFFFFFF), surfaceVariant = Color(0xFF000000), onSurfaceVariant = Color(0xFFFFFFFF), outline = Color(0xFFFFFFFF), outlineVariant = Color(0xFFFFFFFF), scrim = Color(0xFF000000), inverseSurface = Color(0xFFFFFFFF), inverseOnSurface = Color(0xFF000000), inversePrimary = Color(0xFF000000), surfaceDim = Color(0xFF000000), surfaceBright = Color(0xFFFFFFFF), surfaceContainerLowest = Color(0xFF000000), surfaceContainerLow = Color(0xFF000000), surfaceContainer = Color(0xFF000000), surfaceContainerHigh = Color(0xFF000000), surfaceContainerHighest = Color(0xFF000000), ) override val lightScheme = lightColorScheme( primary = Color(0xFF000000), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFF000000), onPrimaryContainer = Color(0xFFFFFFFF), secondary = Color(0xFF000000), onSecondary = Color(0xFFFFFFFF), secondaryContainer = Color(0xFF888888), onSecondaryContainer = Color(0xFFFFFFFF), tertiary = Color(0xFF888888), onTertiary = Color(0xFFFFFFFF), tertiaryContainer = Color(0xFF000000), onTertiaryContainer = Color(0xFFFFFFFF), error = Color(0xFF000000), onError = Color(0xFFFFFFFF), errorContainer = Color(0xFF000000), onErrorContainer = Color(0xFFFFFFFF), background = Color(0xFFFFFFFF), onBackground = Color(0xFF000000), surface = Color(0xFFFFFFFF), onSurface = Color(0xFF000000), surfaceVariant = Color(0xFFFFFFFF), onSurfaceVariant = Color(0xFF000000), outline = Color(0xFF000000), outlineVariant = Color(0xFF000000), scrim = Color(0xFF000000), inverseSurface = Color(0xFF000000), inverseOnSurface = Color(0xFFFFFFFF), inversePrimary = Color(0xFFFFFFFF), surfaceDim = Color(0xFFFFFFFF), surfaceBright = Color(0xFFFFFFFF), surfaceContainerLowest = Color(0xFFFFFFFF), surfaceContainerLow = Color(0xFFFFFFFF), surfaceContainer = Color(0xFFFFFFFF), surfaceContainerHigh = Color(0xFFFFFFFF), surfaceContainerHighest = Color(0xFFFFFFFF), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/NordColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Nord theme * https://www.nordtheme.com/docs/colors-and-palettes * for the light theme, the primary color is switched with the tertiary for better contrast in some case */ internal object NordColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFF88C0D0), onPrimary = Color(0xFF2E3440), primaryContainer = Color(0xFF88C0D0), onPrimaryContainer = Color(0xFF2E3440), inversePrimary = Color(0xFF397E91), secondary = Color(0xFF81A1C1), // Unread badge onSecondary = Color(0xFF2E3440), // Unread badge text secondaryContainer = Color(0xFF506275), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF88C0D0), // Navigation bar selector icon tertiary = Color(0xFF5E81AC), // Downloaded badge onTertiary = Color(0xFF000000), // Downloaded badge text tertiaryContainer = Color(0xFF5E81AC), onTertiaryContainer = Color(0xFF000000), background = Color(0xFF2E3440), onBackground = Color(0xFFECEFF4), surface = Color(0xFF2E3440), onSurface = Color(0xFFECEFF4), surfaceVariant = Color(0xFF414C5C), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFECEFF4), surfaceTint = Color(0xFF88C0D0), inverseSurface = Color(0xFFD8DEE9), inverseOnSurface = Color(0xFF2E3440), outline = Color(0xFF6d717b), outlineVariant = Color(0xFF90939a), onError = Color(0xFF2E3440), errorContainer = Color(0xFFBF616A), onErrorContainer = Color(0xFF000000), surfaceContainerLowest = Color(0xFF373F4D), surfaceContainerLow = Color(0xFF3E4756), surfaceContainer = Color(0xFF414C5C), surfaceContainerHigh = Color(0xFF4E5766), surfaceContainerHighest = Color(0xFF505968), // Navigation bar background ) override val lightScheme = lightColorScheme( primary = Color(0xFF5E81AC), onPrimary = Color(0xFF000000), primaryContainer = Color(0xFF5E81AC), onPrimaryContainer = Color(0xFF000000), inversePrimary = Color(0xFF8CA8CD), secondary = Color(0xFF81A1C1), // Unread badge onSecondary = Color(0xFF2E3440), // Unread badge text secondaryContainer = Color(0xFF91B4D7), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF2E3440), // Navigation bar selector icon tertiary = Color(0xFF88C0D0), // Downloaded badge onTertiary = Color(0xFF2E3440), // Downloaded badge text tertiaryContainer = Color(0xFF88C0D0), onTertiaryContainer = Color(0xFF2E3440), background = Color(0xFFECEFF4), onBackground = Color(0xFF2E3440), surface = Color(0xFFE5E9F0), onSurface = Color(0xFF2E3440), surfaceVariant = Color(0xFFDAE0EA), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF2E3440), surfaceTint = Color(0xFF5E81AC), inverseSurface = Color(0xFF3B4252), inverseOnSurface = Color(0xFFECEFF4), outline = Color(0xFF2E3440), onError = Color(0xFFECEFF4), errorContainer = Color(0xFFBF616A), onErrorContainer = Color(0xFF000000), surfaceContainerLowest = Color(0xFFD1D7E0), surfaceContainerLow = Color(0xFFD6DCE6), surfaceContainer = Color(0xFFDAE0EA), // Navigation bar background surfaceContainerHigh = Color(0xFFE9EDF3), surfaceContainerHighest = Color(0xFFF2F4F8), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/SapphireColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Sapphire theme * Original color scheme by LuftVerbot * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFF38020 * Secondary 0xFFF38020 * Tertiary 0xFF6B5E2F * Neutral 0xFF655C5A */ internal object SapphireColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFF1E88E5), onPrimary = Color(0xFFFAFAFA), primaryContainer = Color(0xFF1E88E5), onPrimaryContainer = Color(0xFFFAFAFA), inversePrimary = Color(0xFF2979FF), // Assuming 'inversePrimary' maps to 'sapphire_primaryInverse' secondary = Color(0xFF1E88E5), onSecondary = Color(0xFFFAFAFA), secondaryContainer = Color(0xFF1E88E5), onSecondaryContainer = Color(0xFFFAFAFA), tertiary = Color(0xFF212121), onTertiary = Color(0xFF1E88E5), tertiaryContainer = Color(0xFF212121), onTertiaryContainer = Color(0xFF1E88E5), background = Color(0xFF212121), onBackground = Color(0xFFFFFFFF), surface = Color(0xFF212121), onSurface = Color(0xFFFFFFFF), surfaceVariant = Color(0xFF424242), onSurfaceVariant = Color(0xFFD8FFFFFF), surfaceTint = Color(0xFF1E88E5), // Assuming 'surfaceTint' maps to 'sapphire_primary' or similar inverseSurface = Color(0xFFFAFAFA), inverseOnSurface = Color(0xFF313131), outline = Color(0xFF1E88E5), ) override val lightScheme = lightColorScheme( primary = Color(0xFF1E88E5), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFF1E88E5), onPrimaryContainer = Color(0xFFFFFFFF), inversePrimary = Color(0xFF2979FF), // Assuming 'inversePrimary' maps to 'sapphire_primaryInverse' secondary = Color(0xFF1E88E5), onSecondary = Color(0xFFFFFFFF), secondaryContainer = Color(0xFF1E88E5), onSecondaryContainer = Color(0xFFFFFFFF), tertiary = Color(0xFFE1F5FE), onTertiary = Color(0xFF1E88E5), tertiaryContainer = Color(0xFFE1F5FE), onTertiaryContainer = Color(0xFF1E88E5), background = Color(0xFFFFFFFF), onBackground = Color(0xFF212121), surface = Color(0xFFFFFFFF), onSurface = Color(0xFF212121), surfaceVariant = Color(0xFFB3E5FC), onSurfaceVariant = Color(0xFFD849454E), surfaceTint = Color(0xFF1E88E5), // Assuming 'surfaceTint' maps to 'sapphire_primary' or similar inverseSurface = Color(0xFF424242), inverseOnSurface = Color(0xFFFAFAFA), outline = Color(0xFF1E88E5), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/StrawberryColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Strawberry Daiquiri theme * Original color scheme by Soitora * M3 color scheme generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary #ED4A65 * Secondary #ED4A65 * Tertiary #775930 * Neutral #655C5C */ internal object StrawberryColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFFFB2B8), onPrimary = Color(0xFF67001D), primaryContainer = Color(0xFFD53855), onPrimaryContainer = Color(0xFFFFFFFF), secondary = Color(0xFFED4A65), // Unread badge onSecondary = Color(0xFF201A1A), // Unread badge text secondaryContainer = Color(0xFF91002A), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFFFFFFF), // Navigation bar selector icon tertiary = Color(0xFFE8C08E), // Downloaded badge onTertiary = Color(0xFF201A1A), // Downloaded badge text tertiaryContainer = Color(0xFF775930), onTertiaryContainer = Color(0xFFFFF7F1), error = Color(0xFFFFB4AB), onError = Color(0xFF690005), errorContainer = Color(0xFF93000A), onErrorContainer = Color(0xFFFFDAD6), background = Color(0xFF201A1A), onBackground = Color(0xFFF7DCDD), surface = Color(0xFF201A1A), onSurface = Color(0xFFF7DCDD), surfaceVariant = Color(0xFF322727), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFE1BEC0), outline = Color(0xFFA9898B), outlineVariant = Color(0xFF594042), scrim = Color(0xFF000000), inverseSurface = Color(0xFFF7DCDD), inverseOnSurface = Color(0xFF3D2C2D), inversePrimary = Color(0xFFB61F40), surfaceDim = Color(0xFF1D1011), surfaceBright = Color(0xFF463536), surfaceContainerLowest = Color(0xFF2C2222), surfaceContainerLow = Color(0xFF302525), surfaceContainer = Color(0xFF322727), // Navigation bar background surfaceContainerHigh = Color(0xFF3C2F2F), surfaceContainerHighest = Color(0xFF463737), ) override val lightScheme = lightColorScheme( primary = Color(0xFFA10833), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFD53855), onPrimaryContainer = Color(0xFFFFFFFF), secondary = Color(0xFFA10833), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFFD53855), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFF6EAED), // Navigation bar selector icon tertiary = Color(0xFF5F441D), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFF87683D), onTertiaryContainer = Color(0xFFFFFFFF), error = Color(0xFFBA1A1A), onError = Color(0xFFFFFFFF), errorContainer = Color(0xFFFFDAD6), onErrorContainer = Color(0xFF410002), background = Color(0xFFFAFAFA), onBackground = Color(0xFF261819), surface = Color(0xFFFAFAFA), onSurface = Color(0xFF261819), surfaceVariant = Color(0xFFF6EAED), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF594042), outline = Color(0xFF8D7071), outlineVariant = Color(0xFFE1BEC0), scrim = Color(0xFF000000), inverseSurface = Color(0xFF3D2C2D), inverseOnSurface = Color(0xFFFFECED), inversePrimary = Color(0xFFFFB2B8), surfaceDim = Color(0xFFEED4D5), surfaceBright = Color(0xFFFFF8F7), surfaceContainerLowest = Color(0xFFF7DCDD), surfaceContainerLow = Color(0xFFFDE2E3), surfaceContainer = Color(0xFFF6EAED), // Navigation bar background surfaceContainerHigh = Color(0xFFFFF0F0), surfaceContainerHighest = Color(0xFFFFFFFF), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/TachiyomiColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Default theme * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary #2979FF * Secondary #2979FF * Tertiary #47A84A * Neutral #919094 */ internal object TachiyomiColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFB0C6FF), onPrimary = Color(0xFF002D6E), primaryContainer = Color(0xFF00429B), onPrimaryContainer = Color(0xFFD9E2FF), inversePrimary = Color(0xFF0058CA), secondary = Color(0xFFB0C6FF), // Unread badge onSecondary = Color(0xFF002D6E), // Unread badge text secondaryContainer = Color(0xFF00429B), // Navigation bar selector pill & pro onSecondaryContainer = Color(0xFFD9E2FF), // Navigation bar selector icon tertiary = Color(0xFF7ADC77), // Downloaded badge onTertiary = Color(0xFF003909), // Downloaded badge text tertiaryContainer = Color(0xFF005312), onTertiaryContainer = Color(0xFF95F990), background = Color(0xFF1B1B1F), onBackground = Color(0xFFE3E2E6), surface = Color(0xFF1B1B1F), onSurface = Color(0xFFE3E2E6), surfaceVariant = Color(0xFF211F26), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFC5C6D0), surfaceTint = Color(0xFFB0C6FF), inverseSurface = Color(0xFFE3E2E6), inverseOnSurface = Color(0xFF1B1B1F), error = Color(0xFFFFB4AB), onError = Color(0xFF690005), errorContainer = Color(0xFF93000A), onErrorContainer = Color(0xFFFFDAD6), outline = Color(0xFF8F9099), outlineVariant = Color(0xFF44464F), surfaceContainerLowest = Color(0xFF1A181D), surfaceContainerLow = Color(0xFF1E1C22), surfaceContainer = Color(0xFF211F26), // Navigation bar background surfaceContainerHigh = Color(0xFF292730), surfaceContainerHighest = Color(0xFF302E38), ) override val lightScheme = lightColorScheme( primary = Color(0xFF0058CA), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFD9E2FF), onPrimaryContainer = Color(0xFF001945), inversePrimary = Color(0xFFB0C6FF), secondary = Color(0xFF0058CA), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFFD9E2FF), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF001945), // Navigation bar selector icon tertiary = Color(0xFF006E1B), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFF95F990), onTertiaryContainer = Color(0xFF002203), background = Color(0xFFFEFBFF), onBackground = Color(0xFF1B1B1F), surface = Color(0xFFFEFBFF), onSurface = Color(0xFF1B1B1F), surfaceVariant = Color(0xFFF3EDF7), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF44464F), surfaceTint = Color(0xFF0058CA), inverseSurface = Color(0xFF303034), inverseOnSurface = Color(0xFFF2F0F4), error = Color(0xFFBA1A1A), onError = Color(0xFFFFFFFF), errorContainer = Color(0xFFFFDAD6), onErrorContainer = Color(0xFF410002), outline = Color(0xFF757780), outlineVariant = Color(0xFFC5C6D0), surfaceContainerLowest = Color(0xFFF5F1F8), surfaceContainerLow = Color(0xFFF7F2FA), surfaceContainer = Color(0xFFF3EDF7), // Navigation bar background surfaceContainerHigh = Color(0xFFFCF7FF), surfaceContainerHighest = Color(0xFFFCF7FF), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/TakoColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Tako theme * Original color scheme by ghostbear * M3 color scheme generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary #F3B375 * Secondary #F3B375 * Tertiary #66577E * Neutral #21212E */ internal object TakoColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFF3B375), onPrimary = Color(0xFF38294E), primaryContainer = Color(0xFFF3B375), onPrimaryContainer = Color(0xFF38294E), inversePrimary = Color(0xFF84531E), secondary = Color(0xFFF3B375), // Unread badge onSecondary = Color(0xFF38294E), // Unread badge text secondaryContainer = Color(0xFF5C4D4B), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFF3B375), // Navigation bar selector icon tertiary = Color(0xFF66577E), // Downloaded badge onTertiary = Color(0xFFF3B375), // Downloaded badge text tertiaryContainer = Color(0xFF4E4065), onTertiaryContainer = Color(0xFFEDDCFF), background = Color(0xFF21212E), onBackground = Color(0xFFE3E0F2), surface = Color(0xFF21212E), onSurface = Color(0xFFE3E0F2), surfaceVariant = Color(0xFF2A2A3C), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFCBC4CE), surfaceTint = Color(0xFF66577E), inverseSurface = Color(0xFFE5E1E6), inverseOnSurface = Color(0xFF1B1B1E), outline = Color(0xFF958F99), surfaceContainerLowest = Color(0xFF20202E), surfaceContainerLow = Color(0xFF262636), surfaceContainer = Color(0xFF2A2A3C), // Navigation bar background surfaceContainerHigh = Color(0xFF303044), surfaceContainerHighest = Color(0xFF36364D), ) override val lightScheme = lightColorScheme( primary = Color(0xFF66577E), onPrimary = Color(0xFFF3B375), primaryContainer = Color(0xFF66577E), onPrimaryContainer = Color(0xFFF3B375), inversePrimary = Color(0xFFD6BAFF), secondary = Color(0xFF66577E), // Unread badge onSecondary = Color(0xFFF3B375), // Unread badge text secondaryContainer = Color(0xFFC8BED0), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF66577E), // Navigation bar selector icon tertiary = Color(0xFFF3B375), // Downloaded badge onTertiary = Color(0xFF574360), // Downloaded badge text tertiaryContainer = Color(0xFFFDD6B0), onTertiaryContainer = Color(0xFF221437), background = Color(0xFFF7F5FF), onBackground = Color(0xFF1B1B22), surface = Color(0xFFF7F5FF), onSurface = Color(0xFF1B1B22), surfaceVariant = Color(0xFFE8E0EB), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF49454E), surfaceTint = Color(0xFF66577E), inverseSurface = Color(0xFF313033), inverseOnSurface = Color(0xFFF3EFF4), outline = Color(0xFF7A757E), surfaceContainerLowest = Color(0xFFD7D0DA), surfaceContainerLow = Color(0xFFDFD8E2), surfaceContainer = Color(0xFFE8E0EB), // Navigation bar background surfaceContainerHigh = Color(0xFFEEE6F1), surfaceContainerHighest = Color(0xFFF7EEFA), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/TealTurqoiseColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Teal Turqoise theme */ internal object TealTurqoiseColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFF40E0D0), onPrimary = Color(0xFF000000), primaryContainer = Color(0xFF40E0D0), onPrimaryContainer = Color(0xFF000000), inversePrimary = Color(0xFF008080), secondary = Color(0xFF40E0D0), // Unread badge onSecondary = Color(0xFF000000), // Unread badge text secondaryContainer = Color(0xFF18544E), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF40E0D0), // Navigation bar selector icon tertiary = Color(0xFFBF1F2F), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFF200508), onTertiaryContainer = Color(0xFFBF1F2F), background = Color(0xFF202125), onBackground = Color(0xFFDFDEDA), surface = Color(0xFF202125), onSurface = Color(0xFFDFDEDA), surfaceVariant = Color(0xFF233133), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFDFDEDA), surfaceTint = Color(0xFF40E0D0), inverseSurface = Color(0xFFDFDEDA), inverseOnSurface = Color(0xFF202125), outline = Color(0xFF899391), surfaceContainerLowest = Color(0xFF202C2E), surfaceContainerLow = Color(0xFF222F31), surfaceContainer = Color(0xFF233133), // Navigation bar background surfaceContainerHigh = Color(0xFF28383A), surfaceContainerHighest = Color(0xFF2F4244), ) override val lightScheme = lightColorScheme( primary = Color(0xFF008080), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFF008080), onPrimaryContainer = Color(0xFFFFFFFF), inversePrimary = Color(0xFF40E0D0), secondary = Color(0xFF008080), // Unread badge text onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFFCFE5E4), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF008080), // Navigation bar selector icon tertiary = Color(0xFFFF7F7F), // Downloaded badge onTertiary = Color(0xFF000000), // Downloaded badge text tertiaryContainer = Color(0xFF2A1616), onTertiaryContainer = Color(0xFFFF7F7F), background = Color(0xFFFAFAFA), onBackground = Color(0xFF050505), surface = Color(0xFFFAFAFA), onSurface = Color(0xFF050505), surfaceVariant = Color(0xFFEBF3F1), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF050505), surfaceTint = Color(0xFFBFDFDF), inverseSurface = Color(0xFF050505), inverseOnSurface = Color(0xFFFAFAFA), outline = Color(0xFF6F7977), surfaceContainerLowest = Color(0xFFE1E9E7), surfaceContainerLow = Color(0xFFE6EEEC), surfaceContainer = Color(0xFFEBF3F1), // Navigation bar background surfaceContainerHigh = Color(0xFFF0F8F6), surfaceContainerHighest = Color(0xFFF7FFFD), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/TidalWaveColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Tidal Wave theme * Original color scheme by NahutabDevelop * * Key colors: * Primary #004152 * Secondary #5ed4fc * Tertiary #92f7bc * Neutral #16151D */ internal object TidalWaveColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFF5ed4fc), onPrimary = Color(0xFF003544), primaryContainer = Color(0xFF004d61), onPrimaryContainer = Color(0xFFb8eaff), inversePrimary = Color(0xFFa12b03), secondary = Color(0xFF5ed4fc), // Unread badge onSecondary = Color(0xFF003544), // Unread badge text secondaryContainer = Color(0xFF004d61), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFb8eaff), // Navigation bar selector icon tertiary = Color(0xFF92f7bc), // Downloaded badge onTertiary = Color(0xFF001c3b), // Downloaded badge text tertiaryContainer = Color(0xFFc3fada), onTertiaryContainer = Color(0xFF78ffd6), background = Color(0xFF001c3b), onBackground = Color(0xFFd5e3ff), surface = Color(0xFF001c3b), onSurface = Color(0xFFd5e3ff), surfaceVariant = Color(0xFF082b4b), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFbfc8cc), surfaceTint = Color(0xFF5ed4fc), inverseSurface = Color(0xFFffe3c4), inverseOnSurface = Color(0xFF001c3b), outline = Color(0xFF8a9296), surfaceContainerLowest = Color(0xFF072642), surfaceContainerLow = Color(0xFF072947), surfaceContainer = Color(0xFF082b4b), // Navigation bar background surfaceContainerHigh = Color(0xFF093257), surfaceContainerHighest = Color(0xFF0A3861), ) override val lightScheme = lightColorScheme( primary = Color(0xFF006780), onPrimary = Color(0xFFffffff), primaryContainer = Color(0xFFB4D4DF), onPrimaryContainer = Color(0xFF001f28), inversePrimary = Color(0xFFff987f), secondary = Color(0xFF006780), // Unread badge onSecondary = Color(0xFFffffff), // Unread badge text secondaryContainer = Color(0xFF9AE1FF), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF001f28), // Navigation bar selector icon tertiary = Color(0xFF92f7bc), // Downloaded badge onTertiary = Color(0xFF001c3b), // Downloaded badge text tertiaryContainer = Color(0xFFc3fada), onTertiaryContainer = Color(0xFF78ffd6), background = Color(0xFFfdfbff), onBackground = Color(0xFF001c3b), surface = Color(0xFFfdfbff), onSurface = Color(0xFF001c3b), surfaceVariant = Color(0xFFe8eff5), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF40484c), surfaceTint = Color(0xFF006780), inverseSurface = Color(0xFF020400), inverseOnSurface = Color(0xFFffe3c4), outline = Color(0xFF70787c), surfaceContainerLowest = Color(0xFFe2e8ec), surfaceContainerLow = Color(0xFFe5ecf1), surfaceContainer = Color(0xFFe8eff5), // Navigation bar background surfaceContainerHigh = Color(0xFFedf4fA), surfaceContainerHighest = Color(0xFFf5faff), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/YinYangColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Yin & Yang theme * Original color scheme by Riztard * M3 colors generated by yours truly + tweaked manually */ internal object YinYangColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFFFFFFF), onPrimary = Color(0xFF5A5A5A), primaryContainer = Color(0xFFFFFFFF), onPrimaryContainer = Color(0xFF000000), inversePrimary = Color(0xFFCECECE), secondary = Color(0xFFFFFFFF), // Unread badge onSecondary = Color(0xFF5A5A5A), // Unread badge text secondaryContainer = Color(0xFF717171), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFE4E4E4), // Navigation bar selector icon tertiary = Color(0xFF000000), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFF00419E), onTertiaryContainer = Color(0xFFD8E2FF), background = Color(0xFF1E1E1E), onBackground = Color(0xFFE6E6E6), surface = Color(0xFF1E1E1E), onSurface = Color(0xFFE6E6E6), surfaceVariant = Color(0xFF313131), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFD1D1D1), surfaceTint = Color(0xFFFFFFFF), inverseSurface = Color(0xFFE6E6E6), inverseOnSurface = Color(0xFF1E1E1E), outline = Color(0xFF999999), surfaceContainerLowest = Color(0xFF2A2A2A), surfaceContainerLow = Color(0xFF2D2D2D), surfaceContainer = Color(0xFF313131), // Navigation bar background surfaceContainerHigh = Color(0xFF383838), surfaceContainerHighest = Color(0xFF3F3F3F), ) override val lightScheme = lightColorScheme( primary = Color(0xFF000000), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFF000000), onPrimaryContainer = Color(0xFFFFFFFF), inversePrimary = Color(0xFFA6A6A6), secondary = Color(0xFF000000), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFFDDDDDD), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF0C0C0C), // Navigation bar selector icon tertiary = Color(0xFFFFFFFF), // Downloaded badge onTertiary = Color(0xFF000000), // Downloaded badge text tertiaryContainer = Color(0xFFD8E2FF), onTertiaryContainer = Color(0xFF001947), background = Color(0xFFFDFDFD), onBackground = Color(0xFF222222), surface = Color(0xFFFDFDFD), onSurface = Color(0xFF222222), surfaceVariant = Color(0xFFE8E8E8), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF515151), surfaceTint = Color(0xFF000000), inverseSurface = Color(0xFF333333), inverseOnSurface = Color(0xFFF4F4F4), outline = Color(0xFF838383), surfaceContainerLowest = Color(0xFFCFCFCF), surfaceContainerLow = Color(0xFFDADADA), surfaceContainer = Color(0xFFE8E8E8), // Navigation bar background surfaceContainerHigh = Color(0xFFECECEC), surfaceContainerHighest = Color(0xFFEFEFEF), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/theme/colorscheme/YotsubaColorScheme.kt ================================================ package eu.kanade.presentation.theme.colorscheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.ui.graphics.Color /** * Colors for Yotsuba theme * Original color scheme by ztimms73 * M3 colors generated by Material Theme Builder (https://goo.gle/material-theme-builder-web) * * Key colors: * Primary 0xFFAE3200 * Secondary 0xFFAE3200 * Tertiary 0xFF6B5E2F * Neutral 0xFF655C5A */ internal object YotsubaColorScheme : BaseColorScheme() { override val darkScheme = darkColorScheme( primary = Color(0xFFFFB59D), onPrimary = Color(0xFF5F1600), primaryContainer = Color(0xFF862200), onPrimaryContainer = Color(0xFFFFDBCF), inversePrimary = Color(0xFFAE3200), secondary = Color(0xFFFFB59D), // Unread badge onSecondary = Color(0xFF5F1600), // Unread badge text secondaryContainer = Color(0xFF862200), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFFFFDBCF), // Navigation bar selector icon tertiary = Color(0xFFD7C68D), // Downloaded badge onTertiary = Color(0xFF3A2F05), // Downloaded badge text tertiaryContainer = Color(0xFF524619), onTertiaryContainer = Color(0xFFF5E2A7), background = Color(0xFF211A18), onBackground = Color(0xFFEDE0DD), surface = Color(0xFF211A18), onSurface = Color(0xFFEDE0DD), surfaceVariant = Color(0xFF332723), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFFD8C2BC), surfaceTint = Color(0xFFFFB59D), inverseSurface = Color(0xFFEDE0DD), inverseOnSurface = Color(0xFF211A18), outline = Color(0xFFA08C87), surfaceContainerLowest = Color(0xFF2E221F), surfaceContainerLow = Color(0xFF312521), surfaceContainer = Color(0xFF332723), // Navigation bar background surfaceContainerHigh = Color(0xFF413531), surfaceContainerHighest = Color(0xFF4C403D), ) override val lightScheme = lightColorScheme( primary = Color(0xFFAE3200), onPrimary = Color(0xFFFFFFFF), primaryContainer = Color(0xFFFFDBCF), onPrimaryContainer = Color(0xFF3B0A00), inversePrimary = Color(0xFFFFB59D), secondary = Color(0xFFAE3200), // Unread badge onSecondary = Color(0xFFFFFFFF), // Unread badge text secondaryContainer = Color(0xFFEBCDC2), // Navigation bar selector pill & progress indicator (remaining) onSecondaryContainer = Color(0xFF3B0A00), // Navigation bar selector icon tertiary = Color(0xFF6B5E2F), // Downloaded badge onTertiary = Color(0xFFFFFFFF), // Downloaded badge text tertiaryContainer = Color(0xFFF5E2A7), onTertiaryContainer = Color(0xFF231B00), background = Color(0xFFFCFCFC), onBackground = Color(0xFF211A18), surface = Color(0xFFFCFCFC), onSurface = Color(0xFF211A18), surfaceVariant = Color(0xFFF6EBE7), // Navigation bar background (ThemePrefWidget) onSurfaceVariant = Color(0xFF53433F), surfaceTint = Color(0xFFAE3200), inverseSurface = Color(0xFF362F2D), inverseOnSurface = Color(0xFFFBEEEB), outline = Color(0xFF85736E), surfaceContainerLowest = Color(0xFFECE3E0), surfaceContainerLow = Color(0xFFF1E7E4), surfaceContainer = Color(0xFFF6EBE7), // Navigation bar background surfaceContainerHigh = Color(0xFFFAF4F2), surfaceContainerHighest = Color(0xFFFBF6F4), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogSelector.kt ================================================ package eu.kanade.presentation.track import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.DatePicker import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.SelectableDates import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.rememberDatePickerState import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.theme.TachiyomiPreviewTheme import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableList import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.WheelNumberPicker import tachiyomi.presentation.core.components.WheelTextPicker import tachiyomi.presentation.core.components.material.AlertDialogContent import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun TrackStatusSelector( selection: Long, onSelectionChange: (Long) -> Unit, selections: Map, onConfirm: () -> Unit, onDismissRequest: () -> Unit, ) { BaseSelector( title = stringResource(MR.strings.status), content = { val state = rememberLazyListState() ScrollbarLazyColumn(state = state) { selections.forEach { (key, value) -> val isSelected = selection == key item { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .clip(RoundedCornerShape(8.dp)) .selectable( selected = isSelected, onClick = { onSelectionChange(key) }, ) .fillMaxWidth() .minimumInteractiveComponentSize(), ) { RadioButton( selected = isSelected, onClick = null, ) Text( text = value?.let { stringResource(it) } ?: "", style = MaterialTheme.typography.bodyLarge.merge(), modifier = Modifier.padding(start = 24.dp), ) } } } } if (state.canScrollBackward) HorizontalDivider(modifier = Modifier.align(Alignment.TopCenter)) if (state.canScrollForward) HorizontalDivider(modifier = Modifier.align(Alignment.BottomCenter)) }, onConfirm = onConfirm, onDismissRequest = onDismissRequest, ) } @Composable fun TrackItemSelector( selection: Int, onSelectionChange: (Int) -> Unit, range: Iterable, onConfirm: () -> Unit, onDismissRequest: () -> Unit, isManga: Boolean, ) { val titleText = if (isManga) MR.strings.chapters else AYMR.strings.episodes BaseSelector( title = stringResource(titleText), content = { WheelNumberPicker( items = range.toImmutableList(), modifier = Modifier.align(Alignment.Center), startIndex = selection, onSelectionChanged = { onSelectionChange(it) }, ) }, onConfirm = onConfirm, onDismissRequest = onDismissRequest, ) } @Composable fun TrackScoreSelector( selection: String, onSelectionChange: (String) -> Unit, selections: ImmutableList, onConfirm: () -> Unit, onDismissRequest: () -> Unit, ) { BaseSelector( title = stringResource(MR.strings.score), content = { WheelTextPicker( items = selections, modifier = Modifier.align(Alignment.Center), startIndex = selections.indexOf(selection).takeIf { it > 0 } ?: (selections.size / 2), onSelectionChanged = { onSelectionChange(selections[it]) }, ) }, onConfirm = onConfirm, onDismissRequest = onDismissRequest, ) } @Composable fun TrackDateSelector( title: String, initialSelectedDateMillis: Long, selectableDates: SelectableDates, onConfirm: (Long) -> Unit, onRemove: (() -> Unit)?, onDismissRequest: () -> Unit, ) { val pickerState = rememberDatePickerState( initialSelectedDateMillis = initialSelectedDateMillis, selectableDates = selectableDates, ) AlertDialogContent( modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars), title = { Text(text = title) }, content = { Column { DatePicker( state = pickerState, title = null, headline = null, showModeToggle = false, ) Row( modifier = Modifier .fillMaxWidth() .padding(start = 12.dp, top = 8.dp, end = 12.dp, bottom = 24.dp), horizontalArrangement = Arrangement.spacedBy( MaterialTheme.padding.small, Alignment.End, ), ) { if (onRemove != null) { TextButton(onClick = onRemove) { Text(text = stringResource(MR.strings.action_remove)) } Spacer(modifier = Modifier.weight(1f)) } TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } TextButton(onClick = { onConfirm(pickerState.selectedDateMillis!!) }) { Text(text = stringResource(MR.strings.action_ok)) } } } }, ) } @Composable fun BaseSelector( title: String, content: @Composable BoxScope.() -> Unit, onConfirm: () -> Unit, onDismissRequest: () -> Unit, thirdButton: @Composable (RowScope.() -> Unit)? = null, ) { AlertDialogContent( modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars), title = { Text(text = title) }, text = { Box( modifier = Modifier.fillMaxWidth(), content = content, ) }, buttons = { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy( MaterialTheme.padding.small, Alignment.End, ), ) { if (thirdButton != null) { thirdButton() Spacer(modifier = Modifier.weight(1f)) } TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } TextButton(onClick = onConfirm) { Text(text = stringResource(MR.strings.action_ok)) } } }, ) } @PreviewLightDark @Composable private fun TrackStatusSelectorPreviews() { TachiyomiPreviewTheme { Surface { TrackStatusSelector( selection = 1, onSelectionChange = {}, selections = persistentMapOf( // Anilist values 1L to MR.strings.reading, 2L to MR.strings.plan_to_read, 3L to MR.strings.completed, 4L to MR.strings.on_hold, 5L to MR.strings.dropped, 6L to MR.strings.repeating, 7L to AYMR.strings.watching, 8L to AYMR.strings.plan_to_watch, ), onConfirm = {}, onDismissRequest = {}, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHome.kt ================================================ package eu.kanade.presentation.track.anime import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.absoluteOffset import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.Badge import androidx.compose.material3.BadgedBox import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.track.components.TrackLogoIcon import eu.kanade.presentation.track.manga.TrackDetailsItem import eu.kanade.presentation.track.manga.TrackInfoItemMenu import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.ui.entries.anime.track.AnimeTrackItem import eu.kanade.tachiyomi.util.lang.toLocalDate import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.format.DateTimeFormatter @Composable fun AnimeTrackInfoDialogHome( trackItems: List, dateFormat: DateTimeFormatter, onStatusClick: (AnimeTrackItem) -> Unit, onEpisodeClick: (AnimeTrackItem) -> Unit, onScoreClick: (AnimeTrackItem) -> Unit, onStartDateEdit: (AnimeTrackItem) -> Unit, onEndDateEdit: (AnimeTrackItem) -> Unit, onNewSearch: (AnimeTrackItem) -> Unit, onOpenInBrowser: (AnimeTrackItem) -> Unit, onRemoved: (AnimeTrackItem) -> Unit, onCopyLink: (AnimeTrackItem) -> Unit, onTogglePrivate: (AnimeTrackItem) -> Unit, ) { Column( modifier = Modifier .animateContentSize() .fillMaxWidth() .verticalScroll(rememberScrollState()) .padding(16.dp) .windowInsetsPadding(WindowInsets.systemBars), verticalArrangement = Arrangement.spacedBy(24.dp), ) { trackItems.forEach { item -> if (item.track != null) { val supportsScoring = item.tracker.animeService.getScoreList().isNotEmpty() val supportsReadingDates = item.tracker.supportsReadingDates val supportsPrivate = item.tracker.supportsPrivateTracking TrackInfoItem( title = item.track.title, tracker = item.tracker, status = (item.tracker as? AnimeTracker)?.getStatusForAnime(item.track.status), onStatusClick = { onStatusClick(item) }, episodes = "${item.track.lastEpisodeSeen.toInt()}".let { val totalEpisodes = item.track.totalEpisodes if (totalEpisodes > 0) { // Add known total episode count "$it / $totalEpisodes" } else { it } }, onEpisodesClick = { onEpisodeClick(item) }, score = item.tracker.animeService.displayScore(item.track) .takeIf { supportsScoring && item.track.score != 0.0 }, onScoreClick = { onScoreClick(item) } .takeIf { supportsScoring }, startDate = remember(item.track.startDate) { dateFormat.format( item.track.startDate.toLocalDate(), ) } .takeIf { supportsReadingDates && item.track.startDate != 0L }, onStartDateClick = { onStartDateEdit(item) } // TODO .takeIf { supportsReadingDates }, endDate = dateFormat.format(item.track.finishDate.toLocalDate()) .takeIf { supportsReadingDates && item.track.finishDate != 0L }, onEndDateClick = { onEndDateEdit(item) } .takeIf { supportsReadingDates }, onNewSearch = { onNewSearch(item) }, onOpenInBrowser = { onOpenInBrowser(item) }, onRemoved = { onRemoved(item) }, onCopyLink = { onCopyLink(item) }, private = item.track.private, onTogglePrivate = { onTogglePrivate(item) } .takeIf { supportsPrivate }, ) } else { TrackInfoItemEmpty( tracker = item.tracker, onNewSearch = { onNewSearch(item) }, ) } } } } @Composable private fun TrackInfoItem( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, episodes: String, onEpisodesClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, onCopyLink: () -> Unit, private: Boolean, onTogglePrivate: (() -> Unit)?, ) { val context = LocalContext.current Column { Row( verticalAlignment = Alignment.CenterVertically, ) { BadgedBox( badge = { if (private) { Badge( containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.absoluteOffset(x = (-5).dp), ) { Icon( imageVector = Icons.Filled.VisibilityOff, contentDescription = stringResource(MR.strings.tracked_privately), modifier = Modifier.size(14.dp), ) } } }, ) { TrackLogoIcon( tracker = tracker, onClick = onOpenInBrowser, onLongClick = onCopyLink, ) } Box( modifier = Modifier .height(48.dp) .weight(1f) .combinedClickable( onClick = onNewSearch, onLongClick = { context.copyToClipboard(title, title) }, ) .padding(start = 16.dp), contentAlignment = Alignment.CenterStart, ) { Text( text = title, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface, ) } VerticalDivider() TrackInfoItemMenu( onOpenInBrowser = onOpenInBrowser, onRemoved = onRemoved, onCopyLink = onCopyLink, private = private, onTogglePrivate = onTogglePrivate, ) } Box( modifier = Modifier .padding(top = 12.dp) .clip(MaterialTheme.shapes.medium) .background(MaterialTheme.colorScheme.surfaceContainerHighest) .padding(8.dp) .clip(RoundedCornerShape(6.dp)), ) { Column { Row(modifier = Modifier.height(IntrinsicSize.Min)) { TrackDetailsItem( modifier = Modifier.weight(1f), text = status?.let { stringResource(it) } ?: "", onClick = onStatusClick, ) VerticalDivider() TrackDetailsItem( modifier = Modifier.weight(1f), text = episodes, onClick = onEpisodesClick, ) if (onScoreClick != null) { VerticalDivider() TrackDetailsItem( modifier = Modifier.weight(1f), text = score, placeholder = stringResource(MR.strings.score), onClick = onScoreClick, ) } } if (onStartDateClick != null && onEndDateClick != null) { HorizontalDivider() Row(modifier = Modifier.height(IntrinsicSize.Min)) { TrackDetailsItem( modifier = Modifier.weight(1F), text = startDate, placeholder = stringResource(MR.strings.track_started_reading_date), onClick = onStartDateClick, ) VerticalDivider() TrackDetailsItem( modifier = Modifier.weight(1F), text = endDate, placeholder = stringResource(MR.strings.track_finished_reading_date), onClick = onEndDateClick, ) } } } } } } @Composable private fun TrackInfoItemEmpty( tracker: Tracker, onNewSearch: () -> Unit, ) { Row( verticalAlignment = Alignment.CenterVertically, ) { TrackLogoIcon(tracker) TextButton( onClick = onNewSearch, modifier = Modifier .padding(start = 16.dp) .weight(1f), ) { Text(text = stringResource(MR.strings.add_tracking)) } } } @PreviewLightDark @Composable private fun TrackInfoDialogHomePreviews( @PreviewParameter(AnimeTrackInfoDialogHomePreviewProvider::class) content: @Composable () -> Unit, ) { TachiyomiPreviewTheme { content() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackInfoDialogHomePreviewProvider.kt ================================================ package eu.kanade.presentation.track.anime import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.PreviewParameterProvider import eu.kanade.tachiyomi.ui.entries.anime.track.AnimeTrackItem import eu.kanade.test.DummyTracker import tachiyomi.domain.track.anime.model.AnimeTrack import java.time.format.DateTimeFormatter import java.time.format.FormatStyle internal class AnimeTrackInfoDialogHomePreviewProvider : PreviewParameterProvider<@Composable () -> Unit> { private val aTrack = AnimeTrack( id = 1L, animeId = 2L, trackerId = 3L, remoteId = 4L, libraryId = null, title = "Manage Name On Tracker Site", lastEpisodeSeen = 2.0, totalEpisodes = 12L, status = 1L, score = 2.0, remoteUrl = "https://example.com", startDate = 0L, finishDate = 0L, private = false, ) private val privateTrack = aTrack.copy(private = true) private val trackItemWithoutTrack = AnimeTrackItem( track = null, tracker = DummyTracker( id = 1L, name = "Example Tracker", ), ) private val trackItemWithTrack = AnimeTrackItem( track = aTrack, tracker = DummyTracker( id = 2L, name = "Example Tracker 2", ), ) private val trackItemWithPrivateTrack = AnimeTrackItem( track = privateTrack, tracker = DummyTracker( id = 2L, name = "Example Tracker 2", ), ) private val trackersWithAndWithoutTrack = @Composable { AnimeTrackInfoDialogHome( trackItems = listOf( trackItemWithoutTrack, trackItemWithTrack, ), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), onStatusClick = {}, onEpisodeClick = {}, onScoreClick = {}, onStartDateEdit = {}, onEndDateEdit = {}, onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, onCopyLink = {}, onTogglePrivate = {}, ) } private val noTrackers = @Composable { AnimeTrackInfoDialogHome( trackItems = listOf(), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), onStatusClick = {}, onEpisodeClick = {}, onScoreClick = {}, onStartDateEdit = {}, onEndDateEdit = {}, onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, onCopyLink = {}, onTogglePrivate = {}, ) } private val trackerWithPrivateTracking = @Composable { AnimeTrackInfoDialogHome( trackItems = listOf(trackItemWithPrivateTrack), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), onStatusClick = {}, onEpisodeClick = {}, onScoreClick = {}, onStartDateEdit = {}, onEndDateEdit = {}, onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, onCopyLink = {}, onTogglePrivate = {}, ) } override val values: Sequence<@Composable () -> Unit> get() = sequenceOf( trackersWithAndWithoutTrack, noTrackers, trackerWithPrivateTracking, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackerSearch.kt ================================================ package eu.kanade.presentation.track.anime import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.paddingFromBaseline import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.foundation.text.input.clearText import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.ClipboardManager import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.toLowerCase import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.util.system.openInBrowser import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.runOnEnterKeyPressed import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun AnimeTrackerSearch( state: TextFieldState, onDispatchQuery: () -> Unit, queryResult: Result>?, selected: AnimeTrackSearch?, onSelectedChange: (AnimeTrackSearch) -> Unit, onConfirmSelection: (private: Boolean) -> Unit, onDismissRequest: () -> Unit, supportsPrivateTracking: Boolean, ) { val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } val dispatchQueryAndClearFocus: () -> Unit = { onDispatchQuery() focusManager.clearFocus() } Scaffold( topBar = { Column { TopAppBar( navigationIcon = { IconButton(onClick = onDismissRequest) { Icon( imageVector = Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } }, title = { BasicTextField( state = state, modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester) .runOnEnterKeyPressed(action = dispatchQueryAndClearFocus), textStyle = MaterialTheme.typography.bodyLarge .copy(color = MaterialTheme.colorScheme.onSurface), lineLimits = TextFieldLineLimits.SingleLine, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), onKeyboardAction = { dispatchQueryAndClearFocus() }, cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), decorator = { if (state.text.isEmpty()) { Text( text = stringResource(MR.strings.action_search_hint), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyLarge, ) } it() }, ) }, actions = { if (state.text.isNotEmpty()) { IconButton( onClick = { state.clearText() focusRequester.requestFocus() }, ) { Icon( imageVector = Icons.Default.Close, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } }, ) HorizontalDivider() } }, bottomBar = { AnimatedVisibility( visible = selected != null, enter = fadeIn() + slideInVertically { it / 2 }, exit = slideOutVertically { it / 2 } + fadeOut(), ) { Row( modifier = Modifier .padding(MaterialTheme.padding.small) .windowInsetsPadding(WindowInsets.navigationBars) .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Button( onClick = { onConfirmSelection(false) }, modifier = Modifier.weight(1f), elevation = ButtonDefaults.elevatedButtonElevation(), ) { Text(text = stringResource(MR.strings.action_track)) } if (supportsPrivateTracking) { Button( onClick = { onConfirmSelection(true) }, elevation = ButtonDefaults.elevatedButtonElevation(), ) { Icon( imageVector = Icons.Filled.VisibilityOff, contentDescription = stringResource(MR.strings.action_toggle_private_on), ) } } } } }, ) { innerPadding -> if (queryResult == null) { LoadingScreen(modifier = Modifier.padding(innerPadding)) } else { val availableTracks = queryResult.getOrNull() if (availableTracks != null) { if (availableTracks.isEmpty()) { EmptyScreen( modifier = Modifier.padding(innerPadding), stringRes = MR.strings.no_results_found, ) } else { ScrollbarLazyColumn( contentPadding = innerPadding + PaddingValues(vertical = 12.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { items( items = availableTracks, key = { it.hashCode() }, ) { SearchResultItem( trackSearch = it, selected = it == selected, onClick = { onSelectedChange(it) }, ) } } } } else { EmptyScreen( modifier = Modifier.padding(innerPadding), message = queryResult.exceptionOrNull()?.message ?: stringResource(MR.strings.unknown_error), ) } } } } @Composable private fun SearchResultItem( trackSearch: AnimeTrackSearch, selected: Boolean, onClick: () -> Unit, ) { val context = LocalContext.current val clipboardManager: ClipboardManager = LocalClipboardManager.current val focusManager = LocalFocusManager.current val type = trackSearch.publishing_type.toLowerCase(Locale.current).capitalize(Locale.current) val status = trackSearch.publishing_status.toLowerCase(Locale.current).capitalize(Locale.current) val description = trackSearch.summary.trim() val shape = RoundedCornerShape(16.dp) val borderColor = if (selected) MaterialTheme.colorScheme.outline else Color.Transparent var dropDownMenuExpanded by remember { mutableStateOf(false) } Box( modifier = Modifier .fillMaxWidth() .padding(horizontal = 12.dp) .clip(shape) .background(MaterialTheme.colorScheme.surface) .border( width = 2.dp, color = borderColor, shape = shape, ) .combinedClickable( onLongClick = { dropDownMenuExpanded = true }, onClick = { focusManager.clearFocus() onClick() }, ) .padding(12.dp), ) { if (selected) { Icon( imageVector = Icons.Filled.CheckCircle, contentDescription = null, modifier = Modifier.align(Alignment.TopEnd), tint = MaterialTheme.colorScheme.primary, ) } Column { Row { ItemCover.Book( data = trackSearch.cover_url, modifier = Modifier.height(96.dp), ) Spacer(modifier = Modifier.width(12.dp)) Column { Text( text = trackSearch.title, modifier = Modifier.padding(end = 28.dp), maxLines = 2, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleMedium, ) SearchResultItemDropDownMenu( expanded = dropDownMenuExpanded, onCollapseMenu = { dropDownMenuExpanded = false }, onCopyName = { clipboardManager.setText(AnnotatedString(trackSearch.title)) }, onOpenInBrowser = { val url = trackSearch.tracking_url if (url.isNotBlank()) { context.openInBrowser(url) } }, ) if (trackSearch.authors.isNotEmpty() || trackSearch.artists.isNotEmpty()) { Text( text = (trackSearch.authors + trackSearch.artists).distinct().joinToString(), modifier = Modifier.secondaryItemAlpha(), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } if (type.isNotBlank()) { SearchResultItemDetails( title = stringResource(MR.strings.track_type), text = type, ) } if (trackSearch.start_date.isNotBlank()) { SearchResultItemDetails( title = stringResource(MR.strings.label_started), text = trackSearch.start_date, ) } if (status.isNotBlank()) { SearchResultItemDetails( title = stringResource(MR.strings.track_status), text = status, ) } if (trackSearch.score != -1.0) { SearchResultItemDetails( title = stringResource(MR.strings.score), text = trackSearch.score.toString(), ) } } } if (description.isNotBlank()) { Text( text = description, modifier = Modifier .paddingFromBaseline(top = 24.dp) .secondaryItemAlpha(), maxLines = 4, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } } } } @Composable private fun SearchResultItemDropDownMenu( expanded: Boolean, onCollapseMenu: () -> Unit, onCopyName: () -> Unit, onOpenInBrowser: () -> Unit, ) { DropdownMenu( expanded = expanded, onDismissRequest = onCollapseMenu, ) { DropdownMenuItem( text = { Text(stringResource(MR.strings.action_copy_to_clipboard)) }, onClick = { onCopyName() onCollapseMenu() }, ) DropdownMenuItem( text = { Text(stringResource(MR.strings.action_open_in_browser)) }, onClick = { onOpenInBrowser() }, ) } } @Composable private fun SearchResultItemDetails( title: String, text: String, ) { Row(horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall)) { Text( text = title, maxLines = 1, style = MaterialTheme.typography.titleSmall, ) Text( text = text, modifier = Modifier .weight(1f) .secondaryItemAlpha(), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) } } @PreviewLightDark @Composable private fun TrackerSearchPreviews( @PreviewParameter(AnimeTrackerSearchPreviewProvider::class) content: @Composable () -> Unit, ) { TachiyomiPreviewTheme { Surface { content() } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/anime/AnimeTrackerSearchPreviewProvider.kt ================================================ package eu.kanade.presentation.track.anime import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.datasource.LoremIpsum import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import java.text.SimpleDateFormat import java.time.Instant import java.time.temporal.ChronoUnit import java.util.Date import java.util.Locale import kotlin.random.Random internal class AnimeTrackerSearchPreviewProvider : PreviewParameterProvider<@Composable () -> Unit> { private val fullPageWithSecondSelected = @Composable { val items = someTrackSearches().take(30).toList() AnimeTrackerSearch( state = TextFieldState(initialText = "search text"), onDispatchQuery = {}, queryResult = Result.success(items), selected = items[1], onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = false, ) } private val fullPageWithoutSelected = @Composable { AnimeTrackerSearch( state = TextFieldState(), onDispatchQuery = {}, queryResult = Result.success(someTrackSearches().take(30).toList()), selected = null, onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = false, ) } private val loading = @Composable { AnimeTrackerSearch( state = TextFieldState(), onDispatchQuery = {}, queryResult = null, selected = null, onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = false, ) } private val fullPageWithPrivateTracking = @Composable { val items = someTrackSearches().take(30).toList() AnimeTrackerSearch( state = TextFieldState(initialText = "search text"), onDispatchQuery = {}, queryResult = Result.success(items), selected = items[1], onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = true, ) } override val values: Sequence<@Composable () -> Unit> = sequenceOf( fullPageWithSecondSelected, fullPageWithoutSelected, loading, fullPageWithPrivateTracking, ) private fun someTrackSearches(): Sequence = sequence { while (true) { yield(randTrackSearch()) } } private val formatter: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) private fun randTrackSearch() = AnimeTrackSearch().let { it.id = Random.nextLong() it.anime_id = Random.nextLong() it.tracker_id = Random.nextLong() it.remote_id = Random.nextLong() it.library_id = Random.nextLong() it.title = lorem((1..10).random()).joinToString() it.last_episode_seen = (0..100).random().toDouble() it.total_episodes = (100L..1000L).random() it.score = (0..10).random().toDouble() it.status = Random.nextLong() it.started_watching_date = 0L it.finished_watching_date = 0L it.tracking_url = "https://example.com/tracker-example" it.cover_url = "https://example.com/cover.png" it.start_date = formatter.format(Date.from(Instant.now().minus((1L..365).random(), ChronoUnit.DAYS))) it.summary = lorem((0..40).random()).joinToString() it.publishing_status = if (Random.nextBoolean()) "Finished" else "" it.publishing_type = if (Random.nextBoolean()) "OVA" else "" it.artists = randomNames() it.authors = randomNames() it } private fun randomNames(): List = (0..(0..3).random()).map { lorem((3..5).random()).joinToString() } private fun lorem(words: Int): Sequence = LoremIpsum(words).values } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIcon.kt ================================================ package eu.kanade.presentation.track.components import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.data.track.Tracker import tachiyomi.presentation.core.util.clickableNoIndication @Composable fun TrackLogoIcon( tracker: Tracker, onClick: (() -> Unit)? = null, onLongClick: (() -> Unit)? = null, ) { val modifier = if (onClick != null) { Modifier.clickableNoIndication(onClick = onClick, onLongClick = onLongClick) } else { Modifier } Box( modifier = modifier .size(48.dp) .background(color = Color(tracker.getLogoColor()), shape = MaterialTheme.shapes.medium) .padding(4.dp), contentAlignment = Alignment.Center, ) { Image( painter = painterResource(tracker.getLogo()), contentDescription = tracker.name, ) } } @PreviewLightDark @Composable private fun TrackLogoIconPreviews( @PreviewParameter(TrackLogoIconPreviewProvider::class) tracker: Tracker, ) { TachiyomiPreviewTheme { TrackLogoIcon( tracker = tracker, onClick = null, onLongClick = null, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/components/TrackLogoIconPreviewProvider.kt ================================================ package eu.kanade.presentation.track.components import android.graphics.Color import androidx.compose.ui.tooling.preview.PreviewParameterProvider import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.test.DummyTracker internal class TrackLogoIconPreviewProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( DummyTracker( id = 1L, name = "Dummy Tracker", valLogoColor = Color.rgb(18, 25, 35), valLogo = R.drawable.ic_tracker_anilist, ), ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHome.kt ================================================ package eu.kanade.presentation.track.manga import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.absoluteOffset import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.Badge import androidx.compose.material3.BadgedBox import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.track.components.TrackLogoIcon import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.ui.entries.manga.track.MangaTrackItem import eu.kanade.tachiyomi.util.lang.toLocalDate import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.format.DateTimeFormatter @Composable fun MangaTrackInfoDialogHome( trackItems: List, dateFormat: DateTimeFormatter, onStatusClick: (MangaTrackItem) -> Unit, onChapterClick: (MangaTrackItem) -> Unit, onScoreClick: (MangaTrackItem) -> Unit, onStartDateEdit: (MangaTrackItem) -> Unit, onEndDateEdit: (MangaTrackItem) -> Unit, onNewSearch: (MangaTrackItem) -> Unit, onOpenInBrowser: (MangaTrackItem) -> Unit, onRemoved: (MangaTrackItem) -> Unit, onCopyLink: (MangaTrackItem) -> Unit, onTogglePrivate: (MangaTrackItem) -> Unit, ) { Column( modifier = Modifier .animateContentSize() .fillMaxWidth() .verticalScroll(rememberScrollState()) .padding(16.dp) .windowInsetsPadding(WindowInsets.systemBars), verticalArrangement = Arrangement.spacedBy(24.dp), ) { trackItems.forEach { item -> if (item.track != null) { val supportsScoring = item.tracker.mangaService.getScoreList().isNotEmpty() val supportsReadingDates = item.tracker.supportsReadingDates val supportsPrivate = item.tracker.supportsPrivateTracking TrackInfoItem( title = item.track.title, tracker = item.tracker, status = (item.tracker as? MangaTracker)?.getStatusForManga(item.track.status), onStatusClick = { onStatusClick(item) }, chapters = "${item.track.lastChapterRead.toInt()}".let { val totalChapters = item.track.totalChapters if (totalChapters > 0) { // Add known total chapter count "$it / $totalChapters" } else { it } }, onChaptersClick = { onChapterClick(item) }, score = item.tracker.mangaService.displayScore(item.track) .takeIf { supportsScoring && item.track.score != 0.0 }, onScoreClick = { onScoreClick(item) } .takeIf { supportsScoring }, startDate = remember(item.track.startDate) { dateFormat.format( item.track.startDate.toLocalDate(), ) } .takeIf { supportsReadingDates && item.track.startDate != 0L }, onStartDateClick = { onStartDateEdit(item) } // TODO .takeIf { supportsReadingDates }, endDate = dateFormat.format(item.track.finishDate.toLocalDate()) .takeIf { supportsReadingDates && item.track.finishDate != 0L }, onEndDateClick = { onEndDateEdit(item) } .takeIf { supportsReadingDates }, onNewSearch = { onNewSearch(item) }, onOpenInBrowser = { onOpenInBrowser(item) }, onRemoved = { onRemoved(item) }, onCopyLink = { onCopyLink(item) }, private = item.track.private, onTogglePrivate = { onTogglePrivate(item) } .takeIf { supportsPrivate }, ) } else { TrackInfoItemEmpty( tracker = item.tracker, onNewSearch = { onNewSearch(item) }, ) } } } } @Composable private fun TrackInfoItem( title: String, tracker: Tracker, status: StringResource?, onStatusClick: () -> Unit, chapters: String, onChaptersClick: () -> Unit, score: String?, onScoreClick: (() -> Unit)?, startDate: String?, onStartDateClick: (() -> Unit)?, endDate: String?, onEndDateClick: (() -> Unit)?, onNewSearch: () -> Unit, onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, onCopyLink: () -> Unit, private: Boolean, onTogglePrivate: (() -> Unit)?, ) { val context = LocalContext.current Column { Row( verticalAlignment = Alignment.CenterVertically, ) { BadgedBox( badge = { if (private) { Badge( containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.absoluteOffset(x = (-5).dp), ) { Icon( imageVector = Icons.Filled.VisibilityOff, contentDescription = stringResource(MR.strings.tracked_privately), modifier = Modifier.size(14.dp), ) } } }, ) { TrackLogoIcon( tracker = tracker, onClick = onOpenInBrowser, onLongClick = onCopyLink, ) } Box( modifier = Modifier .height(48.dp) .weight(1f) .combinedClickable( onClick = onNewSearch, onLongClick = { context.copyToClipboard(title, title) }, ) .padding(start = 16.dp), contentAlignment = Alignment.CenterStart, ) { Text( text = title, maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface, ) } VerticalDivider() TrackInfoItemMenu( onOpenInBrowser = onOpenInBrowser, onRemoved = onRemoved, onCopyLink = onCopyLink, private = private, onTogglePrivate = onTogglePrivate, ) } Box( modifier = Modifier .padding(top = 12.dp) .clip(MaterialTheme.shapes.medium) .background(MaterialTheme.colorScheme.surfaceContainerHighest) .padding(8.dp) .clip(RoundedCornerShape(6.dp)), ) { Column { Row(modifier = Modifier.height(IntrinsicSize.Min)) { TrackDetailsItem( modifier = Modifier.weight(1f), text = status?.let { stringResource(it) } ?: "", onClick = onStatusClick, ) VerticalDivider() TrackDetailsItem( modifier = Modifier.weight(1f), text = chapters, onClick = onChaptersClick, ) if (onScoreClick != null) { VerticalDivider() TrackDetailsItem( modifier = Modifier.weight(1f), text = score, placeholder = stringResource(MR.strings.score), onClick = onScoreClick, ) } } if (onStartDateClick != null && onEndDateClick != null) { HorizontalDivider() Row(modifier = Modifier.height(IntrinsicSize.Min)) { TrackDetailsItem( modifier = Modifier.weight(1F), text = startDate, placeholder = stringResource(MR.strings.track_started_reading_date), onClick = onStartDateClick, ) VerticalDivider() TrackDetailsItem( modifier = Modifier.weight(1F), text = endDate, placeholder = stringResource(MR.strings.track_finished_reading_date), onClick = onEndDateClick, ) } } } } } } private const val UNSET_TEXT_ALPHA = 0.5F @Composable fun TrackDetailsItem( text: String?, onClick: () -> Unit, modifier: Modifier = Modifier, placeholder: String = "", ) { Box( modifier = modifier .clickable(onClick = onClick) .fillMaxHeight() .padding(12.dp), contentAlignment = Alignment.Center, ) { Text( text = text ?: placeholder, maxLines = 2, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Center, color = MaterialTheme.colorScheme.onSurface.copy(alpha = if (text == null) UNSET_TEXT_ALPHA else 1f), ) } } @Composable private fun TrackInfoItemEmpty( tracker: Tracker, onNewSearch: () -> Unit, ) { Row( verticalAlignment = Alignment.CenterVertically, ) { TrackLogoIcon(tracker) TextButton( onClick = onNewSearch, modifier = Modifier .padding(start = 16.dp) .weight(1f), ) { Text(text = stringResource(MR.strings.add_tracking)) } } } @Composable fun TrackInfoItemMenu( onOpenInBrowser: () -> Unit, onRemoved: () -> Unit, onCopyLink: () -> Unit, private: Boolean, onTogglePrivate: (() -> Unit)?, ) { var expanded by remember { mutableStateOf(false) } Box(modifier = Modifier.wrapContentSize(Alignment.TopStart)) { IconButton(onClick = { expanded = true }) { Icon( imageVector = Icons.Default.MoreVert, contentDescription = stringResource(MR.strings.label_more), ) } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false }, ) { DropdownMenuItem( text = { Text(stringResource(MR.strings.action_open_in_browser)) }, onClick = { onOpenInBrowser() expanded = false }, ) DropdownMenuItem( text = { Text(stringResource(MR.strings.action_copy_link)) }, onClick = { onCopyLink() expanded = false }, ) if (onTogglePrivate != null) { DropdownMenuItem( text = { Text( stringResource( if (private) { MR.strings.action_toggle_private_off } else { MR.strings.action_toggle_private_on }, ), ) }, onClick = { onTogglePrivate() expanded = false }, ) } DropdownMenuItem( text = { Text(stringResource(MR.strings.action_remove)) }, onClick = { onRemoved() expanded = false }, ) } } } @PreviewLightDark @Composable private fun TrackInfoDialogHomePreviews( @PreviewParameter(MangaTrackInfoDialogHomePreviewProvider::class) content: @Composable () -> Unit, ) { TachiyomiPreviewTheme { content() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackInfoDialogHomePreviewProvider.kt ================================================ package eu.kanade.presentation.track.manga import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.PreviewParameterProvider import eu.kanade.tachiyomi.ui.entries.manga.track.MangaTrackItem import eu.kanade.test.DummyTracker import tachiyomi.domain.track.manga.model.MangaTrack import java.time.format.DateTimeFormatter import java.time.format.FormatStyle internal class MangaTrackInfoDialogHomePreviewProvider : PreviewParameterProvider<@Composable () -> Unit> { private val aTrack = MangaTrack( id = 1L, mangaId = 2L, trackerId = 3L, remoteId = 4L, libraryId = null, title = "Manage Name On Tracker Site", lastChapterRead = 2.0, totalChapters = 12L, status = 1L, score = 2.0, remoteUrl = "https://example.com", startDate = 0L, finishDate = 0L, private = false, ) private val privateTrack = aTrack.copy(private = true) private val trackItemWithoutTrack = MangaTrackItem( track = null, tracker = DummyTracker( id = 1L, name = "Example Tracker", ), ) private val trackItemWithTrack = MangaTrackItem( track = aTrack, tracker = DummyTracker( id = 2L, name = "Example Tracker 2", ), ) private val trackItemWithPrivateTrack = MangaTrackItem( track = privateTrack, tracker = DummyTracker( id = 2L, name = "Example Tracker 2", ), ) private val trackersWithAndWithoutTrack = @Composable { MangaTrackInfoDialogHome( trackItems = listOf( trackItemWithoutTrack, trackItemWithTrack, ), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), onStatusClick = {}, onChapterClick = {}, onScoreClick = {}, onStartDateEdit = {}, onEndDateEdit = {}, onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, onCopyLink = {}, onTogglePrivate = {}, ) } private val noTrackers = @Composable { MangaTrackInfoDialogHome( trackItems = listOf(), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), onStatusClick = {}, onChapterClick = {}, onScoreClick = {}, onStartDateEdit = {}, onEndDateEdit = {}, onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, onCopyLink = {}, onTogglePrivate = {}, ) } private val trackerWithPrivateTracking = @Composable { MangaTrackInfoDialogHome( trackItems = listOf(trackItemWithPrivateTrack), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), onStatusClick = {}, onChapterClick = {}, onScoreClick = {}, onStartDateEdit = {}, onEndDateEdit = {}, onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, onCopyLink = {}, onTogglePrivate = {}, ) } override val values: Sequence<@Composable () -> Unit> get() = sequenceOf( trackersWithAndWithoutTrack, noTrackers, trackerWithPrivateTracking, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackerSearch.kt ================================================ package eu.kanade.presentation.track.manga import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.paddingFromBaseline import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.foundation.text.input.clearText import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.ClipboardManager import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.toLowerCase import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.util.system.openInBrowser import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.util.plus import tachiyomi.presentation.core.util.runOnEnterKeyPressed import tachiyomi.presentation.core.util.secondaryItemAlpha @Composable fun MangaTrackerSearch( state: TextFieldState, onDispatchQuery: () -> Unit, queryResult: Result>?, selected: MangaTrackSearch?, onSelectedChange: (MangaTrackSearch) -> Unit, onConfirmSelection: (private: Boolean) -> Unit, onDismissRequest: () -> Unit, supportsPrivateTracking: Boolean, ) { val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } val dispatchQueryAndClearFocus: () -> Unit = { onDispatchQuery() focusManager.clearFocus() } Scaffold( topBar = { Column { TopAppBar( navigationIcon = { IconButton(onClick = onDismissRequest) { Icon( imageVector = Icons.AutoMirrored.Outlined.ArrowBack, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } }, title = { BasicTextField( state = state, modifier = Modifier .fillMaxWidth() .focusRequester(focusRequester) .runOnEnterKeyPressed(action = dispatchQueryAndClearFocus), textStyle = MaterialTheme.typography.bodyLarge .copy(color = MaterialTheme.colorScheme.onSurface), lineLimits = TextFieldLineLimits.SingleLine, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), onKeyboardAction = { dispatchQueryAndClearFocus() }, cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), decorator = { if (state.text.isEmpty()) { Text( text = stringResource(MR.strings.action_search_hint), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyLarge, ) } it() }, ) }, actions = { if (state.text.isNotEmpty()) { IconButton( onClick = { state.clearText() focusRequester.requestFocus() }, ) { Icon( imageVector = Icons.Default.Close, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } }, ) HorizontalDivider() } }, bottomBar = { AnimatedVisibility( visible = selected != null, enter = fadeIn() + slideInVertically { it / 2 }, exit = slideOutVertically { it / 2 } + fadeOut(), ) { Row( modifier = Modifier .padding(MaterialTheme.padding.small) .windowInsetsPadding(WindowInsets.navigationBars) .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Button( onClick = { onConfirmSelection(false) }, modifier = Modifier.weight(1f), elevation = ButtonDefaults.elevatedButtonElevation(), ) { Text(text = stringResource(MR.strings.action_track)) } if (supportsPrivateTracking) { Button( onClick = { onConfirmSelection(true) }, elevation = ButtonDefaults.elevatedButtonElevation(), ) { Icon( imageVector = Icons.Filled.VisibilityOff, contentDescription = stringResource(MR.strings.action_toggle_private_on), ) } } } } }, ) { innerPadding -> if (queryResult == null) { LoadingScreen(modifier = Modifier.padding(innerPadding)) } else { val availableTracks = queryResult.getOrNull() if (availableTracks != null) { if (availableTracks.isEmpty()) { EmptyScreen( modifier = Modifier.padding(innerPadding), stringRes = MR.strings.no_results_found, ) } else { ScrollbarLazyColumn( contentPadding = innerPadding + PaddingValues(vertical = 12.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { items( items = availableTracks, key = { it.hashCode() }, ) { SearchResultItem( trackSearch = it, selected = it == selected, onClick = { onSelectedChange(it) }, ) } } } } else { EmptyScreen( modifier = Modifier.padding(innerPadding), message = queryResult.exceptionOrNull()?.message ?: stringResource(MR.strings.unknown_error), ) } } } } @Composable private fun SearchResultItem( trackSearch: MangaTrackSearch, selected: Boolean, onClick: () -> Unit, ) { val context = LocalContext.current val clipboardManager: ClipboardManager = LocalClipboardManager.current val focusManager = LocalFocusManager.current val type = trackSearch.publishing_type.toLowerCase(Locale.current).capitalize(Locale.current) val status = trackSearch.publishing_status.toLowerCase(Locale.current).capitalize(Locale.current) val description = trackSearch.summary.trim() val shape = RoundedCornerShape(16.dp) val borderColor = if (selected) MaterialTheme.colorScheme.outline else Color.Transparent var dropDownMenuExpanded by remember { mutableStateOf(false) } Box( modifier = Modifier .fillMaxWidth() .padding(horizontal = 12.dp) .clip(shape) .background(MaterialTheme.colorScheme.surface) .border( width = 2.dp, color = borderColor, shape = shape, ) .combinedClickable( onLongClick = { dropDownMenuExpanded = true }, onClick = { focusManager.clearFocus() onClick() }, ) .padding(12.dp), ) { if (selected) { Icon( imageVector = Icons.Filled.CheckCircle, contentDescription = null, modifier = Modifier.align(Alignment.TopEnd), tint = MaterialTheme.colorScheme.primary, ) } Column { Row { ItemCover.Book( data = trackSearch.cover_url, modifier = Modifier.height(96.dp), ) Spacer(modifier = Modifier.width(12.dp)) Column { Text( text = trackSearch.title, modifier = Modifier.padding(end = 28.dp), maxLines = 2, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.titleMedium, ) SearchResultItemDropDownMenu( expanded = dropDownMenuExpanded, onCollapseMenu = { dropDownMenuExpanded = false }, onCopyName = { clipboardManager.setText(AnnotatedString(trackSearch.title)) }, onOpenInBrowser = { val url = trackSearch.tracking_url if (url.isNotBlank()) { context.openInBrowser(url) } }, ) if (trackSearch.authors.isNotEmpty() || trackSearch.artists.isNotEmpty()) { Text( text = (trackSearch.authors + trackSearch.artists).distinct().joinToString(), modifier = Modifier.secondaryItemAlpha(), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } if (type.isNotBlank()) { SearchResultItemDetails( title = stringResource(MR.strings.track_type), text = type, ) } if (trackSearch.start_date.isNotBlank()) { SearchResultItemDetails( title = stringResource(MR.strings.label_started), text = trackSearch.start_date, ) } if (status.isNotBlank()) { SearchResultItemDetails( title = stringResource(MR.strings.track_status), text = status, ) } if (trackSearch.score != -1.0) { SearchResultItemDetails( title = stringResource(MR.strings.score), text = trackSearch.score.toString(), ) } } } if (description.isNotBlank()) { Text( text = description, modifier = Modifier .paddingFromBaseline(top = 24.dp) .secondaryItemAlpha(), maxLines = 4, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodySmall, ) } } } } @Composable private fun SearchResultItemDropDownMenu( expanded: Boolean, onCollapseMenu: () -> Unit, onCopyName: () -> Unit, onOpenInBrowser: () -> Unit, ) { DropdownMenu( expanded = expanded, onDismissRequest = onCollapseMenu, ) { DropdownMenuItem( text = { Text(stringResource(MR.strings.action_copy_to_clipboard)) }, onClick = { onCopyName() onCollapseMenu() }, ) DropdownMenuItem( text = { Text(stringResource(MR.strings.action_open_in_browser)) }, onClick = { onOpenInBrowser() }, ) } } @Composable private fun SearchResultItemDetails( title: String, text: String, ) { Row(horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall)) { Text( text = title, maxLines = 1, style = MaterialTheme.typography.titleSmall, ) Text( text = text, modifier = Modifier .weight(1f) .secondaryItemAlpha(), maxLines = 1, overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, ) } } @PreviewLightDark @Composable private fun TrackerSearchPreviews( @PreviewParameter(MangaTrackerSearchPreviewProvider::class) content: @Composable () -> Unit, ) { TachiyomiPreviewTheme { Surface { content() } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/track/manga/MangaTrackerSearchPreviewProvider.kt ================================================ package eu.kanade.presentation.track.manga import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.datasource.LoremIpsum import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import java.text.SimpleDateFormat import java.time.Instant import java.time.temporal.ChronoUnit import java.util.Date import java.util.Locale import kotlin.random.Random internal class MangaTrackerSearchPreviewProvider : PreviewParameterProvider<@Composable () -> Unit> { private val fullPageWithSecondSelected = @Composable { val items = someTrackSearches().take(30).toList() MangaTrackerSearch( state = TextFieldState(initialText = "search text"), onDispatchQuery = {}, queryResult = Result.success(items), selected = items[1], onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = false, ) } private val fullPageWithoutSelected = @Composable { MangaTrackerSearch( state = TextFieldState(), onDispatchQuery = {}, queryResult = Result.success(someTrackSearches().take(30).toList()), selected = null, onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = false, ) } private val loading = @Composable { MangaTrackerSearch( state = TextFieldState(), onDispatchQuery = {}, queryResult = null, selected = null, onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = false, ) } private val fullPageWithPrivateTracking = @Composable { val items = someTrackSearches().take(30).toList() MangaTrackerSearch( state = TextFieldState(initialText = "search text"), onDispatchQuery = {}, queryResult = Result.success(items), selected = items[1], onSelectedChange = {}, onConfirmSelection = {}, onDismissRequest = {}, supportsPrivateTracking = true, ) } override val values: Sequence<@Composable () -> Unit> = sequenceOf( fullPageWithSecondSelected, fullPageWithoutSelected, loading, fullPageWithPrivateTracking, ) private fun someTrackSearches(): Sequence = sequence { while (true) { yield(randTrackSearch()) } } private val formatter: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) private fun randTrackSearch() = MangaTrackSearch().let { it.id = Random.nextLong() it.manga_id = Random.nextLong() it.tracker_id = Random.nextLong() it.remote_id = Random.nextLong() it.library_id = Random.nextLong() it.title = lorem((1..10).random()).joinToString() it.last_chapter_read = (0..100).random().toDouble() it.total_chapters = (100L..1000L).random() it.score = (0..10).random().toDouble() it.status = Random.nextLong() it.started_reading_date = 0L it.finished_reading_date = 0L it.tracking_url = "https://example.com/tracker-example" it.cover_url = "https://example.com/cover.png" it.start_date = formatter.format(Date.from(Instant.now().minus((1L..365).random(), ChronoUnit.DAYS))) it.summary = lorem((0..40).random()).joinToString() it.publishing_status = if (Random.nextBoolean()) "Finished" else "" it.publishing_type = if (Random.nextBoolean()) "Oneshot" else "" it.artists = randomNames() it.authors = randomNames() it } private fun randomNames(): List = (0..(0..3).random()).map { lorem((3..5).random()).joinToString() } private fun lorem(words: Int): Sequence = LoremIpsum(words).values } ================================================ FILE: app/src/main/java/eu/kanade/presentation/updates/UpdatesDialog.kt ================================================ package eu.kanade.presentation.updates import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun UpdatesDeleteConfirmationDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, isManga: Boolean, ) { val title = if (isManga) MR.strings.confirm_delete_chapters else AYMR.strings.confirm_delete_episodes AlertDialog( text = { Text(text = stringResource(title)) }, onDismissRequest = onDismissRequest, confirmButton = { TextButton(onClick = { onConfirm() onDismissRequest() }) { Text(text = stringResource(MR.strings.action_ok)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesScreen.kt ================================================ package eu.kanade.presentation.updates.anime import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastAny import eu.kanade.presentation.entries.anime.components.EpisodeDownloadAction import eu.kanade.presentation.entries.components.EntryBottomActionMenu import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.updates.anime.AnimeUpdatesItem import eu.kanade.tachiyomi.ui.updates.anime.AnimeUpdatesScreenModel import kotlinx.coroutines.delay import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.LocalDate import kotlin.time.Duration.Companion.seconds @Composable fun AnimeUpdateScreen( state: AnimeUpdatesScreenModel.State, snackbarHostState: SnackbarHostState, lastUpdated: Long, onClickCover: (AnimeUpdatesItem) -> Unit, onSelectAll: (Boolean) -> Unit, onInvertSelection: () -> Unit, onUpdateLibrary: () -> Boolean, onDownloadEpisode: (List, EpisodeDownloadAction) -> Unit, onMultiBookmarkClicked: (List, bookmark: Boolean) -> Unit, onMultiFillermarkClicked: (List, fillermark: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List, seen: Boolean) -> Unit, onMultiDeleteClicked: (List) -> Unit, onUpdateSelected: (AnimeUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onOpenEpisode: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, ) { BackHandler(enabled = state.selectionMode, onBack = { onSelectAll(false) }) Scaffold( bottomBar = { AnimeUpdatesBottomBar( selected = state.selected, onDownloadEpisode = onDownloadEpisode, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiFillermarkClicked = onMultiFillermarkClicked, onMultiMarkAsSeenClicked = onMultiMarkAsSeenClicked, onMultiDeleteClicked = onMultiDeleteClicked, onOpenEpisode = onOpenEpisode, ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.items.isEmpty() -> EmptyScreen( stringRes = MR.strings.information_no_recent, modifier = Modifier.padding(contentPadding), ) else -> { val scope = rememberCoroutineScope() var isRefreshing by remember { mutableStateOf(false) } PullRefresh( refreshing = isRefreshing, onRefresh = { val started = onUpdateLibrary() if (!started) return@PullRefresh scope.launch { // Fake refresh status but hide it after a second as it's a long running task isRefreshing = true delay(1.seconds) isRefreshing = false } }, enabled = !state.selectionMode, indicatorPadding = contentPadding, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { animeUpdatesLastUpdatedItem(lastUpdated) animeUpdatesUiItems( uiModels = state.getUiModel(), selectionMode = state.selectionMode, onUpdateSelected = onUpdateSelected, onClickCover = onClickCover, onClickUpdate = onOpenEpisode, onDownloadEpisode = onDownloadEpisode, ) } } } } } } @Composable private fun AnimeUpdatesBottomBar( selected: List, onDownloadEpisode: (List, EpisodeDownloadAction) -> Unit, onMultiBookmarkClicked: (List, bookmark: Boolean) -> Unit, onMultiFillermarkClicked: (List, fillermark: Boolean) -> Unit, onMultiMarkAsSeenClicked: (List, seen: Boolean) -> Unit, onMultiDeleteClicked: (List) -> Unit, onOpenEpisode: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, ) { val playerPreferences: PlayerPreferences = Injekt.get() EntryBottomActionMenu( visible = selected.isNotEmpty(), modifier = Modifier.fillMaxWidth(), onBookmarkClicked = { onMultiBookmarkClicked.invoke(selected, true) }.takeIf { selected.fastAny { !it.update.bookmark } }, onRemoveBookmarkClicked = { onMultiBookmarkClicked.invoke(selected, false) }.takeIf { selected.fastAll { it.update.bookmark } }, onFillermarkClicked = { onMultiFillermarkClicked.invoke(selected, true) }.takeIf { selected.fastAny { !it.update.fillermark } }, onRemoveFillermarkClicked = { onMultiFillermarkClicked.invoke(selected, false) }.takeIf { selected.fastAll { it.update.fillermark } }, onMarkAsViewedClicked = { onMultiMarkAsSeenClicked(selected, true) }.takeIf { selected.fastAny { !it.update.seen } }, onMarkAsUnviewedClicked = { onMultiMarkAsSeenClicked(selected, false) }.takeIf { selected.fastAny { it.update.seen || it.update.lastSecondSeen > 0L } }, onDownloadClicked = { onDownloadEpisode(selected, EpisodeDownloadAction.START) }.takeIf { selected.fastAny { it.downloadStateProvider() != AnimeDownload.State.DOWNLOADED } }, onDeleteClicked = { onMultiDeleteClicked(selected) }.takeIf { selected.fastAny { it.downloadStateProvider() == AnimeDownload.State.DOWNLOADED } }, onExternalClicked = { onOpenEpisode(selected[0], true) }.takeIf { !playerPreferences.alwaysUseExternalPlayer().get() && selected.size == 1 }, onInternalClicked = { onOpenEpisode(selected[0], true) }.takeIf { playerPreferences.alwaysUseExternalPlayer().get() && selected.size == 1 }, isManga = false, ) } sealed interface AnimeUpdatesUiModel { data class Header(val date: LocalDate) : AnimeUpdatesUiModel data class Item(val item: AnimeUpdatesItem) : AnimeUpdatesUiModel } ================================================ FILE: app/src/main/java/eu/kanade/presentation/updates/anime/AnimeUpdatesUiItem.kt ================================================ package eu.kanade.presentation.updates.anime import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Label import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.filled.Circle import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.relativeDateText import eu.kanade.presentation.entries.anime.components.EpisodeDownloadAction import eu.kanade.presentation.entries.anime.components.EpisodeDownloadIndicator import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.relativeTimeSpanString import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.ui.updates.anime.AnimeUpdatesItem import tachiyomi.domain.updates.anime.model.AnimeUpdatesWithRelations import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.ListGroupHeader import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground import java.util.concurrent.TimeUnit internal fun LazyListScope.animeUpdatesLastUpdatedItem( lastUpdated: Long, ) { item(key = "animeUpdates-lastUpdated") { Box( modifier = Modifier .animateItem(fadeInSpec = null, fadeOutSpec = null) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), ) { Text( text = stringResource(MR.strings.updates_last_update_info, relativeTimeSpanString(lastUpdated)), fontStyle = FontStyle.Italic, ) } } } internal fun LazyListScope.animeUpdatesUiItems( uiModels: List, selectionMode: Boolean, onUpdateSelected: (AnimeUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (AnimeUpdatesItem) -> Unit, onClickUpdate: (AnimeUpdatesItem, altPlayer: Boolean) -> Unit, onDownloadEpisode: (List, EpisodeDownloadAction) -> Unit, ) { items( items = uiModels, contentType = { when (it) { is AnimeUpdatesUiModel.Header -> "header" is AnimeUpdatesUiModel.Item -> "item" } }, key = { when (it) { is AnimeUpdatesUiModel.Header -> "animeUpdatesHeader-${it.hashCode()}" is AnimeUpdatesUiModel.Item -> "animeUpdates-${it.item.update.animeId}-${it.item.update.episodeId}" } }, ) { item -> when (item) { is AnimeUpdatesUiModel.Header -> { ListGroupHeader( modifier = Modifier.animateItemFastScroll(), text = relativeDateText(item.date), ) } is AnimeUpdatesUiModel.Item -> { val updatesItem = item.item AnimeUpdatesUiItem( modifier = Modifier.animateItemFastScroll(), update = updatesItem.update, selected = updatesItem.selected, watchProgress = updatesItem.update.lastSecondSeen .takeIf { !updatesItem.update.seen && it > 0L } ?.let { stringResource( AYMR.strings.episode_progress, formatProgress(it), formatProgress(updatesItem.update.totalSeconds), ) }, onLongClick = { onUpdateSelected(updatesItem, !updatesItem.selected, true, true) }, onClick = { when { selectionMode -> onUpdateSelected( updatesItem, !updatesItem.selected, true, false, ) else -> onClickUpdate(updatesItem, false) } }, onClickCover = { onClickCover(updatesItem) }.takeIf { !selectionMode }, onDownloadEpisode = { action: EpisodeDownloadAction -> onDownloadEpisode(listOf(updatesItem), action) }.takeIf { !selectionMode }, downloadStateProvider = updatesItem.downloadStateProvider, downloadProgressProvider = updatesItem.downloadProgressProvider, ) } } } } @Composable private fun AnimeUpdatesUiItem( update: AnimeUpdatesWithRelations, selected: Boolean, watchProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadEpisode: ((EpisodeDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> AnimeDownload.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) { val haptic = LocalHapticFeedback.current val textAlpha = if (update.seen) DISABLED_ALPHA else 1f Row( modifier = modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = { onLongClick() haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, ) .height(56.dp) .padding(horizontal = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Square( modifier = Modifier .padding(vertical = 6.dp) .fillMaxHeight(), data = update.coverData, onClick = onClickCover, ) Column( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .weight(1f), ) { Text( text = update.animeTitle, maxLines = 1, style = MaterialTheme.typography.bodyMedium, color = LocalContentColor.current.copy(alpha = textAlpha), overflow = TextOverflow.Ellipsis, ) Row(verticalAlignment = Alignment.CenterVertically) { var textHeight by remember { mutableIntStateOf(0) } if (!update.seen) { Icon( imageVector = Icons.Filled.Circle, contentDescription = stringResource(MR.strings.unread), modifier = Modifier .height(8.dp) .padding(end = 4.dp), tint = MaterialTheme.colorScheme.primary, ) } if (update.bookmark) { Icon( imageVector = Icons.Filled.Bookmark, contentDescription = stringResource(MR.strings.action_filter_bookmarked), modifier = Modifier .sizeIn( maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }, ), tint = MaterialTheme.colorScheme.primary, ) Spacer(modifier = Modifier.width(2.dp)) } if (update.fillermark) { Icon( imageVector = Icons.AutoMirrored.Filled.Label, contentDescription = stringResource(AYMR.strings.action_filter_fillermarked), modifier = Modifier .sizeIn( maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }, ), tint = MaterialTheme.colorScheme.tertiary, ) Spacer(modifier = Modifier.width(2.dp)) } Text( text = update.episodeName, maxLines = 1, style = MaterialTheme.typography.bodySmall, color = LocalContentColor.current.copy(alpha = textAlpha), overflow = TextOverflow.Ellipsis, onTextLayout = { textHeight = it.size.height }, modifier = Modifier .weight(weight = 1f, fill = false), ) if (watchProgress != null) { DotSeparatorText() Text( text = watchProgress, maxLines = 1, color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), overflow = TextOverflow.Ellipsis, ) } } } EpisodeDownloadIndicator( enabled = onDownloadEpisode != null, modifier = Modifier.padding(start = 4.dp), downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onClick = { onDownloadEpisode?.invoke(it) }, ) } } private fun formatProgress(milliseconds: Long): String { return if (milliseconds > 3600000L) { String.format( "%d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds), TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) } else { String.format( "%d:%02d", TimeUnit.MILLISECONDS.toMinutes(milliseconds), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)), ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesScreen.kt ================================================ package eu.kanade.presentation.updates.manga import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastAny import eu.kanade.presentation.entries.components.EntryBottomActionMenu import eu.kanade.presentation.entries.manga.components.ChapterDownloadAction import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.ui.updates.manga.MangaUpdatesItem import eu.kanade.tachiyomi.ui.updates.manga.MangaUpdatesScreenModel import kotlinx.coroutines.delay import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.FastScrollLazyColumn import tachiyomi.presentation.core.components.material.PullRefresh import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.LoadingScreen import java.time.LocalDate import kotlin.time.Duration.Companion.seconds @Composable fun MangaUpdateScreen( state: MangaUpdatesScreenModel.State, snackbarHostState: SnackbarHostState, lastUpdated: Long, onClickCover: (MangaUpdatesItem) -> Unit, onSelectAll: (Boolean) -> Unit, onInvertSelection: () -> Unit, onUpdateLibrary: () -> Boolean, onDownloadChapter: (List, ChapterDownloadAction) -> Unit, onMultiBookmarkClicked: (List, bookmark: Boolean) -> Unit, onMultiMarkAsReadClicked: (List, read: Boolean) -> Unit, onMultiDeleteClicked: (List) -> Unit, onUpdateSelected: (MangaUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onOpenChapter: (MangaUpdatesItem) -> Unit, ) { BackHandler(enabled = state.selectionMode, onBack = { onSelectAll(false) }) Scaffold( bottomBar = { MangaUpdatesBottomBar( selected = state.selected, onDownloadChapter = onDownloadChapter, onMultiBookmarkClicked = onMultiBookmarkClicked, onMultiMarkAsReadClicked = onMultiMarkAsReadClicked, onMultiDeleteClicked = onMultiDeleteClicked, ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.items.isEmpty() -> EmptyScreen( stringRes = MR.strings.information_no_recent, modifier = Modifier.padding(contentPadding), ) else -> { val scope = rememberCoroutineScope() var isRefreshing by remember { mutableStateOf(false) } PullRefresh( refreshing = isRefreshing, onRefresh = { val started = onUpdateLibrary() if (!started) return@PullRefresh scope.launch { // Fake refresh status but hide it after a second as it's a long running task isRefreshing = true delay(1.seconds) isRefreshing = false } }, enabled = !state.selectionMode, indicatorPadding = contentPadding, ) { FastScrollLazyColumn( contentPadding = contentPadding, ) { mangaUpdatesLastUpdatedItem(lastUpdated) mangaUpdatesUiItems( uiModels = state.getUiModel(), selectionMode = state.selectionMode, onUpdateSelected = onUpdateSelected, onClickCover = onClickCover, onClickUpdate = onOpenChapter, onDownloadChapter = onDownloadChapter, ) } } } } } } @Composable private fun MangaUpdatesBottomBar( selected: List, onDownloadChapter: (List, ChapterDownloadAction) -> Unit, onMultiBookmarkClicked: (List, bookmark: Boolean) -> Unit, onMultiMarkAsReadClicked: (List, read: Boolean) -> Unit, onMultiDeleteClicked: (List) -> Unit, ) { EntryBottomActionMenu( visible = selected.isNotEmpty(), modifier = Modifier.fillMaxWidth(), onBookmarkClicked = { onMultiBookmarkClicked.invoke(selected, true) }.takeIf { selected.fastAny { !it.update.bookmark } }, onRemoveBookmarkClicked = { onMultiBookmarkClicked.invoke(selected, false) }.takeIf { selected.fastAll { it.update.bookmark } }, onMarkAsViewedClicked = { onMultiMarkAsReadClicked(selected, true) }.takeIf { selected.fastAny { !it.update.read } }, onMarkAsUnviewedClicked = { onMultiMarkAsReadClicked(selected, false) }.takeIf { selected.fastAny { it.update.read || it.update.lastPageRead > 0L } }, onDownloadClicked = { onDownloadChapter(selected, ChapterDownloadAction.START) }.takeIf { selected.fastAny { it.downloadStateProvider() != MangaDownload.State.DOWNLOADED } }, onDeleteClicked = { onMultiDeleteClicked(selected) }.takeIf { selected.fastAny { it.downloadStateProvider() == MangaDownload.State.DOWNLOADED } }, isManga = true, ) } sealed interface MangaUpdatesUiModel { data class Header(val date: LocalDate) : MangaUpdatesUiModel data class Item(val item: MangaUpdatesItem) : MangaUpdatesUiModel } ================================================ FILE: app/src/main/java/eu/kanade/presentation/updates/manga/MangaUpdatesUiItem.kt ================================================ package eu.kanade.presentation.updates.manga import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.filled.Circle import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.relativeDateText import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.entries.components.ItemCover import eu.kanade.presentation.entries.manga.components.ChapterDownloadAction import eu.kanade.presentation.entries.manga.components.ChapterDownloadIndicator import eu.kanade.presentation.util.animateItemFastScroll import eu.kanade.presentation.util.relativeTimeSpanString import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.ui.updates.manga.MangaUpdatesItem import tachiyomi.domain.updates.manga.model.MangaUpdatesWithRelations import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ListGroupHeader import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.selectedBackground internal fun LazyListScope.mangaUpdatesLastUpdatedItem( lastUpdated: Long, ) { item(key = "mangaUpdates-lastUpdated") { Box( modifier = Modifier .animateItem(fadeInSpec = null, fadeOutSpec = null) .padding(horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small), ) { Text( text = stringResource(MR.strings.updates_last_update_info, relativeTimeSpanString(lastUpdated)), fontStyle = FontStyle.Italic, ) } } } internal fun LazyListScope.mangaUpdatesUiItems( uiModels: List, selectionMode: Boolean, onUpdateSelected: (MangaUpdatesItem, Boolean, Boolean, Boolean) -> Unit, onClickCover: (MangaUpdatesItem) -> Unit, onClickUpdate: (MangaUpdatesItem) -> Unit, onDownloadChapter: (List, ChapterDownloadAction) -> Unit, ) { items( items = uiModels, contentType = { when (it) { is MangaUpdatesUiModel.Header -> "header" is MangaUpdatesUiModel.Item -> "item" } }, key = { when (it) { is MangaUpdatesUiModel.Header -> "mangaUpdatesHeader-${it.hashCode()}" is MangaUpdatesUiModel.Item -> "mangaUpdates-${it.item.update.mangaId}-${it.item.update.chapterId}" } }, ) { item -> when (item) { is MangaUpdatesUiModel.Header -> { ListGroupHeader( modifier = Modifier.animateItemFastScroll(), text = relativeDateText(item.date), ) } is MangaUpdatesUiModel.Item -> { val updatesItem = item.item MangaUpdatesUiItem( modifier = Modifier.animateItemFastScroll(), update = updatesItem.update, selected = updatesItem.selected, readProgress = updatesItem.update.lastPageRead .takeIf { !updatesItem.update.read && it > 0L } ?.let { stringResource( MR.strings.chapter_progress, it + 1, ) }, onLongClick = { onUpdateSelected(updatesItem, !updatesItem.selected, true, true) }, onClick = { when { selectionMode -> onUpdateSelected( updatesItem, !updatesItem.selected, true, false, ) else -> onClickUpdate(updatesItem) } }, onClickCover = { onClickCover(updatesItem) }.takeIf { !selectionMode }, onDownloadChapter = { action: ChapterDownloadAction -> onDownloadChapter(listOf(updatesItem), action) }.takeIf { !selectionMode }, downloadStateProvider = updatesItem.downloadStateProvider, downloadProgressProvider = updatesItem.downloadProgressProvider, ) } } } } @Composable private fun MangaUpdatesUiItem( update: MangaUpdatesWithRelations, selected: Boolean, readProgress: String?, onClick: () -> Unit, onLongClick: () -> Unit, onClickCover: (() -> Unit)?, onDownloadChapter: ((ChapterDownloadAction) -> Unit)?, // Download Indicator downloadStateProvider: () -> MangaDownload.State, downloadProgressProvider: () -> Int, modifier: Modifier = Modifier, ) { val haptic = LocalHapticFeedback.current val textAlpha = if (update.read) DISABLED_ALPHA else 1f Row( modifier = modifier .selectedBackground(selected) .combinedClickable( onClick = onClick, onLongClick = { onLongClick() haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, ) .height(56.dp) .padding(horizontal = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { ItemCover.Square( modifier = Modifier .padding(vertical = 6.dp) .fillMaxHeight(), data = update.coverData, onClick = onClickCover, ) Column( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium) .weight(1f), ) { Text( text = update.mangaTitle, maxLines = 1, style = MaterialTheme.typography.bodyMedium, color = LocalContentColor.current.copy(alpha = textAlpha), overflow = TextOverflow.Ellipsis, ) Row(verticalAlignment = Alignment.CenterVertically) { var textHeight by remember { mutableIntStateOf(0) } if (!update.read) { Icon( imageVector = Icons.Filled.Circle, contentDescription = stringResource(MR.strings.unread), modifier = Modifier .height(8.dp) .padding(end = 4.dp), tint = MaterialTheme.colorScheme.primary, ) } if (update.bookmark) { Icon( imageVector = Icons.Filled.Bookmark, contentDescription = stringResource(MR.strings.action_filter_bookmarked), modifier = Modifier .sizeIn( maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }, ), tint = MaterialTheme.colorScheme.primary, ) Spacer(modifier = Modifier.width(2.dp)) } Text( text = update.chapterName, maxLines = 1, style = MaterialTheme.typography.bodySmall, color = LocalContentColor.current.copy(alpha = textAlpha), overflow = TextOverflow.Ellipsis, onTextLayout = { textHeight = it.size.height }, modifier = Modifier .weight(weight = 1f, fill = false), ) if (readProgress != null) { DotSeparatorText() Text( text = readProgress, maxLines = 1, color = LocalContentColor.current.copy(alpha = DISABLED_ALPHA), overflow = TextOverflow.Ellipsis, ) } } } ChapterDownloadIndicator( enabled = onDownloadChapter != null, modifier = Modifier.padding(start = 4.dp), downloadStateProvider = downloadStateProvider, downloadProgressProvider = downloadProgressProvider, onClick = { onDownloadChapter?.invoke(it) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt ================================================ package eu.kanade.presentation.util import android.content.Context import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.util.system.isOnline import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.items.chapter.model.NoChaptersException import tachiyomi.domain.items.episode.model.NoEpisodesException import tachiyomi.domain.source.anime.model.AnimeSourceNotInstalledException import tachiyomi.domain.source.manga.model.SourceNotInstalledException import tachiyomi.i18n.MR import java.net.UnknownHostException context(Context) val Throwable.formattedMessage: String get() { when (this) { is HttpException -> return stringResource(MR.strings.exception_http, code) is UnknownHostException -> { return if (!isOnline()) { stringResource(MR.strings.exception_offline) } else { stringResource(MR.strings.exception_unknown_host, message ?: "") } } is NoChaptersException, is NoEpisodesException -> return stringResource( MR.strings.no_results_found, ) is SourceNotInstalledException, is AnimeSourceNotInstalledException -> return stringResource( MR.strings.loader_not_implemented_error, ) } return when (val className = this::class.simpleName) { "Exception", "IOException" -> message ?: className else -> "$className: $message" } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt ================================================ package eu.kanade.presentation.util import androidx.compose.foundation.lazy.LazyItemScope import androidx.compose.ui.Modifier // https://issuetracker.google.com/352584409 context(LazyItemScope) fun Modifier.animateItemFastScroll() = this.animateItem(fadeInSpec = null, fadeOutSpec = null) ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/ItemNumberFormatter.kt ================================================ package eu.kanade.presentation.util import java.text.DecimalFormat import java.text.DecimalFormatSymbols private val formatter = DecimalFormat( "#.###", DecimalFormatSymbols().apply { decimalSeparator = '.' }, ) fun formatChapterNumber(chapterNumber: Double): String { return formatter.format(chapterNumber) } fun formatEpisodeNumber(episodeNumber: Double): String { return formatter.format(episodeNumber) } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/Navigator.kt ================================================ package eu.kanade.presentation.util import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.ContentTransform import androidx.compose.runtime.Composable import androidx.compose.runtime.ProvidableCompositionLocal import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Modifier import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.ScreenModelStore import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.ScreenKey import cafe.adriel.voyager.core.screen.uniqueScreenKey import cafe.adriel.voyager.core.stack.StackEvent import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.transitions.ScreenTransitionContent import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.NavStyle import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.plus import soup.compose.material.motion.animation.materialSharedAxisX import soup.compose.material.motion.animation.rememberSlideDistance import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * For invoking back press to the parent activity */ val LocalBackPress: ProvidableCompositionLocal<(() -> Unit)?> = staticCompositionLocalOf { null } private val uiPreferences: UiPreferences = Injekt.get() interface Tab : cafe.adriel.voyager.navigator.tab.Tab { suspend fun onReselect(navigator: Navigator) {} @Composable fun currentNavigationStyle(): NavStyle = uiPreferences.navStyle().collectAsState().value } abstract class Screen : Screen { override val key: ScreenKey = uniqueScreenKey } /** * A variant of ScreenModel.coroutineScope except with the IO dispatcher instead of the * main dispatcher. */ val ScreenModel.ioCoroutineScope: CoroutineScope get() = ScreenModelStore.getOrPutDependency( screenModel = this, name = "ScreenModelIoCoroutineScope", factory = { key -> CoroutineScope(Dispatchers.IO + SupervisorJob()) + CoroutineName(key) }, onDispose = { scope -> scope.cancel() }, ) interface AssistContentScreen { fun onProvideAssistUrl(): String? } @Composable fun DefaultNavigatorScreenTransition( navigator: Navigator, modifier: Modifier = Modifier, ) { val slideDistance = rememberSlideDistance() ScreenTransition( navigator = navigator, transition = { materialSharedAxisX( forward = navigator.lastEvent != StackEvent.Pop, slideDistance = slideDistance, ) }, modifier = modifier, ) } @Composable fun ScreenTransition( navigator: Navigator, transition: AnimatedContentTransitionScope.() -> ContentTransform, modifier: Modifier = Modifier, content: ScreenTransitionContent = { it.Content() }, ) { AnimatedContent( targetState = navigator.lastItem, transitionSpec = transition, modifier = modifier, label = "transition", ) { screen -> navigator.saveableState("transition", screen) { content(screen) } } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/Permissions.kt ================================================ package eu.kanade.presentation.util import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner @Composable fun rememberRequestPackageInstallsPermissionState(initialValue: Boolean = false): Boolean { val context = LocalContext.current val lifecycleOwner = LocalLifecycleOwner.current var installGranted by remember { mutableStateOf(initialValue) } DisposableEffect(lifecycleOwner.lifecycle) { val observer = object : DefaultLifecycleObserver { override fun onResume(owner: LifecycleOwner) { installGranted = context.packageManager.canRequestPackageInstalls() } } lifecycleOwner.lifecycle.addObserver(observer) onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } } return installGranted } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/Resources.kt ================================================ package eu.kanade.presentation.util import android.content.res.Resources import androidx.annotation.DrawableRes import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.platform.LocalContext import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toBitmap /** * Create a BitmapPainter from a drawable resource. * Use this only if [androidx.compose.ui.res.painterResource] doesn't work. * * @param id the resource identifier * * @return the bitmap associated with the resource */ @Composable fun rememberResourceBitmapPainter(@DrawableRes id: Int): BitmapPainter { val context = LocalContext.current return remember(id) { val drawable = ContextCompat.getDrawable(context, id) ?: throw Resources.NotFoundException() BitmapPainter(drawable.toBitmap().asImageBitmap()) } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/TimeUtils.kt ================================================ package eu.kanade.presentation.util import android.content.Context import android.text.format.DateUtils import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import java.time.Instant import kotlin.time.Duration import kotlin.time.Duration.Companion.minutes fun Duration.toDurationString(context: Context, fallback: String): String { return toComponents { days, hours, minutes, seconds, _ -> buildList(4) { if (days != 0L) add(context.stringResource(MR.strings.day_short, days)) if (hours != 0) add(context.stringResource(MR.strings.hour_short, hours)) if (minutes != 0 && (days == 0L || hours == 0)) { add( context.stringResource(MR.strings.minute_short, minutes), ) } if (seconds != 0 && days == 0L && hours == 0) { add( context.stringResource(MR.strings.seconds_short, seconds), ) } }.joinToString(" ").ifBlank { fallback } } } @Composable @ReadOnlyComposable fun relativeTimeSpanString(epochMillis: Long): String { val now = Instant.now().toEpochMilli() return when { epochMillis <= 0L -> stringResource(MR.strings.relative_time_span_never) now - epochMillis < 1.minutes.inWholeMilliseconds -> stringResource( MR.strings.updates_last_update_info_just_now, ) else -> DateUtils.getRelativeTimeSpanString(epochMillis, now, DateUtils.MINUTE_IN_MILLIS).toString() } } ================================================ FILE: app/src/main/java/eu/kanade/presentation/util/WindowSize.kt ================================================ package eu.kanade.presentation.util import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.platform.LocalConfiguration import eu.kanade.tachiyomi.util.system.isTabletUi @Composable @ReadOnlyComposable fun isTabletUi(): Boolean { return LocalConfiguration.current.isTabletUi() } ================================================ FILE: app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt ================================================ package eu.kanade.presentation.webview import android.content.pm.ApplicationInfo import android.graphics.Bitmap import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ArrowBack import androidx.compose.material.icons.outlined.ArrowForward import androidx.compose.material.icons.outlined.Close import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.unit.dp import com.kevinnzou.web.AccompanistWebViewClient import com.kevinnzou.web.LoadingState import com.kevinnzou.web.WebView import com.kevinnzou.web.rememberWebViewNavigator import com.kevinnzou.web.rememberWebViewState import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.WarningBanner import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.getHtml import eu.kanade.tachiyomi.util.system.setDefaultSettings import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.launch import okhttp3.Request import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun WebViewScreenContent( onNavigateUp: () -> Unit, initialTitle: String?, url: String, onShare: (String) -> Unit, onOpenInBrowser: (String) -> Unit, onClearCookies: (String) -> Unit, headers: Map = emptyMap(), onUrlChange: (String) -> Unit = {}, ) { val state = rememberWebViewState(url = url, additionalHttpHeaders = headers) val navigator = rememberWebViewNavigator() val context = LocalContext.current val uriHandler = LocalUriHandler.current val scope = rememberCoroutineScope() val network = remember { Injekt.get() } val spoofedPackageName = remember { WebViewUtil.spoofedPackageName(context) } var currentUrl by remember { mutableStateOf(url) } var showCloudflareHelp by remember { mutableStateOf(false) } val webClient = remember { object : AccompanistWebViewClient() { override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) url?.let { currentUrl = it onUrlChange(it) } } override fun onPageFinished(view: WebView, url: String?) { super.onPageFinished(view, url) scope.launch { val html = view.getHtml() showCloudflareHelp = "window._cf_chl_opt" in html || "Ray ID is" in html } } override fun doUpdateVisitedHistory( view: WebView, url: String?, isReload: Boolean, ) { super.doUpdateVisitedHistory(view, url, isReload) url?.let { currentUrl = it onUrlChange(it) } } override fun shouldOverrideUrlLoading( view: WebView?, request: WebResourceRequest?, ): Boolean { request?.let { // Don't attempt to open blobs as webpages if (it.url.toString().startsWith("blob:http")) { return false } // Ignore intents urls if (it.url.toString().startsWith("intent://")) { return true } // Continue with request, but with custom headers view?.loadUrl(it.url.toString(), headers) } return super.shouldOverrideUrlLoading(view, request) } override fun shouldInterceptRequest( view: WebView?, request: WebResourceRequest?, ): WebResourceResponse? { return try { val internalRequest = Request.Builder().apply { url(request!!.url.toString()) request.requestHeaders.forEach { (key, value) -> if (key == "X-Requested-With" && value in setOf(context.packageName, spoofedPackageName)) { return@forEach } addHeader(key, value) } method(request.method, null) }.build() val response = network.nonCloudflareClient.newCall(internalRequest).execute() val contentType = response.body.contentType()?.let { "${it.type}/${it.subtype}" } ?: "text/html" val contentEncoding = response.body.contentType()?.charset()?.name() ?: "utf-8" WebResourceResponse( contentType, contentEncoding, response.code, response.message, response.headers.associate { it.first to it.second }, response.body.byteStream(), ) } catch (e: Throwable) { super.shouldInterceptRequest(view, request) } } } } Scaffold( topBar = { Box { Column { AppBar( title = state.pageTitle ?: initialTitle, subtitle = currentUrl, navigateUp = onNavigateUp, navigationIcon = Icons.Outlined.Close, actions = { AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_webview_back), icon = Icons.Outlined.ArrowBack, onClick = { if (navigator.canGoBack) { navigator.navigateBack() } }, enabled = navigator.canGoBack, ), AppBar.Action( title = stringResource(MR.strings.action_webview_forward), icon = Icons.Outlined.ArrowForward, onClick = { if (navigator.canGoForward) { navigator.navigateForward() } }, enabled = navigator.canGoForward, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_webview_refresh), onClick = { navigator.reload() }, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_share), onClick = { onShare(currentUrl) }, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_open_in_browser), onClick = { onOpenInBrowser(currentUrl) }, ), AppBar.OverflowAction( title = stringResource(MR.strings.pref_clear_cookies), onClick = { onClearCookies(currentUrl) }, ), ), ) }, ) if (showCloudflareHelp) { Surface( modifier = Modifier.padding(8.dp), ) { WarningBanner( textRes = MR.strings.information_cloudflare_help, modifier = Modifier .clip(MaterialTheme.shapes.small) .clickable { uriHandler.openUri( "https://aniyomi.org/docs/guides/troubleshooting/#cloudflare", ) }, ) } } } when (val loadingState = state.loadingState) { is LoadingState.Initializing -> LinearProgressIndicator( modifier = Modifier .fillMaxWidth() .align(Alignment.BottomCenter), ) is LoadingState.Loading -> LinearProgressIndicator( progress = { (loadingState as? LoadingState.Loading)?.progress ?: 1f }, modifier = Modifier .fillMaxWidth() .align(Alignment.BottomCenter), ) else -> {} } } }, ) { contentPadding -> WebView( state = state, modifier = Modifier .fillMaxSize() .padding(contentPadding), navigator = navigator, onCreated = { webView -> webView.setDefaultSettings() // Debug mode (chrome://inspect/#devices) if (BuildConfig.DEBUG && 0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE ) { WebView.setWebContentsDebuggingEnabled(true) } headers["user-agent"]?.let { webView.settings.userAgentString = it } }, client = webClient, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/App.kt ================================================ package eu.kanade.tachiyomi import android.annotation.SuppressLint import android.app.Application import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Build import android.os.Looper import android.webkit.WebView import androidx.core.content.ContextCompat import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import coil3.ImageLoader import coil3.SingletonImageLoader import coil3.network.okhttp.OkHttpNetworkFetcherFactory import coil3.request.allowRgb565 import coil3.request.crossfade import coil3.util.DebugLogger import dev.mihon.injekt.patchInjekt import eu.kanade.domain.DomainModule import eu.kanade.domain.SYDomainModule import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.setAppCompatDelegateThemeMode import eu.kanade.tachiyomi.crash.CrashActivity import eu.kanade.tachiyomi.crash.GlobalExceptionHandler import eu.kanade.tachiyomi.data.coil.AnimeCoverKeyer import eu.kanade.tachiyomi.data.coil.AnimeImageFetcher import eu.kanade.tachiyomi.data.coil.AnimeKeyer import eu.kanade.tachiyomi.data.coil.BufferedSourceFetcher import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher import eu.kanade.tachiyomi.data.coil.MangaCoverKeyer import eu.kanade.tachiyomi.data.coil.MangaKeyer import eu.kanade.tachiyomi.data.coil.TachiyomiImageDecoder import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.di.AppModule import eu.kanade.tachiyomi.di.PreferenceModule import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.GLUtil import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.animatorDurationScale import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notify import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import logcat.AndroidLogcatLogger import logcat.LogPriority import logcat.LogcatLogger import mihon.core.migration.Migrator import mihon.core.migration.migrations.migrations import org.conscrypt.Conscrypt import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import tachiyomi.presentation.widget.entries.anime.AnimeWidgetManager import tachiyomi.presentation.widget.entries.manga.MangaWidgetManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.security.Security class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factory { private val basePreferences: BasePreferences by injectLazy() private val networkPreferences: NetworkPreferences by injectLazy() private val disableIncognitoReceiver = DisableIncognitoReceiver() @SuppressLint("LaunchActivityFromNotification") override fun onCreate() { super.onCreate() patchInjekt() GlobalExceptionHandler.initialize(applicationContext, CrashActivity::class.java) // TLS 1.3 support for Android < 10 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { Security.insertProviderAt(Conscrypt.newProvider(), 1) } // Avoid potential crashes if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val process = getProcessName() if (packageName != process) WebView.setDataDirectorySuffix(process) } Injekt.importModule(PreferenceModule(this)) Injekt.importModule(AppModule(this)) Injekt.importModule(DomainModule()) // SY --> Injekt.importModule(SYDomainModule()) // SY <-- setupNotificationChannels() ProcessLifecycleOwner.get().lifecycle.addObserver(this) val scope = ProcessLifecycleOwner.get().lifecycleScope // Show notification to disable Incognito Mode when it's enabled basePreferences.incognitoMode().changes() .onEach { enabled -> if (enabled) { disableIncognitoReceiver.register() notify( Notifications.ID_INCOGNITO_MODE, Notifications.CHANNEL_INCOGNITO_MODE, ) { setContentTitle(stringResource(MR.strings.pref_incognito_mode)) setContentText(stringResource(MR.strings.notification_incognito_text)) setSmallIcon(R.drawable.ic_glasses_24dp) setOngoing(true) val pendingIntent = PendingIntent.getBroadcast( this@App, 0, Intent(ACTION_DISABLE_INCOGNITO_MODE), PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE, ) setContentIntent(pendingIntent) } } else { disableIncognitoReceiver.unregister() cancelNotification(Notifications.ID_INCOGNITO_MODE) } } .launchIn(ProcessLifecycleOwner.get().lifecycleScope) basePreferences.hardwareBitmapThreshold().let { preference -> if (!preference.isSet()) preference.set(GLUtil.DEVICE_TEXTURE_LIMIT) } basePreferences.hardwareBitmapThreshold().changes() .onEach { ImageUtil.hardwareBitmapThreshold = it } .launchIn(scope) setAppCompatDelegateThemeMode(Injekt.get().themeMode().get()) // Updates widget update with(MangaWidgetManager(Injekt.get(), Injekt.get())) { init(ProcessLifecycleOwner.get().lifecycleScope) } with(AnimeWidgetManager(Injekt.get(), Injekt.get())) { init(ProcessLifecycleOwner.get().lifecycleScope) } if (!LogcatLogger.isInstalled && networkPreferences.verboseLogging().get()) { LogcatLogger.install(AndroidLogcatLogger(LogPriority.VERBOSE)) } initializeMigrator() } private fun initializeMigrator() { val preferenceStore = Injekt.get() val preference = preferenceStore.getInt(Preference.appStateKey("last_version_code"), 0) logcat { "Migration from ${preference.get()} to ${BuildConfig.VERSION_CODE}" } Migrator.initialize( old = preference.get(), new = BuildConfig.VERSION_CODE, migrations = migrations, onMigrationComplete = { logcat { "Updating last version to ${BuildConfig.VERSION_CODE}" } preference.set(BuildConfig.VERSION_CODE) }, ) } override fun newImageLoader(context: Context): ImageLoader { return ImageLoader.Builder(this).apply { val callFactoryLazy = lazy { Injekt.get().client } components { // NetworkFetcher.Factory add(OkHttpNetworkFetcherFactory(callFactoryLazy::value)) // Decoder.Factory add(TachiyomiImageDecoder.Factory()) // Fetcher.Factory add(BufferedSourceFetcher.Factory()) add(MangaCoverFetcher.MangaFactory(callFactoryLazy)) add(MangaCoverFetcher.MangaCoverFactory(callFactoryLazy)) add(AnimeImageFetcher.AnimeFactory(callFactoryLazy)) add(AnimeImageFetcher.AnimeCoverFactory(callFactoryLazy)) // Keyer add(AnimeKeyer()) add(MangaKeyer()) add(AnimeCoverKeyer()) add(MangaCoverKeyer()) } crossfade((300 * this@App.animatorDurationScale).toInt()) allowRgb565(DeviceUtil.isLowRamDevice(this@App)) if (networkPreferences.verboseLogging().get()) logger(DebugLogger()) // Coil spawns a new thread for every image load by default fetcherCoroutineContext(Dispatchers.IO.limitedParallelism(8)) decoderCoroutineContext(Dispatchers.IO.limitedParallelism(3)) } .build() } override fun onStart(owner: LifecycleOwner) { SecureActivityDelegate.onApplicationStart() } override fun onStop(owner: LifecycleOwner) { SecureActivityDelegate.onApplicationStopped() } override fun getPackageName(): String { try { // Override the value passed as X-Requested-With in WebView requests val stackTrace = Looper.getMainLooper().thread.stackTrace val isChromiumCall = stackTrace.any { trace -> trace.className.equals("org.chromium.base.BuildInfo", ignoreCase = true) && setOf("getAll", "getPackageName", "").any { trace.methodName.equals(it, ignoreCase = true) } } if (isChromiumCall) return WebViewUtil.spoofedPackageName(applicationContext) } catch (_: Exception) { } return super.getPackageName() } private fun setupNotificationChannels() { try { Notifications.createChannels(this) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to modify notification channels" } } } private inner class DisableIncognitoReceiver : BroadcastReceiver() { private var registered = false override fun onReceive(context: Context, intent: Intent) { basePreferences.incognitoMode().set(false) } fun register() { if (!registered) { ContextCompat.registerReceiver( this@App, this, IntentFilter(ACTION_DISABLE_INCOGNITO_MODE), ContextCompat.RECEIVER_NOT_EXPORTED, ) registered = true } } fun unregister() { if (registered) { unregisterReceiver(this) registered = false } } } } private const val ACTION_DISABLE_INCOGNITO_MODE = "tachi.action.DISABLE_INCOGNITO_MODE" ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/AppInfo.kt ================================================ package eu.kanade.tachiyomi import tachiyomi.core.common.util.system.ImageUtil /** * Used by extensions. */ @Suppress("UNUSED") object AppInfo { /** * Version code of the host application. May be useful for sharing as User-Agent information. * Note that this value differs between forks so logic should not rely on it. * * @since extension-lib 1.3 */ fun getVersionCode(): Int = BuildConfig.VERSION_CODE /** * Version name of the host application. May be useful for sharing as User-Agent information. * Note that this value differs between forks so logic should not rely on it. * * @since extension-lib 1.3 */ fun getVersionName(): String = BuildConfig.VERSION_NAME /** * A list of supported image MIME types by the reader. * e.g. ["image/jpeg", "image/png", ...] * * @since extension-lib 1.5 */ fun getSupportedImageMimeTypes(): List = ImageUtil.ImageType.entries.map { it.mime } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/crash/CrashActivity.kt ================================================ package eu.kanade.tachiyomi.crash import android.content.Intent import android.os.Bundle import androidx.core.view.WindowCompat import eu.kanade.presentation.crash.CrashScreen import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.view.setComposeContent class CrashActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) val exception = GlobalExceptionHandler.getThrowableFromIntent(intent) setComposeContent { CrashScreen( exception = exception, onRestartClick = { finishAffinity() startActivity(Intent(this@CrashActivity, MainActivity::class.java)) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/crash/GlobalExceptionHandler.kt ================================================ package eu.kanade.tachiyomi.crash import android.content.Context import android.content.Intent import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.Json import logcat.LogPriority import tachiyomi.core.common.util.system.logcat class GlobalExceptionHandler private constructor( private val applicationContext: Context, private val defaultHandler: Thread.UncaughtExceptionHandler, private val activityToBeLaunched: Class<*>, ) : Thread.UncaughtExceptionHandler { object ThrowableSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Throwable", PrimitiveKind.STRING) override fun deserialize(decoder: Decoder): Throwable = Throwable(message = decoder.decodeString()) override fun serialize(encoder: Encoder, value: Throwable) = encoder.encodeString(value.stackTraceToString()) } override fun uncaughtException(thread: Thread, exception: Throwable) { logcat(priority = LogPriority.ERROR, throwable = exception) launchActivity(applicationContext, activityToBeLaunched, exception) defaultHandler.uncaughtException(thread, exception) } private fun launchActivity( applicationContext: Context, activity: Class<*>, exception: Throwable, ) { val intent = Intent(applicationContext, activity).apply { putExtra(INTENT_EXTRA, Json.encodeToString(ThrowableSerializer, exception)) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } applicationContext.startActivity(intent) } companion object { private const val INTENT_EXTRA = "Throwable" fun initialize( applicationContext: Context, activityToBeLaunched: Class<*>, ) { val handler = GlobalExceptionHandler( applicationContext, Thread.getDefaultUncaughtExceptionHandler() as Thread.UncaughtExceptionHandler, activityToBeLaunched, ) Thread.setDefaultUncaughtExceptionHandler(handler) } fun getThrowableFromIntent(intent: Intent): Throwable? { return try { Json.decodeFromString(ThrowableSerializer, intent.getStringExtra(INTENT_EXTRA)!!) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Wasn't able to retrieve throwable from intent" } null } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupDecoder.kt ================================================ package eu.kanade.tachiyomi.data.backup import android.content.Context import android.net.Uri import eu.kanade.tachiyomi.data.backup.models.Backup import eu.kanade.tachiyomi.data.backup.models.LegacyBackup import kotlinx.serialization.SerializationException import kotlinx.serialization.protobuf.ProtoBuf import okio.buffer import okio.gzip import okio.source import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.IOException class BackupDecoder( private val context: Context, private val parser: ProtoBuf = Injekt.get(), ) { /** * Decode a potentially-gzipped backup. */ fun decode(uri: Uri): Backup { return context.contentResolver.openInputStream(uri)!!.use { inputStream -> val source = inputStream.source().buffer() val peeked = source.peek().apply { require(2) } val id1id2 = peeked.readShort() val backupString = when (id1id2.toInt()) { 0x1f8b -> source.gzip().buffer() // 0x1f8b is gzip magic bytes MAGIC_JSON_SIGNATURE1, MAGIC_JSON_SIGNATURE2, MAGIC_JSON_SIGNATURE3 -> { throw IOException(context.stringResource(MR.strings.invalid_backup_file_json)) } else -> source }.use { it.readByteArray() } try { if (BackupDetector.isLegacyBackup(backupString)) { parser.decodeFromByteArray(LegacyBackup.serializer(), backupString) .toBackup() } else { parser.decodeFromByteArray(Backup.serializer(), backupString) } } catch (_: SerializationException) { throw IOException(context.stringResource(MR.strings.invalid_backup_file_unknown)) } } } companion object { private const val MAGIC_JSON_SIGNATURE1 = 0x7b7d // `{}` private const val MAGIC_JSON_SIGNATURE2 = 0x7b22 // `{"` private const val MAGIC_JSON_SIGNATURE3 = 0x7b0a // `{\n` } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupDetector.kt ================================================ package eu.kanade.tachiyomi.data.backup import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException import kotlinx.serialization.protobuf.ProtoBuf import kotlinx.serialization.protobuf.ProtoNumber /** * Try to guess if the backup is an old aniyomi backup. * * Returns true if it's (probably) an old aniyomi backup, or false if it's a mihon backup * or a new aniyomi backup. */ object BackupDetector { @Serializable data class BackupDetector( @ProtoNumber(103) val backupAnimeSources: List = emptyList(), @ProtoNumber(500) val isLegacy: Boolean = true, ) { @Serializable data class DetectAnimeSource( @ProtoNumber(1) val name: String = "", @ProtoNumber(2) val sourceId: Long, ) } fun isLegacyBackup(bytes: ByteArray): Boolean { return try { val detect = ProtoBuf.decodeFromByteArray(BackupDetector.serializer(), bytes) detect.isLegacy && detect.backupAnimeSources.isNotEmpty() } catch (_: SerializationException) { false } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupFileValidator.kt ================================================ package eu.kanade.tachiyomi.data.backup import android.content.Context import android.net.Uri import eu.kanade.tachiyomi.data.track.TrackerManager import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class BackupFileValidator( private val context: Context, private val animeSourceManager: AnimeSourceManager = Injekt.get(), private val mangaSourceManager: MangaSourceManager = Injekt.get(), private val trackerManager: TrackerManager = Injekt.get(), ) { /** * Checks for critical backup file data. * * @return List of missing sources or missing trackers. */ fun validate(uri: Uri): Results { val backup = try { BackupDecoder(context).decode(uri) } catch (e: Exception) { throw IllegalStateException(e) } val sources = backup.backupSources.associate { it.sourceId to it.name } val animesources = backup.backupAnimeSources.associate { it.sourceId to it.name } val missingSources = sources .filter { mangaSourceManager.get(it.key) == null } .values.map { val id = it.toLongOrNull() if (id == null) { it } else { mangaSourceManager.getOrStub(id).toString() } } .distinct() .sorted() + animesources .filter { animeSourceManager.get(it.key) == null } .values.map { val id = it.toLongOrNull() if (id == null) { it } else { animeSourceManager.getOrStub(id).toString() } } .distinct() .sorted() val animeTrackers = backup.backupAnime .flatMap { it.tracking } .map { it.syncId } val mangaTrackers = backup.backupManga .flatMap { it.tracking } .map { it.syncId } val trackers = (animeTrackers + mangaTrackers).distinct() val missingTrackers = trackers .mapNotNull { trackerManager.get(it.toLong()) } .filter { !it.isLoggedIn } .map { it.name } .sorted() return Results(missingSources, missingTrackers) } data class Results( val missingSources: List, val missingTrackers: List, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt ================================================ package eu.kanade.tachiyomi.data.backup import android.content.Context import android.graphics.BitmapFactory import androidx.core.app.NotificationCompat import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.displayablePath import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.io.File import java.util.concurrent.TimeUnit class BackupNotifier(private val context: Context) { private val preferences: SecurityPreferences by injectLazy() private val progressNotificationBuilder = context.notificationBuilder( Notifications.CHANNEL_BACKUP_RESTORE_PROGRESS, ) { setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)) setSmallIcon(R.drawable.ic_ani) setAutoCancel(false) setOngoing(true) setOnlyAlertOnce(true) } private val completeNotificationBuilder = context.notificationBuilder( Notifications.CHANNEL_BACKUP_RESTORE_COMPLETE, ) { setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)) setSmallIcon(R.drawable.ic_ani) setAutoCancel(false) } private fun NotificationCompat.Builder.show(id: Int) { context.notify(id, build()) } fun showBackupProgress(): NotificationCompat.Builder { val builder = with(progressNotificationBuilder) { setContentTitle(context.stringResource(MR.strings.creating_backup)) setProgress(0, 0, true) } builder.show(Notifications.ID_BACKUP_PROGRESS) return builder } fun showBackupError(error: String?) { context.cancelNotification(Notifications.ID_BACKUP_PROGRESS) with(completeNotificationBuilder) { setContentTitle(context.stringResource(MR.strings.creating_backup_error)) setContentText(error) show(Notifications.ID_BACKUP_COMPLETE) } } fun showBackupComplete(file: UniFile) { context.cancelNotification(Notifications.ID_BACKUP_PROGRESS) with(completeNotificationBuilder) { setContentTitle(context.stringResource(MR.strings.backup_created)) setContentText(file.displayablePath) clearActions() addAction( R.drawable.ic_share_24dp, context.stringResource(MR.strings.action_share), NotificationReceiver.shareBackupPendingBroadcast(context, file.uri), ) show(Notifications.ID_BACKUP_COMPLETE) } } fun showRestoreProgress( content: String = "", progress: Int = 0, maxAmount: Int = 100, sync: Boolean = false, ): NotificationCompat.Builder { val builder = with(progressNotificationBuilder) { val contentTitle = if (sync) { context.stringResource(MR.strings.syncing_library) } else { context.stringResource(MR.strings.restoring_backup) } setContentTitle(contentTitle) if (!preferences.hideNotificationContent().get()) { setContentText(content) } setProgress(maxAmount, progress, false) setOnlyAlertOnce(true) clearActions() addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), NotificationReceiver.cancelRestorePendingBroadcast( context, Notifications.ID_RESTORE_PROGRESS, ), ) } builder.show(Notifications.ID_RESTORE_PROGRESS) return builder } fun showRestoreError(error: String?) { context.cancelNotification(Notifications.ID_RESTORE_PROGRESS) with(completeNotificationBuilder) { setContentTitle(context.stringResource(MR.strings.restoring_backup_error)) setContentText(error) show(Notifications.ID_RESTORE_COMPLETE) } } fun showRestoreComplete( time: Long, errorCount: Int, path: String?, file: String?, sync: Boolean, ) { val contentTitle = if (sync) { context.stringResource(MR.strings.library_sync_complete) } else { context.stringResource(MR.strings.restore_completed) } context.cancelNotification(Notifications.ID_RESTORE_PROGRESS) val timeString = context.stringResource( MR.strings.restore_duration, TimeUnit.MILLISECONDS.toMinutes(time), TimeUnit.MILLISECONDS.toSeconds(time) - TimeUnit.MINUTES.toSeconds( TimeUnit.MILLISECONDS.toMinutes(time), ), ) with(completeNotificationBuilder) { setContentTitle(contentTitle) setContentText( context.resources.getQuantityString( R.plurals.restore_completed_message, errorCount, timeString, errorCount, ), ) clearActions() if (errorCount > 0 && !path.isNullOrEmpty() && !file.isNullOrEmpty()) { val destFile = File(path, file) val uri = destFile.getUriCompat(context) val errorLogIntent = NotificationReceiver.openErrorLogPendingActivity(context, uri) setContentIntent(errorLogIntent) addAction( R.drawable.ic_folder_24dp, context.stringResource(MR.strings.action_show_errors), errorLogIntent, ) } show(Notifications.ID_RESTORE_COMPLETE) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreateJob.kt ================================================ package eu.kanade.tachiyomi.data.backup.create import android.content.Context import android.content.pm.ServiceInfo import android.net.Uri import android.os.Build import androidx.core.net.toUri import androidx.work.BackoffPolicy import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkerParameters import androidx.work.workDataOf import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.data.backup.BackupNotifier import eu.kanade.tachiyomi.data.backup.restore.BackupRestoreJob import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.setForegroundSafely import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.storage.service.StorageManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.TimeUnit class BackupCreateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val notifier = BackupNotifier(context) override suspend fun doWork(): Result { val isAutoBackup = inputData.getBoolean(IS_AUTO_BACKUP_KEY, true) if (isAutoBackup && BackupRestoreJob.isRunning(context)) return Result.retry() val uri = inputData.getString(LOCATION_URI_KEY)?.toUri() ?: getAutomaticBackupLocation() ?: return Result.failure() setForegroundSafely() val options = inputData.getBooleanArray(OPTIONS_KEY)?.let { BackupOptions.fromBooleanArray(it) } ?: BackupOptions() return try { val location = BackupCreator(context, isAutoBackup).backup(uri, options) if (!isAutoBackup) { notifier.showBackupComplete(UniFile.fromUri(context, location.toUri())!!) } Result.success() } catch (e: Exception) { logcat(LogPriority.ERROR, e) if (!isAutoBackup) notifier.showBackupError(e.message) Result.failure() } finally { context.cancelNotification(Notifications.ID_BACKUP_PROGRESS) } } override suspend fun getForegroundInfo(): ForegroundInfo { return ForegroundInfo( Notifications.ID_BACKUP_PROGRESS, notifier.showBackupProgress().build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } private fun getAutomaticBackupLocation(): Uri? { val storageManager = Injekt.get() return storageManager.getAutomaticBackupsDirectory()?.uri } companion object { fun isManualJobRunning(context: Context): Boolean { return context.workManager.isRunning(TAG_MANUAL) } fun setupTask(context: Context, prefInterval: Int? = null) { val backupPreferences = Injekt.get() val interval = prefInterval ?: backupPreferences.backupInterval().get() if (interval > 0) { val constraints = Constraints( requiresBatteryNotLow = true, ) val request = PeriodicWorkRequestBuilder( interval.toLong(), TimeUnit.HOURS, 10, TimeUnit.MINUTES, ) .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 10, TimeUnit.MINUTES) .addTag(TAG_AUTO) .setConstraints(constraints) .setInputData(workDataOf(IS_AUTO_BACKUP_KEY to true)) .build() context.workManager.enqueueUniquePeriodicWork(TAG_AUTO, ExistingPeriodicWorkPolicy.UPDATE, request) } else { context.workManager.cancelUniqueWork(TAG_AUTO) } } fun startNow(context: Context, uri: Uri, options: BackupOptions) { val inputData = workDataOf( IS_AUTO_BACKUP_KEY to false, LOCATION_URI_KEY to uri.toString(), OPTIONS_KEY to options.asBooleanArray(), ) val request = OneTimeWorkRequestBuilder() .addTag(TAG_MANUAL) .setInputData(inputData) .build() context.workManager.enqueueUniqueWork(TAG_MANUAL, ExistingWorkPolicy.KEEP, request) } } } private const val TAG_AUTO = "BackupCreator" private const val TAG_MANUAL = "$TAG_AUTO:manual" private const val IS_AUTO_BACKUP_KEY = "is_auto_backup" // Boolean private const val LOCATION_URI_KEY = "location_uri" // String private const val OPTIONS_KEY = "options" // BooleanArray ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create import android.content.Context import android.net.Uri import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.backup.BackupFileValidator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.AnimeSourcesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.CustomButtonBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.ExtensionsBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaCategoriesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaExtensionRepoBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.MangaSourcesBackupCreator import eu.kanade.tachiyomi.data.backup.create.creators.PreferenceBackupCreator import eu.kanade.tachiyomi.data.backup.models.Backup import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupCustomButtons import eu.kanade.tachiyomi.data.backup.models.BackupExtension import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSource import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority import okio.buffer import okio.gzip import okio.sink import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.entries.anime.interactor.GetAnimeFavorites import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.repository.AnimeRepository import tachiyomi.domain.entries.manga.interactor.GetMangaFavorites import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.repository.MangaRepository import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.FileOutputStream import java.text.SimpleDateFormat import java.time.Instant import java.util.Date import java.util.Locale class BackupCreator( private val context: Context, private val isAutoBackup: Boolean, private val parser: ProtoBuf = Injekt.get(), private val getAnimeFavorites: GetAnimeFavorites = Injekt.get(), private val getMangaFavorites: GetMangaFavorites = Injekt.get(), private val backupPreferences: BackupPreferences = Injekt.get(), private val mangaRepository: MangaRepository = Injekt.get(), private val animeRepository: AnimeRepository = Injekt.get(), private val animeCategoriesBackupCreator: AnimeCategoriesBackupCreator = AnimeCategoriesBackupCreator(), private val mangaCategoriesBackupCreator: MangaCategoriesBackupCreator = MangaCategoriesBackupCreator(), private val animeBackupCreator: AnimeBackupCreator = AnimeBackupCreator(), private val mangaBackupCreator: MangaBackupCreator = MangaBackupCreator(), private val preferenceBackupCreator: PreferenceBackupCreator = PreferenceBackupCreator(), private val animeExtensionRepoBackupCreator: AnimeExtensionRepoBackupCreator = AnimeExtensionRepoBackupCreator(), private val mangaExtensionRepoBackupCreator: MangaExtensionRepoBackupCreator = MangaExtensionRepoBackupCreator(), private val customButtonBackupCreator: CustomButtonBackupCreator = CustomButtonBackupCreator(), private val animeSourcesBackupCreator: AnimeSourcesBackupCreator = AnimeSourcesBackupCreator(), private val mangaSourcesBackupCreator: MangaSourcesBackupCreator = MangaSourcesBackupCreator(), private val extensionsBackupCreator: ExtensionsBackupCreator = ExtensionsBackupCreator(context), ) { suspend fun backup(uri: Uri, options: BackupOptions): String { var file: UniFile? = null try { file = if (isAutoBackup) { // Get dir of file and create val dir = UniFile.fromUri(context, uri) // Delete older backups dir?.listFiles { _, filename -> FILENAME_REGEX.matches(filename) } .orEmpty() .sortedByDescending { it.name } .drop(MAX_AUTO_BACKUPS - 1) .forEach { it.delete() } // Create new file to place backup dir?.createFile(getFilename()) } else { UniFile.fromUri(context, uri) } if (file == null || !file.isFile) { throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error)) } val nonFavoriteAnime = if (options.readEntries) { animeRepository.getWatchedAnimeNotInLibrary() } else { emptyList() } val backupAnime = backupAnimes(getAnimeFavorites.await() + nonFavoriteAnime, options) val nonFavoriteManga = if (options.readEntries) { mangaRepository.getReadMangaNotInLibrary() } else { emptyList() } val backupManga = backupMangas(getMangaFavorites.await() + nonFavoriteManga, options) val backup = Backup( backupManga = backupManga, backupCategories = backupMangaCategories(options), backupSources = backupMangaSources(backupManga), backupPreferences = backupAppPreferences(options), backupSourcePreferences = backupSourcePreferences(options), backupMangaExtensionRepo = backupMangaExtensionRepos(options), isLegacy = false, backupAnime = backupAnime, backupAnimeCategories = backupAnimeCategories(options), backupAnimeSources = backupAnimeSources(backupAnime), backupExtensions = backupExtensions(options), backupAnimeExtensionRepo = backupAnimeExtensionRepos(options), backupCustomButton = backupCustomButtons(options), ) val byteArray = parser.encodeToByteArray(Backup.serializer(), backup) if (byteArray.isEmpty()) { throw IllegalStateException(context.stringResource(MR.strings.empty_backup_error)) } file.openOutputStream() .also { // Force overwrite old file (it as? FileOutputStream)?.channel?.truncate(0) } .sink().gzip().buffer().use { it.write(byteArray) } val fileUri = file.uri // Make sure it's a valid backup file BackupFileValidator(context).validate(fileUri) if (isAutoBackup) { backupPreferences.lastAutoBackupTimestamp().set(Instant.now().toEpochMilli()) } return fileUri.toString() } catch (e: Exception) { logcat(LogPriority.ERROR, e) file?.delete() throw e } } private suspend fun backupAnimeCategories(options: BackupOptions): List { if (!options.categories) return emptyList() return animeCategoriesBackupCreator() } private suspend fun backupMangaCategories(options: BackupOptions): List { if (!options.categories) return emptyList() return mangaCategoriesBackupCreator() } private suspend fun backupMangas(mangas: List, options: BackupOptions): List { if (!options.libraryEntries) return emptyList() return mangaBackupCreator(mangas, options) } private suspend fun backupAnimes(animes: List, options: BackupOptions): List { if (!options.libraryEntries) return emptyList() return animeBackupCreator(animes, options) } private fun backupAnimeSources(animes: List): List { return animeSourcesBackupCreator(animes) } private fun backupMangaSources(mangas: List): List { return mangaSourcesBackupCreator(mangas) } private fun backupAppPreferences(options: BackupOptions): List { if (!options.appSettings) return emptyList() return preferenceBackupCreator.createApp(includePrivatePreferences = options.privateSettings) } private suspend fun backupAnimeExtensionRepos(options: BackupOptions): List { if (!options.extensionRepoSettings) return emptyList() return animeExtensionRepoBackupCreator() } private suspend fun backupMangaExtensionRepos(options: BackupOptions): List { if (!options.extensionRepoSettings) return emptyList() return mangaExtensionRepoBackupCreator() } private suspend fun backupCustomButtons(options: BackupOptions): List { if (!options.customButton) return emptyList() return customButtonBackupCreator() } private fun backupSourcePreferences(options: BackupOptions): List { if (!options.sourceSettings) return emptyList() return preferenceBackupCreator.createSource(includePrivatePreferences = options.privateSettings) } private fun backupExtensions(options: BackupOptions): List { if (!options.extensions) return emptyList() return extensionsBackupCreator() } companion object { private const val MAX_AUTO_BACKUPS: Int = 4 private val FILENAME_REGEX = """${BuildConfig.APPLICATION_ID}_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.tachibk""".toRegex() fun getFilename(): String { val date = SimpleDateFormat("yyyy-MM-dd_HH-mm", Locale.ENGLISH).format(Date()) return "${BuildConfig.APPLICATION_ID}_$date.tachibk" } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt ================================================ package eu.kanade.tachiyomi.data.backup.create import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR data class BackupOptions( val libraryEntries: Boolean = true, val categories: Boolean = true, val chapters: Boolean = true, val tracking: Boolean = true, val history: Boolean = true, val readEntries: Boolean = true, val appSettings: Boolean = true, val extensionRepoSettings: Boolean = true, val customButton: Boolean = true, val sourceSettings: Boolean = true, val privateSettings: Boolean = false, val extensions: Boolean = false, ) { fun asBooleanArray() = booleanArrayOf( libraryEntries, categories, chapters, tracking, history, readEntries, appSettings, extensionRepoSettings, customButton, sourceSettings, privateSettings, extensions, ) fun canCreate() = libraryEntries || categories || appSettings || extensionRepoSettings || customButton || sourceSettings companion object { val libraryOptions = persistentListOf( Entry( label = AYMR.strings.entries, getter = BackupOptions::libraryEntries, setter = { options, enabled -> options.copy(libraryEntries = enabled) }, ), Entry( label = AYMR.strings.chapters_episodes, getter = BackupOptions::chapters, setter = { options, enabled -> options.copy(chapters = enabled) }, enabled = { it.libraryEntries }, ), Entry( label = MR.strings.track, getter = BackupOptions::tracking, setter = { options, enabled -> options.copy(tracking = enabled) }, enabled = { it.libraryEntries }, ), Entry( label = MR.strings.history, getter = BackupOptions::history, setter = { options, enabled -> options.copy(history = enabled) }, enabled = { it.libraryEntries }, ), Entry( label = MR.strings.categories, getter = BackupOptions::categories, setter = { options, enabled -> options.copy(categories = enabled) }, ), Entry( label = AYMR.strings.non_library_settings, getter = BackupOptions::readEntries, setter = { options, enabled -> options.copy(readEntries = enabled) }, enabled = { it.libraryEntries }, ), ) val settingsOptions = persistentListOf( Entry( label = MR.strings.app_settings, getter = BackupOptions::appSettings, setter = { options, enabled -> options.copy(appSettings = enabled) }, ), Entry( label = MR.strings.extensionRepo_settings, getter = BackupOptions::extensionRepoSettings, setter = { options, enabled -> options.copy(extensionRepoSettings = enabled) }, ), Entry( label = AYMR.strings.custom_button_settings, getter = BackupOptions::customButton, setter = { options, enabled -> options.copy(customButton = enabled) }, ), Entry( label = MR.strings.source_settings, getter = BackupOptions::sourceSettings, setter = { options, enabled -> options.copy(sourceSettings = enabled) }, ), Entry( label = MR.strings.private_settings, getter = BackupOptions::privateSettings, setter = { options, enabled -> options.copy(privateSettings = enabled) }, enabled = { it.appSettings || it.sourceSettings }, ), ) val extensionOptions = persistentListOf( Entry( label = MR.strings.label_extensions, getter = BackupOptions::extensions, setter = { options, enabled -> options.copy(extensions = enabled) }, ), ) fun fromBooleanArray(array: BooleanArray) = BackupOptions( libraryEntries = array[0], categories = array[1], chapters = array[2], tracking = array[3], history = array[4], readEntries = array[5], appSettings = array[6], extensionRepoSettings = array[7], customButton = array[8], sourceSettings = array[9], privateSettings = array[10], extensions = array[11], ) } data class Entry( val label: StringResource, val getter: (BackupOptions) -> Boolean, val setter: (BackupOptions, Boolean) -> BackupOptions, val enabled: (BackupOptions) -> Boolean = { true }, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.create.BackupOptions import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeHistory import eu.kanade.tachiyomi.data.backup.models.BackupEpisode import eu.kanade.tachiyomi.data.backup.models.backupAnimeTrackMapper import eu.kanade.tachiyomi.data.backup.models.backupEpisodeMapper import tachiyomi.data.handlers.anime.AnimeDatabaseHandler import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.history.anime.interactor.GetAnimeHistory import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeBackupCreator( private val handler: AnimeDatabaseHandler = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val getHistory: GetAnimeHistory = Injekt.get(), ) { suspend operator fun invoke(animes: List, options: BackupOptions): List { return animes.map { backupAnime(it, options) } } private suspend fun backupAnime(anime: Anime, options: BackupOptions): BackupAnime { // Entry for this anime val animeObject = anime.toBackupAnime() if (options.chapters) { // Backup all the episodes handler.awaitList { episodesQueries.getEpisodesByAnimeId( animeId = anime.id, mapper = backupEpisodeMapper, ) } .takeUnless(List::isEmpty) ?.let { animeObject.episodes = it } } if (options.categories) { // Backup categories for this anime val categoriesForAnime = getCategories.await(anime.id) if (categoriesForAnime.isNotEmpty()) { animeObject.categories = categoriesForAnime.map { it.order } } } if (options.tracking) { val tracks = handler.awaitList { anime_syncQueries.getTracksByAnimeId(anime.id, backupAnimeTrackMapper) } if (tracks.isNotEmpty()) { animeObject.tracking = tracks } } if (options.history) { val historyByAnimeId = getHistory.await(anime.id) if (historyByAnimeId.isNotEmpty()) { val history = historyByAnimeId.map { history -> val episode = handler.awaitOne { episodesQueries.getEpisodeById(history.episodeId) } BackupAnimeHistory(episode.url, history.seenAt?.time ?: 0L) } if (history.isNotEmpty()) { animeObject.history = history } } } return animeObject } } private fun Anime.toBackupAnime() = BackupAnime( url = this.url, title = this.title, artist = this.artist, author = this.author, description = this.description, genre = this.genre.orEmpty(), status = this.status.toInt(), thumbnailUrl = this.thumbnailUrl, favorite = this.favorite, source = this.source, dateAdded = this.dateAdded, viewer_flags = this.viewerFlags.toInt(), episodeFlags = this.episodeFlags.toInt(), updateStrategy = this.updateStrategy, lastModifiedAt = this.lastModifiedAt, favoriteModifiedAt = this.favoriteModifiedAt, version = this.version, fetchType = this.fetchType, parentId = this.parentId, id = this.id, seasonFlags = this.seasonFlags, seasonNumber = this.seasonNumber, seasonSourceOrder = this.seasonSourceOrder, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeCategoriesBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.backupCategoryMapper import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.model.Category import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeCategoriesBackupCreator( private val getAnimeCategories: GetAnimeCategories = Injekt.get(), ) { suspend operator fun invoke(): List { return getAnimeCategories.await() .filterNot(Category::isSystemCategory) .map(backupCategoryMapper) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeExtensionRepoBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.backupExtensionReposMapper import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeExtensionRepoBackupCreator( private val getAnimeExtensionRepos: GetAnimeExtensionRepo = Injekt.get(), ) { suspend operator fun invoke(): List { return getAnimeExtensionRepos.getAll() .map(backupExtensionReposMapper) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeSourcesBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeSourcesBackupCreator( private val animeSourceManager: AnimeSourceManager = Injekt.get(), ) { operator fun invoke(animes: List): List { return animes .asSequence() .map(BackupAnime::source) .distinct() .map(animeSourceManager::getOrStub) .map { it.toBackupSource() } .toList() } } private fun AnimeSource.toBackupSource() = BackupAnimeSource( name = this.name, sourceId = this.id, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/CustomButtonBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupCustomButtons import eu.kanade.tachiyomi.data.backup.models.backupCustomButtonsMapper import tachiyomi.domain.custombuttons.interactor.GetCustomButtons import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class CustomButtonBackupCreator( private val getCustomButtons: GetCustomButtons = Injekt.get(), ) { suspend operator fun invoke(): List { return getCustomButtons.getAll() .map(backupCustomButtonsMapper) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/ExtensionsBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import android.content.Context import android.content.pm.PackageManager import eu.kanade.tachiyomi.data.backup.models.BackupExtension import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File class ExtensionsBackupCreator( private val context: Context, private val animeExtensionManager: AnimeExtensionManager = Injekt.get(), private val mangaExtensionManager: MangaExtensionManager = Injekt.get(), ) { operator fun invoke(): List { val installedExtensions = mutableListOf() animeExtensionManager.installedExtensionsFlow.value.forEach { val packageName = it.pkgName val apk = File( context.packageManager .getApplicationInfo( packageName, PackageManager.GET_META_DATA, ).publicSourceDir, ).readBytes() installedExtensions.add( BackupExtension(packageName, apk), ) } mangaExtensionManager.installedExtensionsFlow.value.forEach { val packageName = it.pkgName val apk = File( context.packageManager .getApplicationInfo( packageName, PackageManager.GET_META_DATA, ).publicSourceDir, ).readBytes() installedExtensions.add( BackupExtension(packageName, apk), ) } return installedExtensions } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.create.BackupOptions import eu.kanade.tachiyomi.data.backup.models.BackupChapter import eu.kanade.tachiyomi.data.backup.models.BackupHistory import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.backupChapterMapper import eu.kanade.tachiyomi.data.backup.models.backupMangaTrackMapper import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode import tachiyomi.data.handlers.manga.MangaDatabaseHandler import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.history.manga.interactor.GetMangaHistory import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaBackupCreator( private val handler: MangaDatabaseHandler = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val getHistory: GetMangaHistory = Injekt.get(), ) { suspend operator fun invoke(mangas: List, options: BackupOptions): List { return mangas.map { backupManga(it, options) } } private suspend fun backupManga(manga: Manga, options: BackupOptions): BackupManga { // Entry for this manga val mangaObject = manga.toBackupManga() mangaObject.excludedScanlators = handler.awaitList { excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(manga.id) } if (options.chapters) { // Backup all the chapters handler.awaitList { chaptersQueries.getChaptersByMangaId( mangaId = manga.id, applyScanlatorFilter = 0, // false mapper = backupChapterMapper, ) } .takeUnless(List::isEmpty) ?.let { mangaObject.chapters = it } } if (options.categories) { // Backup categories for this manga val categoriesForManga = getCategories.await(manga.id) if (categoriesForManga.isNotEmpty()) { mangaObject.categories = categoriesForManga.map { it.order } } } if (options.tracking) { val tracks = handler.awaitList { manga_syncQueries.getTracksByMangaId(manga.id, backupMangaTrackMapper) } if (tracks.isNotEmpty()) { mangaObject.tracking = tracks } } if (options.history) { val historyByMangaId = getHistory.await(manga.id) if (historyByMangaId.isNotEmpty()) { val history = historyByMangaId.map { history -> val chapter = handler.awaitOne { chaptersQueries.getChapterById(history.chapterId) } BackupHistory(chapter.url, history.readAt?.time ?: 0L, history.readDuration) } if (history.isNotEmpty()) { mangaObject.history = history } } } return mangaObject } } private fun Manga.toBackupManga() = BackupManga( url = this.url, title = this.title, artist = this.artist, author = this.author, description = this.description, genre = this.genre.orEmpty(), status = this.status.toInt(), thumbnailUrl = this.thumbnailUrl, favorite = this.favorite, source = this.source, dateAdded = this.dateAdded, viewer = (this.viewerFlags.toInt() and ReadingMode.MASK), viewer_flags = this.viewerFlags.toInt(), chapterFlags = this.chapterFlags.toInt(), updateStrategy = this.updateStrategy, lastModifiedAt = this.lastModifiedAt, favoriteModifiedAt = this.favoriteModifiedAt, version = this.version, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaCategoriesBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.backupCategoryMapper import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.model.Category import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaCategoriesBackupCreator( private val getMangaCategories: GetMangaCategories = Injekt.get(), ) { suspend operator fun invoke(): List { return getMangaCategories.await() .filterNot(Category::isSystemCategory) .map(backupCategoryMapper) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaExtensionRepoBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.backupExtensionReposMapper import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaExtensionRepoBackupCreator( private val getMangaExtensionRepos: GetMangaExtensionRepo = Injekt.get(), ) { suspend operator fun invoke(): List { return getMangaExtensionRepos.getAll() .map(backupExtensionReposMapper) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaSourcesBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupSource import eu.kanade.tachiyomi.source.MangaSource import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaSourcesBackupCreator( private val mangaSourceManager: MangaSourceManager = Injekt.get(), ) { operator fun invoke(mangas: List): List { return mangas .asSequence() .map(BackupManga::source) .distinct() .map(mangaSourceManager::getOrStub) .map { it.toBackupSource() } .toList() } } private fun MangaSource.toBackupSource() = BackupSource( name = this.name, sourceId = this.id, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt ================================================ package eu.kanade.tachiyomi.data.backup.create.creators import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.preferenceKey import eu.kanade.tachiyomi.animesource.sourcePreferences import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences import eu.kanade.tachiyomi.data.backup.models.BooleanPreferenceValue import eu.kanade.tachiyomi.data.backup.models.FloatPreferenceValue import eu.kanade.tachiyomi.data.backup.models.IntPreferenceValue import eu.kanade.tachiyomi.data.backup.models.LongPreferenceValue import eu.kanade.tachiyomi.data.backup.models.StringPreferenceValue import eu.kanade.tachiyomi.data.backup.models.StringSetPreferenceValue import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.preferenceKey import eu.kanade.tachiyomi.source.sourcePreferences import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class PreferenceBackupCreator( private val animeSourceManager: AnimeSourceManager = Injekt.get(), private val mangaSourceManager: MangaSourceManager = Injekt.get(), private val preferenceStore: PreferenceStore = Injekt.get(), ) { fun createApp(includePrivatePreferences: Boolean): List { return preferenceStore.getAll().toBackupPreferences() .withPrivatePreferences(includePrivatePreferences) } fun createSource(includePrivatePreferences: Boolean): List { val animePreferences = animeSourceManager.getCatalogueSources() .filterIsInstance() .map { BackupSourcePreferences( it.preferenceKey(), it.sourcePreferences().all.toBackupPreferences() .withPrivatePreferences(includePrivatePreferences), ) } .filter { it.prefs.isNotEmpty() } val mangaPreferences = mangaSourceManager.getCatalogueSources() .filterIsInstance() .map { BackupSourcePreferences( it.preferenceKey(), it.sourcePreferences().all.toBackupPreferences() .withPrivatePreferences(includePrivatePreferences), ) } .filter { it.prefs.isNotEmpty() } return animePreferences + mangaPreferences } @Suppress("UNCHECKED_CAST") private fun Map.toBackupPreferences(): List { return this .filterKeys { !Preference.isAppState(it) } .mapNotNull { (key, value) -> when (value) { is Int -> BackupPreference(key, IntPreferenceValue(value)) is Long -> BackupPreference(key, LongPreferenceValue(value)) is Float -> BackupPreference(key, FloatPreferenceValue(value)) is String -> BackupPreference(key, StringPreferenceValue(value)) is Boolean -> BackupPreference(key, BooleanPreferenceValue(value)) is Set<*> -> (value as? Set)?.let { BackupPreference(key, StringSetPreferenceValue(it)) } else -> null } } } private fun List.withPrivatePreferences(include: Boolean) = if (include) { this } else { this.filter { !Preference.isPrivate(it.key) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/Backup.kt ================================================ package eu.kanade.tachiyomi.data.backup.full.models import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeSource import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupSource import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class Backup( @ProtoNumber(1) val backupManga: List = emptyList(), @ProtoNumber(2) var backupCategories: List = emptyList(), @ProtoNumber(3) val backupAnime: List = emptyList(), @ProtoNumber(4) var backupAnimeCategories: List = emptyList(), // Bump by 100 to specify this is a 0.x value // @ProtoNumber(100) var backupBrokenSources, legacy source model with non-compliant proto number, @ProtoNumber(101) var backupSources: List = emptyList(), // @ProtoNumber(102) var backupBrokenAnimeSources, legacy source model with non-compliant proto number, @ProtoNumber(103) var backupAnimeSources: List = emptyList(), @ProtoNumber(104) var backupPreferences: List = emptyList(), ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/full/models/BackupPreference.kt ================================================ package eu.kanade.tachiyomi.data.backup.full.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class BackupPreference( @ProtoNumber(1) val key: String, @ProtoNumber(2) val value: PreferenceValue, ) @Serializable sealed class PreferenceValue @Serializable data class IntPreferenceValue(val value: Int) : PreferenceValue() @Serializable data class LongPreferenceValue(val value: Long) : PreferenceValue() @Serializable data class FloatPreferenceValue(val value: Float) : PreferenceValue() @Serializable data class StringPreferenceValue(val value: String) : PreferenceValue() @Serializable data class BooleanPreferenceValue(val value: Boolean) : PreferenceValue() @Serializable data class StringSetPreferenceValue(val value: Set) : PreferenceValue() ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class LegacyBackup( @ProtoNumber(1) val backupManga: List = emptyList(), @ProtoNumber(2) var backupCategories: List = emptyList(), @ProtoNumber(3) val backupAnime: List = emptyList(), @ProtoNumber(4) var backupAnimeCategories: List = emptyList(), // Bump by 100 to specify this is a 0.x value // @ProtoNumber(100) var backupBrokenSources, legacy source model with non-compliant proto number, @ProtoNumber(101) var backupSources: List = emptyList(), // @ProtoNumber(102) var backupBrokenAnimeSources, legacy source model with non-compliant proto number, @ProtoNumber(103) var backupAnimeSources: List = emptyList(), @ProtoNumber(104) var backupPreferences: List = emptyList(), @ProtoNumber(105) var backupSourcePreferences: List = emptyList(), @ProtoNumber(106) var backupExtensions: List = emptyList(), @ProtoNumber(107) var backupAnimeExtensionRepo: List = emptyList(), @ProtoNumber(108) var backupMangaExtensionRepo: List = emptyList(), @ProtoNumber(109) var backupCustomButton: List = emptyList(), ) { fun toBackup(): Backup { return Backup( backupManga = backupManga, backupCategories = backupCategories, backupSources = backupSources, backupPreferences = backupPreferences, backupSourcePreferences = backupSourcePreferences, backupMangaExtensionRepo = backupMangaExtensionRepo, isLegacy = false, // Only used for detection backupAnime = backupAnime, backupAnimeCategories = backupAnimeCategories, backupAnimeSources = backupAnimeSources, backupExtensions = backupExtensions, backupAnimeExtensionRepo = backupAnimeExtensionRepo, backupCustomButton = backupCustomButton, ) } } @Serializable data class Backup( @ProtoNumber(1) val backupManga: List = emptyList(), @ProtoNumber(2) var backupCategories: List = emptyList(), // @ProtoNumber(100) var backupBrokenSources, legacy source model with non-compliant proto number, @ProtoNumber(101) var backupSources: List = emptyList(), @ProtoNumber(104) var backupPreferences: List = emptyList(), @ProtoNumber(105) var backupSourcePreferences: List = emptyList(), @ProtoNumber(106) var backupMangaExtensionRepo: List = emptyList(), // Aniyomi specific values @ProtoNumber(500) val isLegacy: Boolean = true, @ProtoNumber(501) val backupAnime: List = emptyList(), @ProtoNumber(502) var backupAnimeCategories: List = emptyList(), @ProtoNumber(503) var backupAnimeSources: List = emptyList(), @ProtoNumber(504) var backupExtensions: List = emptyList(), @ProtoNumber(505) var backupAnimeExtensionRepo: List = emptyList(), @ProtoNumber(506) var backupCustomButton: List = emptyList(), ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import eu.kanade.tachiyomi.animesource.model.AnimeUpdateStrategy import eu.kanade.tachiyomi.animesource.model.FetchType import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.entries.anime.model.Anime @Suppress("DEPRECATION") @Serializable data class BackupAnime( // in 1.x some of these values have different names @ProtoNumber(1) var source: Long, // url is called key in 1.x @ProtoNumber(2) var url: String, @ProtoNumber(3) var title: String = "", @ProtoNumber(4) var artist: String? = null, @ProtoNumber(5) var author: String? = null, @ProtoNumber(6) var description: String? = null, @ProtoNumber(7) var genre: List = emptyList(), @ProtoNumber(8) var status: Int = 0, // thumbnailUrl is called cover in 1.x @ProtoNumber(9) var thumbnailUrl: String? = null, // @ProtoNumber(10) val customCover: String = "", 1.x value, not used in 0.x // @ProtoNumber(11) val lastUpdate: Long = 0, 1.x value, not used in 0.x // @ProtoNumber(12) val lastInit: Long = 0, 1.x value, not used in 0.x @ProtoNumber(13) var dateAdded: Long = 0, // @ProtoNumber(15) val flags: Int = 0, 1.x value, not used in 0.x @ProtoNumber(16) var episodes: List = emptyList(), @ProtoNumber(17) var categories: List = emptyList(), @ProtoNumber(18) var tracking: List = emptyList(), // Bump by 100 for values that are not saved/implemented in 1.x but are used in 0.x @ProtoNumber(100) var favorite: Boolean = true, @ProtoNumber(101) var episodeFlags: Int = 0, // @ProtoNumber(102) var brokenHistory, legacy history model with non-compliant proto number @ProtoNumber(103) var viewer_flags: Int = 0, @ProtoNumber(104) var history: List = emptyList(), @ProtoNumber(105) var updateStrategy: AnimeUpdateStrategy = AnimeUpdateStrategy.ALWAYS_UPDATE, @ProtoNumber(106) var lastModifiedAt: Long = 0, @ProtoNumber(107) var favoriteModifiedAt: Long? = null, @ProtoNumber(109) var version: Long = 0, // Aniyomi specific values @ProtoNumber(500) var backgroundUrl: String? = null, // @ProtoNumber(501) Broken, do not use @ProtoNumber(502) var parentId: Long? = null, @ProtoNumber(503) var id: Long? = null, // Used to associate seasons with parents. Do not use for anything else. @ProtoNumber(504) var seasonFlags: Long = 0, @ProtoNumber(505) var seasonNumber: Double = -1.0, @ProtoNumber(506) var seasonSourceOrder: Long = 0, @ProtoNumber(507) var fetchType: FetchType = FetchType.Episodes, ) { fun getAnimeImpl(): Anime { return Anime.create().copy( url = this@BackupAnime.url, title = this@BackupAnime.title, artist = this@BackupAnime.artist, author = this@BackupAnime.author, description = this@BackupAnime.description, genre = this@BackupAnime.genre, status = this@BackupAnime.status.toLong(), thumbnailUrl = this@BackupAnime.thumbnailUrl, backgroundUrl = this@BackupAnime.backgroundUrl, favorite = this@BackupAnime.favorite, source = this@BackupAnime.source, dateAdded = this@BackupAnime.dateAdded, viewerFlags = this@BackupAnime.viewer_flags.toLong(), episodeFlags = this@BackupAnime.episodeFlags.toLong(), updateStrategy = this@BackupAnime.updateStrategy, lastModifiedAt = this@BackupAnime.lastModifiedAt, favoriteModifiedAt = this@BackupAnime.favoriteModifiedAt, version = this@BackupAnime.version, fetchType = this@BackupAnime.fetchType, parentId = this@BackupAnime.parentId, seasonFlags = this@BackupAnime.seasonFlags, seasonNumber = this@BackupAnime.seasonNumber, seasonSourceOrder = this@BackupAnime.seasonSourceOrder, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeHistory.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.history.anime.model.AnimeHistory import java.util.Date @Serializable data class BackupAnimeHistory( @ProtoNumber(1) var url: String, @ProtoNumber(2) var lastRead: Long, @ProtoNumber(3) var readDuration: Long = 0, ) { fun getHistoryImpl(): AnimeHistory { return AnimeHistory.create().copy( seenAt = Date(lastRead), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeSource.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class BackupAnimeSource( @ProtoNumber(1) var name: String = "", @ProtoNumber(2) var sourceId: Long, ) @Serializable data class BrokenBackupAnimeSource( @ProtoNumber(0) var name: String = "", @ProtoNumber(1) var sourceId: Long, ) { fun toBackupSource() = BackupAnimeSource(name, sourceId) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnimeTracking.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.track.anime.model.AnimeTrack @Serializable data class BackupAnimeTracking( // in 1.x some of these values have different types or names @ProtoNumber(1) var syncId: Int, // LibraryId is not null in 1.x @ProtoNumber(2) var libraryId: Long, @Deprecated("Use mediaId instead", level = DeprecationLevel.WARNING) @ProtoNumber(3) var mediaIdInt: Int = 0, // trackingUrl is called mediaUrl in 1.x @ProtoNumber(4) var trackingUrl: String = "", @ProtoNumber(5) var title: String = "", // lastEpisodeSeen is called last seen, and it has been changed to a float in 1.x @ProtoNumber(6) var lastEpisodeSeen: Float = 0F, @ProtoNumber(7) var totalEpisodes: Int = 0, @ProtoNumber(8) var score: Float = 0F, @ProtoNumber(9) var status: Int = 0, // startedReadingDate is called startReadTime in 1.x @ProtoNumber(10) var startedWatchingDate: Long = 0, // finishedReadingDate is called endReadTime in 1.x @ProtoNumber(11) var finishedWatchingDate: Long = 0, @ProtoNumber(12) var private: Boolean = false, @ProtoNumber(100) var mediaId: Long = 0, ) { @Suppress("DEPRECATION") fun getTrackImpl(): AnimeTrack { return AnimeTrack( id = -1, animeId = -1, trackerId = this@BackupAnimeTracking.syncId.toLong(), remoteId = if (this@BackupAnimeTracking.mediaIdInt != 0) { this@BackupAnimeTracking.mediaIdInt.toLong() } else { this@BackupAnimeTracking.mediaId }, libraryId = this@BackupAnimeTracking.libraryId, title = this@BackupAnimeTracking.title, lastEpisodeSeen = this@BackupAnimeTracking.lastEpisodeSeen.toDouble(), totalEpisodes = this@BackupAnimeTracking.totalEpisodes.toLong(), score = this@BackupAnimeTracking.score.toDouble(), status = this@BackupAnimeTracking.status.toLong(), startDate = this@BackupAnimeTracking.startedWatchingDate, finishDate = this@BackupAnimeTracking.finishedWatchingDate, remoteUrl = this@BackupAnimeTracking.trackingUrl, private = this@BackupAnimeTracking.private, ) } } val backupAnimeTrackMapper = { _id: Long, anime_id: Long, syncId: Long, mediaId: Long, libraryId: Long?, title: String, lastEpisodeSeen: Double, totalEpisodes: Long, status: Long, score: Double, remoteUrl: String, startDate: Long, finishDate: Long, private: Boolean, -> BackupAnimeTracking( syncId = syncId.toInt(), mediaId = mediaId, // forced not null so its compatible with 1.x backup system libraryId = libraryId ?: 0, title = title, lastEpisodeSeen = lastEpisodeSeen.toFloat(), totalEpisodes = totalEpisodes.toInt(), score = score.toFloat(), status = status.toInt(), startedWatchingDate = startDate, finishedWatchingDate = finishDate, trackingUrl = remoteUrl, private = private, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupCategory.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.category.model.Category @Serializable class BackupCategory( @ProtoNumber(1) var name: String, @ProtoNumber(2) var order: Long = 0, @ProtoNumber(3) var id: Long = 0, // @ProtoNumber(3) val updateInterval: Int = 0, 1.x value not used in 0.x // Bump by 100 to specify this is a 0.x value @ProtoNumber(100) var flags: Long = 0, ) { fun toCategory(id: Long) = Category( id = id, name = this@BackupCategory.name, flags = this@BackupCategory.flags, order = this@BackupCategory.order, hidden = false, ) } val backupCategoryMapper = { category: Category -> BackupCategory( id = category.id, name = category.name, order = category.order, flags = category.flags, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.items.chapter.model.Chapter @Serializable data class BackupChapter( // in 1.x some of these values have different names // url is called key in 1.x @ProtoNumber(1) var url: String, @ProtoNumber(2) var name: String, @ProtoNumber(3) var scanlator: String? = null, @ProtoNumber(4) var read: Boolean = false, @ProtoNumber(5) var bookmark: Boolean = false, // lastPageRead is called progress in 1.x @ProtoNumber(6) var lastPageRead: Long = 0, @ProtoNumber(7) var dateFetch: Long = 0, @ProtoNumber(8) var dateUpload: Long = 0, // chapterNumber is called number is 1.x @ProtoNumber(9) var chapterNumber: Float = 0F, @ProtoNumber(10) var sourceOrder: Long = 0, @ProtoNumber(11) var lastModifiedAt: Long = 0, @ProtoNumber(12) var version: Long = 0, ) { fun toChapterImpl(): Chapter { return Chapter.create().copy( url = this@BackupChapter.url, name = this@BackupChapter.name, chapterNumber = this@BackupChapter.chapterNumber.toDouble(), scanlator = this@BackupChapter.scanlator, read = this@BackupChapter.read, bookmark = this@BackupChapter.bookmark, lastPageRead = this@BackupChapter.lastPageRead, dateFetch = this@BackupChapter.dateFetch, dateUpload = this@BackupChapter.dateUpload, sourceOrder = this@BackupChapter.sourceOrder, lastModifiedAt = this@BackupChapter.lastModifiedAt, version = this@BackupChapter.version, ) } } val backupChapterMapper = { _: Long, _: Long, url: String, name: String, scanlator: String?, read: Boolean, bookmark: Boolean, lastPageRead: Long, chapterNumber: Double, source_order: Long, dateFetch: Long, dateUpload: Long, lastModifiedAt: Long, version: Long, _: Long, -> BackupChapter( url = url, name = name, chapterNumber = chapterNumber.toFloat(), scanlator = scanlator, read = read, bookmark = bookmark, lastPageRead = lastPageRead, dateFetch = dateFetch, dateUpload = dateUpload, sourceOrder = source_order, lastModifiedAt = lastModifiedAt, version = version, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupCustomButtons.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.custombuttons.model.CustomButton @Serializable class BackupCustomButtons( @ProtoNumber(1) var name: String, @ProtoNumber(2) var isFavorite: Boolean, @ProtoNumber(3) var sortIndex: Long, @ProtoNumber(4) var content: String, @ProtoNumber(5) var longPressContent: String, @ProtoNumber(6) var onStartup: String, ) val backupCustomButtonsMapper = { btn: CustomButton -> BackupCustomButtons( name = btn.name, isFavorite = btn.isFavorite, sortIndex = btn.sortIndex, content = btn.content, longPressContent = btn.longPressContent, onStartup = btn.onStartup, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.items.episode.model.Episode @Serializable data class BackupEpisode( // in 1.x some of these values have different names // url is called key in 1.x @ProtoNumber(1) var url: String, @ProtoNumber(2) var name: String, @ProtoNumber(3) var scanlator: String? = null, @ProtoNumber(4) var seen: Boolean = false, @ProtoNumber(5) var bookmark: Boolean = false, // lastPageRead is called progress in 1.x @ProtoNumber(6) var lastSecondSeen: Long = 0, @ProtoNumber(16) var totalSeconds: Long = 0, @ProtoNumber(7) var dateFetch: Long = 0, @ProtoNumber(8) var dateUpload: Long = 0, // episodeNumber is called number is 1.x @ProtoNumber(9) var episodeNumber: Float = 0F, @ProtoNumber(10) var sourceOrder: Long = 0, @ProtoNumber(11) var lastModifiedAt: Long = 0, @ProtoNumber(12) var version: Long = 0, // Aniyomi specific values @ProtoNumber(501) var fillermark: Boolean = false, @ProtoNumber(502) var summary: String? = null, @ProtoNumber(503) var previewUrl: String? = null, ) { fun toEpisodeImpl(): Episode { return Episode.create().copy( url = this@BackupEpisode.url, name = this@BackupEpisode.name, episodeNumber = this@BackupEpisode.episodeNumber.toDouble(), scanlator = this@BackupEpisode.scanlator, summary = this@BackupEpisode.summary, previewUrl = this@BackupEpisode.previewUrl, seen = this@BackupEpisode.seen, bookmark = this@BackupEpisode.bookmark, fillermark = this@BackupEpisode.fillermark, lastSecondSeen = this@BackupEpisode.lastSecondSeen, totalSeconds = this@BackupEpisode.totalSeconds, dateFetch = this@BackupEpisode.dateFetch, dateUpload = this@BackupEpisode.dateUpload, sourceOrder = this@BackupEpisode.sourceOrder, lastModifiedAt = this@BackupEpisode.lastModifiedAt, version = this@BackupEpisode.version, ) } } val backupEpisodeMapper = { _: Long, _: Long, url: String, name: String, scanlator: String?, seen: Boolean, bookmark: Boolean, lastSecondSeen: Long, totalSeconds: Long, episodeNumber: Double, source_order: Long, dateFetch: Long, dateUpload: Long, lastModifiedAt: Long, version: Long, _: Long, summary: String?, previewUrl: String?, fillermark: Boolean, -> BackupEpisode( url = url, name = name, episodeNumber = episodeNumber.toFloat(), scanlator = scanlator, summary = summary, previewUrl = previewUrl, seen = seen, bookmark = bookmark, fillermark = fillermark, lastSecondSeen = lastSecondSeen, totalSeconds = totalSeconds, dateFetch = dateFetch, dateUpload = dateUpload, sourceOrder = source_order, lastModifiedAt = lastModifiedAt, version = version, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtension.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class BackupExtension( @ProtoNumber(1) val pkgName: String, @ProtoNumber(2) val apk: ByteArray, ) { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as BackupExtension if (pkgName != other.pkgName) return false if (!apk.contentEquals(other.apk)) return false return true } override fun hashCode(): Int { var result = pkgName.hashCode() result = 31 * result + apk.contentHashCode() return result } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionPreferences.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class BackupExtensionPreferences( @ProtoNumber(1) val name: String, @ProtoNumber(2) val prefs: List, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupExtensionRepos.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import mihon.domain.extensionrepo.model.ExtensionRepo @Serializable class BackupExtensionRepos( @ProtoNumber(1) var baseUrl: String, @ProtoNumber(2) var name: String, @ProtoNumber(3) var shortName: String?, @ProtoNumber(4) var website: String, @ProtoNumber(5) var signingKeyFingerprint: String, ) val backupExtensionReposMapper = { repo: ExtensionRepo -> BackupExtensionRepos( baseUrl = repo.baseUrl, name = repo.name, shortName = repo.shortName, website = repo.website, signingKeyFingerprint = repo.signingKeyFingerprint, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupHistory.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.history.manga.model.MangaHistory import java.util.Date @Serializable data class BackupHistory( @ProtoNumber(1) var url: String, @ProtoNumber(2) var lastRead: Long, @ProtoNumber(3) var readDuration: Long = 0, ) { fun getHistoryImpl(): MangaHistory { return MangaHistory.create().copy( readAt = Date(lastRead), readDuration = readDuration, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import eu.kanade.tachiyomi.source.model.UpdateStrategy import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.entries.manga.model.Manga @Suppress("DEPRECATION") @Serializable data class BackupManga( // in 1.x some of these values have different names @ProtoNumber(1) var source: Long, // url is called key in 1.x @ProtoNumber(2) var url: String, @ProtoNumber(3) var title: String = "", @ProtoNumber(4) var artist: String? = null, @ProtoNumber(5) var author: String? = null, @ProtoNumber(6) var description: String? = null, @ProtoNumber(7) var genre: List = emptyList(), @ProtoNumber(8) var status: Int = 0, // thumbnailUrl is called cover in 1.x @ProtoNumber(9) var thumbnailUrl: String? = null, // @ProtoNumber(10) val customCover: String = "", 1.x value, not used in 0.x // @ProtoNumber(11) val lastUpdate: Long = 0, 1.x value, not used in 0.x // @ProtoNumber(12) val lastInit: Long = 0, 1.x value, not used in 0.x @ProtoNumber(13) var dateAdded: Long = 0, @ProtoNumber(14) var viewer: Int = 0, // Replaced by viewer_flags // @ProtoNumber(15) val flags: Int = 0, 1.x value, not used in 0.x @ProtoNumber(16) var chapters: List = emptyList(), @ProtoNumber(17) var categories: List = emptyList(), @ProtoNumber(18) var tracking: List = emptyList(), // Bump by 100 for values that are not saved/implemented in 1.x but are used in 0.x @ProtoNumber(100) var favorite: Boolean = true, @ProtoNumber(101) var chapterFlags: Int = 0, // @ProtoNumber(102) var brokenHistory, legacy history model with non-compliant proto number @ProtoNumber(103) var viewer_flags: Int? = null, @ProtoNumber(104) var history: List = emptyList(), @ProtoNumber(105) var updateStrategy: UpdateStrategy = UpdateStrategy.ALWAYS_UPDATE, @ProtoNumber(106) var lastModifiedAt: Long = 0, @ProtoNumber(107) var favoriteModifiedAt: Long? = null, @ProtoNumber(108) var excludedScanlators: List = emptyList(), @ProtoNumber(109) var version: Long = 0, ) { fun getMangaImpl(): Manga { return Manga.create().copy( url = this@BackupManga.url, title = this@BackupManga.title, artist = this@BackupManga.artist, author = this@BackupManga.author, description = this@BackupManga.description, genre = this@BackupManga.genre, status = this@BackupManga.status.toLong(), thumbnailUrl = this@BackupManga.thumbnailUrl, favorite = this@BackupManga.favorite, source = this@BackupManga.source, dateAdded = this@BackupManga.dateAdded, viewerFlags = (this@BackupManga.viewer_flags ?: this@BackupManga.viewer).toLong(), chapterFlags = this@BackupManga.chapterFlags.toLong(), updateStrategy = this@BackupManga.updateStrategy, lastModifiedAt = this@BackupManga.lastModifiedAt, favoriteModifiedAt = this@BackupManga.favoriteModifiedAt, version = this@BackupManga.version, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupPreference.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class BackupPreference( @ProtoNumber(1) val key: String, @ProtoNumber(2) val value: PreferenceValue, ) @Serializable data class BackupSourcePreferences( @ProtoNumber(1) val sourceKey: String, @ProtoNumber(2) val prefs: List, ) @Serializable sealed class PreferenceValue @Serializable data class IntPreferenceValue(val value: Int) : PreferenceValue() @Serializable data class LongPreferenceValue(val value: Long) : PreferenceValue() @Serializable data class FloatPreferenceValue(val value: Float) : PreferenceValue() @Serializable data class StringPreferenceValue(val value: String) : PreferenceValue() @Serializable data class BooleanPreferenceValue(val value: Boolean) : PreferenceValue() @Serializable data class StringSetPreferenceValue(val value: Set) : PreferenceValue() ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupSource.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber @Serializable data class BackupSource( @ProtoNumber(1) var name: String = "", @ProtoNumber(2) var sourceId: Long, ) @Serializable data class BrokenBackupSource( @ProtoNumber(0) var name: String = "", @ProtoNumber(1) var sourceId: Long, ) { fun toBackupSource() = BackupSource(name, sourceId) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt ================================================ package eu.kanade.tachiyomi.data.backup.models import kotlinx.serialization.Serializable import kotlinx.serialization.protobuf.ProtoNumber import tachiyomi.domain.track.manga.model.MangaTrack @Serializable data class BackupTracking( // in 1.x some of these values have different types or names @ProtoNumber(1) var syncId: Int, // LibraryId is not null in 1.x @ProtoNumber(2) var libraryId: Long, @Deprecated("Use mediaId instead", level = DeprecationLevel.WARNING) @ProtoNumber(3) var mediaIdInt: Int = 0, // trackingUrl is called mediaUrl in 1.x @ProtoNumber(4) var trackingUrl: String = "", @ProtoNumber(5) var title: String = "", // lastChapterRead is called last read, and it has been changed to a float in 1.x @ProtoNumber(6) var lastChapterRead: Float = 0F, @ProtoNumber(7) var totalChapters: Int = 0, @ProtoNumber(8) var score: Float = 0F, @ProtoNumber(9) var status: Int = 0, // startedReadingDate is called startReadTime in 1.x @ProtoNumber(10) var startedReadingDate: Long = 0, // finishedReadingDate is called endReadTime in 1.x @ProtoNumber(11) var finishedReadingDate: Long = 0, @ProtoNumber(12) var private: Boolean = false, @ProtoNumber(100) var mediaId: Long = 0, ) { @Suppress("DEPRECATION") fun getTrackImpl(): MangaTrack { return MangaTrack( id = -1, mangaId = -1, trackerId = this@BackupTracking.syncId.toLong(), remoteId = if (this@BackupTracking.mediaIdInt != 0) { this@BackupTracking.mediaIdInt.toLong() } else { this@BackupTracking.mediaId }, libraryId = this@BackupTracking.libraryId, title = this@BackupTracking.title, lastChapterRead = this@BackupTracking.lastChapterRead.toDouble(), totalChapters = this@BackupTracking.totalChapters.toLong(), score = this@BackupTracking.score.toDouble(), status = this@BackupTracking.status.toLong(), startDate = this@BackupTracking.startedReadingDate, finishDate = this@BackupTracking.finishedReadingDate, remoteUrl = this@BackupTracking.trackingUrl, private = this@BackupTracking.private, ) } } val backupMangaTrackMapper = { _: Long, _: Long, syncId: Long, mediaId: Long, libraryId: Long?, title: String, lastChapterRead: Double, totalChapters: Long, status: Long, score: Double, remoteUrl: String, startDate: Long, finishDate: Long, private: Boolean, -> BackupTracking( syncId = syncId.toInt(), mediaId = mediaId, // forced not null so its compatible with 1.x backup system libraryId = libraryId ?: 0, title = title, lastChapterRead = lastChapterRead.toFloat(), totalChapters = totalChapters.toInt(), score = score.toFloat(), status = status.toInt(), startedReadingDate = startDate, finishedReadingDate = finishDate, trackingUrl = remoteUrl, private = private, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestoreJob.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore import android.content.Context import android.content.pm.ServiceInfo import android.net.Uri import android.os.Build import androidx.core.net.toUri import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkerParameters import androidx.work.workDataOf import eu.kanade.tachiyomi.data.backup.BackupNotifier import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR class BackupRestoreJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val notifier = BackupNotifier(context) override suspend fun doWork(): Result { val uri = inputData.getString(LOCATION_URI_KEY)?.toUri() val options = inputData.getBooleanArray(OPTIONS_KEY)?.let { RestoreOptions.fromBooleanArray(it) } if (uri == null || options == null) { return Result.failure() } val isSync = inputData.getBoolean(SYNC_KEY, false) try { setForeground(getForegroundInfo()) } catch (e: IllegalStateException) { logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" } } return try { BackupRestorer(context, notifier, isSync).restore(uri, options) Result.success() } catch (e: Exception) { if (e is CancellationException) { notifier.showRestoreError(context.stringResource(MR.strings.restoring_backup_canceled)) Result.success() } else { logcat(LogPriority.ERROR, e) notifier.showRestoreError(e.message) Result.failure() } } finally { context.cancelNotification(Notifications.ID_RESTORE_PROGRESS) } } override suspend fun getForegroundInfo(): ForegroundInfo { return ForegroundInfo( Notifications.ID_RESTORE_PROGRESS, notifier.showRestoreProgress().build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } companion object { fun isRunning(context: Context): Boolean { return context.workManager.isRunning(TAG) } fun start( context: Context, uri: Uri, options: RestoreOptions, sync: Boolean = false, ) { val inputData = workDataOf( LOCATION_URI_KEY to uri.toString(), SYNC_KEY to sync, OPTIONS_KEY to options.asBooleanArray(), ) val request = OneTimeWorkRequestBuilder() .addTag(TAG) .setInputData(inputData) .build() context.workManager.enqueueUniqueWork(TAG, ExistingWorkPolicy.KEEP, request) } fun stop(context: Context) { context.workManager.cancelUniqueWork(TAG) } } } private const val TAG = "BackupRestore" private const val LOCATION_URI_KEY = "location_uri" // String private const val SYNC_KEY = "sync" // Boolean private const val OPTIONS_KEY = "options" // BooleanArray ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/BackupRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore import android.content.Context import android.net.Uri import eu.kanade.tachiyomi.data.backup.BackupDecoder import eu.kanade.tachiyomi.data.backup.BackupNotifier import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupCustomButtons import eu.kanade.tachiyomi.data.backup.models.BackupExtension import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeCategoriesRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeExtensionRepoRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.AnimeRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.CustomButtonRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.ExtensionsRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaCategoriesRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaExtensionRepoRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.MangaRestorer import eu.kanade.tachiyomi.data.backup.restore.restorers.PreferenceRestorer import eu.kanade.tachiyomi.util.system.createFileInCacheDir import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import java.io.File import java.text.SimpleDateFormat import java.util.Date import java.util.Locale class BackupRestorer( private val context: Context, private val notifier: BackupNotifier, private val isSync: Boolean, private val animeCategoriesRestorer: AnimeCategoriesRestorer = AnimeCategoriesRestorer(), private val mangaCategoriesRestorer: MangaCategoriesRestorer = MangaCategoriesRestorer(), private val preferenceRestorer: PreferenceRestorer = PreferenceRestorer(context), private val animeExtensionRepoRestorer: AnimeExtensionRepoRestorer = AnimeExtensionRepoRestorer(), private val mangaExtensionRepoRestorer: MangaExtensionRepoRestorer = MangaExtensionRepoRestorer(), private val customButtonRestorer: CustomButtonRestorer = CustomButtonRestorer(), private val animeRestorer: AnimeRestorer = AnimeRestorer(), private val mangaRestorer: MangaRestorer = MangaRestorer(), private val extensionsRestorer: ExtensionsRestorer = ExtensionsRestorer(context), ) { private var restoreAmount = 0 private var restoreProgress = 0 private val errors = mutableListOf>() /** * Mapping of source ID to source name from backup data */ private var animeSourceMapping: Map = emptyMap() private var mangaSourceMapping: Map = emptyMap() suspend fun restore(uri: Uri, options: RestoreOptions) { val startTime = System.currentTimeMillis() restoreFromFile(uri, options) val time = System.currentTimeMillis() - startTime val logFile = writeErrorLog() notifier.showRestoreComplete( time, errors.size, logFile.parent, logFile.name, isSync, ) } private suspend fun restoreFromFile(uri: Uri, options: RestoreOptions) { val backup = BackupDecoder(context).decode(uri) // Store source mapping for error messages val backupAnimeMaps = backup.backupAnimeSources mangaSourceMapping = backupAnimeMaps.associate { it.sourceId to it.name } val backupMangaMaps = backup.backupSources mangaSourceMapping = backupMangaMaps.associate { it.sourceId to it.name } if (options.libraryEntries) { restoreAmount += backup.backupManga.size + backup.backupAnime.size } if (options.categories) { restoreAmount += 2 // +2 for anime and manga categories } if (options.appSettings) { restoreAmount += 1 } if (options.extensionRepoSettings) { restoreAmount += backup.backupAnimeExtensionRepo.size + backup.backupMangaExtensionRepo.size } if (options.customButtons) { restoreAmount += 1 } if (options.sourceSettings) { restoreAmount += 1 } if (options.extensions) { restoreAmount += 1 } coroutineScope { if (options.categories) { restoreCategories( backupAnimeCategories = backup.backupAnimeCategories, backupMangaCategories = backup.backupCategories, ) } if (options.appSettings) { restoreAppPreferences(backup.backupPreferences, backup.backupCategories.takeIf { options.categories }) } if (options.sourceSettings) { restoreSourcePreferences(backup.backupSourcePreferences) } if (options.libraryEntries) { restoreAnime(backup.backupAnime, if (options.categories) backup.backupAnimeCategories else emptyList()) restoreManga(backup.backupManga, if (options.categories) backup.backupCategories else emptyList()) } if (options.extensionRepoSettings) { restoreExtensionRepos(backup.backupAnimeExtensionRepo, backup.backupMangaExtensionRepo) } if (options.customButtons) { restoreCustomButtons(backup.backupCustomButton) } if (options.extensions) { restoreExtensions(backup.backupExtensions) } // TODO: optionally trigger online library + tracker update } } private fun CoroutineScope.restoreCategories( backupAnimeCategories: List, backupMangaCategories: List, ) = launch { ensureActive() animeCategoriesRestorer(backupAnimeCategories) mangaCategoriesRestorer(backupMangaCategories) restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(MR.strings.categories), restoreProgress, restoreAmount, isSync, ) } private fun CoroutineScope.restoreAnime( backupAnimes: List, backupAnimeCategories: List, ) = launch { animeRestorer.sortByNew(backupAnimes) .forEach { ensureActive() val seasons = backupAnimes.filter { s -> s.parentId == it.id } try { animeRestorer.restore(it, backupAnimeCategories, seasons) } catch (e: Exception) { val sourceName = animeSourceMapping[it.source] ?: it.source.toString() errors.add(Date() to "${it.title} [$sourceName]: ${e.message}") } restoreProgress += 1 notifier.showRestoreProgress(it.title, restoreProgress, restoreAmount, isSync) } } private fun CoroutineScope.restoreManga( backupMangas: List, backupMangaCategories: List, ) = launch { mangaRestorer.sortByNew(backupMangas) .forEach { ensureActive() try { mangaRestorer.restore(it, backupMangaCategories) } catch (e: Exception) { val sourceName = mangaSourceMapping[it.source] ?: it.source.toString() errors.add(Date() to "${it.title} [$sourceName]: ${e.message}") } restoreProgress += 1 notifier.showRestoreProgress(it.title, restoreProgress, restoreAmount, isSync) } } private fun CoroutineScope.restoreAppPreferences( preferences: List, categories: List?, ) = launch { ensureActive() preferenceRestorer.restoreApp( preferences, categories, ) restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(MR.strings.app_settings), restoreProgress, restoreAmount, isSync, ) } private fun CoroutineScope.restoreSourcePreferences(preferences: List) = launch { ensureActive() preferenceRestorer.restoreSource(preferences) restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(MR.strings.source_settings), restoreProgress, restoreAmount, isSync, ) } private fun CoroutineScope.restoreExtensionRepos( backupAnimeExtensionRepo: List, backupMangaExtensionRepo: List, ) = launch { backupAnimeExtensionRepo .forEach { ensureActive() try { animeExtensionRepoRestorer(it) } catch (e: Exception) { errors.add(Date() to "Error Adding Anime Repo: ${it.name} : ${e.message}") } restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(MR.strings.extensionRepo_settings), restoreProgress, restoreAmount, isSync, ) } backupMangaExtensionRepo .forEach { ensureActive() try { mangaExtensionRepoRestorer(it) } catch (e: Exception) { errors.add(Date() to "Error Adding Manga Repo: ${it.name} : ${e.message}") } restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(MR.strings.extensionRepo_settings), restoreProgress, restoreAmount, isSync, ) } } private fun CoroutineScope.restoreCustomButtons(customButtons: List) = launch { ensureActive() customButtonRestorer(customButtons) restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(AYMR.strings.custom_button_settings), restoreProgress, restoreAmount, isSync, ) } private fun CoroutineScope.restoreExtensions(extensions: List) = launch { ensureActive() extensionsRestorer.restoreExtensions(extensions) restoreProgress += 1 notifier.showRestoreProgress( context.stringResource(MR.strings.source_settings), restoreProgress, restoreAmount, isSync, ) } private fun writeErrorLog(): File { try { if (errors.isNotEmpty()) { val file = context.createFileInCacheDir("aniyomi_restore_error.txt") val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()) file.bufferedWriter().use { out -> errors.forEach { (date, message) -> out.write("[${sdf.format(date)}] $message\n") } } return file } } catch (e: Exception) { // Empty } return File("") } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/RestoreOptions.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR data class RestoreOptions( val libraryEntries: Boolean = true, val categories: Boolean = true, val appSettings: Boolean = true, val extensionRepoSettings: Boolean = true, val customButtons: Boolean = true, val sourceSettings: Boolean = true, val extensions: Boolean = false, ) { fun asBooleanArray() = booleanArrayOf( libraryEntries, categories, appSettings, extensionRepoSettings, customButtons, sourceSettings, extensions, ) fun canRestore() = libraryEntries || categories || appSettings || extensionRepoSettings || customButtons || sourceSettings || extensions companion object { val options = persistentListOf( Entry( label = MR.strings.label_library, getter = RestoreOptions::libraryEntries, setter = { options, enabled -> options.copy(libraryEntries = enabled) }, ), Entry( label = MR.strings.categories, getter = RestoreOptions::categories, setter = { options, enabled -> options.copy(categories = enabled) }, ), Entry( label = MR.strings.app_settings, getter = RestoreOptions::appSettings, setter = { options, enabled -> options.copy(appSettings = enabled) }, ), Entry( label = MR.strings.extensionRepo_settings, getter = RestoreOptions::extensionRepoSettings, setter = { options, enabled -> options.copy(extensionRepoSettings = enabled) }, ), Entry( label = AYMR.strings.custom_button_settings, getter = RestoreOptions::customButtons, setter = { options, enabled -> options.copy(customButtons = enabled) }, ), Entry( label = MR.strings.source_settings, getter = RestoreOptions::sourceSettings, setter = { options, enabled -> options.copy(sourceSettings = enabled) }, ), Entry( label = MR.strings.label_extensions, getter = RestoreOptions::extensions, setter = { options, enabled -> options.copy(extensions = enabled) }, ), ) fun fromBooleanArray(array: BooleanArray) = RestoreOptions( libraryEntries = array[0], categories = array[1], appSettings = array[2], extensionRepoSettings = array[3], customButtons = array[4], sourceSettings = array[5], extensions = array[6], ) } data class Entry( val label: StringResource, val getter: (RestoreOptions) -> Boolean, val setter: (RestoreOptions, Boolean) -> RestoreOptions, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeCategoriesRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.tachiyomi.data.backup.models.BackupCategory import tachiyomi.data.handlers.anime.AnimeDatabaseHandler import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.library.service.LibraryPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeCategoriesRestorer( private val animeHandler: AnimeDatabaseHandler = Injekt.get(), private val getAnimeCategories: GetAnimeCategories = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), ) { suspend operator fun invoke(backupCategories: List) { if (backupCategories.isNotEmpty()) { val dbCategories = getAnimeCategories.await() val dbCategoriesByName = dbCategories.associateBy { it.name } var nextOrder = dbCategories.maxOfOrNull { it.order }?.plus(1) ?: 0 val categories = backupCategories .sortedBy { it.order } .map { val dbCategory = dbCategoriesByName[it.name] if (dbCategory != null) return@map dbCategory val order = nextOrder++ animeHandler.awaitOneExecutable { categoriesQueries.insert(it.name, order, it.flags) categoriesQueries.selectLastInsertedRowId() } .let { id -> it.toCategory(id).copy(order = order) } } libraryPreferences.categorizedDisplaySettings().set( (dbCategories + categories) .distinctBy { it.flags } .size > 1, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeExtensionRepoRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo import tachiyomi.data.handlers.anime.AnimeDatabaseHandler import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeExtensionRepoRestorer( private val animeHandler: AnimeDatabaseHandler = Injekt.get(), private val getExtensionRepos: GetAnimeExtensionRepo = Injekt.get(), ) { suspend operator fun invoke( backupRepo: BackupExtensionRepos, ) { val dbRepos = getExtensionRepos.getAll() val existingReposBySHA = dbRepos.associateBy { it.signingKeyFingerprint } val existingReposByUrl = dbRepos.associateBy { it.baseUrl } val urlExists = existingReposByUrl[backupRepo.baseUrl] val shaExists = existingReposBySHA[backupRepo.signingKeyFingerprint] if (urlExists != null && urlExists.signingKeyFingerprint != backupRepo.signingKeyFingerprint) { error("Already Exists with different signing key fingerprint") } else if (shaExists != null) { error("${shaExists.name} has the same signing key fingerprint") } else { animeHandler.await { extension_reposQueries.insert( backupRepo.baseUrl, backupRepo.name, backupRepo.shortName, backupRepo.website, backupRepo.signingKeyFingerprint, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnime import eu.kanade.tachiyomi.data.backup.models.BackupAnimeHistory import eu.kanade.tachiyomi.data.backup.models.BackupAnimeTracking import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupEpisode import tachiyomi.data.AnimeUpdateStrategyColumnAdapter import tachiyomi.data.FetchTypeColumnAdapter import tachiyomi.data.handlers.anime.AnimeDatabaseHandler import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.entries.anime.interactor.AnimeFetchInterval import tachiyomi.domain.entries.anime.interactor.GetAnimeByUrlAndSourceId import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import tachiyomi.domain.track.anime.model.AnimeTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.ZonedDateTime import java.util.Date import kotlin.math.max class AnimeRestorer( private val handler: AnimeDatabaseHandler = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val getAnimeByUrlAndSourceId: GetAnimeByUrlAndSourceId = Injekt.get(), private val getEpisodesByAnimeId: GetEpisodesByAnimeId = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), private val getTracks: GetAnimeTracks = Injekt.get(), private val insertTrack: InsertAnimeTrack = Injekt.get(), fetchInterval: AnimeFetchInterval = Injekt.get(), ) { private var now = ZonedDateTime.now() private var currentFetchWindow = fetchInterval.getWindow(now) init { now = ZonedDateTime.now() currentFetchWindow = fetchInterval.getWindow(now) } suspend fun sortByNew(backupAnimes: List): List { val urlsBySource = handler.awaitList { animesQueries.getAllAnimeSourceAndUrl() } .groupBy({ it.source }, { it.url }) return backupAnimes .sortedWith( compareBy { it.url in urlsBySource[it.source].orEmpty() } .then(compareByDescending { it.lastModifiedAt }), ) } suspend fun restore( backupAnime: BackupAnime, backupCategories: List, backupSeasons: List, ) { handler.await(inTransaction = true) { val dbAnime = findExistingAnime(backupAnime) val anime = backupAnime.getAnimeImpl() val restoredAnime = if (dbAnime == null) { restoreNewAnime(anime) } else { restoreExistingAnime(anime, dbAnime) } backupSeasons.forEach { bs -> val dbAnime = findExistingAnime(bs) val anime = bs.getAnimeImpl().copy( parentId = restoredAnime.id, ) if (dbAnime == null) { restoreNewAnime(anime) } else { restoreExistingAnime(anime, dbAnime) } } restoreAnimeDetails( anime = restoredAnime, episodes = backupAnime.episodes, categories = backupAnime.categories, backupCategories = backupCategories, history = backupAnime.history, tracks = backupAnime.tracking, ) } } private suspend fun findExistingAnime(backupAnime: BackupAnime): Anime? { return getAnimeByUrlAndSourceId.await(backupAnime.url, backupAnime.source) } private suspend fun restoreExistingAnime(anime: Anime, dbAnime: Anime): Anime { return if (anime.version > dbAnime.version) { updateAnime(dbAnime.copyFrom(anime).copy(id = dbAnime.id, parentId = anime.parentId)) } else { updateAnime(anime.copyFrom(dbAnime).copy(id = dbAnime.id, parentId = anime.parentId)) } } private fun Anime.copyFrom(newer: Anime): Anime { return this.copy( favorite = this.favorite || newer.favorite, author = newer.author, artist = newer.artist, description = newer.description, genre = newer.genre, thumbnailUrl = newer.thumbnailUrl, status = newer.status, initialized = this.initialized || newer.initialized, version = newer.version, fetchType = newer.fetchType, parentId = newer.parentId, ) } private suspend fun updateAnime(anime: Anime): Anime { handler.await(true) { animesQueries.update( source = anime.source, url = anime.url, artist = anime.artist, author = anime.author, description = anime.description, genre = anime.genre?.joinToString(separator = ", "), title = anime.title, status = anime.status, thumbnailUrl = anime.thumbnailUrl, favorite = anime.favorite, lastUpdate = anime.lastUpdate, nextUpdate = null, calculateInterval = null, initialized = anime.initialized, viewer = anime.viewerFlags, episodeFlags = anime.episodeFlags, coverLastModified = anime.coverLastModified, dateAdded = anime.dateAdded, animeId = anime.id, updateStrategy = anime.updateStrategy.let(AnimeUpdateStrategyColumnAdapter::encode), version = anime.version, isSyncing = 1, fetchType = anime.fetchType.let(FetchTypeColumnAdapter::encode), parentId = anime.parentId, seasonFlags = anime.seasonFlags, seasonNumber = anime.seasonNumber, seasonSourceOrder = anime.seasonSourceOrder, backgroundUrl = anime.backgroundUrl, backgroundLastModified = anime.backgroundLastModified, ) } return anime } private suspend fun restoreNewAnime( anime: Anime, ): Anime { return anime.copy( initialized = anime.description != null, id = insertAnime(anime), version = anime.version, ) } private suspend fun restoreEpisodes(anime: Anime, backupEpisodes: List) { val dbEpisodesByUrl = getEpisodesByAnimeId.await(anime.id) .associateBy { it.url } val (existingEpisodes, newEpisodes) = backupEpisodes .mapNotNull { val episode = it.toEpisodeImpl().copy(animeId = anime.id) val dbEpisode = dbEpisodesByUrl[episode.url] ?: // New episode return@mapNotNull episode if (episode.forComparison() == dbEpisode.forComparison()) { // Same state; skip return@mapNotNull null } // Update to an existing episode var updatedEpisode = episode .copyFrom(dbEpisode) .copy( id = dbEpisode.id, bookmark = episode.bookmark || dbEpisode.bookmark, fillermark = episode.fillermark || dbEpisode.fillermark, ) if (dbEpisode.seen && !updatedEpisode.seen) { updatedEpisode = updatedEpisode.copy( seen = true, lastSecondSeen = dbEpisode.lastSecondSeen, ) } else if (updatedEpisode.lastSecondSeen == 0L && dbEpisode.lastSecondSeen != 0L) { updatedEpisode = updatedEpisode.copy( lastSecondSeen = dbEpisode.lastSecondSeen, ) } updatedEpisode } .partition { it.id > 0 } insertNewEpisodes(newEpisodes) updateExistingEpisodes(existingEpisodes) } private fun Episode.forComparison() = this.copy(id = 0L, animeId = 0L, dateFetch = 0L, dateUpload = 0L, lastModifiedAt = 0L, version = 0L) private suspend fun insertNewEpisodes(episodes: List) { handler.await(true) { episodes.forEach { episode -> episodesQueries.insert( episode.animeId, episode.url, episode.name, episode.scanlator, episode.seen, episode.bookmark, episode.lastSecondSeen, episode.totalSeconds, episode.episodeNumber, episode.sourceOrder, episode.dateFetch, episode.dateUpload, episode.version, episode.summary, episode.previewUrl, episode.fillermark, ) } } } private suspend fun updateExistingEpisodes(episodes: List) { handler.await(true) { episodes.forEach { episode -> episodesQueries.update( animeId = null, url = null, name = null, scanlator = null, summary = null, previewUrl = null, seen = episode.seen, bookmark = episode.bookmark, fillermark = episode.fillermark, lastSecondSeen = episode.lastSecondSeen, totalSeconds = episode.totalSeconds, episodeNumber = null, sourceOrder = null, dateFetch = null, dateUpload = null, episodeId = episode.id, version = episode.version, isSyncing = 0, ) } } } /** * Inserts anime and returns id * * @return id of [Anime], null if not found */ private suspend fun insertAnime(anime: Anime): Long { return handler.awaitOneExecutable(true) { animesQueries.insert( source = anime.source, url = anime.url, artist = anime.artist, author = anime.author, description = anime.description, genre = anime.genre, title = anime.title, status = anime.status, thumbnailUrl = anime.thumbnailUrl, favorite = anime.favorite, lastUpdate = anime.lastUpdate, nextUpdate = 0L, calculateInterval = 0L, initialized = anime.initialized, viewerFlags = anime.viewerFlags, episodeFlags = anime.episodeFlags, coverLastModified = anime.coverLastModified, dateAdded = anime.dateAdded, updateStrategy = anime.updateStrategy, version = anime.version, fetchType = anime.fetchType, parentId = anime.parentId, seasonFlags = anime.seasonFlags, seasonNumber = anime.seasonNumber, seasonSourceOrder = anime.seasonSourceOrder, backgroundUrl = anime.backgroundUrl, backgroundLastModified = anime.backgroundLastModified, ) animesQueries.selectLastInsertedRowId() } } private suspend fun restoreAnimeDetails( anime: Anime, episodes: List, categories: List, backupCategories: List, history: List, tracks: List, ): Anime { restoreCategories(anime, categories, backupCategories) restoreEpisodes(anime, episodes) restoreTracking(anime, tracks) restoreHistory(history) updateAnime.awaitUpdateFetchInterval(anime, now, currentFetchWindow) return anime } /** * Restores the categories a anime is in. * * @param anime the anime whose categories have to be restored. * @param categories the categories to restore. */ private suspend fun restoreCategories( anime: Anime, categories: List, backupCategories: List, ) { val dbCategories = getCategories.await() val dbCategoriesByName = dbCategories.associateBy { it.name } val backupCategoriesByOrder = backupCategories.associateBy { it.order } val animeCategoriesToUpdate = categories.mapNotNull { backupCategoryOrder -> backupCategoriesByOrder[backupCategoryOrder]?.let { backupCategory -> dbCategoriesByName[backupCategory.name]?.let { dbCategory -> Pair(anime.id, dbCategory.id) } } } if (animeCategoriesToUpdate.isNotEmpty()) { handler.await(true) { animes_categoriesQueries.deleteAnimeCategoryByAnimeId(anime.id) animeCategoriesToUpdate.forEach { (animeId, categoryId) -> animes_categoriesQueries.insert(animeId, categoryId) } } } } private suspend fun restoreHistory(backupHistory: List) { val toUpdate = backupHistory.mapNotNull { history -> val dbHistory = handler.awaitOneOrNull { animehistoryQueries.getHistoryByEpisodeUrl(history.url) } val item = history.getHistoryImpl() if (dbHistory == null) { val episode = handler.awaitOneOrNull { episodesQueries.getEpisodeByUrl(history.url) } return@mapNotNull if (episode == null) { // Episode doesn't exist; skip null } else { // New history entry item.copy(episodeId = episode._id) } } // Update history entry item.copy( id = dbHistory._id, episodeId = dbHistory.episode_id, seenAt = max(item.seenAt?.time ?: 0L, dbHistory.last_seen?.time ?: 0L) .takeIf { it > 0L } ?.let { Date(it) }, ) } if (toUpdate.isNotEmpty()) { handler.await(true) { toUpdate.forEach { animehistoryQueries.upsert( it.episodeId, it.seenAt, ) } } } } private suspend fun restoreTracking(anime: Anime, backupTracks: List) { val dbTrackByTrackerId = getTracks.await(anime.id).associateBy { it.trackerId } val (existingTracks, newTracks) = backupTracks .mapNotNull { val track = it.getTrackImpl() val dbTrack = dbTrackByTrackerId[track.trackerId] ?: // New track return@mapNotNull track.copy( id = 0, // Let DB assign new ID animeId = anime.id, ) if (track.forComparison() == dbTrack.forComparison()) { // Same state; skip return@mapNotNull null } // Update to an existing track dbTrack.copy( remoteId = track.remoteId, libraryId = track.libraryId, lastEpisodeSeen = max(dbTrack.lastEpisodeSeen, track.lastEpisodeSeen), ) } .partition { it.id > 0 } if (newTracks.isNotEmpty()) { insertTrack.awaitAll(newTracks) } if (existingTracks.isNotEmpty()) { handler.await(true) { existingTracks.forEach { track -> anime_syncQueries.update( track.animeId, track.trackerId, track.remoteId, track.libraryId, track.title, track.lastEpisodeSeen, track.totalEpisodes, track.status, track.score, track.remoteUrl, track.startDate, track.finishDate, track.private, track.id, ) } } } } private fun AnimeTrack.forComparison() = this.copy(id = 0L, animeId = 0L) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/CustomButtonRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.tachiyomi.data.backup.models.BackupCustomButtons import tachiyomi.data.handlers.anime.AnimeDatabaseHandler import tachiyomi.domain.custombuttons.interactor.GetCustomButtons import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class CustomButtonRestorer( private val handler: AnimeDatabaseHandler = Injekt.get(), private val getCustomButtons: GetCustomButtons = Injekt.get(), ) { suspend operator fun invoke( backupCustomButtons: List, ) { if (backupCustomButtons.isNotEmpty()) { val dbCustomButtons = getCustomButtons.getAll() val dbCustomButtonsByName = dbCustomButtons.associateBy { it.name } var nextSortIndex = dbCustomButtons.maxOfOrNull { it.sortIndex }?.plus(1) ?: 0 val dbHasFavorite = dbCustomButtons.firstOrNull { it.isFavorite } != null backupCustomButtons .sortedBy { it.sortIndex } .map { val dbCustomButton = dbCustomButtonsByName[it.name] if (dbCustomButton != null) return@map dbCustomButton val sortIndex = nextSortIndex++ handler.awaitOneExecutable { val isFavorite = it.isFavorite && !dbHasFavorite custom_buttonsQueries.insert( it.name, isFavorite, sortIndex, it.content, it.longPressContent, it.onStartup, ) custom_buttonsQueries.selectLastInsertedRowId() } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/ExtensionsRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import android.content.Context import android.content.Intent import eu.kanade.tachiyomi.data.backup.models.BackupExtension import eu.kanade.tachiyomi.util.storage.getUriCompat import uy.kohesive.injekt.api.get import java.io.File class ExtensionsRestorer( private val context: Context, ) { fun restoreExtensions(extensions: List) { extensions.forEach { if (context.packageManager.getInstalledPackages(0).none { pkg -> pkg.packageName == it.pkgName }) { // save apk in files dir and open installer dialog val file = File(context.cacheDir, "${it.pkgName}.apk") file.writeBytes(it.apk) val intent = Intent(Intent.ACTION_VIEW) .setDataAndType( file.getUriCompat(context), "application/vnd.android.package-archive", ) .setFlags( Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION, ) context.startActivity(intent) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaCategoriesRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.tachiyomi.data.backup.models.BackupCategory import tachiyomi.data.handlers.manga.MangaDatabaseHandler import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.library.service.LibraryPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaCategoriesRestorer( private val mangaHandler: MangaDatabaseHandler = Injekt.get(), private val getMangaCategories: GetMangaCategories = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), ) { suspend operator fun invoke(backupCategories: List) { if (backupCategories.isNotEmpty()) { val dbCategories = getMangaCategories.await() val dbCategoriesByName = dbCategories.associateBy { it.name } var nextOrder = dbCategories.maxOfOrNull { it.order }?.plus(1) ?: 0 val categories = backupCategories .sortedBy { it.order } .map { val dbCategory = dbCategoriesByName[it.name] if (dbCategory != null) return@map dbCategory val order = nextOrder++ mangaHandler.awaitOneExecutable { categoriesQueries.insert(it.name, order, it.flags) categoriesQueries.selectLastInsertedRowId() } .let { id -> it.toCategory(id).copy(order = order) } } libraryPreferences.categorizedDisplaySettings().set( (dbCategories + categories) .distinctBy { it.flags } .size > 1, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaExtensionRepoRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.tachiyomi.data.backup.models.BackupExtensionRepos import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo import tachiyomi.data.handlers.manga.MangaDatabaseHandler import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaExtensionRepoRestorer( private val mangaHandler: MangaDatabaseHandler = Injekt.get(), private val getExtensionRepos: GetMangaExtensionRepo = Injekt.get(), ) { suspend operator fun invoke( backupRepo: BackupExtensionRepos, ) { val dbRepos = getExtensionRepos.getAll() val existingReposBySHA = dbRepos.associateBy { it.signingKeyFingerprint } val existingReposByUrl = dbRepos.associateBy { it.baseUrl } val urlExists = existingReposByUrl[backupRepo.baseUrl] val shaExists = existingReposBySHA[backupRepo.signingKeyFingerprint] if (urlExists != null && urlExists.signingKeyFingerprint != backupRepo.signingKeyFingerprint) { error("Already Exists with different signing key fingerprint") } else if (shaExists != null) { error("${shaExists.name} has the same signing key fingerprint") } else { mangaHandler.await { extension_reposQueries.insert( backupRepo.baseUrl, backupRepo.name, backupRepo.shortName, backupRepo.website, backupRepo.signingKeyFingerprint, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupChapter import eu.kanade.tachiyomi.data.backup.models.BackupHistory import eu.kanade.tachiyomi.data.backup.models.BackupManga import eu.kanade.tachiyomi.data.backup.models.BackupTracking import tachiyomi.data.MangaUpdateStrategyColumnAdapter import tachiyomi.data.handlers.manga.MangaDatabaseHandler import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.entries.manga.interactor.GetMangaByUrlAndSourceId import tachiyomi.domain.entries.manga.interactor.MangaFetchInterval import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.domain.track.manga.interactor.InsertMangaTrack import tachiyomi.domain.track.manga.model.MangaTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.ZonedDateTime import java.util.Date import kotlin.math.max class MangaRestorer( private val handler: MangaDatabaseHandler = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val getMangaByUrlAndSourceId: GetMangaByUrlAndSourceId = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), private val getTracks: GetMangaTracks = Injekt.get(), private val insertTrack: InsertMangaTrack = Injekt.get(), fetchInterval: MangaFetchInterval = Injekt.get(), ) { private var now = ZonedDateTime.now() private var currentFetchWindow = fetchInterval.getWindow(now) init { now = ZonedDateTime.now() currentFetchWindow = fetchInterval.getWindow(now) } suspend fun sortByNew(backupMangas: List): List { val urlsBySource = handler.awaitList { mangasQueries.getAllMangaSourceAndUrl() } .groupBy({ it.source }, { it.url }) return backupMangas .sortedWith( compareBy { it.url in urlsBySource[it.source].orEmpty() } .then(compareByDescending { it.lastModifiedAt }), ) } suspend fun restore( backupManga: BackupManga, backupCategories: List, ) { handler.await(inTransaction = true) { val dbManga = findExistingManga(backupManga) val manga = backupManga.getMangaImpl() val restoredManga = if (dbManga == null) { restoreNewManga(manga) } else { restoreExistingManga(manga, dbManga) } restoreMangaDetails( manga = restoredManga, chapters = backupManga.chapters, categories = backupManga.categories, backupCategories = backupCategories, history = backupManga.history, tracks = backupManga.tracking, excludedScanlators = backupManga.excludedScanlators, ) } } private suspend fun findExistingManga(backupManga: BackupManga): Manga? { return getMangaByUrlAndSourceId.await(backupManga.url, backupManga.source) } private suspend fun restoreExistingManga(manga: Manga, dbManga: Manga): Manga { return if (manga.version > dbManga.version) { updateManga(dbManga.copyFrom(manga).copy(id = dbManga.id)) } else { updateManga(manga.copyFrom(dbManga).copy(id = dbManga.id)) } } private fun Manga.copyFrom(newer: Manga): Manga { return this.copy( favorite = this.favorite || newer.favorite, author = newer.author, artist = newer.artist, description = newer.description, genre = newer.genre, thumbnailUrl = newer.thumbnailUrl, status = newer.status, initialized = this.initialized || newer.initialized, version = newer.version, ) } private suspend fun updateManga(manga: Manga): Manga { handler.await(true) { mangasQueries.update( source = manga.source, url = manga.url, artist = manga.artist, author = manga.author, description = manga.description, genre = manga.genre?.joinToString(separator = ", "), title = manga.title, status = manga.status, thumbnailUrl = manga.thumbnailUrl, favorite = manga.favorite, lastUpdate = manga.lastUpdate, nextUpdate = null, calculateInterval = null, initialized = manga.initialized, viewer = manga.viewerFlags, chapterFlags = manga.chapterFlags, coverLastModified = manga.coverLastModified, dateAdded = manga.dateAdded, mangaId = manga.id, updateStrategy = manga.updateStrategy.let(MangaUpdateStrategyColumnAdapter::encode), version = manga.version, isSyncing = 1, ) } return manga } private suspend fun restoreNewManga( manga: Manga, ): Manga { return manga.copy( initialized = manga.description != null, id = insertManga(manga), version = manga.version, ) } private suspend fun restoreChapters(manga: Manga, backupChapters: List) { val dbChaptersByUrl = getChaptersByMangaId.await(manga.id) .associateBy { it.url } val (existingChapters, newChapters) = backupChapters .mapNotNull { val chapter = it.toChapterImpl().copy(mangaId = manga.id) val dbChapter = dbChaptersByUrl[chapter.url] ?: // New chapter return@mapNotNull chapter if (chapter.forComparison() == dbChapter.forComparison()) { // Same state; skip return@mapNotNull null } // Update to an existing chapter var updatedChapter = chapter .copyFrom(dbChapter) .copy( id = dbChapter.id, bookmark = chapter.bookmark || dbChapter.bookmark, ) if (dbChapter.read && !updatedChapter.read) { updatedChapter = updatedChapter.copy( read = true, lastPageRead = dbChapter.lastPageRead, ) } else if (updatedChapter.lastPageRead == 0L && dbChapter.lastPageRead != 0L) { updatedChapter = updatedChapter.copy( lastPageRead = dbChapter.lastPageRead, ) } updatedChapter } .partition { it.id > 0 } insertNewChapters(newChapters) updateExistingChapters(existingChapters) } private fun Chapter.forComparison() = this.copy(id = 0L, mangaId = 0L, dateFetch = 0L, dateUpload = 0L, lastModifiedAt = 0L, version = 0L) private suspend fun insertNewChapters(chapters: List) { handler.await(true) { chapters.forEach { chapter -> chaptersQueries.insert( chapter.mangaId, chapter.url, chapter.name, chapter.scanlator, chapter.read, chapter.bookmark, chapter.lastPageRead, chapter.chapterNumber, chapter.sourceOrder, chapter.dateFetch, chapter.dateUpload, chapter.version, ) } } } private suspend fun updateExistingChapters(chapters: List) { handler.await(true) { chapters.forEach { chapter -> chaptersQueries.update( mangaId = null, url = null, name = null, scanlator = null, read = chapter.read, bookmark = chapter.bookmark, lastPageRead = chapter.lastPageRead, chapterNumber = null, sourceOrder = null, dateFetch = null, dateUpload = null, chapterId = chapter.id, version = chapter.version, isSyncing = 0, ) } } } /** * Inserts manga and returns id * * @return id of [Manga], null if not found */ private suspend fun insertManga(manga: Manga): Long { return handler.awaitOneExecutable(true) { mangasQueries.insert( source = manga.source, url = manga.url, artist = manga.artist, author = manga.author, description = manga.description, genre = manga.genre, title = manga.title, status = manga.status, thumbnailUrl = manga.thumbnailUrl, favorite = manga.favorite, lastUpdate = manga.lastUpdate, nextUpdate = 0L, calculateInterval = 0L, initialized = manga.initialized, viewerFlags = manga.viewerFlags, chapterFlags = manga.chapterFlags, coverLastModified = manga.coverLastModified, dateAdded = manga.dateAdded, updateStrategy = manga.updateStrategy, version = manga.version, ) mangasQueries.selectLastInsertedRowId() } } private suspend fun restoreMangaDetails( manga: Manga, chapters: List, categories: List, backupCategories: List, history: List, tracks: List, excludedScanlators: List, ): Manga { restoreCategories(manga, categories, backupCategories) restoreChapters(manga, chapters) restoreTracking(manga, tracks) restoreHistory(history) restoreExcludedScanlators(manga, excludedScanlators) updateManga.awaitUpdateFetchInterval(manga, now, currentFetchWindow) return manga } /** * Restores the categories a manga is in. * * @param manga the manga whose categories have to be restored. * @param categories the categories to restore. */ private suspend fun restoreCategories( manga: Manga, categories: List, backupCategories: List, ) { val dbCategories = getCategories.await() val dbCategoriesByName = dbCategories.associateBy { it.name } val backupCategoriesByOrder = backupCategories.associateBy { it.order } val mangaCategoriesToUpdate = categories.mapNotNull { backupCategoryOrder -> backupCategoriesByOrder[backupCategoryOrder]?.let { backupCategory -> dbCategoriesByName[backupCategory.name]?.let { dbCategory -> Pair(manga.id, dbCategory.id) } } } if (mangaCategoriesToUpdate.isNotEmpty()) { handler.await(true) { mangas_categoriesQueries.deleteMangaCategoryByMangaId(manga.id) mangaCategoriesToUpdate.forEach { (mangaId, categoryId) -> mangas_categoriesQueries.insert(mangaId, categoryId) } } } } private suspend fun restoreHistory(backupHistory: List) { val toUpdate = backupHistory.mapNotNull { history -> val dbHistory = handler.awaitOneOrNull { historyQueries.getHistoryByChapterUrl(history.url) } val item = history.getHistoryImpl() if (dbHistory == null) { val chapter = handler.awaitOneOrNull { chaptersQueries.getChapterByUrl(history.url) } return@mapNotNull if (chapter == null) { // Chapter doesn't exist; skip null } else { // New history entry item.copy(chapterId = chapter._id) } } // Update history entry item.copy( id = dbHistory._id, chapterId = dbHistory.chapter_id, readAt = max(item.readAt?.time ?: 0L, dbHistory.last_read?.time ?: 0L) .takeIf { it > 0L } ?.let { Date(it) }, readDuration = max(item.readDuration, dbHistory.time_read) - dbHistory.time_read, ) } if (toUpdate.isNotEmpty()) { handler.await(true) { toUpdate.forEach { historyQueries.upsert( it.chapterId, it.readAt, it.readDuration, ) } } } } private suspend fun restoreTracking(manga: Manga, backupTracks: List) { val dbTrackByTrackerId = getTracks.await(manga.id).associateBy { it.trackerId } val (existingTracks, newTracks) = backupTracks .mapNotNull { val track = it.getTrackImpl() val dbTrack = dbTrackByTrackerId[track.trackerId] ?: // New track return@mapNotNull track.copy( id = 0, // Let DB assign new ID mangaId = manga.id, ) if (track.forComparison() == dbTrack.forComparison()) { // Same state; skip return@mapNotNull null } // Update to an existing track dbTrack.copy( remoteId = track.remoteId, libraryId = track.libraryId, lastChapterRead = max(dbTrack.lastChapterRead, track.lastChapterRead), ) } .partition { it.id > 0 } if (newTracks.isNotEmpty()) { insertTrack.awaitAll(newTracks) } if (existingTracks.isNotEmpty()) { handler.await(true) { existingTracks.forEach { track -> manga_syncQueries.update( track.mangaId, track.trackerId, track.remoteId, track.libraryId, track.title, track.lastChapterRead, track.totalChapters, track.status, track.score, track.remoteUrl, track.startDate, track.finishDate, track.private, track.id, ) } } } } private fun MangaTrack.forComparison() = this.copy(id = 0L, mangaId = 0L) /** * Restores the excluded scanlators for the manga. * * @param manga the manga whose excluded scanlators have to be restored. * @param excludedScanlators the excluded scanlators to restore. */ private suspend fun restoreExcludedScanlators(manga: Manga, excludedScanlators: List) { if (excludedScanlators.isEmpty()) return val existingExcludedScanlators = handler.awaitList { excluded_scanlatorsQueries.getExcludedScanlatorsByMangaId(manga.id) } val toInsert = excludedScanlators.filter { it !in existingExcludedScanlators } if (toInsert.isNotEmpty()) { handler.await { toInsert.forEach { excluded_scanlatorsQueries.insert(manga.id, it) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/PreferenceRestorer.kt ================================================ package eu.kanade.tachiyomi.data.backup.restore.restorers import android.content.Context import android.util.Log import eu.kanade.tachiyomi.data.backup.create.BackupCreateJob import eu.kanade.tachiyomi.data.backup.models.BackupCategory import eu.kanade.tachiyomi.data.backup.models.BackupPreference import eu.kanade.tachiyomi.data.backup.models.BackupSourcePreferences import eu.kanade.tachiyomi.data.backup.models.BooleanPreferenceValue import eu.kanade.tachiyomi.data.backup.models.FloatPreferenceValue import eu.kanade.tachiyomi.data.backup.models.IntPreferenceValue import eu.kanade.tachiyomi.data.backup.models.LongPreferenceValue import eu.kanade.tachiyomi.data.backup.models.StringPreferenceValue import eu.kanade.tachiyomi.data.backup.models.StringSetPreferenceValue import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateJob import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateJob import eu.kanade.tachiyomi.source.sourcePreferences import tachiyomi.core.common.preference.AndroidPreferenceStore import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.preference.plusAssign import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.library.service.LibraryPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class PreferenceRestorer( private val context: Context, private val getMangaCategories: GetMangaCategories = Injekt.get(), private val getAnimeCategories: GetAnimeCategories = Injekt.get(), private val preferenceStore: PreferenceStore = Injekt.get(), ) { suspend fun restoreApp( preferences: List, backupCategories: List?, ) { restorePreferences( preferences, preferenceStore, backupCategories, ) AnimeLibraryUpdateJob.setupTask(context) MangaLibraryUpdateJob.setupTask(context) BackupCreateJob.setupTask(context) } suspend fun restoreSource(preferences: List) { preferences.forEach { val sourcePrefs = AndroidPreferenceStore(context, sourcePreferences(it.sourceKey)) restorePreferences(it.prefs, sourcePrefs) } } private suspend fun restorePreferences( toRestore: List, preferenceStore: PreferenceStore, backupCategories: List? = null, ) { val allMangaCategories = if (backupCategories != null) getMangaCategories.await() else emptyList() val allAnimeCategories = if (backupCategories != null) getAnimeCategories.await() else emptyList() val mangaCategoriesByName = allMangaCategories.associateBy { it.name } val animeCategoriesByName = allAnimeCategories.associateBy { it.name } val backupCategoriesById = backupCategories?.associateBy { it.id.toString() }.orEmpty() val prefs = preferenceStore.getAll() toRestore.forEach { (key, value) -> try { when (value) { is IntPreferenceValue -> { if (prefs[key] is Int?) { val newValue = if (key == LibraryPreferences.DEFAULT_MANGA_CATEGORY_PREF_KEY) { backupCategoriesById[value.value.toString()] ?.let { mangaCategoriesByName[it.name]?.id?.toInt() } } else if (key == LibraryPreferences.DEFAULT_ANIME_CATEGORY_PREF_KEY) { backupCategoriesById[value.value.toString()] ?.let { animeCategoriesByName[it.name]?.id?.toInt() } } else { value.value } newValue?.let { preferenceStore.getInt(key).set(it) } } } is LongPreferenceValue -> { if (prefs[key] is Long?) { preferenceStore.getLong(key).set(value.value) } } is FloatPreferenceValue -> { if (prefs[key] is Float?) { preferenceStore.getFloat(key).set(value.value) } } is StringPreferenceValue -> { if (prefs[key] is String?) { preferenceStore.getString(key).set(value.value) } } is BooleanPreferenceValue -> { if (prefs[key] is Boolean?) { preferenceStore.getBoolean(key).set(value.value) } } is StringSetPreferenceValue -> { if (prefs[key] is Set<*>?) { val restored = restoreCategoriesPreference( key, value.value, preferenceStore, backupCategoriesById, mangaCategoriesByName, animeCategoriesByName, ) if (!restored) preferenceStore.getStringSet(key).set(value.value) } } } } catch (e: Exception) { Log.e("PreferenceRestorer", "Failed to restore preference <$key>", e) } } } private fun restoreCategoriesPreference( key: String, value: Set, preferenceStore: PreferenceStore, backupCategoriesById: Map, mangaCategoriesByName: Map, animeCategoriesByName: Map, ): Boolean { val categoryPreferences = LibraryPreferences.categoryPreferenceKeys + DownloadPreferences.categoryPreferenceKeys if (key !in categoryPreferences) return false val ids = value.flatMap { listOf( backupCategoriesById[it]?.name?.let { name -> mangaCategoriesByName[name]?.id?.toString() }, backupCategoriesById[it]?.name?.let { name -> animeCategoriesByName[name]?.id?.toString() }, ) }.filterNotNull() if (ids.isNotEmpty()) { preferenceStore.getStringSet(key) += ids } return true } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/cache/AnimeBackgroundCache.kt ================================================ package eu.kanade.tachiyomi.data.cache import android.content.Context import eu.kanade.tachiyomi.util.storage.DiskUtil import tachiyomi.domain.entries.anime.model.Anime import java.io.File import java.io.IOException import java.io.InputStream /** * Class used to create background cache. * It is used to store the background of the library. * Names of files are created with the md5 of the background URL. * * @param context the application context. * @constructor creates an instance of the background cache. */ class AnimeBackgroundCache(private val context: Context) { companion object { private const val BACKGROUNDS_DIR = "animebackgrounds" private const val CUSTOM_BACKGROUNDS_DIR = "animebackgrounds/custom" } /** * Cache directory used for cache management. */ private val cacheDir = getCacheDir(BACKGROUNDS_DIR) private val customBackgroundCacheDir = getCacheDir(CUSTOM_BACKGROUNDS_DIR) /** * Returns the background from cache. * * @param animeBackgroundUrl the anime. * @return background image. */ fun getBackgroundFile(animeBackgroundUrl: String?): File? { return animeBackgroundUrl?.let { File(cacheDir, DiskUtil.hashKeyForDisk(it)) } } /** * Returns the custom background from cache. * * @param animeId the anime id. * @return background image. */ fun getCustomBackgroundFile(animeId: Long?): File { return File(customBackgroundCacheDir, DiskUtil.hashKeyForDisk(animeId.toString())) } /** * Saves the given stream as the anime's custom background to cache. * * @param anime the anime. * @param inputStream the stream to copy. * @throws IOException if there's any error. */ @Throws(IOException::class) fun setCustomBackgroundToCache(anime: Anime, inputStream: InputStream) { getCustomBackgroundFile(anime.id).outputStream().use { inputStream.copyTo(it) } } /** * Delete the background files of the anime from the cache. * * @param anime the anime. * @param deleteCustomBackground whether the custom background should be deleted. * @return number of files that were deleted. */ fun deleteFromCache(anime: Anime, deleteCustomBackground: Boolean = false): Int { var deleted = 0 getBackgroundFile(anime.backgroundUrl)?.let { if (it.exists() && it.delete()) ++deleted } if (deleteCustomBackground) { if (deleteCustomBackground(anime.id)) ++deleted } return deleted } /** * Delete custom background of the anime from the cache * * @param animeId the anime id. * @return whether the background was deleted. */ fun deleteCustomBackground(animeId: Long?): Boolean { return getCustomBackgroundFile(animeId).let { it.exists() && it.delete() } } private fun getCacheDir(dir: String): File { return context.getExternalFilesDir(dir) ?: File(context.filesDir, dir).also { it.mkdirs() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/cache/AnimeCoverCache.kt ================================================ package eu.kanade.tachiyomi.data.cache import android.content.Context import eu.kanade.tachiyomi.util.storage.DiskUtil import tachiyomi.domain.entries.anime.model.Anime import java.io.File import java.io.IOException import java.io.InputStream /** * Class used to create cover cache. * It is used to store the covers of the library. * Names of files are created with the md5 of the thumbnail URL. * * @param context the application context. * @constructor creates an instance of the cover cache. */ class AnimeCoverCache(private val context: Context) { companion object { private const val COVERS_DIR = "animecovers" private const val CUSTOM_COVERS_DIR = "animecovers/custom" } /** * Cache directory used for cache management. */ private val cacheDir = getCacheDir(COVERS_DIR) private val customCoverCacheDir = getCacheDir(CUSTOM_COVERS_DIR) /** * Returns the cover from cache. * * @param animeThumbnailUrl the anime. * @return cover image. */ fun getCoverFile(animeThumbnailUrl: String?): File? { return animeThumbnailUrl?.let { File(cacheDir, DiskUtil.hashKeyForDisk(it)) } } /** * Returns the custom cover from cache. * * @param animeId the anime id. * @return cover image. */ fun getCustomCoverFile(animeId: Long?): File { return File(customCoverCacheDir, DiskUtil.hashKeyForDisk(animeId.toString())) } /** * Saves the given stream as the anime's custom cover to cache. * * @param anime the anime. * @param inputStream the stream to copy. * @throws IOException if there's any error. */ @Throws(IOException::class) fun setCustomCoverToCache(anime: Anime, inputStream: InputStream) { getCustomCoverFile(anime.id).outputStream().use { inputStream.copyTo(it) } } /** * Delete the cover files of the anime from the cache. * * @param anime the anime. * @param deleteCustomCover whether the custom cover should be deleted. * @return number of files that were deleted. */ fun deleteFromCache(anime: Anime, deleteCustomCover: Boolean = false): Int { var deleted = 0 getCoverFile(anime.thumbnailUrl)?.let { if (it.exists() && it.delete()) ++deleted } if (deleteCustomCover) { if (deleteCustomCover(anime.id)) ++deleted } return deleted } /** * Delete custom cover of the anime from the cache * * @param animeId the anime id. * @return whether the cover was deleted. */ fun deleteCustomCover(animeId: Long?): Boolean { return getCustomCoverFile(animeId).let { it.exists() && it.delete() } } private fun getCacheDir(dir: String): File { return context.getExternalFilesDir(dir) ?: File(context.filesDir, dir).also { it.mkdirs() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt ================================================ package eu.kanade.tachiyomi.data.cache import android.content.Context import android.text.format.Formatter import com.jakewharton.disklrucache.DiskLruCache import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.saveTo import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import logcat.LogPriority import okhttp3.Response import okio.buffer import okio.sink import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.items.chapter.model.Chapter import java.io.File import java.io.IOException /** * Class used to create chapter cache * For each image in a chapter a file is created * For each chapter a Json list is created and converted to a file. * The files are in format *md5key*.0 * * @param context the application context. * @constructor creates an instance of the chapter cache. */ class ChapterCache( private val context: Context, private val json: Json, ) { /** Cache class used for cache management. */ private val diskCache = DiskLruCache.open( File(context.cacheDir, "chapter_disk_cache"), PARAMETER_APP_VERSION, PARAMETER_VALUE_COUNT, PARAMETER_CACHE_SIZE, ) /** * Returns directory of cache. */ private val cacheDir: File = diskCache.directory /** * Returns real size of directory. */ private val realSize: Long get() = DiskUtil.getDirectorySize(cacheDir) /** * Returns real size of directory in human readable format. */ val readableSize: String get() = Formatter.formatFileSize(context, realSize) /** * Get page list from cache. * * @param chapter the chapter. * @return the list of pages. */ fun getPageListFromCache(chapter: Chapter): List { // Get the key for the chapter. val key = DiskUtil.hashKeyForDisk(getKey(chapter)) // Convert JSON string to list of objects. Throws an exception if snapshot is null return diskCache.get(key).use { json.decodeFromString(it.getString(0)) } } /** * Add page list to disk cache. * * @param chapter the chapter. * @param pages list of pages. */ fun putPageListToCache(chapter: Chapter, pages: List) { // Convert list of pages to json string. val cachedValue = json.encodeToString(pages) // Initialize the editor (edits the values for an entry). var editor: DiskLruCache.Editor? = null try { // Get editor from md5 key. val key = DiskUtil.hashKeyForDisk(getKey(chapter)) editor = diskCache.edit(key) ?: return // Write chapter urls to cache. editor.newOutputStream(0).sink().buffer().use { it.write(cachedValue.toByteArray()) it.flush() } diskCache.flush() editor.commit() editor.abortUnlessCommitted() } catch (e: Exception) { logcat(LogPriority.WARN, e) { "Failed to put page list to cache" } // Ignore. } finally { editor?.abortUnlessCommitted() } } /** * Returns true if image is in cache. * * @param imageUrl url of image. * @return true if in cache otherwise false. */ fun isImageInCache(imageUrl: String): Boolean { return try { diskCache.get(DiskUtil.hashKeyForDisk(imageUrl)).use { it != null } } catch (e: IOException) { false } } /** * Get image file from url. * * @param imageUrl url of image. * @return path of image. */ fun getImageFile(imageUrl: String): File { // Get file from md5 key. val imageName = DiskUtil.hashKeyForDisk(imageUrl) + ".0" return File(diskCache.directory, imageName) } /** * Add image to cache. * * @param imageUrl url of image. * @param response http response from page. * @throws IOException image error. */ @Throws(IOException::class) fun putImageToCache(imageUrl: String, response: Response) { // Initialize editor (edits the values for an entry). var editor: DiskLruCache.Editor? = null try { // Get editor from md5 key. val key = DiskUtil.hashKeyForDisk(imageUrl) editor = diskCache.edit(key) ?: throw IOException("Unable to edit key") // Get OutputStream and write image with Okio. response.body.source().saveTo(editor.newOutputStream(0)) diskCache.flush() editor.commit() } finally { response.body.close() editor?.abortUnlessCommitted() } } fun clear(): Int { var deletedFiles = 0 cacheDir.listFiles()?.forEach { if (removeFileFromCache(it.name)) { deletedFiles++ } } return deletedFiles } /** * Remove file from cache. * * @param file name of file "md5.0". * @return status of deletion for the file. */ private fun removeFileFromCache(file: String): Boolean { // Make sure we don't delete the journal file (keeps track of cache) if (file == "journal" || file.startsWith("journal.")) { return false } return try { // Remove the extension from the file to get the key of the cache val key = file.substringBeforeLast(".") // Remove file from cache diskCache.remove(key) } catch (e: Exception) { logcat(LogPriority.WARN, e) { "Failed to remove file from cache" } false } } private fun getKey(chapter: Chapter): String { return "${chapter.mangaId}${chapter.url}" } } /** Application cache version. */ private const val PARAMETER_APP_VERSION = 1 /** The number of values per cache entry. Must be positive. */ private const val PARAMETER_VALUE_COUNT = 1 /** The maximum number of bytes this cache should use to store. */ private const val PARAMETER_CACHE_SIZE = 100L * 1024 * 1024 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/cache/MangaCoverCache.kt ================================================ package eu.kanade.tachiyomi.data.cache import android.content.Context import eu.kanade.tachiyomi.util.storage.DiskUtil import tachiyomi.domain.entries.manga.model.Manga import java.io.File import java.io.IOException import java.io.InputStream /** * Class used to create cover cache. * It is used to store the covers of the library. * Names of files are created with the md5 of the thumbnail URL. * * @param context the application context. * @constructor creates an instance of the cover cache. */ class MangaCoverCache(private val context: Context) { companion object { private const val COVERS_DIR = "covers" private const val CUSTOM_COVERS_DIR = "covers/custom" } /** * Cache directory used for cache management. */ private val cacheDir = getCacheDir(COVERS_DIR) private val customCoverCacheDir = getCacheDir(CUSTOM_COVERS_DIR) /** * Returns the cover from cache. * * @param mangaThumbnailUrl thumbnail url for the manga. * @return cover image. */ fun getCoverFile(mangaThumbnailUrl: String?): File? { return mangaThumbnailUrl?.let { File(cacheDir, DiskUtil.hashKeyForDisk(it)) } } /** * Returns the custom cover from cache. * * @param mangaId the manga id. * @return cover image. */ fun getCustomCoverFile(mangaId: Long?): File { return File(customCoverCacheDir, DiskUtil.hashKeyForDisk(mangaId.toString())) } /** * Saves the given stream as the manga's custom cover to cache. * * @param manga the manga. * @param inputStream the stream to copy. * @throws IOException if there's any error. */ @Throws(IOException::class) fun setCustomCoverToCache(manga: Manga, inputStream: InputStream) { getCustomCoverFile(manga.id).outputStream().use { inputStream.copyTo(it) } } /** * Delete the cover files of the manga from the cache. * * @param manga the manga. * @param deleteCustomCover whether the custom cover should be deleted. * @return number of files that were deleted. */ fun deleteFromCache(manga: Manga, deleteCustomCover: Boolean = false): Int { var deleted = 0 getCoverFile(manga.thumbnailUrl)?.let { if (it.exists() && it.delete()) ++deleted } if (deleteCustomCover) { if (deleteCustomCover(manga.id)) ++deleted } return deleted } /** * Delete custom cover of the manga from the cache * * @param mangaId the manga id. * @return whether the cover was deleted. */ fun deleteCustomCover(mangaId: Long?): Boolean { return getCustomCoverFile(mangaId).let { it.exists() && it.delete() } } private fun getCacheDir(dir: String): File { return context.getExternalFilesDir(dir) ?: File(context.filesDir, dir).also { it.mkdirs() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeCoverKeyer.kt ================================================ package eu.kanade.tachiyomi.data.coil import coil3.key.Keyer import coil3.request.Options import eu.kanade.domain.entries.anime.model.hasCustomBackground import eu.kanade.domain.entries.anime.model.hasCustomCover import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import tachiyomi.domain.entries.anime.model.AnimeCover import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import tachiyomi.domain.entries.anime.model.Anime as DomainAnime class AnimeKeyer : Keyer { override fun key(data: DomainAnime, options: Options): String { return when { options.useBackground && data.hasCustomBackground() -> "anime;${data.id};${data.backgroundLastModified}" options.useBackground -> "anime;${data.backgroundUrl};${data.backgroundLastModified}" data.hasCustomCover() -> "anime;${data.id};${data.coverLastModified}" else -> "anime;${data.thumbnailUrl};${data.coverLastModified}" } } } class AnimeCoverKeyer( private val coverCache: AnimeCoverCache = Injekt.get(), ) : Keyer { override fun key(data: AnimeCover, options: Options): String { return if (coverCache.getCustomCoverFile(data.animeId).exists()) { "anime;${data.animeId};${data.lastModified}" } else { "anime;${data.url};${data.lastModified}" } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/AnimeImageFetcher.kt ================================================ package eu.kanade.tachiyomi.data.coil import androidx.core.net.toUri import coil3.Extras import coil3.ImageLoader import coil3.decode.DataSource import coil3.decode.ImageSource import coil3.disk.DiskCache import coil3.fetch.FetchResult import coil3.fetch.Fetcher import coil3.fetch.SourceFetchResult import coil3.getOrDefault import coil3.request.Options import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.coil.AnimeImageFetcher.Companion.USE_CUSTOM_COVER_KEY import eu.kanade.tachiyomi.network.await import logcat.LogPriority import okhttp3.CacheControl import okhttp3.Call import okhttp3.Request import okhttp3.Response import okio.FileSystem import okio.Path.Companion.toOkioPath import okio.Source import okio.buffer import okio.sink import okio.source import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeCover import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.injectLazy import java.io.File import java.io.IOException /** * A [Fetcher] that fetches cover image for [Anime] object. * * It uses [Anime.thumbnailUrl] if custom cover is not set by the user. * Disk caching for library items is handled by [AnimeCoverCache], otherwise * handled by Coil's [DiskCache]. * * Available request parameter: * - [USE_CUSTOM_COVER_KEY]: Use custom cover if set by user, default is true */ class AnimeImageFetcher( private val url: String?, private val isLibraryAnime: Boolean, private val options: Options, private val coverFileLazy: Lazy, private val customCoverFileLazy: Lazy, private val diskCacheKeyLazy: Lazy, private val sourceLazy: Lazy, private val callFactoryLazy: Lazy, private val imageLoader: ImageLoader, ) : Fetcher { private val diskCacheKey: String get() = diskCacheKeyLazy.value override suspend fun fetch(): FetchResult { // Use custom cover if exists val useCustomCover = options.extras.getOrDefault(USE_CUSTOM_COVER_KEY) if (useCustomCover) { val customCoverFile = customCoverFileLazy.value if (customCoverFile.exists()) { return fileLoader(customCoverFile) } } // diskCacheKey is thumbnail_url if (url == null) error("No cover specified") return when (getResourceType(url)) { Type.URL -> httpLoader() Type.File -> fileLoader(File(url.substringAfter("file://"))) Type.URI -> uniFileLoader(url) null -> error("Invalid image") } } private fun uniFileLoader(urlString: String): FetchResult { val uniFile = UniFile.fromUri(options.context, urlString.toUri())!! val tempFile = uniFile.openInputStream().source().buffer() return SourceFetchResult( source = ImageSource(source = tempFile, fileSystem = FileSystem.SYSTEM), mimeType = "image/*", dataSource = DataSource.DISK, ) } private fun fileLoader(file: File): FetchResult { return SourceFetchResult( source = ImageSource( file = file.toOkioPath(), fileSystem = FileSystem.SYSTEM, diskCacheKey = diskCacheKey, ), mimeType = "image/*", dataSource = DataSource.DISK, ) } private suspend fun httpLoader(): FetchResult { // Only cache separately if it's a library item val libraryCoverCacheFile = if (isLibraryAnime) { coverFileLazy.value ?: error("No cover specified") } else { null } if (libraryCoverCacheFile?.exists() == true && options.diskCachePolicy.readEnabled) { return fileLoader(libraryCoverCacheFile) } var snapshot = readFromDiskCache() try { // Fetch from disk cache if (snapshot != null) { val snapshotCoverCache = moveSnapshotToCoverCache(snapshot, libraryCoverCacheFile) if (snapshotCoverCache != null) { // Read from cover cache after added to library return fileLoader(snapshotCoverCache) } // Read from snapshot return SourceFetchResult( source = snapshot.toImageSource(), mimeType = "image/*", dataSource = DataSource.DISK, ) } // Fetch from network val response = executeNetworkRequest() val responseBody = checkNotNull(response.body) { "Null response source" } try { // Read from cover cache after library manga cover updated val responseCoverCache = writeResponseToCoverCache(response, libraryCoverCacheFile) if (responseCoverCache != null) { return fileLoader(responseCoverCache) } // Read from disk cache snapshot = writeToDiskCache(response) if (snapshot != null) { return SourceFetchResult( source = snapshot.toImageSource(), mimeType = "image/*", dataSource = DataSource.NETWORK, ) } // Read from response if cache is unused or unusable return SourceFetchResult( source = ImageSource(source = responseBody.source(), fileSystem = FileSystem.SYSTEM), mimeType = "image/*", dataSource = if (response.cacheResponse != null) DataSource.DISK else DataSource.NETWORK, ) } catch (e: Exception) { responseBody.close() throw e } } catch (e: Exception) { snapshot?.close() throw e } } private suspend fun executeNetworkRequest(): Response { val client = sourceLazy.value?.client ?: callFactoryLazy.value val response = client.newCall(newRequest()).await() if (!response.isSuccessful && response.code != HTTP_NOT_MODIFIED) { response.close() throw IOException(response.message) } return response } private fun newRequest(): Request { val request = Request.Builder().apply { url(url!!) val sourceHeaders = sourceLazy.value?.headers if (sourceHeaders != null) { headers(sourceHeaders) } } when { options.networkCachePolicy.readEnabled -> { // don't take up okhttp cache request.cacheControl(CACHE_CONTROL_NO_STORE) } else -> { // This causes the request to fail with a 504 Unsatisfiable Request. request.cacheControl(CACHE_CONTROL_NO_NETWORK_NO_CACHE) } } return request.build() } private fun moveSnapshotToCoverCache(snapshot: DiskCache.Snapshot, cacheFile: File?): File? { if (cacheFile == null) return null return try { imageLoader.diskCache?.run { fileSystem.source(snapshot.data).use { input -> writeSourceToCoverCache(input, cacheFile) } remove(diskCacheKey) } cacheFile.takeIf { it.exists() } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to write snapshot data to cover cache ${cacheFile.name}" } null } } private fun writeResponseToCoverCache(response: Response, cacheFile: File?): File? { if (cacheFile == null || !options.diskCachePolicy.writeEnabled) return null return try { response.peekBody(Long.MAX_VALUE).source().use { input -> writeSourceToCoverCache(input, cacheFile) } cacheFile.takeIf { it.exists() } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to write response data to cover cache ${cacheFile.name}" } null } } private fun writeSourceToCoverCache(input: Source, cacheFile: File) { cacheFile.parentFile?.mkdirs() cacheFile.delete() try { cacheFile.sink().buffer().use { output -> output.writeAll(input) } } catch (e: Exception) { cacheFile.delete() throw e } } private fun readFromDiskCache(): DiskCache.Snapshot? { return if (options.diskCachePolicy.readEnabled) { imageLoader.diskCache?.openSnapshot(diskCacheKey) } else { null } } private fun writeToDiskCache( response: Response, ): DiskCache.Snapshot? { val diskCache = imageLoader.diskCache val editor = diskCache?.openEditor(diskCacheKey) ?: return null try { diskCache.fileSystem.write(editor.data) { response.body.source().readAll(this) } return editor.commitAndOpenSnapshot() } catch (e: Exception) { try { editor.abort() } catch (ignored: Exception) { } throw e } } private fun DiskCache.Snapshot.toImageSource(): ImageSource { return ImageSource( file = data, fileSystem = FileSystem.SYSTEM, diskCacheKey = diskCacheKey, closeable = this, ) } private fun getResourceType(cover: String?): Type? { return when { cover.isNullOrEmpty() -> null cover.startsWith("http", true) || cover.startsWith("Custom-", true) -> Type.URL cover.startsWith("/") || cover.startsWith("file://") -> Type.File cover.startsWith("content") -> Type.URI else -> null } } private enum class Type { File, URL, URI, } class AnimeFactory( private val callFactoryLazy: Lazy, ) : Fetcher.Factory { private val coverCache: AnimeCoverCache by injectLazy() private val backgroundCache: AnimeBackgroundCache by injectLazy() private val sourceManager: AnimeSourceManager by injectLazy() override fun create(data: Anime, options: Options, imageLoader: ImageLoader): Fetcher { val isBackground = options.useBackground val url = if (isBackground) data.backgroundUrl else data.thumbnailUrl val coverCacheLazy = if (isBackground) { lazy { backgroundCache.getBackgroundFile(url) } } else { lazy { coverCache.getCoverFile(url) } } val customCoverCacheLazy = if (isBackground) { lazy { backgroundCache.getCustomBackgroundFile(data.id) } } else { lazy { coverCache.getCustomCoverFile(data.id) } } return AnimeImageFetcher( url = url, isLibraryAnime = data.favorite, options = options, coverFileLazy = coverCacheLazy, customCoverFileLazy = customCoverCacheLazy, diskCacheKeyLazy = lazy { imageLoader.components.key(data, options)!! }, sourceLazy = lazy { sourceManager.get(data.source) as? AnimeHttpSource }, callFactoryLazy = callFactoryLazy, imageLoader = imageLoader, ) } } class AnimeCoverFactory( private val callFactoryLazy: Lazy, ) : Fetcher.Factory { private val coverCache: AnimeCoverCache by injectLazy() private val sourceManager: AnimeSourceManager by injectLazy() override fun create(data: AnimeCover, options: Options, imageLoader: ImageLoader): Fetcher { return AnimeImageFetcher( url = data.url, isLibraryAnime = data.isAnimeFavorite, options = options, coverFileLazy = lazy { coverCache.getCoverFile(data.url) }, customCoverFileLazy = lazy { coverCache.getCustomCoverFile(data.animeId) }, diskCacheKeyLazy = lazy { imageLoader.components.key(data, options)!! }, sourceLazy = lazy { sourceManager.get(data.sourceId) as? AnimeHttpSource }, callFactoryLazy = callFactoryLazy, imageLoader = imageLoader, ) } } companion object { val USE_CUSTOM_COVER_KEY = Extras.Key(true) private val CACHE_CONTROL_NO_STORE = CacheControl.Builder().noStore().build() private val CACHE_CONTROL_NO_NETWORK_NO_CACHE = CacheControl.Builder().noCache().onlyIfCached().build() private const val HTTP_NOT_MODIFIED = 304 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/BufferedSourceFetcher.kt ================================================ package eu.kanade.tachiyomi.data.coil import coil3.ImageLoader import coil3.decode.DataSource import coil3.decode.ImageSource import coil3.fetch.FetchResult import coil3.fetch.Fetcher import coil3.fetch.SourceFetchResult import coil3.request.Options import okio.BufferedSource class BufferedSourceFetcher( private val data: BufferedSource, private val options: Options, ) : Fetcher { override suspend fun fetch(): FetchResult { return SourceFetchResult( source = ImageSource( source = data, fileSystem = options.fileSystem, ), mimeType = null, dataSource = DataSource.MEMORY, ) } class Factory : Fetcher.Factory { override fun create( data: BufferedSource, options: Options, imageLoader: ImageLoader, ): Fetcher { return BufferedSourceFetcher(data, options) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverFetcher.kt ================================================ package eu.kanade.tachiyomi.data.coil import androidx.core.net.toUri import coil3.Extras import coil3.ImageLoader import coil3.decode.DataSource import coil3.decode.ImageSource import coil3.disk.DiskCache import coil3.fetch.FetchResult import coil3.fetch.Fetcher import coil3.fetch.SourceFetchResult import coil3.getOrDefault import coil3.request.Options import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher.Companion.USE_CUSTOM_COVER_KEY import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.source.online.HttpSource import logcat.LogPriority import okhttp3.CacheControl import okhttp3.Call import okhttp3.Request import okhttp3.Response import okio.FileSystem import okio.Path.Companion.toOkioPath import okio.Source import okio.buffer import okio.sink import okio.source import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaCover import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.injectLazy import java.io.File import java.io.IOException /** * A [Fetcher] that fetches cover image for [Manga] object. * * It uses [Manga.thumbnailUrl] if custom cover is not set by the user. * Disk caching for library items is handled by [MangaCoverCache], otherwise * handled by Coil's [DiskCache]. * * Available request parameter: * - [USE_CUSTOM_COVER_KEY]: Use custom cover if set by user, default is true */ class MangaCoverFetcher( private val url: String?, private val isLibraryManga: Boolean, private val options: Options, private val coverFileLazy: Lazy, private val customCoverFileLazy: Lazy, private val diskCacheKeyLazy: Lazy, private val sourceLazy: Lazy, private val callFactoryLazy: Lazy, private val imageLoader: ImageLoader, ) : Fetcher { private val diskCacheKey: String get() = diskCacheKeyLazy.value override suspend fun fetch(): FetchResult { // Use custom cover if exists val useCustomCover = options.extras.getOrDefault(USE_CUSTOM_COVER_KEY) if (useCustomCover) { val customCoverFile = customCoverFileLazy.value if (customCoverFile.exists()) { return fileLoader(customCoverFile) } } // diskCacheKey is thumbnail_url if (url == null) error("No cover specified") return when (getResourceType(url)) { Type.URL -> httpLoader() Type.File -> fileLoader(File(url.substringAfter("file://"))) Type.URI -> uniFileLoader(url) null -> error("Invalid image") } } private fun uniFileLoader(urlString: String): FetchResult { val uniFile = UniFile.fromUri(options.context, urlString.toUri())!! val tempFile = uniFile.openInputStream().source().buffer() return SourceFetchResult( source = ImageSource(source = tempFile, fileSystem = FileSystem.SYSTEM), mimeType = "image/*", dataSource = DataSource.DISK, ) } private fun fileLoader(file: File): FetchResult { return SourceFetchResult( source = ImageSource( file = file.toOkioPath(), fileSystem = FileSystem.SYSTEM, diskCacheKey = diskCacheKey, ), mimeType = "image/*", dataSource = DataSource.DISK, ) } private suspend fun httpLoader(): FetchResult { // Only cache separately if it's a library item val libraryCoverCacheFile = if (isLibraryManga) { coverFileLazy.value ?: error("No cover specified") } else { null } if (libraryCoverCacheFile?.exists() == true && options.diskCachePolicy.readEnabled) { return fileLoader(libraryCoverCacheFile) } var snapshot = readFromDiskCache() try { // Fetch from disk cache if (snapshot != null) { val snapshotCoverCache = moveSnapshotToCoverCache(snapshot, libraryCoverCacheFile) if (snapshotCoverCache != null) { // Read from cover cache after added to library return fileLoader(snapshotCoverCache) } // Read from snapshot return SourceFetchResult( source = snapshot.toImageSource(), mimeType = "image/*", dataSource = DataSource.DISK, ) } // Fetch from network val response = executeNetworkRequest() val responseBody = checkNotNull(response.body) { "Null response source" } try { // Read from cover cache after library manga cover updated val responseCoverCache = writeResponseToCoverCache(response, libraryCoverCacheFile) if (responseCoverCache != null) { return fileLoader(responseCoverCache) } // Read from disk cache snapshot = writeToDiskCache(response) if (snapshot != null) { return SourceFetchResult( source = snapshot.toImageSource(), mimeType = "image/*", dataSource = DataSource.NETWORK, ) } // Read from response if cache is unused or unusable return SourceFetchResult( source = ImageSource(source = responseBody.source(), fileSystem = FileSystem.SYSTEM), mimeType = "image/*", dataSource = if (response.cacheResponse != null) DataSource.DISK else DataSource.NETWORK, ) } catch (e: Exception) { responseBody.close() throw e } } catch (e: Exception) { snapshot?.close() throw e } } private suspend fun executeNetworkRequest(): Response { val client = sourceLazy.value?.client ?: callFactoryLazy.value val response = client.newCall(newRequest()).await() if (!response.isSuccessful && response.code != HTTP_NOT_MODIFIED) { response.close() throw IOException(response.message) } return response } private fun newRequest(): Request { val request = Request.Builder().apply { url(url!!) val sourceHeaders = sourceLazy.value?.headers if (sourceHeaders != null) { headers(sourceHeaders) } } when { options.networkCachePolicy.readEnabled -> { // don't take up okhttp cache request.cacheControl(CACHE_CONTROL_NO_STORE) } else -> { // This causes the request to fail with a 504 Unsatisfiable Request. request.cacheControl(CACHE_CONTROL_NO_NETWORK_NO_CACHE) } } return request.build() } private fun moveSnapshotToCoverCache(snapshot: DiskCache.Snapshot, cacheFile: File?): File? { if (cacheFile == null) return null return try { imageLoader.diskCache?.run { fileSystem.source(snapshot.data).use { input -> writeSourceToCoverCache(input, cacheFile) } remove(diskCacheKey) } cacheFile.takeIf { it.exists() } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to write snapshot data to cover cache ${cacheFile.name}" } null } } private fun writeResponseToCoverCache(response: Response, cacheFile: File?): File? { if (cacheFile == null || !options.diskCachePolicy.writeEnabled) return null return try { response.peekBody(Long.MAX_VALUE).source().use { input -> writeSourceToCoverCache(input, cacheFile) } cacheFile.takeIf { it.exists() } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to write response data to cover cache ${cacheFile.name}" } null } } private fun writeSourceToCoverCache(input: Source, cacheFile: File) { cacheFile.parentFile?.mkdirs() cacheFile.delete() try { cacheFile.sink().buffer().use { output -> output.writeAll(input) } } catch (e: Exception) { cacheFile.delete() throw e } } private fun readFromDiskCache(): DiskCache.Snapshot? { return if (options.diskCachePolicy.readEnabled) { imageLoader.diskCache?.openSnapshot(diskCacheKey) } else { null } } private fun writeToDiskCache( response: Response, ): DiskCache.Snapshot? { val diskCache = imageLoader.diskCache val editor = diskCache?.openEditor(diskCacheKey) ?: return null try { diskCache.fileSystem.write(editor.data) { response.body.source().readAll(this) } return editor.commitAndOpenSnapshot() } catch (e: Exception) { try { editor.abort() } catch (ignored: Exception) { } throw e } } private fun DiskCache.Snapshot.toImageSource(): ImageSource { return ImageSource( file = data, fileSystem = FileSystem.SYSTEM, diskCacheKey = diskCacheKey, closeable = this, ) } private fun getResourceType(cover: String?): Type? { return when { cover.isNullOrEmpty() -> null cover.startsWith("http", true) || cover.startsWith("Custom-", true) -> Type.URL cover.startsWith("/") || cover.startsWith("file://") -> Type.File cover.startsWith("content") -> Type.URI else -> null } } private enum class Type { File, URL, URI, } class MangaFactory( private val callFactoryLazy: Lazy, ) : Fetcher.Factory { private val coverCache: MangaCoverCache by injectLazy() private val sourceManager: MangaSourceManager by injectLazy() override fun create(data: Manga, options: Options, imageLoader: ImageLoader): Fetcher { return MangaCoverFetcher( url = data.thumbnailUrl, isLibraryManga = data.favorite, options = options, coverFileLazy = lazy { coverCache.getCoverFile(data.thumbnailUrl) }, customCoverFileLazy = lazy { coverCache.getCustomCoverFile(data.id) }, diskCacheKeyLazy = lazy { imageLoader.components.key(data, options)!! }, sourceLazy = lazy { sourceManager.get(data.source) as? HttpSource }, callFactoryLazy = callFactoryLazy, imageLoader = imageLoader, ) } } class MangaCoverFactory( private val callFactoryLazy: Lazy, ) : Fetcher.Factory { private val coverCache: MangaCoverCache by injectLazy() private val sourceManager: MangaSourceManager by injectLazy() override fun create(data: MangaCover, options: Options, imageLoader: ImageLoader): Fetcher { return MangaCoverFetcher( url = data.url, isLibraryManga = data.isMangaFavorite, options = options, coverFileLazy = lazy { coverCache.getCoverFile(data.url) }, customCoverFileLazy = lazy { coverCache.getCustomCoverFile(data.mangaId) }, diskCacheKeyLazy = lazy { imageLoader.components.key(data, options)!! }, sourceLazy = lazy { sourceManager.get(data.sourceId) as? HttpSource }, callFactoryLazy = callFactoryLazy, imageLoader = imageLoader, ) } } companion object { val USE_CUSTOM_COVER_KEY = Extras.Key(true) private val CACHE_CONTROL_NO_STORE = CacheControl.Builder().noStore().build() private val CACHE_CONTROL_NO_NETWORK_NO_CACHE = CacheControl.Builder().noCache().onlyIfCached().build() private const val HTTP_NOT_MODIFIED = 304 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/MangaCoverKeyer.kt ================================================ package eu.kanade.tachiyomi.data.coil import coil3.key.Keyer import coil3.request.Options import eu.kanade.domain.entries.manga.model.hasCustomCover import eu.kanade.tachiyomi.data.cache.MangaCoverCache import tachiyomi.domain.entries.manga.model.MangaCover import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import tachiyomi.domain.entries.manga.model.Manga as DomainManga class MangaKeyer : Keyer { override fun key(data: DomainManga, options: Options): String { return if (data.hasCustomCover()) { "manga;${data.id};${data.coverLastModified}" } else { "manga;${data.thumbnailUrl};${data.coverLastModified}" } } } class MangaCoverKeyer( private val coverCache: MangaCoverCache = Injekt.get(), ) : Keyer { override fun key(data: MangaCover, options: Options): String { return if (coverCache.getCustomCoverFile(data.mangaId).exists()) { "manga;${data.mangaId};${data.lastModified}" } else { "manga;${data.url};${data.lastModified}" } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/TachiyomiImageDecoder.kt ================================================ package eu.kanade.tachiyomi.data.coil import android.graphics.Bitmap import coil3.ImageLoader import coil3.asImage import coil3.decode.DecodeResult import coil3.decode.DecodeUtils import coil3.decode.Decoder import coil3.decode.ImageSource import coil3.fetch.SourceFetchResult import coil3.request.Options import coil3.request.bitmapConfig import okio.BufferedSource import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.decoder.ImageDecoder /** * A [Decoder] that uses built-in [ImageDecoder] to decode images that is not supported by the system. */ class TachiyomiImageDecoder(private val resources: ImageSource, private val options: Options) : Decoder { override suspend fun decode(): DecodeResult { val decoder = resources.sourceOrNull()?.use { ImageDecoder.newInstance(it.inputStream(), options.cropBorders, displayProfile) } check(decoder != null && decoder.width > 0 && decoder.height > 0) { "Failed to initialize decoder" } val srcWidth = decoder.width val srcHeight = decoder.height val dstWidth = options.size.widthPx(options.scale) { srcWidth } val dstHeight = options.size.heightPx(options.scale) { srcHeight } val sampleSize = DecodeUtils.calculateInSampleSize( srcWidth = srcWidth, srcHeight = srcHeight, dstWidth = dstWidth, dstHeight = dstHeight, scale = options.scale, ) var bitmap = decoder.decode(sampleSize = sampleSize) decoder.recycle() check(bitmap != null) { "Failed to decode image" } if (options.bitmapConfig == Bitmap.Config.HARDWARE && ImageUtil.canUseHardwareBitmap(bitmap)) { val hwBitmap = bitmap.copy(Bitmap.Config.HARDWARE, false) if (hwBitmap != null) { bitmap.recycle() bitmap = hwBitmap } } return DecodeResult( image = bitmap.asImage(), isSampled = sampleSize > 1, ) } class Factory : Decoder.Factory { override fun create(result: SourceFetchResult, options: Options, imageLoader: ImageLoader): Decoder? { return if (options.customDecoder || isApplicable(result.source.source())) { TachiyomiImageDecoder(result.source, options) } else { null } } private fun isApplicable(source: BufferedSource): Boolean { val type = source.peek().inputStream().use { ImageUtil.findImageType(it) } return when (type) { ImageUtil.ImageType.AVIF, ImageUtil.ImageType.JXL, ImageUtil.ImageType.HEIF -> true else -> false } } override fun equals(other: Any?) = other is Factory override fun hashCode() = javaClass.hashCode() } companion object { var displayProfile: ByteArray? = null } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/coil/Utils.kt ================================================ package eu.kanade.tachiyomi.data.coil import coil3.Extras import coil3.getExtra import coil3.request.ImageRequest import coil3.request.Options import coil3.size.Dimension import coil3.size.Scale import coil3.size.Size import coil3.size.isOriginal import coil3.size.pxOrElse internal inline fun Size.widthPx(scale: Scale, original: () -> Int): Int { return if (isOriginal) original() else width.toPx(scale) } internal inline fun Size.heightPx(scale: Scale, original: () -> Int): Int { return if (isOriginal) original() else height.toPx(scale) } internal fun Dimension.toPx(scale: Scale): Int = pxOrElse { when (scale) { Scale.FILL -> Int.MIN_VALUE Scale.FIT -> Int.MAX_VALUE } } fun ImageRequest.Builder.cropBorders(enable: Boolean) = apply { extras[cropBordersKey] = enable } val Options.cropBorders: Boolean get() = getExtra(cropBordersKey) private val cropBordersKey = Extras.Key(default = false) fun ImageRequest.Builder.customDecoder(enable: Boolean) = apply { extras[customDecoderKey] = enable } val Options.customDecoder: Boolean get() = getExtra(customDecoderKey) private val customDecoderKey = Extras.Key(default = false) fun ImageRequest.Builder.useBackground(enable: Boolean) = apply { extras[useBackgroundKey] = enable } val Options.useBackground: Boolean get() = getExtra(useBackgroundKey) private val useBackgroundKey = Extras.Key(default = false) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrack.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.anime import java.io.Serializable interface AnimeTrack : Serializable { var id: Long? var anime_id: Long var tracker_id: Long var remote_id: Long var library_id: Long? var title: String var last_episode_seen: Double var total_episodes: Long var score: Double var status: Long var started_watching_date: Long var finished_watching_date: Long var tracking_url: String var private: Boolean fun copyPersonalFrom(other: AnimeTrack, copyRemotePrivate: Boolean = true) { last_episode_seen = other.last_episode_seen score = other.score status = other.status started_watching_date = other.started_watching_date finished_watching_date = other.finished_watching_date if (copyRemotePrivate) private = other.private } companion object { fun create(serviceId: Long): AnimeTrack = AnimeTrackImpl().apply { tracker_id = serviceId } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/AnimeTrackImpl.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.anime class AnimeTrackImpl : AnimeTrack { override var id: Long? = null override var anime_id: Long = 0 override var tracker_id: Long = 0 override var remote_id: Long = 0 override var library_id: Long? = null override lateinit var title: String override var last_episode_seen: Double = 0.0 override var total_episodes: Long = 0 override var score: Double = 0.0 override var status: Long = 0 override var started_watching_date: Long = 0 override var finished_watching_date: Long = 0 override var tracking_url: String = "" override var private: Boolean = false } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/Episode.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.anime import eu.kanade.tachiyomi.animesource.model.SEpisode import java.io.Serializable import tachiyomi.domain.items.episode.model.Episode as DomainEpisode interface Episode : SEpisode, Serializable { var id: Long? var anime_id: Long? var seen: Boolean var bookmark: Boolean var last_second_seen: Long var total_seconds: Long var date_fetch: Long var source_order: Int var last_modified: Long var version: Long } val Episode.isRecognizedNumber: Boolean get() = episode_number >= 0f fun Episode.toDomainEpisode(): DomainEpisode? { if (id == null || anime_id == null) return null return DomainEpisode( id = id!!, animeId = anime_id!!, seen = seen, bookmark = bookmark, fillermark = fillermark, lastSecondSeen = last_second_seen, totalSeconds = total_seconds, dateFetch = date_fetch, sourceOrder = source_order.toLong(), url = url, name = name, dateUpload = date_upload, episodeNumber = episode_number.toDouble(), scanlator = scanlator, summary = summary, previewUrl = preview_url, lastModifiedAt = last_modified, version = version, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/EpisodeImpl.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.anime class EpisodeImpl : Episode { override var id: Long? = null override var anime_id: Long? = null override lateinit var url: String override lateinit var name: String override var scanlator: String? = null override var summary: String? = null override var preview_url: String? = null override var seen: Boolean = false override var bookmark: Boolean = false override var fillermark: Boolean = false override var last_second_seen: Long = 0 override var total_seconds: Long = 0 override var date_fetch: Long = 0 override var date_upload: Long = 0 override var episode_number: Float = 0f override var source_order: Int = 0 override var last_modified: Long = 0 override var version: Long = 0 override fun equals(other: Any?): Boolean { if (this === other) return true if (other == null || javaClass != other.javaClass) return false val episode = other as Episode if (url != episode.url) return false return id == episode.id } override fun hashCode(): Int { return url.hashCode() + id.hashCode() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/Chapter.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.manga import eu.kanade.tachiyomi.source.model.SChapter import java.io.Serializable import tachiyomi.domain.items.chapter.model.Chapter as DomainChapter interface Chapter : SChapter, Serializable { var id: Long? var manga_id: Long? var read: Boolean var bookmark: Boolean var last_page_read: Int var date_fetch: Long var source_order: Int var last_modified: Long var version: Long } val Chapter.isRecognizedNumber: Boolean get() = chapter_number >= 0f fun Chapter.toDomainChapter(): DomainChapter? { if (id == null || manga_id == null) return null return DomainChapter( id = id!!, mangaId = manga_id!!, read = read, bookmark = bookmark, lastPageRead = last_page_read.toLong(), dateFetch = date_fetch, sourceOrder = source_order.toLong(), url = url, name = name, dateUpload = date_upload, chapterNumber = chapter_number.toDouble(), scanlator = scanlator, lastModifiedAt = last_modified, version = version, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/ChapterImpl.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.manga class ChapterImpl : Chapter { override var id: Long? = null override var manga_id: Long? = null override lateinit var url: String override lateinit var name: String override var scanlator: String? = null override var read: Boolean = false override var bookmark: Boolean = false override var last_page_read: Int = 0 override var date_fetch: Long = 0 override var date_upload: Long = 0 override var chapter_number: Float = 0f override var source_order: Int = 0 override var last_modified: Long = 0 override var version: Long = 0 override fun equals(other: Any?): Boolean { if (this === other) return true if (other == null || javaClass != other.javaClass) return false val chapter = other as Chapter if (url != chapter.url) return false return id == chapter.id } override fun hashCode(): Int { return url.hashCode() + id.hashCode() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrack.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.manga import java.io.Serializable interface MangaTrack : Serializable { var id: Long? var manga_id: Long var tracker_id: Long var remote_id: Long var library_id: Long? var title: String var last_chapter_read: Double var total_chapters: Long var score: Double var status: Long var started_reading_date: Long var finished_reading_date: Long var tracking_url: String var private: Boolean fun copyPersonalFrom(other: MangaTrack, copyRemotePrivate: Boolean = true) { last_chapter_read = other.last_chapter_read score = other.score status = other.status started_reading_date = other.started_reading_date finished_reading_date = other.finished_reading_date if (copyRemotePrivate) private = other.private } companion object { fun create(serviceId: Long): MangaTrack = MangaTrackImpl().apply { tracker_id = serviceId } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/MangaTrackImpl.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.database.models.manga class MangaTrackImpl : MangaTrack { override var id: Long? = null override var manga_id: Long = 0 override var tracker_id: Long = 0 override var remote_id: Long = 0 override var library_id: Long? = null override lateinit var title: String override var last_chapter_read: Double = 0.0 override var total_chapters: Long = 0 override var score: Double = 0.0 override var status: Long = 0 override var started_reading_date: Long = 0 override var finished_reading_date: Long = 0 override var tracking_url: String = "" override var private: Boolean = false } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.app.Application import android.content.Context import androidx.core.net.toUri import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.util.size import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encodeToByteArray import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority import tachiyomi.core.common.storage.extension import tachiyomi.core.common.storage.nameWithoutExtension import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.storage.service.StorageManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.seconds /** * Cache where we dump the downloads directory from the filesystem. This class is needed because * directory checking is expensive and it slows downs the app. The cache is invalidated by the time * defined in [renewInterval] as we don't have any control over the filesystem and the user can * delete the folders at any time without the app noticing. */ class AnimeDownloadCache( private val context: Context, private val provider: AnimeDownloadProvider = Injekt.get(), private val sourceManager: AnimeSourceManager = Injekt.get(), private val extensionManager: AnimeExtensionManager = Injekt.get(), private val storageManager: StorageManager = Injekt.get(), ) { private val scope = CoroutineScope(Dispatchers.IO) private val _changes: Channel = Channel(Channel.UNLIMITED) val changes = _changes.receiveAsFlow() .onStart { emit(Unit) } .shareIn(scope, SharingStarted.Lazily, 1) /** * The interval after which this cache should be invalidated. 1 hour shouldn't cause major * issues, as the cache is only used for UI feedback. */ private val renewInterval = 1.hours.inWholeMilliseconds /** * The last time the cache was refreshed. */ private var lastRenew = 0L private var renewalJob: Job? = null private val _isInitializing = MutableStateFlow(false) val isInitializing = _isInitializing .debounce(1000L) // Don't notify if it finishes quickly enough .stateIn(scope, SharingStarted.WhileSubscribed(), false) private val diskCacheFile: File get() = File(context.cacheDir, "dl_anime_index_cache_v3") private val rootDownloadsDirMutex = Mutex() private var rootDownloadsDir = RootDirectory(storageManager.getDownloadsDirectory()) init { // Attempt to read cache file scope.launch { rootDownloadsDirMutex.withLock { try { if (diskCacheFile.exists()) { val diskCache = diskCacheFile.inputStream().use { ProtoBuf.decodeFromByteArray(it.readBytes()) } rootDownloadsDir = diskCache lastRenew = System.currentTimeMillis() } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Failed to initialize disk cache" } diskCacheFile.delete() } } } storageManager.changes .onEach { invalidateCache() } .launchIn(scope) } /** * Returns true if the episode is downloaded. * * @param episodeName the name of the episode to query. * @param episodeScanlator scanlator of the episode to query * @param animeTitle the title of the anime to query. * @param sourceId the id of the source of the episode. */ fun isEpisodeDownloaded( episodeName: String, episodeScanlator: String?, animeTitle: String, sourceId: Long, skipCache: Boolean, ): Boolean { if (skipCache) { val source = sourceManager.getOrStub(sourceId) return provider.findEpisodeDir(episodeName, episodeScanlator, animeTitle, source) != null } renewCache() val sourceDir = rootDownloadsDir.sourceDirs[sourceId] if (sourceDir != null) { val animeDir = sourceDir.animeDirs[provider.getAnimeDirName(animeTitle)] if (animeDir != null) { return provider.getValidEpisodeDirNames( episodeName, episodeScanlator, ).any { it in animeDir.episodeDirs } } } return false } /** * Returns the amount of downloaded episodes. */ fun getTotalDownloadCount(): Int { renewCache() return rootDownloadsDir.sourceDirs.values.sumOf { sourceDir -> sourceDir.animeDirs.values.sumOf { animeDir -> animeDir.episodeDirs.size } } } /** * Returns the amount of downloaded episodes for an anime. * * @param anime the anime to check. */ fun getDownloadCount(anime: Anime): Int { renewCache() val sourceDir = rootDownloadsDir.sourceDirs[anime.source] if (sourceDir != null) { val animeDir = sourceDir.animeDirs[provider.getAnimeDirName(anime.title)] if (animeDir != null) { return animeDir.episodeDirs.size } } return 0 } /** * Returns the total size of downloaded episodes. */ fun getTotalDownloadSize(): Long { renewCache() return rootDownloadsDir.sourceDirs.values.sumOf { sourceDir -> sourceDir.dir?.size() ?: 0L } } /** * Returns the total size of downloaded chapters for an anime. * * @param anime the anime to check. */ fun getDownloadSize(anime: Anime): Long { renewCache() return rootDownloadsDir.sourceDirs[anime.source]?.animeDirs?.get( provider.getAnimeDirName( anime.title, ), )?.dir?.size() ?: 0 } /** * Adds an episode that has just been download to this cache. * * @param episodeDirName the downloaded episode's directory name. * @param animeUniFile the directory of the anime. * @param anime the anime of the episode. */ suspend fun addEpisode(episodeDirName: String, animeUniFile: UniFile, anime: Anime) { rootDownloadsDirMutex.withLock { // Retrieve the cached source directory or cache a new one var sourceDir = rootDownloadsDir.sourceDirs[anime.source] if (sourceDir == null) { val source = sourceManager.get(anime.source) ?: return val sourceUniFile = provider.findSourceDir(source) ?: return sourceDir = SourceDirectory(sourceUniFile) rootDownloadsDir.sourceDirs += anime.source to sourceDir } // Retrieve the cached anime directory or cache a new one val animeDirName = provider.getAnimeDirName(anime.title) var animeDir = sourceDir.animeDirs[animeDirName] if (animeDir == null) { animeDir = AnimeDirectory(animeUniFile) sourceDir.animeDirs += animeDirName to animeDir } // Save the chapter directory animeDir.episodeDirs += episodeDirName } notifyChanges() } /** * Removes an episode that has been deleted from this cache. * * @param episode the episode to remove. * @param anime the anime of the episode. */ suspend fun removeEpisode(episode: Episode, anime: Anime) { rootDownloadsDirMutex.withLock { val sourceDir = rootDownloadsDir.sourceDirs[anime.source] ?: return val animeDir = sourceDir.animeDirs[provider.getAnimeDirName(anime.title)] ?: return provider.getValidEpisodeDirNames(episode.name, episode.scanlator).forEach { if (it in animeDir.episodeDirs) { animeDir.episodeDirs -= it } } } notifyChanges() } /** * Removes a list of episodes that have been deleted from this cache. * * @param episodes the list of episode to remove. * @param anime the anime of the episode. */ suspend fun removeEpisodes(episodes: List, anime: Anime) { rootDownloadsDirMutex.withLock { val sourceDir = rootDownloadsDir.sourceDirs[anime.source] ?: return val animeDir = sourceDir.animeDirs[provider.getAnimeDirName(anime.title)] ?: return episodes.forEach { episode -> provider.getValidEpisodeDirNames(episode.name, episode.scanlator).forEach { if (it in animeDir.episodeDirs) { animeDir.episodeDirs -= it } } } } notifyChanges() } /** * Removes an anime that has been deleted from this cache. * * @param anime the anime to remove. */ suspend fun removeAnime(anime: Anime) { rootDownloadsDirMutex.withLock { val sourceDir = rootDownloadsDir.sourceDirs[anime.source] ?: return val animeDirName = provider.getAnimeDirName(anime.title) if (sourceDir.animeDirs.containsKey(animeDirName)) { sourceDir.animeDirs -= animeDirName } } notifyChanges() } suspend fun removeSource(source: AnimeSource) { rootDownloadsDirMutex.withLock { rootDownloadsDir.sourceDirs -= source.id } notifyChanges() } fun invalidateCache() { lastRenew = 0L renewalJob?.cancel() diskCacheFile.delete() renewCache() } /** * Renews the downloads cache. */ private fun renewCache() { // Avoid renewing cache if in the process nor too often if (lastRenew + renewInterval >= System.currentTimeMillis() || renewalJob?.isActive == true) { return } renewalJob = scope.launchIO { if (lastRenew == 0L) { _isInitializing.emit(true) } // Try to wait until extensions and sources have loaded var sources = emptyList() withTimeoutOrNull(30.seconds) { extensionManager.isInitialized.first { it } sourceManager.isInitialized.first { it } sources = getSources() } val sourceMap = sources.associate { provider.getSourceDirName(it).lowercase() to it.id } rootDownloadsDirMutex.withLock { val updatedRootDir = RootDirectory(storageManager.getDownloadsDirectory()) updatedRootDir.sourceDirs = updatedRootDir.dir?.listFiles().orEmpty() .filter { it.isDirectory && !it.name.isNullOrBlank() } .mapNotNull { dir -> val sourceId = sourceMap[dir.name!!.lowercase()] sourceId?.let { it to SourceDirectory(dir) } } .toMap() updatedRootDir.sourceDirs.values.map { sourceDir -> async { sourceDir.animeDirs = sourceDir.dir?.listFiles().orEmpty() .filter { it.isDirectory && !it.name.isNullOrBlank() } .associate { it.name!! to AnimeDirectory(it) } sourceDir.animeDirs.values.forEach { animeDir -> val episodeDirs = animeDir.dir?.listFiles().orEmpty() .mapNotNull { when { // Ignore incomplete downloads it.name?.endsWith(AnimeDownloader.TMP_DIR_SUFFIX) == true -> null // Folder of videos it.isDirectory -> it.name // MP4 files it.isFile && it.extension == "mp4" -> it.nameWithoutExtension // MKV files it.isFile && it.extension == "mkv" -> it.nameWithoutExtension // Anything else is irrelevant else -> null } } .toMutableSet() animeDir.episodeDirs = episodeDirs } } } .awaitAll() rootDownloadsDir = updatedRootDir } _isInitializing.emit(false) }.also { it.invokeOnCompletion(onCancelling = true) { exception -> if (exception != null && exception !is CancellationException) { logcat(LogPriority.ERROR, exception) { "Failed to create download cache" } } lastRenew = System.currentTimeMillis() notifyChanges() } } // Mainly to notify the indexing notifier UI notifyChanges() } private fun getSources(): List { return sourceManager.getOnlineSources() + sourceManager.getStubSources() } private fun notifyChanges() { scope.launchNonCancellable { _changes.send(Unit) } updateDiskCache() } private var updateDiskCacheJob: Job? = null private fun updateDiskCache() { updateDiskCacheJob?.cancel() updateDiskCacheJob = scope.launchIO { delay(1000) ensureActive() val bytes = ProtoBuf.encodeToByteArray(rootDownloadsDir) ensureActive() try { diskCacheFile.writeBytes(bytes) } catch (e: Throwable) { logcat( priority = LogPriority.ERROR, throwable = e, message = { "Failed to write disk cache file" }, ) } } } } /** * Class to store the files under the root downloads directory. */ @Serializable private class RootDirectory( @Serializable(with = UniFileAsStringSerializer::class) val dir: UniFile?, var sourceDirs: Map = mapOf(), ) /** * Class to store the files under a source directory. */ @Serializable private class SourceDirectory( @Serializable(with = UniFileAsStringSerializer::class) val dir: UniFile?, var animeDirs: Map = mapOf(), ) /** * Class to store the files under a manga directory. */ @Serializable private class AnimeDirectory( @Serializable(with = UniFileAsStringSerializer::class) val dir: UniFile?, var episodeDirs: MutableSet = mutableSetOf(), ) private object UniFileAsStringSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("UniFile", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: UniFile?) { return if (value == null) { encoder.encodeNull() } else { encoder.encodeString(value.uri.toString()) } } override fun deserialize(decoder: Decoder): UniFile? { return if (decoder.decodeNotNullMark()) { UniFile.fromUri(Injekt.get(), decoder.decodeString().toUri()) } else { decoder.decodeNull() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadJob.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.content.Context import android.content.pm.ServiceInfo import android.os.Build import androidx.lifecycle.asFlow import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.WorkerParameters import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.NetworkState import eu.kanade.tachiyomi.util.system.activeNetworkState import eu.kanade.tachiyomi.util.system.networkStateFlow import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.setForegroundSafely import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import tachiyomi.domain.download.service.DownloadPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This worker is used to manage the downloader. The system can decide to stop the worker, in * which case the downloader is also stopped. It's also stopped while there's no network available. */ class AnimeDownloadJob(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val downloadManager: AnimeDownloadManager = Injekt.get() private val downloadPreferences: DownloadPreferences = Injekt.get() override suspend fun getForegroundInfo(): ForegroundInfo { val notification = applicationContext.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { setContentTitle(applicationContext.getString(R.string.download_notifier_downloader_title)) setSmallIcon(android.R.drawable.stat_sys_download) }.build() return ForegroundInfo( Notifications.ID_DOWNLOAD_EPISODE_PROGRESS, notification, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } override suspend fun doWork(): Result { var networkCheck = checkNetworkState( applicationContext.activeNetworkState(), downloadPreferences.downloadOnlyOverWifi().get(), ) var active = networkCheck && downloadManager.downloaderStart() if (!active) { return Result.failure() } setForegroundSafely() coroutineScope { combineTransform( applicationContext.networkStateFlow(), downloadPreferences.downloadOnlyOverWifi().changes(), transform = { a, b -> emit(checkNetworkState(a, b)) }, ) .onEach { networkCheck = it } .launchIn(this) } // Keep the worker running when needed while (active) { active = !isStopped && downloadManager.isRunning && networkCheck } return Result.success() } private fun checkNetworkState(state: NetworkState, requireWifi: Boolean): Boolean { return if (state.isOnline) { val noWifi = requireWifi && !state.isWifi if (noWifi) { downloadManager.downloaderStop( applicationContext.getString(R.string.download_notifier_text_only_wifi), ) } !noWifi } else { downloadManager.downloaderStop(applicationContext.getString(R.string.download_notifier_no_network)) false } } companion object { private const val TAG = "AnimeDownloader" fun start(context: Context) { val request = OneTimeWorkRequestBuilder() .addTag(TAG) .build() WorkManager.getInstance(context) .enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) } fun stop(context: Context) { WorkManager.getInstance(context) .cancelUniqueWork(TAG) } fun isRunning(context: Context): Boolean { return WorkManager.getInstance(context) .getWorkInfosForUniqueWork(TAG) .get() .let { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } } fun isRunningFlow(context: Context): Flow { return WorkManager.getInstance(context) .getWorkInfosForUniqueWorkLiveData(TAG) .asFlow() .map { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadManager.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.content.Context import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.util.size import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.runBlocking import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.source.local.entries.anime.LocalAnimeSource import tachiyomi.source.local.io.ArchiveAnime import tachiyomi.source.local.io.anime.LocalAnimeSourceFileSystem import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This class is used to manage episode downloads in the application. It must be instantiated once * and retrieved through dependency injection. You can use this class to queue new episodes or query * downloaded episodes. */ class AnimeDownloadManager( private val context: Context, private val storageManager: StorageManager = Injekt.get(), private val provider: AnimeDownloadProvider = Injekt.get(), private val cache: AnimeDownloadCache = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val sourceManager: AnimeSourceManager = Injekt.get(), private val downloadPreferences: DownloadPreferences = Injekt.get(), ) { /** * Downloader whose only task is to download episodes. */ private val downloader = AnimeDownloader(context, provider, cache, sourceManager) val isRunning: Boolean get() = downloader.isRunning /** * Queue to delay the deletion of a list of episodes until triggered. */ private val pendingDeleter = AnimeDownloadPendingDeleter(context) val queueState get() = downloader.queueState // For use by DownloadService only fun downloaderStart() = downloader.start() fun downloaderStop(reason: String? = null) = downloader.stop(reason) val isDownloaderRunning get() = AnimeDownloadJob.isRunningFlow(context) /** * Tells the downloader to begin downloads. */ fun startDownloads() { if (downloader.isRunning) return if (AnimeDownloadJob.isRunning(context)) { downloader.start() } else { AnimeDownloadJob.start(context) } } /** * Tells the downloader to pause downloads. */ fun pauseDownloads() { downloader.stop() } /** * Empties the download queue. */ fun clearQueue() { downloader.clearQueue() downloader.stop() } /** * Returns the download from queue if the episode is queued for download * else it will return null which means that the episode is not queued for download * * @param episodeId the episode to check. */ fun getQueuedDownloadOrNull(episodeId: Long): AnimeDownload? { return queueState.value.find { it.episode.id == episodeId } } fun startDownloadNow(episodeId: Long) { val existingDownload = getQueuedDownloadOrNull(episodeId) // If not in queue try to start a new download val toAdd = existingDownload ?: runBlocking { AnimeDownload.fromEpisodeId(episodeId) } ?: return queueState.value.toMutableList().apply { existingDownload?.let { remove(it) } add(0, toAdd) reorderQueue(this) } startDownloads() } /** * Reorders the download queue. * * @param downloads value to set the download queue to */ fun reorderQueue(downloads: List) { downloader.updateQueue(downloads) } /** * Tells the downloader to enqueue the given list of episodes. * * @param anime the anime of the episodes. * @param episodes the list of episodes to enqueue. * @param autoStart whether to start the downloader after enqueuing the episodes. * @param alt whether to use the alternative downloader */ fun downloadEpisodes( anime: Anime, episodes: List, autoStart: Boolean = true, alt: Boolean = false, video: Video? = null, ) { val filteredEpisodes = getEpisodesToDownload(episodes) downloader.queueEpisodes(anime, filteredEpisodes, autoStart, alt, video) } /** * Tells the downloader to enqueue the given list of downloads at the start of the queue. * * @param downloads the list of downloads to enqueue. */ fun addDownloadsToStartOfQueue(downloads: List) { if (downloads.isEmpty()) return queueState.value.toMutableList().apply { addAll(0, downloads) reorderQueue(this) } if (!AnimeDownloadJob.isRunning(context)) startDownloads() } /** * Builds the page list of a downloaded episode. * * @param source the source of the episode. * @param anime the anime of the episode. * @param episode the downloaded episode. * @return an observable containing the list of pages from the episode. */ fun buildVideo(source: AnimeSource, anime: Anime, episode: Episode): Video { val episodeDir = provider.findEpisodeDir(episode.name, episode.scanlator, anime.title, source) val files = episodeDir?.listFiles().orEmpty() .filter { "video" in it.type.orEmpty() } if (files.isEmpty()) { throw Exception(context.stringResource(AYMR.strings.video_list_empty_error)) } val file = files[0] return Video( videoUrl = file.uri.toString(), videoTitle = "download: " + file.uri.toString(), initialized = true, ).apply { status = Video.State.READY } } /** * Returns true if the episode is downloaded. * * @param episodeName the name of the episode to query. * @param episodeScanlator scanlator of the episode to query * @param animeTitle the title of the anime to query. * @param sourceId the id of the source of the episode. * @param skipCache whether to skip the directory cache and check in the filesystem. */ fun isEpisodeDownloaded( episodeName: String, episodeScanlator: String?, animeTitle: String, sourceId: Long, skipCache: Boolean = false, ): Boolean { return cache.isEpisodeDownloaded( episodeName, episodeScanlator, animeTitle, sourceId, skipCache, ) } /** * Returns the amount of downloaded episodes. */ fun getDownloadCount(): Int { return cache.getTotalDownloadCount() } /** * Returns the amount of downloaded/local episodes for an anime. * * @param anime the anime to check. */ fun getDownloadCount(anime: Anime): Int { return if (anime.source == LocalAnimeSource.ID) { LocalAnimeSourceFileSystem(storageManager).getFilesInAnimeDirectory(anime.url) .count { ArchiveAnime.isSupported(it) } } else { cache.getDownloadCount(anime) } } /** * Returns the size of downloaded episodes. */ fun getDownloadSize(): Long { return cache.getTotalDownloadSize() } /** * Returns the size of downloaded/local episodes for an anime. * * @param anime the anime to check. */ fun getDownloadSize(anime: Anime): Long { return if (anime.source == LocalAnimeSource.ID) { LocalAnimeSourceFileSystem(storageManager).getAnimeDirectory(anime.url) ?.size() ?: 0L } else { cache.getDownloadSize(anime) } } fun cancelQueuedDownloads(downloads: List) { removeFromDownloadQueue(downloads.map { it.episode }) } /** * Deletes the directories of a list of downloaded episodes. * * @param episodes the list of episodes to delete. * @param anime the anime of the episodes. * @param source the source of the episodes. */ fun deleteEpisodes(episodes: List, anime: Anime, source: AnimeSource) { launchIO { val filteredEpisodes = getEpisodesToDelete(episodes, anime) if (filteredEpisodes.isEmpty()) { return@launchIO } removeFromDownloadQueue(filteredEpisodes) val (animeDir, episodeDirs) = provider.findEpisodeDirs( filteredEpisodes, anime, source, ) episodeDirs.forEach { it.delete() } cache.removeEpisodes(filteredEpisodes, anime) // Delete anime directory if empty if (animeDir?.listFiles()?.isEmpty() == true) { deleteAnime(anime, source, removeQueued = false) } } } /** * Deletes the directory of a downloaded anime. * * @param anime the anime to delete. * @param source the source of the anime. * @param removeQueued whether to also remove queued downloads. */ fun deleteAnime(anime: Anime, source: AnimeSource, removeQueued: Boolean = true) { launchIO { if (removeQueued) { downloader.removeFromQueue(anime) } provider.findAnimeDir(anime.title, source)?.delete() cache.removeAnime(anime) // Delete source directory if empty val sourceDir = provider.findSourceDir(source) if (sourceDir?.listFiles()?.isEmpty() == true) { sourceDir.delete() cache.removeSource(source) } } } private fun removeFromDownloadQueue(episodes: List) { val wasRunning = downloader.isRunning if (wasRunning) { downloader.pause() } downloader.removeFromQueue(episodes) if (wasRunning) { if (queueState.value.isEmpty()) { downloader.stop() } else if (queueState.value.isNotEmpty()) { downloader.start() } } } /** * Adds a list of episodes to be deleted later. * * @param episodes the list of episodes to delete. * @param anime the anime of the episodes. */ suspend fun enqueueEpisodesToDelete(episodes: List, anime: Anime) { pendingDeleter.addEpisodes(getEpisodesToDelete(episodes, anime), anime) } /** * Triggers the execution of the deletion of pending episodes. */ fun deletePendingEpisodes() { val pendingEpisodes = pendingDeleter.getPendingEpisodes() for ((anime, episodes) in pendingEpisodes) { val source = sourceManager.get(anime.source) ?: continue deleteEpisodes(episodes, anime, source) } } /** * Renames source download folder * * @param oldSource the old source. * @param newSource the new source. */ fun renameSource(oldSource: AnimeSource, newSource: AnimeSource) { val oldFolder = provider.findSourceDir(oldSource) ?: return val newName = provider.getSourceDirName(newSource) if (oldFolder.name == newName) return val capitalizationChanged = oldFolder.name.equals(newName, ignoreCase = true) if (capitalizationChanged) { val tempName = newName + AnimeDownloader.TMP_DIR_SUFFIX if (!oldFolder.renameTo(tempName)) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } return } } if (!oldFolder.renameTo(newName)) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } } } /** * Renames an already downloaded episode * * @param source the source of the anime. * @param anime the anime of the episode. * @param oldEpisode the existing episode with the old name. * @param newEpisode the target episode with the new name. */ suspend fun renameEpisode(source: AnimeSource, anime: Anime, oldEpisode: Episode, newEpisode: Episode) { val oldNames = provider.getValidEpisodeDirNames(oldEpisode.name, oldEpisode.scanlator) val animeDir = provider.getAnimeDir(anime.title, source) // Assume there's only 1 version of the episode name formats present val oldFolder = oldNames.asSequence() .mapNotNull { animeDir.findFile(it) } .firstOrNull() val newName = provider.getEpisodeDirName(newEpisode.name, newEpisode.scanlator) if (oldFolder?.name == newName) return if (oldFolder?.renameTo(newName) == true) { cache.removeEpisode(oldEpisode, anime) cache.addEpisode(newName, animeDir, anime) } else { logcat(LogPriority.ERROR) { "Could not rename downloaded episode: ${oldNames.joinToString()}" } } } private suspend fun getEpisodesToDelete(episodes: List, anime: Anime): List { // Retrieve the categories that are set to exclude from being deleted on read val categoriesToExclude = downloadPreferences.removeExcludeAnimeCategories().get().map(String::toLong) val categoriesForAnime = getCategories.await(anime.id) .map { it.id } .ifEmpty { listOf(0) } val filteredCategoryAnime = if (categoriesForAnime.intersect(categoriesToExclude).isNotEmpty()) { episodes.filterNot { it.seen } } else { episodes } return if (!downloadPreferences.removeBookmarkedChapters().get()) { filteredCategoryAnime.filterNot { it.bookmark } } else { filteredCategoryAnime } } private fun getEpisodesToDownload(episodes: List): List { return if (!downloadPreferences.downloadFillermarkedItems().get()) { episodes.filterNot { it.fillermark } } else { episodes } } fun statusFlow(): Flow = queueState .flatMapLatest { downloads -> downloads .map { download -> download.statusFlow.drop(1).map { download } } .merge() } .onStart { emitAll( queueState.value.filter { download -> download.status == AnimeDownload.State.DOWNLOADING } .asFlow(), ) } fun progressFlow(): Flow = queueState .flatMapLatest { downloads -> downloads .map { download -> download.progressFlow.drop(1).map { download } } .merge() } .onStart { emitAll( queueState.value.filter { download -> download.status == AnimeDownload.State.DOWNLOADING } .asFlow(), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadNotifier.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.app.PendingIntent import android.content.Context import android.graphics.BitmapFactory import androidx.core.app.NotificationCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import java.util.regex.Pattern /** * DownloadNotifier is used to show notifications when downloading one or multiple chapters. * * @param context context of application */ internal class AnimeDownloadNotifier(private val context: Context) { private val preferences: SecurityPreferences by injectLazy() private val progressNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)) setAutoCancel(false) setOnlyAlertOnce(true) } } private val errorNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_ERROR) { setAutoCancel(false) } } /** * Status of download. Used for correct notification icon. */ private var isDownloading = false /** * Shows a notification from this builder. * * @param id the id of the notification. */ private fun NotificationCompat.Builder.show(id: Int) { context.notify(id, build()) } /** * Dismiss the downloader's notification. Downloader error notifications use a different id, so * those can only be dismissed by the user. */ fun dismissProgress() { context.notificationManager.cancel(Notifications.ID_DOWNLOAD_EPISODE_PROGRESS) } /** * Called when download progress changes. * * @param download download object containing download information. */ fun onProgressChange(download: AnimeDownload) { with(progressNotificationBuilder) { if (!isDownloading) { setSmallIcon(android.R.drawable.stat_sys_download) clearActions() // Open download manager when clicked setContentIntent( NotificationHandler.openAnimeDownloadManagerPendingActivity(context), ) isDownloading = true // Pause action addAction( R.drawable.ic_pause_24dp, context.stringResource(AYMR.strings.action_stop), NotificationReceiver.pauseAnimeDownloadsPendingBroadcast(context), ) addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_show_anime), NotificationReceiver.openAnimeEntryPendingActivity(context, download.anime.id), ) } val downloadingProgressText = if (download.progress == 0) { context.stringResource(MR.strings.update_check_notification_download_in_progress) } else { context.stringResource(AYMR.strings.episode_downloading_progress, download.progress) } if (preferences.hideNotificationContent().get()) { setContentTitle(downloadingProgressText) setContentText(null) } else { val title = download.anime.title.chop(15) val quotedTitle = Pattern.quote(title) val episode = download.episode.name.replaceFirst( "$quotedTitle[\\s]*[-]*[\\s]*".toRegex(RegexOption.IGNORE_CASE), "", ) setContentTitle("$title - $episode".chop(30)) setContentText(downloadingProgressText) } if (download.progress == 0) { setProgress(100, download.progress, true) } else { setProgress(100, download.progress, false) } setOngoing(true) show(Notifications.ID_DOWNLOAD_EPISODE_PROGRESS) } } /** * Show notification when download is paused. */ fun onPaused() { with(progressNotificationBuilder) { setContentTitle(context.stringResource(AYMR.strings.download_paused)) setContentText(context.stringResource(AYMR.strings.download_notifier_download_paused_episodes)) setSmallIcon(R.drawable.ic_pause_24dp) setProgress(0, 0, false) setOngoing(false) clearActions() // Open download manager when clicked setContentIntent(NotificationHandler.openAnimeDownloadManagerPendingActivity(context)) // Resume action addAction( R.drawable.ic_play_arrow_24dp, context.stringResource(MR.strings.action_resume), NotificationReceiver.resumeAnimeDownloadsPendingBroadcast(context), ) // Clear action addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel_all), NotificationReceiver.clearAnimeDownloadsPendingBroadcast(context), ) show(Notifications.ID_DOWNLOAD_EPISODE_PROGRESS) } // Reset initial values isDownloading = false } /** * Resets the state once downloads are completed. */ fun onComplete() { dismissProgress() // Reset states to default isDownloading = false } /** * Called when the downloader receives a warning. * * @param reason the text to show. * @param timeout duration after which to automatically dismiss the notification. * @param animeId the id of the entry being warned about */ fun onWarning(reason: String, timeout: Long? = null, contentIntent: PendingIntent? = null, animeId: Long? = null) { with(errorNotificationBuilder) { setContentTitle(context.stringResource(MR.strings.download_notifier_downloader_title)) setStyle(NotificationCompat.BigTextStyle().bigText(reason)) setSmallIcon(R.drawable.ic_warning_white_24dp) setAutoCancel(true) clearActions() setContentIntent(NotificationHandler.openAnimeDownloadManagerPendingActivity(context)) if (animeId != null) { addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_show_anime), NotificationReceiver.openAnimeEntryPendingActivity(context, animeId), ) } setProgress(0, 0, false) timeout?.let { setTimeoutAfter(it) } contentIntent?.let { setContentIntent(it) } show(Notifications.ID_DOWNLOAD_EPISODE_ERROR) } // Reset download information isDownloading = false } /** * Called when the downloader receives an error. It's shown as a separate notification to avoid * being overwritten. * * @param error string containing error information. * @param episode string containing episode title. * @param animeId the id of the entry that the error occurred on */ fun onError(error: String? = null, episode: String? = null, animeTitle: String? = null, animeId: Long? = null) { // Create notification with(errorNotificationBuilder) { setContentTitle( animeTitle?.plus(": $episode") ?: context.stringResource( MR.strings.download_notifier_downloader_title, ), ) setContentText(error ?: context.stringResource(MR.strings.download_notifier_unknown_error)) setSmallIcon(R.drawable.ic_warning_white_24dp) clearActions() setContentIntent(NotificationHandler.openAnimeDownloadManagerPendingActivity(context)) if (animeId != null) { addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_show_anime), NotificationReceiver.openAnimeEntryPendingActivity(context, animeId), ) } setProgress(0, 0, false) show(Notifications.ID_DOWNLOAD_EPISODE_ERROR) } // Reset download information isDownloading = false } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadPendingDeleter.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.content.Context import androidx.core.content.edit import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * Class used to keep a list of episodes for future deletion. * * @param context the application context. */ class AnimeDownloadPendingDeleter( context: Context, private val json: Json = Injekt.get(), ) { /** * Preferences used to store the list of episodes to delete. */ private val preferences = context.getSharedPreferences( "episodes_to_delete", Context.MODE_PRIVATE, ) /** * Last added episode, used to avoid decoding from the preference too often. */ private var lastAddedEntry: Entry? = null /** * Adds a list of episodes for future deletion. * * @param episodes the episodes to be deleted. * @param anime the anime of the episodes. */ @Synchronized fun addEpisodes(episodes: List, anime: Anime) { val lastEntry = lastAddedEntry val newEntry = if (lastEntry != null && lastEntry.anime.id == anime.id) { // Append new episodes val newEpisodes = lastEntry.episodes.addUniqueById(episodes) // If no episodes were added, do nothing if (newEpisodes.size == lastEntry.episodes.size) return // Last entry matches the anime, reuse it to avoid decoding json from preferences lastEntry.copy(episodes = newEpisodes) } else { val existingEntry = preferences.getString(anime.id.toString(), null) if (existingEntry != null) { // Existing entry found on preferences, decode json and add the new episode val savedEntry = json.decodeFromString(existingEntry) // Append new episodes val newEpisodes = savedEntry.episodes.addUniqueById(episodes) // If no episodes were added, do nothing if (newEpisodes.size == savedEntry.episodes.size) return savedEntry.copy(episodes = newEpisodes) } else { // No entry has been found yet, create a new one Entry(episodes.map { it.toEntry() }, anime.toEntry()) } } // Save current state val json = json.encodeToString(newEntry) preferences.edit { putString(newEntry.anime.id.toString(), json) } lastAddedEntry = newEntry } /** * Returns the list of episodes to be deleted grouped by its anime. * * Note: the returned list of anime and episodes only contain basic information needed by the * downloader, so don't use them for anything else. */ @Synchronized fun getPendingEpisodes(): Map> { val entries = decodeAll() preferences.edit { clear() } lastAddedEntry = null return entries.associate { (episodes, anime) -> anime.toModel() to episodes.map { it.toModel() } } } /** * Decodes all the episodes from preferences. */ private fun decodeAll(): List { return preferences.all.values.mapNotNull { rawEntry -> try { (rawEntry as? String)?.let { json.decodeFromString(it) } } catch (e: Exception) { null } } } /** * Returns a copy of episode entries ensuring no duplicates by episode id. */ private fun List.addUniqueById(episodes: List): List { val newList = toMutableList() for (episode in episodes) { if (none { it.id == episode.id }) { newList.add(episode.toEntry()) } } return newList } /** * Returns a anime entry from a anime model. */ private fun Anime.toEntry() = AnimeEntry(id, url, title, source) /** * Returns a episode entry from a episode model. */ private fun Episode.toEntry() = EpisodeEntry(id, url, name, scanlator) /** * Returns a anime model from a anime entry. */ private fun AnimeEntry.toModel() = Anime.create().copy( url = url, title = title, source = source, id = id, ) /** * Returns a episode model from a episode entry. */ private fun EpisodeEntry.toModel() = Episode.create().copy( id = id, url = url, name = name, scanlator = scanlator, ) /** * Class used to save an entry of episodes with their anime into preferences. */ @Serializable private data class Entry( val episodes: List, val anime: AnimeEntry, ) /** * Class used to save an entry for an episode into preferences. */ @Serializable private data class EpisodeEntry( val id: Long, val url: String, val name: String, val scanlator: String? = null, ) /** * Class used to save an entry for an anime into preferences. */ @Serializable private data class AnimeEntry( val id: Long, val url: String, val title: String, val source: Long, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadProvider.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.content.Context import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.util.storage.DiskUtil import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.displayablePath import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This class is used to provide the directories where the downloads should be saved. * It uses the following path scheme: //// * * @param context the application context. */ class AnimeDownloadProvider( private val context: Context, private val storageManager: StorageManager = Injekt.get(), ) { private val downloadsDir: UniFile? get() = storageManager.getDownloadsDirectory() /** * Returns the download directory for an anime. For internal use only. * * @param animeTitle the title of the anime to query. * @param source the source of the anime. */ internal fun getAnimeDir(animeTitle: String, source: AnimeSource): UniFile { try { return downloadsDir!! .createDirectory(getSourceDirName(source))!! .createDirectory(getAnimeDirName(animeTitle))!! } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Invalid download directory" } throw Exception( context.stringResource( MR.strings.invalid_location, downloadsDir?.displayablePath ?: "", ), ) } } /** * Returns the download directory for a source if it exists. * * @param source the source to query. */ fun findSourceDir(source: AnimeSource): UniFile? { return downloadsDir?.findFile(getSourceDirName(source)) } /** * Returns the download directory for an anime if it exists. * * @param animeTitle the title of the anime to query. * @param source the source of the anime. */ fun findAnimeDir(animeTitle: String, source: AnimeSource): UniFile? { val sourceDir = findSourceDir(source) return sourceDir?.findFile(getAnimeDirName(animeTitle)) } /** * Returns the download directory for an episode if it exists. * * @param episodeName the name of the episode to query. * @param episodeScanlator scanlator of the episode to query * @param animeTitle the title of the anime to query. * @param source the source of the episode. */ fun findEpisodeDir( episodeName: String, episodeScanlator: String?, animeTitle: String, source: AnimeSource, ): UniFile? { val animeDir = findAnimeDir(animeTitle, source) return getValidEpisodeDirNames(episodeName, episodeScanlator).asSequence() .mapNotNull { animeDir?.findFile(it) } .firstOrNull() } /** * Returns a list of downloaded directories for the episodes that exist. * * @param episodes the episodes to query. * @param anime the anime of the episode. * @param source the source of the episode. */ fun findEpisodeDirs(episodes: List, anime: Anime, source: AnimeSource): Pair> { val animeDir = findAnimeDir(anime.title, source) ?: return null to emptyList() return animeDir to episodes.mapNotNull { episode -> getValidEpisodeDirNames(episode.name, episode.scanlator).asSequence() .mapNotNull { animeDir.findFile(it) } .firstOrNull() } } /** * Returns the download directory name for a source. * * @param source the source to query. */ fun getSourceDirName(source: AnimeSource): String { return DiskUtil.buildValidFilename(source.toString()) } /** * Returns the download directory name for an anime. * * @param animeTitle the title of the anime to query. */ fun getAnimeDirName(animeTitle: String): String { return DiskUtil.buildValidFilename(animeTitle) } /** * Returns the episode directory name for an episode. * * @param episodeName the name of the episode to query. * @param episodeScanlator scanlator of the episode to query */ fun getEpisodeDirName(episodeName: String, episodeScanlator: String?): String { val newEpisodeName = sanitizeEpisodeName(episodeName) return DiskUtil.buildValidFilename( when { !episodeScanlator.isNullOrBlank() -> "${episodeScanlator}_$newEpisodeName" else -> newEpisodeName }, ) } /** * Return the new name for the episode (in case it's empty or blank) * * @param episodeName the name of the episode */ private fun sanitizeEpisodeName(episodeName: String): String { return episodeName.ifBlank { "Episode" } } /** * Returns the episode directory name for an episode. * * @param episodeName the name of the episode to query. * @param episodeScanlator scanlator of the episode to query */ fun getOldEpisodeDirName(episodeName: String, episodeScanlator: String?): String { return DiskUtil.buildValidFilename( when { episodeScanlator != null -> "${episodeScanlator}_$episodeName" else -> episodeName }, ) } fun isEpisodeDirNameChanged(oldEpisode: Episode, newEpisode: Episode): Boolean { return oldEpisode.name != newEpisode.name || oldEpisode.scanlator?.takeIf { it.isNotBlank() } != newEpisode.scanlator?.takeIf { it.isNotBlank() } } /** * Returns valid downloaded episode directory names. * * @param episodeName the name of the episode to query. * @param episodeScanlator scanlator of the episode to query */ fun getValidEpisodeDirNames(episodeName: String, episodeScanlator: String?): List { val episodeDirName = getEpisodeDirName(episodeName, episodeScanlator) val oldEpisodeDirName = getOldEpisodeDirName(episodeName, episodeScanlator) return listOf(episodeDirName, oldEpisodeDirName) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadStore.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.content.Context import androidx.core.content.edit import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.interactor.GetEpisode import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This class is used to persist active downloads across application restarts. */ class AnimeDownloadStore( context: Context, private val sourceManager: AnimeSourceManager = Injekt.get(), private val json: Json = Injekt.get(), private val getAnime: GetAnime = Injekt.get(), private val getEpisode: GetEpisode = Injekt.get(), ) { /** * Preference file where active downloads are stored. */ private val preferences = context.getSharedPreferences("active_downloads", Context.MODE_PRIVATE) /** * Counter used to keep the queue order. */ private var counter = 0 /** * Adds a list of downloads to the store. * * @param downloads the list of downloads to add. */ fun addAll(downloads: List) { preferences.edit { downloads.forEach { putString(getKey(it), serialize(it)) } } } /** * Removes a download from the store. * * @param download the download to remove. */ fun remove(download: AnimeDownload) { preferences.edit { remove(getKey(download)) } } /** * Removes a list of downloads from the store. * * @param downloads the download to remove. */ fun removeAll(downloads: List) { preferences.edit { downloads.forEach { remove(getKey(it)) } } } /** * Removes all the downloads from the store. */ fun clear() { preferences.edit { clear() } } /** * Returns the preference's key for the given download. * * @param download the download. */ private fun getKey(download: AnimeDownload): String { return download.episode.id.toString() } /** * Returns the list of downloads to restore. It should be called in a background thread. */ fun restore(): List { val objs = preferences.all .mapNotNull { it.value as? String } .mapNotNull { deserialize(it) } .sortedBy { it.order } val downloads = mutableListOf() if (objs.isNotEmpty()) { val cachedAnime = mutableMapOf() for ((animeId, episodeId) in objs) { val anime = cachedAnime.getOrPut(animeId) { runBlocking { getAnime.await(animeId) } } ?: continue val source = sourceManager.get(anime.source) as? AnimeHttpSource ?: continue val episode = runBlocking { getEpisode.await(episodeId) } ?: continue downloads.add(AnimeDownload(source, anime, episode)) } } // Clear the store, downloads will be added again immediately. clear() return downloads } /** * Converts a download to a string. * * @param download the download to serialize. */ private fun serialize(download: AnimeDownload): String { val obj = AnimeDownloadObject(download.anime.id, download.episode.id!!, counter++) return json.encodeToString(obj) } /** * Restore a download from a string. * * @param string the download as string. */ private fun deserialize(string: String): AnimeDownloadObject? { return try { json.decodeFromString(string) } catch (e: Exception) { null } } } /** * Class used for download serialization * * @param animeId the id of the anime. * @param episodeId the id of the episode. * @param order the order of the download in the queue. */ @Serializable private data class AnimeDownloadObject(val animeId: Long, val episodeId: Long, val order: Int) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt ================================================ package eu.kanade.tachiyomi.data.download.anime import android.content.ComponentName import android.content.Context import android.content.Intent import android.os.Bundle import androidx.core.net.toUri import com.arthenica.ffmpegkit.FFmpegKit import com.arthenica.ffmpegkit.FFmpegKitConfig import com.arthenica.ffmpegkit.FFprobeKit import com.arthenica.ffmpegkit.Level import com.arthenica.ffmpegkit.LogCallback import com.arthenica.ffmpegkit.LogRedirectionStrategy import com.arthenica.ffmpegkit.StatisticsCallback import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.animesource.UnmeteredSource import eu.kanade.tachiyomi.animesource.model.Track import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateNotifier import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.ui.player.loader.EpisodeLoader import eu.kanade.tachiyomi.ui.player.loader.HosterLoader import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.toFFmpegString import eu.kanade.tachiyomi.util.system.copyToClipboard import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.async import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.retryWhen import kotlinx.coroutines.flow.transformLatest import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope import kotlinx.coroutines.suspendCancellableCoroutine import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.extension import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException /** * This class is the one in charge of downloading episodes. * * Its queue contains the list of episodes to download. In order to download them, the downloader * subscription must be running and the list of episodes must be sent to them by [downloaderJob]. * * The queue manipulation must be done in one thread (currently the main thread) to avoid unexpected * behavior, but it's safe to read it from multiple threads. */ class AnimeDownloader( private val context: Context, private val provider: AnimeDownloadProvider, private val cache: AnimeDownloadCache, private val sourceManager: AnimeSourceManager = Injekt.get(), ) { /** * Store for persisting downloads across restarts. */ private val store = AnimeDownloadStore(context) /** * Queue where active downloads are kept. */ private val _queueState = MutableStateFlow>(emptyList()) val queueState = _queueState.asStateFlow() /** * Notifier for the downloader state and progress. */ private val notifier by lazy { AnimeDownloadNotifier(context) } /** * Coroutine scope used for download job scheduling */ private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) /** * Job object for download queue management */ private var downloaderJob: Job? = null /** * Preference for user's choice of external downloader */ private val preferences: DownloadPreferences by injectLazy() /** * Whether the downloader is running. */ val isRunning: Boolean get() = downloaderJob?.isActive ?: false init { scope.launch { val episodes = async { store.restore() } addAllToQueue(episodes.await()) } } /** * Starts the downloader. It doesn't do anything if it's already running or there isn't anything * to download. * * @return true if the downloader is started, false otherwise. */ fun start(): Boolean { if (isRunning || queueState.value.isEmpty()) { return false } val pending = queueState.value.filter { it.status != AnimeDownload.State.DOWNLOADED } pending.forEach { if (it.status != AnimeDownload.State.QUEUE) it.status = AnimeDownload.State.QUEUE } launchDownloaderJob() return pending.isNotEmpty() } /** * Stops the downloader. */ fun stop(reason: String? = null) { cancelDownloaderJob() queueState.value .filter { it.status == AnimeDownload.State.DOWNLOADING } .forEach { it.status = AnimeDownload.State.ERROR } if (reason != null) { notifier.onWarning(reason) return } if (queueState.value.isNotEmpty()) { notifier.onPaused() } else { notifier.onComplete() } AnimeDownloadJob.stop(context) } /** * Pauses the downloader */ fun pause() { cancelDownloaderJob() queueState.value .filter { it.status == AnimeDownload.State.DOWNLOADING } .forEach { it.status = AnimeDownload.State.QUEUE } } /** * Removes everything from the queue. */ fun clearQueue() { cancelDownloaderJob() internalClearQueue() notifier.dismissProgress() } /** * Prepares the jobs to start downloading. */ private fun launchDownloaderJob() { if (isRunning) return downloaderJob = scope.launch { val activeDownloadsFlow = queueState.transformLatest { queue -> while (true) { val activeDownloads = queue.asSequence() .filter { it.status.value <= AnimeDownload.State.DOWNLOADING.value } // Ignore completed downloads, leave them in the queue .groupBy { it.source } .toList().take(3) // Concurrently download from 5 different sources .map { (_, downloads) -> downloads.first() } emit(activeDownloads) if (activeDownloads.isEmpty()) break // Suspend until a download enters the ERROR state val activeDownloadsErroredFlow = combine(activeDownloads.map(AnimeDownload::statusFlow)) { states -> states.contains(AnimeDownload.State.ERROR) }.filter { it } activeDownloadsErroredFlow.first() } if (areAllAnimeDownloadsFinished()) stop() }.distinctUntilChanged() // Use supervisorScope to cancel child jobs when the downloader job is cancelled supervisorScope { val downloadJobs = mutableMapOf() activeDownloadsFlow.collectLatest { activeDownloads -> val downloadJobsToStop = downloadJobs.filter { it.key !in activeDownloads } downloadJobsToStop.forEach { (download, job) -> job.cancel() downloadJobs.remove(download) } val downloadsToStart = activeDownloads.filter { it !in downloadJobs } downloadsToStart.forEach { download -> downloadJobs[download] = launchDownloadJob(download) } } } } } /** * Launch the job responsible for download a single video */ private fun CoroutineScope.launchDownloadJob(download: AnimeDownload) = launchIO { // This try-catch manages the job cancellation try { downloadEpisode(download) // Remove successful download from queue if (download.status == AnimeDownload.State.DOWNLOADED) { removeFromQueue(download) } } catch (e: Throwable) { if (e is CancellationException) throw e logcat(LogPriority.ERROR, e) notifier.onError(e.message) stop() } } /** * Destroys the downloader subscriptions. */ private fun cancelDownloaderJob() { downloaderJob?.cancel() downloaderJob = null } /** * Creates a download object for every episode and adds them to the downloads queue. * * @param anime the anime of the episodes to download. * @param episodes the list of episodes to download. * @param autoStart whether to start the downloader after enqueing the episodes. */ fun queueEpisodes( anime: Anime, episodes: List, autoStart: Boolean, changeDownloader: Boolean = false, video: Video? = null, ) { if (episodes.isEmpty()) return val source = sourceManager.get(anime.source) as? AnimeHttpSource ?: return val wasEmpty = queueState.value.isEmpty() val episodesToQueue = episodes.asSequence() // Filter out those already downloaded. .filter { provider.findEpisodeDir(it.name, it.scanlator, anime.title, source) == null } // Add episodes to queue from the start. .sortedByDescending { it.sourceOrder } // Filter out those already enqueued. .filter { episode -> queueState.value.none { it.episode.id == episode.id } } // Create a download for each one. .map { AnimeDownload(source, anime, it, changeDownloader, video) } .toList() if (episodesToQueue.isNotEmpty()) { addAllToQueue(episodesToQueue) // Start downloader if needed if (autoStart && wasEmpty) { val queuedDownloads = queueState.value.count { it: AnimeDownload -> it.source !is UnmeteredSource } val maxDownloadsFromSource = queueState.value .groupBy { it.source } .filterKeys { it !is UnmeteredSource } .maxOfOrNull { it.value.size } ?: 0 // TODO: show warnings in stable if ( queuedDownloads > DOWNLOADS_QUEUED_WARNING_THRESHOLD || maxDownloadsFromSource > EPISODES_PER_SOURCE_QUEUE_WARNING_THRESHOLD ) { notifier.onWarning( context.stringResource(AYMR.strings.download_queue_size_warning), WARNING_NOTIF_TIMEOUT_MS, NotificationHandler.openUrl( context, AnimeLibraryUpdateNotifier.HELP_WARNING_URL, ), ) } AnimeDownloadJob.start(context) } } } /** * Download the video associated with download object * * @param download the episode to be downloaded. */ private suspend fun downloadEpisode(download: AnimeDownload) { val animeDir = provider.getAnimeDir(download.anime.title, download.source) val availSpace = DiskUtil.getAvailableStorageSpace(animeDir) if (availSpace != -1L && availSpace < MIN_DISK_SPACE) { download.status = AnimeDownload.State.ERROR notifier.onError( context.stringResource(AYMR.strings.download_insufficient_space), download.episode.name, download.anime.title, download.anime.id, ) return } val episodeDirname = provider.getEpisodeDirName(download.episode.name, download.episode.scanlator) val tmpDir = animeDir.createDirectory(episodeDirname + TMP_DIR_SUFFIX)!! try { if (download.video == null) { // Pull video from network and add them to download object val hosters = EpisodeLoader.getHosters(download.episode, download.anime, download.source) if (hosters.isEmpty()) { throw Exception(context.stringResource(AYMR.strings.video_list_empty_error)) } val bestVideo = HosterLoader.getBestVideo(download.source, hosters) ?: throw Exception(context.stringResource(AYMR.strings.video_list_empty_error)) download.video = bestVideo } withIOContext { getOrDownloadVideoFile(download, tmpDir) } if (!isDownloadSuccessful(download, tmpDir)) { download.status = AnimeDownload.State.ERROR return } val filename = DiskUtil.buildValidFilename("${download.anime.title} - ${download.episode.name}") tmpDir.findFile("${filename}_tmp.mkv")?.delete() tmpDir.renameTo(episodeDirname) cache.addEpisode(episodeDirname, animeDir, download.anime) DiskUtil.createNoMediaFile(tmpDir, context) download.status = AnimeDownload.State.DOWNLOADED } catch (error: Throwable) { if (error is CancellationException) throw error // If the video threw, it will resume here logcat(LogPriority.ERROR, error) download.status = AnimeDownload.State.ERROR notifier.onError( error.message, download.episode.name, download.anime.title, download.anime.id, ) } } /** * Gets the video file if already downloaded, otherwise downloads it * * @param download the download of the video. * @param tmpDir the temporary directory of the download. */ private suspend fun getOrDownloadVideoFile( download: AnimeDownload, tmpDir: UniFile, ) { val video = download.video!! video.status = Video.State.LOAD_VIDEO var progressJob: Job? = null // Get filename from download info val filename = DiskUtil.buildValidFilename(download.episode.name) // Delete temp file if it exists tmpDir.findFile("$filename.tmp")?.delete() // Try to find the video file val videoFile = tmpDir.listFiles()?.firstOrNull { it.name!!.startsWith("$filename.mkv") } try { // If the video is already downloaded, do nothing. Otherwise download from network val file = when { videoFile != null -> videoFile else -> { notifier.onProgressChange(download) download.status = AnimeDownload.State.DOWNLOADING download.progress = 0 // If videoFile is not existing then download it if (preferences.useExternalDownloader().get() == download.changeDownloader) { progressJob = scope.launch { while (download.status == AnimeDownload.State.DOWNLOADING) { delay(50) notifier.onProgressChange(download) } } downloadVideo(download, tmpDir, filename) } else { val betterFileName = DiskUtil.buildValidFilename( "${download.anime.title} - ${download.episode.name}", ) downloadVideoExternal(download.video!!, download.source, tmpDir, betterFileName) } } } video.videoUrl = file.uri.path ?: "" download.progress = 100 video.status = Video.State.READY progressJob?.cancel() } catch (e: Exception) { if (e is CancellationException) throw e video.status = Video.State.ERROR notifier.onError(e.message, download.episode.name, download.anime.title, download.anime.id) progressJob?.cancel() } } /** * Define a retry routine in order to accommodate some errors that can be raised * * @param download the download reference * @param tmpDir the directory where placing the file * @param filename the name to give to download file */ private suspend fun downloadVideo( download: AnimeDownload, tmpDir: UniFile, filename: String, ): UniFile { return flow { tmpDir.findFile("$filename.tmp")?.delete() val videoFile = tmpDir.createFile("$filename.tmp")!! try { ffmpegDownload(download, tmpDir, videoFile, filename) } catch (e: Exception) { videoFile.delete() throw e } emit(videoFile) } // Retry 3 times, waiting 2, 4 and 8 seconds between attempts. .retryWhen { _, attempt -> if (attempt < 3) { delay((2L shl attempt.toInt()) * 1000) true } else { false } } .flowOn(Dispatchers.IO) .first() } // ffmpeg is always on safe mode private suspend fun ffmpegDownload( download: AnimeDownload, tmpDir: UniFile, videoFile: UniFile, filename: String, ) { val video = download.video!! val ffmpegFilename = { videoFile.uri.toFFmpegString(context) } val headers = video.headers ?: download.source.headers val headerOptions = headers.joinToString("", "-headers '", "'") { "${it.first}: ${it.second}\r\n" } FFmpegKitConfig.setLogRedirectionStrategy(LogRedirectionStrategy.ALWAYS_PRINT_LOGS) val ffmpegOptions = getFFmpegOptions(video, headerOptions, ffmpegFilename()) val ffprobeCommand = { file: String, ffprobeHeaders: String? -> FFmpegKitConfig.parseArguments( "${ffprobeHeaders?.plus(" ") ?: ""}-v quiet -show_entries " + "format=duration -of default=noprint_wrappers=1:nokey=1 \"$file\"", ) } var duration = 0L val logCallback = LogCallback { log -> if (log.level <= Level.AV_LOG_WARNING) { log.message?.let { logcat(LogPriority.ERROR) { it } } } } val statCallback = StatisticsCallback { s -> val outTime = (s.time / 1000.0).toLong() if (duration != 0L && outTime > 0) { download.progress = (100 * outTime / duration).toInt() } } duration = getDuration(ffprobeCommand(video.videoUrl, headerOptions))?.toLong() ?: 0L suspendCancellableCoroutine { continuation -> val session = FFmpegKit.executeWithArgumentsAsync( ffmpegOptions, { if (it.returnCode.isValueSuccess) { tmpDir.findFile("$filename.tmp")?.apply { renameTo("$filename.mkv") } continuation.resume(it) } else { continuation.resumeWithException(Exception("Error in ffmpeg!")) } }, logCallback, statCallback, ) continuation.invokeOnCancellation { session.cancel() } } } private fun getFFmpegOptions(video: Video, headerOptions: String, ffmpegFilename: String): Array { fun formatInputs(tracks: List) = tracks.joinToString(" ", postfix = " ") { buildList { if (it.url.startsWith("http")) { add(headerOptions) } add("-i") add("\"${it.url}\"") }.joinToString(" ") } fun formatMaps(tracks: List, type: String, offset: Int = 0) = tracks.indices.joinToString(" ") { "-map ${it + 1 + offset}:$type" } fun formatMetadata(tracks: List, type: String) = tracks.mapIndexed { i, track -> "-metadata:s:$type:$i \"title=${track.lang}\"" }.joinToString(" ") val subtitleInputs = formatInputs(video.subtitleTracks) val subtitleMaps = formatMaps(video.subtitleTracks, "s") val subtitleMetadata = formatMetadata(video.subtitleTracks, "s") val audioInputs = formatInputs(video.audioTracks) val audioMaps = formatMaps(video.audioTracks, "a", video.subtitleTracks.size) val audioMetadata = formatMetadata(video.audioTracks, "a") val sourceStreamOptions = video.ffmpegStreamArgs.joinToString(" ") { (key, value) -> "-$key \"$value\"" } val sourceVideoOptions = video.ffmpegVideoArgs.joinToString(" ") { (key, value) -> "-$key \"$value\"" } val videoInput = buildList { if (video.videoUrl.startsWith("http")) { add(headerOptions) } add(sourceStreamOptions) add("-i") add("\"${video.videoUrl}\"") }.joinToString(" ") val command = listOf( videoInput, subtitleInputs, audioInputs, "-map 0:v", audioMaps, "-map 0:a?", subtitleMaps, "-map 0:s? -map 0:t?", "-f matroska -c:a copy -c:v copy -c:s copy", subtitleMetadata, audioMetadata, sourceVideoOptions, "\"$ffmpegFilename\" -y", ) .filter(String::isNotBlank) .joinToString(" ") return FFmpegKitConfig.parseArguments(command) } private suspend fun getDuration(ffprobeCommand: Array): Float? { return suspendCancellableCoroutine { continuation -> val session = FFprobeKit.executeWithArgumentsAsync(ffprobeCommand) { if (it.returnCode.isValueSuccess) { continuation.resume(it) } else { continuation.resumeWithException(Exception(it.output)) } } continuation.invokeOnCancellation { session.cancel() } }.output.toFloatOrNull() } /** * Returns the observable which downloads the video with an external downloader. * * @param video the video to download. * @param source the source of the video. * @param tmpDir the temporary directory of the download. * @param filename the filename of the video. */ private suspend fun downloadVideoExternal( video: Video, source: AnimeHttpSource, tmpDir: UniFile, filename: String, ): UniFile { try { val file = tmpDir.createFile("${filename}_tmp.mkv")!! withUIContext { context.copyToClipboard("Episode download location", tmpDir.filePath!!.substringBeforeLast("_tmp")) } // TODO: support other file formats!! // start download with intent val pm = context.packageManager val pkgName = preferences.externalDownloaderSelection().get() val intent: Intent if (pkgName.isNotEmpty()) { intent = pm.getLaunchIntentForPackage(pkgName) ?: throw Exception( "Launch intent not found", ) when { // 1DM pkgName.startsWith("idm.internet.download.manager") -> { val headers = (video.headers ?: source.headers).toMap() val bundle = Bundle() for ((key, value) in headers) { bundle.putString(key, value) } intent.apply { component = ComponentName( pkgName, "idm.internet.download.manager.Downloader", ) action = Intent.ACTION_VIEW data = video.videoUrl.toUri() putExtra("extra_filename", "$filename.mkv") putExtra("extra_headers", bundle) } } // ADM pkgName.startsWith("com.dv.adm") -> { val headers = (video.headers ?: source.headers).toList() val bundle = Bundle() headers.forEach { a -> bundle.putString( a.first, a.second.replace("http", "h_ttp"), ) } intent.apply { component = ComponentName(pkgName, "$pkgName.AEditor") action = Intent.ACTION_VIEW putExtra( "com.dv.get.ACTION_LIST_ADD", "${video.videoUrl.toUri()}$filename.mkv", ) putExtra( "com.dv.get.ACTION_LIST_PATH", tmpDir.filePath!!.substringBeforeLast("_"), ) putExtra("android.media.intent.extra.HTTP_HEADERS", bundle) } file.delete() tmpDir.delete() queueState.value.find { anime -> anime.video == video }?.let { download -> download.status = AnimeDownload.State.DOWNLOADED // Delete successful downloads from queue if (download.status == AnimeDownload.State.DOWNLOADED) { // Remove downloaded episode from queue removeFromQueue(download) } if (areAllAnimeDownloadsFinished()) { stop() } } } } } else { intent = Intent(Intent.ACTION_VIEW).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) setDataAndType(video.videoUrl.toUri(), "video/*") putExtra("extra_filename", filename) } } context.startActivity(intent) return file } catch (e: Exception) { tmpDir.findFile("${filename}_tmp.mkv")?.delete() throw e } } /** * Checks if the download was successful. * * @param download the download to check. * @param tmpDir the directory where the download is currently stored. */ private fun isDownloadSuccessful( download: AnimeDownload, tmpDir: UniFile, ): Boolean { val downloadedVideo = tmpDir.listFiles().orEmpty().filterNot { it.extension == ".tmp" } return downloadedVideo.size == 1 } /** * Checks if the download was successful. * * @param download the download to check. * @param animeDir the anime directory of the download. * @param tmpDir the directory where the download is currently stored. * @param dirname the real (non temporary) directory name of the download. */ private suspend fun ensureSuccessfulAnimeDownload( download: AnimeDownload, animeDir: UniFile, tmpDir: UniFile, dirname: String, ) { // Ensure that the episode folder has the full video val downloadedVideo = tmpDir.listFiles().orEmpty().filterNot { it.extension == ".tmp" } download.status = if (downloadedVideo.size == 1) { // Only rename the directory if it's downloaded val filename = DiskUtil.buildValidFilename("${download.anime.title} - ${download.episode.name}") tmpDir.findFile("${filename}_tmp.mkv")?.delete() tmpDir.renameTo(dirname) cache.addEpisode(dirname, animeDir, download.anime) DiskUtil.createNoMediaFile(tmpDir, context) AnimeDownload.State.DOWNLOADED } else { throw Exception("Unable to finalize download") } } /** * Returns true if all the queued downloads are in DOWNLOADED or ERROR state. */ private fun areAllAnimeDownloadsFinished(): Boolean { return queueState.value.none { it.status.value <= AnimeDownload.State.DOWNLOADING.value } } private fun addAllToQueue(downloads: List) { _queueState.update { downloads.forEach { download -> download.status = AnimeDownload.State.QUEUE } store.addAll(downloads) it + downloads } } private fun removeFromQueue(download: AnimeDownload) { _queueState.update { store.remove(download) if (download.status == AnimeDownload.State.DOWNLOADING || download.status == AnimeDownload.State.QUEUE) { download.status = AnimeDownload.State.NOT_DOWNLOADED } it - download } } private inline fun removeFromQueueIf(predicate: (AnimeDownload) -> Boolean) { _queueState.update { queue -> val downloads = queue.filter { predicate(it) } store.removeAll(downloads) downloads.forEach { download -> if (download.status == AnimeDownload.State.DOWNLOADING || download.status == AnimeDownload.State.QUEUE ) { download.status = AnimeDownload.State.NOT_DOWNLOADED } } queue - downloads.toSet() } } fun removeFromQueue(episodes: List) { val episodeIds = episodes.map { it.id } removeFromQueueIf { it.episode.id in episodeIds } } fun removeFromQueue(anime: Anime) { removeFromQueueIf { it.anime.id == anime.id } } private fun internalClearQueue() { _queueState.update { it.forEach { download -> if (download.status == AnimeDownload.State.DOWNLOADING || download.status == AnimeDownload.State.QUEUE ) { download.status = AnimeDownload.State.NOT_DOWNLOADED } } store.clear() emptyList() } } fun updateQueue(downloads: List) { if (queueState == downloads) return if (downloads.isEmpty()) { clearQueue() stop() return } val wasRunning = isRunning pause() internalClearQueue() addAllToQueue(downloads) if (wasRunning) { start() } } companion object { const val TMP_DIR_SUFFIX = "_tmp" const val WARNING_NOTIF_TIMEOUT_MS = 30_000L const val EPISODES_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 10 private const val DOWNLOADS_QUEUED_WARNING_THRESHOLD = 20 } } // Arbitrary minimum required space to start a download: 200 MB private const val MIN_DISK_SPACE = 200L * 1024 * 1024 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/model/AnimeDownload.kt ================================================ package eu.kanade.tachiyomi.data.download.anime.model import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.network.ProgressListener import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.interactor.GetEpisode import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get data class AnimeDownload( val source: AnimeHttpSource, val anime: Anime, val episode: Episode, val changeDownloader: Boolean = false, var video: Video? = null, ) : ProgressListener { @Transient private val _statusFlow = MutableStateFlow(State.NOT_DOWNLOADED) @Transient val statusFlow = _statusFlow.asStateFlow() var status: State get() = _statusFlow.value set(status) { _statusFlow.value = status } @Transient private val progressStateFlow = MutableStateFlow(0) @Transient val progressFlow = progressStateFlow.asStateFlow() var progress: Int get() = progressStateFlow.value set(value) { progressStateFlow.value = value } /** * Updates the status of the download * * @param bytesRead the updated TOTAL number of bytes read (not a partial increment) * @param contentLength the updated content length * @param done whether progress has completed or not */ override fun update(bytesRead: Long, contentLength: Long, done: Boolean) { val newProgress = if (contentLength > 0) { (100 * bytesRead / contentLength).toInt() } else { -1 } if (progress != newProgress) progress = newProgress } enum class State(val value: Int) { NOT_DOWNLOADED(0), QUEUE(1), DOWNLOADING(2), DOWNLOADED(3), ERROR(4), } companion object { suspend fun fromEpisodeId( episodeId: Long, getEpisode: GetEpisode = Injekt.get(), getAnimeById: GetAnime = Injekt.get(), sourceManager: AnimeSourceManager = Injekt.get(), ): AnimeDownload? { val episode = getEpisode.await(episodeId) ?: return null val anime = getAnimeById.await(episode.animeId) ?: return null val source = sourceManager.get(anime.source) as? AnimeHttpSource ?: return null return AnimeDownload(source, anime, episode) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/anime/model/AnimeDownloadPart.kt ================================================ package eu.kanade.tachiyomi.data.download.anime.model import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.network.ProgressListener import okhttp3.Request /** * This class contains all data needed to manage the download of a http range download part */ class AnimeDownloadPart( placingDir: UniFile, range: Pair, ) { /** * Directory where to place the download file */ private val placingDir: UniFile /** * The download file */ private var _file: UniFile? = null /** * The range of bytes this part covers */ var range: Pair init { this.range = range this.placingDir = placingDir } /** * If the download of this part has been completed or not */ @Volatile var completed: Boolean = false /** * Retrieve a valid download file (creates one if there isn't yet one) */ var file: UniFile get() { if (_file == null) { _file = placingDir.createFile("${range.first}.part.tmp")!! } return _file!! } set(value) { _file = value } /** * If present it the request of the not yet downloaded bytes range */ var request: Request? = null var listener: ProgressListener? = null } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadCache.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.app.Application import android.content.Context import androidx.core.net.toUri import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.util.size import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encodeToByteArray import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.protobuf.ProtoBuf import logcat.LogPriority import tachiyomi.core.common.storage.extension import tachiyomi.core.common.storage.nameWithoutExtension import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.storage.service.StorageManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.seconds /** * Cache where we dump the downloads directory from the filesystem. This class is needed because * directory checking is expensive and it slows down the app. The cache is invalidated by the time * defined in [renewInterval] as we don't have any control over the filesystem and the user can * delete the folders at any time without the app noticing. */ class MangaDownloadCache( private val context: Context, private val provider: MangaDownloadProvider = Injekt.get(), private val sourceManager: MangaSourceManager = Injekt.get(), private val extensionManager: MangaExtensionManager = Injekt.get(), private val storageManager: StorageManager = Injekt.get(), ) { private val scope = CoroutineScope(Dispatchers.IO) private val _changes: Channel = Channel(Channel.UNLIMITED) val changes = _changes.receiveAsFlow() .onStart { emit(Unit) } .shareIn(scope, SharingStarted.Lazily, 1) /** * The interval after which this cache should be invalidated. 1 hour shouldn't cause major * issues, as the cache is only used for UI feedback. */ private val renewInterval = 1.hours.inWholeMilliseconds /** * The last time the cache was refreshed. */ private var lastRenew = 0L private var renewalJob: Job? = null private val _isInitializing = MutableStateFlow(false) val isInitializing = _isInitializing .debounce(1000L) // Don't notify if it finishes quickly enough .stateIn(scope, SharingStarted.WhileSubscribed(), false) private val diskCacheFile: File get() = File(context.cacheDir, "dl_index_cache_v3") private val rootDownloadsDirMutex = Mutex() private var rootDownloadsDir = RootDirectory(storageManager.getDownloadsDirectory()) init { // Attempt to read cache file scope.launch { rootDownloadsDirMutex.withLock { try { if (diskCacheFile.exists()) { val diskCache = diskCacheFile.inputStream().use { ProtoBuf.decodeFromByteArray(it.readBytes()) } rootDownloadsDir = diskCache lastRenew = System.currentTimeMillis() } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Failed to initialize from disk cache" } diskCacheFile.delete() } } } storageManager.changes .onEach { invalidateCache() } .launchIn(scope) } /** * Returns true if the chapter is downloaded. * * @param chapterName the name of the chapter to query. * @param chapterScanlator scanlator of the chapter to query * @param mangaTitle the title of the manga to query. * @param sourceId the id of the source of the chapter. * @param skipCache whether to skip the directory cache and check in the filesystem. */ fun isChapterDownloaded( chapterName: String, chapterScanlator: String?, mangaTitle: String, sourceId: Long, skipCache: Boolean, ): Boolean { if (skipCache) { val source = sourceManager.getOrStub(sourceId) return provider.findChapterDir( chapterName, chapterScanlator, mangaTitle, source, ) != null } renewCache() val sourceDir = rootDownloadsDir.sourceDirs[sourceId] if (sourceDir != null) { val mangaDir = sourceDir.mangaDirs[provider.getMangaDirName(mangaTitle)] if (mangaDir != null) { return provider.getValidChapterDirNames(chapterName, chapterScanlator) .any { it in mangaDir.chapterDirs } } } return false } /** * Returns the amount of downloaded chapters. */ fun getTotalDownloadCount(): Int { renewCache() return rootDownloadsDir.sourceDirs.values.sumOf { sourceDir -> sourceDir.mangaDirs.values.sumOf { mangaDir -> mangaDir.chapterDirs.size } } } /** * Returns the amount of downloaded chapters for a manga. * * @param manga the manga to check. */ fun getDownloadCount(manga: Manga): Int { renewCache() val sourceDir = rootDownloadsDir.sourceDirs[manga.source] if (sourceDir != null) { val mangaDir = sourceDir.mangaDirs[provider.getMangaDirName(manga.title)] if (mangaDir != null) { return mangaDir.chapterDirs.size } } return 0 } /** * Returns the total size of downloaded chapters. */ fun getTotalDownloadSize(): Long { renewCache() return rootDownloadsDir.sourceDirs.values.sumOf { sourceDir -> sourceDir.dir?.size() ?: 0L } } /** * Returns the total size of downloaded chapters for a manga. * * @param manga the manga to check. */ fun getDownloadSize(manga: Manga): Long { renewCache() return rootDownloadsDir.sourceDirs[manga.source]?.mangaDirs?.get( provider.getMangaDirName( manga.title, ), )?.dir?.size() ?: 0 } /** * Adds a chapter that has just been download to this cache. * * @param chapterDirName the downloaded chapter's directory name. * @param mangaUniFile the directory of the manga. * @param manga the manga of the chapter. */ suspend fun addChapter(chapterDirName: String, mangaUniFile: UniFile, manga: Manga) { rootDownloadsDirMutex.withLock { // Retrieve the cached source directory or cache a new one var sourceDir = rootDownloadsDir.sourceDirs[manga.source] if (sourceDir == null) { val source = sourceManager.get(manga.source) ?: return val sourceUniFile = provider.findSourceDir(source) ?: return sourceDir = SourceDirectory(sourceUniFile) rootDownloadsDir.sourceDirs += manga.source to sourceDir } // Retrieve the cached manga directory or cache a new one val mangaDirName = provider.getMangaDirName(manga.title) var mangaDir = sourceDir.mangaDirs[mangaDirName] if (mangaDir == null) { mangaDir = MangaDirectory(mangaUniFile) sourceDir.mangaDirs += mangaDirName to mangaDir } // Save the chapter directory mangaDir.chapterDirs += chapterDirName } notifyChanges() } /** * Removes a chapter that has been deleted from this cache. * * @param chapter the chapter to remove. * @param manga the manga of the chapter. */ suspend fun removeChapter(chapter: Chapter, manga: Manga) { rootDownloadsDirMutex.withLock { val sourceDir = rootDownloadsDir.sourceDirs[manga.source] ?: return val mangaDir = sourceDir.mangaDirs[provider.getMangaDirName(manga.title)] ?: return provider.getValidChapterDirNames(chapter.name, chapter.scanlator).forEach { if (it in mangaDir.chapterDirs) { mangaDir.chapterDirs -= it } } } notifyChanges() } /** * Removes a list of chapters that have been deleted from this cache. * * @param chapters the list of chapter to remove. * @param manga the manga of the chapter. */ suspend fun removeChapters(chapters: List, manga: Manga) { rootDownloadsDirMutex.withLock { val sourceDir = rootDownloadsDir.sourceDirs[manga.source] ?: return val mangaDir = sourceDir.mangaDirs[provider.getMangaDirName(manga.title)] ?: return chapters.forEach { chapter -> provider.getValidChapterDirNames(chapter.name, chapter.scanlator).forEach { if (it in mangaDir.chapterDirs) { mangaDir.chapterDirs -= it } } } } notifyChanges() } /** * Removes a manga that has been deleted from this cache. * * @param manga the manga to remove. */ suspend fun removeManga(manga: Manga) { rootDownloadsDirMutex.withLock { val sourceDir = rootDownloadsDir.sourceDirs[manga.source] ?: return val mangaDirName = provider.getMangaDirName(manga.title) if (sourceDir.mangaDirs.containsKey(mangaDirName)) { sourceDir.mangaDirs -= mangaDirName } } notifyChanges() } suspend fun removeSource(source: MangaSource) { rootDownloadsDirMutex.withLock { rootDownloadsDir.sourceDirs -= source.id } notifyChanges() } fun invalidateCache() { lastRenew = 0L renewalJob?.cancel() diskCacheFile.delete() renewCache() } /** * Renews the downloads cache. */ private fun renewCache() { // Avoid renewing cache if in the process nor too often if (lastRenew + renewInterval >= System.currentTimeMillis() || renewalJob?.isActive == true) { return } renewalJob = scope.launchIO { if (lastRenew == 0L) { _isInitializing.emit(true) } // Try to wait until extensions and sources have loaded var sources = emptyList() withTimeoutOrNull(30.seconds) { extensionManager.isInitialized.first { it } sourceManager.isInitialized.first { it } sources = getSources() } val sourceMap = sources.associate { provider.getSourceDirName(it).lowercase() to it.id } rootDownloadsDirMutex.withLock { val updatedRootDir = RootDirectory(storageManager.getDownloadsDirectory()) updatedRootDir.sourceDirs = updatedRootDir.dir?.listFiles().orEmpty() .filter { it.isDirectory && !it.name.isNullOrBlank() } .mapNotNull { dir -> val sourceId = sourceMap[dir.name!!.lowercase()] sourceId?.let { it to SourceDirectory(dir) } } .toMap() updatedRootDir.sourceDirs.values.map { sourceDir -> async { sourceDir.mangaDirs = sourceDir.dir?.listFiles().orEmpty() .filter { it.isDirectory && !it.name.isNullOrBlank() } .associate { it.name!! to MangaDirectory(it) } sourceDir.mangaDirs.values.forEach { mangaDir -> val chapterDirs = mangaDir.dir?.listFiles().orEmpty() .mapNotNull { when { // Ignore incomplete downloads it.name?.endsWith(MangaDownloader.TMP_DIR_SUFFIX) == true -> null // Folder of images it.isDirectory -> it.name // CBZ files it.isFile && it.extension == "cbz" -> it.nameWithoutExtension // Anything else is irrelevant else -> null } } .toMutableSet() mangaDir.chapterDirs = chapterDirs } } } .awaitAll() rootDownloadsDir = updatedRootDir } _isInitializing.emit(false) }.also { it.invokeOnCompletion(onCancelling = true) { exception -> if (exception != null && exception !is CancellationException) { logcat(LogPriority.ERROR, exception) { "DownloadCache: failed to create cache" } } lastRenew = System.currentTimeMillis() notifyChanges() } } // Mainly to notify the indexing notifier UI notifyChanges() } private fun getSources(): List { return sourceManager.getOnlineSources() + sourceManager.getStubSources() } private fun notifyChanges() { scope.launchNonCancellable { _changes.send(Unit) } updateDiskCache() } private var updateDiskCacheJob: Job? = null private fun updateDiskCache() { updateDiskCacheJob?.cancel() updateDiskCacheJob = scope.launchIO { delay(1000) ensureActive() val bytes = ProtoBuf.encodeToByteArray(rootDownloadsDir) ensureActive() try { diskCacheFile.writeBytes(bytes) } catch (e: Throwable) { logcat( priority = LogPriority.ERROR, throwable = e, message = { "Failed to write disk cache file" }, ) } } } } /** * Class to store the files under the root downloads directory. */ @Serializable private class RootDirectory( @Serializable(with = UniFileAsStringSerializer::class) val dir: UniFile?, var sourceDirs: Map = mapOf(), ) /** * Class to store the files under a source directory. */ @Serializable private class SourceDirectory( @Serializable(with = UniFileAsStringSerializer::class) val dir: UniFile?, var mangaDirs: Map = mapOf(), ) /** * Class to store the files under a manga directory. */ @Serializable private class MangaDirectory( @Serializable(with = UniFileAsStringSerializer::class) val dir: UniFile?, var chapterDirs: MutableSet = mutableSetOf(), ) private object UniFileAsStringSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("UniFile", PrimitiveKind.STRING) override fun serialize(encoder: Encoder, value: UniFile?) { return if (value == null) { encoder.encodeNull() } else { encoder.encodeString(value.uri.toString()) } } override fun deserialize(decoder: Decoder): UniFile? { return if (decoder.decodeNotNullMark()) { UniFile.fromUri(Injekt.get(), decoder.decodeString().toUri()) } else { decoder.decodeNull() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadJob.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.content.Context import android.content.pm.ServiceInfo import android.os.Build import androidx.lifecycle.asFlow import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.WorkerParameters import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.NetworkState import eu.kanade.tachiyomi.util.system.activeNetworkState import eu.kanade.tachiyomi.util.system.networkStateFlow import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.setForegroundSafely import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import tachiyomi.domain.download.service.DownloadPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This worker is used to manage the downloader. The system can decide to stop the worker, in * which case the downloader is also stopped. It's also stopped while there's no network available. */ class MangaDownloadJob(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val downloadManager: MangaDownloadManager = Injekt.get() private val downloadPreferences: DownloadPreferences = Injekt.get() override suspend fun getForegroundInfo(): ForegroundInfo { val notification = applicationContext.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { setContentTitle(applicationContext.getString(R.string.download_notifier_downloader_title)) setSmallIcon(android.R.drawable.stat_sys_download) }.build() return ForegroundInfo( Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS, notification, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } override suspend fun doWork(): Result { var networkCheck = checkNetworkState( applicationContext.activeNetworkState(), downloadPreferences.downloadOnlyOverWifi().get(), ) var active = networkCheck && downloadManager.downloaderStart() if (!active) { return Result.failure() } setForegroundSafely() coroutineScope { combineTransform( applicationContext.networkStateFlow(), downloadPreferences.downloadOnlyOverWifi().changes(), transform = { a, b -> emit(checkNetworkState(a, b)) }, ) .onEach { networkCheck = it } .launchIn(this) } // Keep the worker running when needed while (active) { active = !isStopped && downloadManager.isRunning && networkCheck } return Result.success() } private fun checkNetworkState(state: NetworkState, requireWifi: Boolean): Boolean { return if (state.isOnline) { val noWifi = requireWifi && !state.isWifi if (noWifi) { downloadManager.downloaderStop( applicationContext.getString(R.string.download_notifier_text_only_wifi), ) } !noWifi } else { downloadManager.downloaderStop(applicationContext.getString(R.string.download_notifier_no_network)) false } } companion object { private const val TAG = "MangaDownloader" fun start(context: Context) { val request = OneTimeWorkRequestBuilder() .addTag(TAG) .build() WorkManager.getInstance(context) .enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) } fun stop(context: Context) { WorkManager.getInstance(context) .cancelUniqueWork(TAG) } fun isRunning(context: Context): Boolean { return WorkManager.getInstance(context) .getWorkInfosForUniqueWork(TAG) .get() .let { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } } fun isRunningFlow(context: Context): Flow { return WorkManager.getInstance(context) .getWorkInfosForUniqueWorkLiveData(TAG) .asFlow() .map { list -> list.count { it.state == WorkInfo.State.RUNNING } == 1 } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadManager.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.content.Context import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.util.size import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.runBlocking import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.extension import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import tachiyomi.source.local.entries.manga.LocalMangaSource import tachiyomi.source.local.io.ArchiveManga import tachiyomi.source.local.io.manga.LocalMangaSourceFileSystem import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This class is used to manage chapter downloads in the application. It must be instantiated once * and retrieved through dependency injection. You can use this class to queue new chapters or query * downloaded chapters. */ class MangaDownloadManager( private val context: Context, private val storageManager: StorageManager = Injekt.get(), private val provider: MangaDownloadProvider = Injekt.get(), private val cache: MangaDownloadCache = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val sourceManager: MangaSourceManager = Injekt.get(), private val downloadPreferences: DownloadPreferences = Injekt.get(), ) { /** * Downloader whose only task is to download chapters. */ private val downloader = MangaDownloader(context, provider, cache) val isRunning: Boolean get() = downloader.isRunning /** * Queue to delay the deletion of a list of chapters until triggered. */ private val pendingDeleter = MangaDownloadPendingDeleter(context) val queueState get() = downloader.queueState // For use by DownloadService only fun downloaderStart() = downloader.start() fun downloaderStop(reason: String? = null) = downloader.stop(reason) val isDownloaderRunning get() = MangaDownloadJob.isRunningFlow(context) /** * Tells the downloader to begin downloads. */ fun startDownloads() { if (downloader.isRunning) return if (MangaDownloadJob.isRunning(context)) { downloader.start() } else { MangaDownloadJob.start(context) } } /** * Tells the downloader to pause downloads. */ fun pauseDownloads() { downloader.pause() downloader.stop() } /** * Empties the download queue. */ fun clearQueue() { downloader.clearQueue() downloader.stop() } /** * Returns the download from queue if the chapter is queued for download * else it will return null which means that the chapter is not queued for download * * @param chapterId the chapter to check. */ fun getQueuedDownloadOrNull(chapterId: Long): MangaDownload? { return queueState.value.find { it.chapter.id == chapterId } } fun startDownloadNow(chapterId: Long) { val existingDownload = getQueuedDownloadOrNull(chapterId) // If not in queue try to start a new download val toAdd = existingDownload ?: runBlocking { MangaDownload.fromChapterId(chapterId) } ?: return queueState.value.toMutableList().apply { existingDownload?.let { remove(it) } add(0, toAdd) reorderQueue(this) } startDownloads() } /** * Reorders the download queue. * * @param downloads value to set the download queue to */ fun reorderQueue(downloads: List) { downloader.updateQueue(downloads) } /** * Tells the downloader to enqueue the given list of chapters. * * @param manga the manga of the chapters. * @param chapters the list of chapters to enqueue. * @param autoStart whether to start the downloader after enqueing the chapters. */ fun downloadChapters(manga: Manga, chapters: List, autoStart: Boolean = true) { downloader.queueChapters(manga, chapters, autoStart) } /** * Tells the downloader to enqueue the given list of downloads at the start of the queue. * * @param downloads the list of downloads to enqueue. */ fun addDownloadsToStartOfQueue(downloads: List) { if (downloads.isEmpty()) return queueState.value.toMutableList().apply { addAll(0, downloads) reorderQueue(this) } if (!MangaDownloadJob.isRunning(context)) startDownloads() } /** * Builds the page list of a downloaded chapter. * * @param source the source of the chapter. * @param manga the manga of the chapter. * @param chapter the downloaded chapter. * @return the list of pages from the chapter. */ fun buildPageList(source: MangaSource, manga: Manga, chapter: Chapter): List { val chapterDir = provider.findChapterDir( chapter.name, chapter.scanlator, manga.title, source, ) val files = chapterDir?.listFiles().orEmpty() .filter { it.isFile && ImageUtil.isImage(it.name) { it.openInputStream() } } if (files.isEmpty()) { throw Exception(context.stringResource(MR.strings.page_list_empty_error)) } return files.sortedBy { it.name } .mapIndexed { i, file -> Page(i, uri = file.uri).apply { status = Page.State.READY } } } /** * Returns true if the chapter is downloaded. * * @param chapterName the name of the chapter to query. * @param chapterScanlator scanlator of the chapter to query * @param mangaTitle the title of the manga to query. * @param sourceId the id of the source of the chapter. * @param skipCache whether to skip the directory cache and check in the filesystem. */ fun isChapterDownloaded( chapterName: String, chapterScanlator: String?, mangaTitle: String, sourceId: Long, skipCache: Boolean = false, ): Boolean { return cache.isChapterDownloaded( chapterName, chapterScanlator, mangaTitle, sourceId, skipCache, ) } /** * Returns the amount of downloaded chapters. */ fun getDownloadCount(): Int { return cache.getTotalDownloadCount() } /** * Returns the amount of downloaded/local chapters for a manga. * * @param manga the manga to check. */ fun getDownloadCount(manga: Manga): Int { return if (manga.source == LocalMangaSource.ID) { LocalMangaSourceFileSystem(storageManager).getFilesInMangaDirectory(manga.url) .count { it.isDirectory || ArchiveManga.isSupported(it) } } else { cache.getDownloadCount(manga) } } /** * Returns the size of downloaded chapters. */ fun getDownloadSize(): Long { return cache.getTotalDownloadSize() } /** * Returns the size of downloaded/local episodes for an manga. * * @param manga the manga to check. */ fun getDownloadSize(manga: Manga): Long { return if (manga.source == LocalMangaSource.ID) { LocalMangaSourceFileSystem(storageManager).getMangaDirectory(manga.url) ?.size() ?: 0L } else { cache.getDownloadSize(manga) } } fun cancelQueuedDownloads(downloads: List) { removeFromDownloadQueue(downloads.map { it.chapter }) } /** * Deletes the directories of a list of downloaded chapters. * * @param chapters the list of chapters to delete. * @param manga the manga of the chapters. * @param source the source of the chapters. */ fun deleteChapters(chapters: List, manga: Manga, source: MangaSource) { launchIO { val filteredChapters = getChaptersToDelete(chapters, manga) if (filteredChapters.isEmpty()) { return@launchIO } removeFromDownloadQueue(filteredChapters) val (mangaDir, chapterDirs) = provider.findChapterDirs(filteredChapters, manga, source) chapterDirs.forEach { it.delete() } cache.removeChapters(filteredChapters, manga) // Delete manga directory if empty if (mangaDir?.listFiles()?.isEmpty() == true) { deleteManga(manga, source, removeQueued = false) } } } /** * Deletes the directory of a downloaded manga. * * @param manga the manga to delete. * @param source the source of the manga. * @param removeQueued whether to also remove queued downloads. */ fun deleteManga(manga: Manga, source: MangaSource, removeQueued: Boolean = true) { launchIO { if (removeQueued) { downloader.removeFromQueue(manga) } provider.findMangaDir(manga.title, source)?.delete() cache.removeManga(manga) // Delete source directory if empty val sourceDir = provider.findSourceDir(source) if (sourceDir?.listFiles()?.isEmpty() == true) { sourceDir.delete() cache.removeSource(source) } } } private fun removeFromDownloadQueue(chapters: List) { val wasRunning = downloader.isRunning if (wasRunning) { downloader.pause() } downloader.removeFromQueue(chapters) if (wasRunning) { if (queueState.value.isEmpty()) { downloader.stop() } else if (queueState.value.isNotEmpty()) { downloader.start() } } } /** * Adds a list of chapters to be deleted later. * * @param chapters the list of chapters to delete. * @param manga the manga of the chapters. */ suspend fun enqueueChaptersToDelete(chapters: List, manga: Manga) { pendingDeleter.addChapters(getChaptersToDelete(chapters, manga), manga) } /** * Triggers the execution of the deletion of pending chapters. */ fun deletePendingChapters() { val pendingChapters = pendingDeleter.getPendingChapters() for ((manga, chapters) in pendingChapters) { val source = sourceManager.get(manga.source) ?: continue deleteChapters(chapters, manga, source) } } /** * Renames source download folder * * @param oldSource the old source. * @param newSource the new source. */ fun renameSource(oldSource: MangaSource, newSource: MangaSource) { val oldFolder = provider.findSourceDir(oldSource) ?: return val newName = provider.getSourceDirName(newSource) if (oldFolder.name == newName) return val capitalizationChanged = oldFolder.name.equals(newName, ignoreCase = true) if (capitalizationChanged) { val tempName = newName + MangaDownloader.TMP_DIR_SUFFIX if (!oldFolder.renameTo(tempName)) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } return } } if (!oldFolder.renameTo(newName)) { logcat(LogPriority.ERROR) { "Failed to rename source download folder: ${oldFolder.name}" } } } /** * Renames an already downloaded chapter * * @param source the source of the manga. * @param manga the manga of the chapter. * @param oldChapter the existing chapter with the old name. * @param newChapter the target chapter with the new name. */ suspend fun renameChapter( source: MangaSource, manga: Manga, oldChapter: Chapter, newChapter: Chapter, ) { val oldNames = provider.getValidChapterDirNames(oldChapter.name, oldChapter.scanlator) val mangaDir = provider.getMangaDir(manga.title, source) // Assume there's only 1 version of the chapter name formats present val oldDownload = oldNames.asSequence() .mapNotNull { mangaDir.findFile(it) } .firstOrNull() ?: return var newName = provider.getChapterDirName(newChapter.name, newChapter.scanlator) if (oldDownload.isFile && oldDownload.extension == "cbz") { newName += ".cbz" } if (oldDownload.name == newName) return if (oldDownload.renameTo(newName)) { cache.removeChapter(oldChapter, manga) cache.addChapter(newName, mangaDir, manga) } else { logcat(LogPriority.ERROR) { "Could not rename downloaded chapter: ${oldNames.joinToString()}" } } } private suspend fun getChaptersToDelete(chapters: List, manga: Manga): List { // Retrieve the categories that are set to exclude from being deleted on read val categoriesToExclude = downloadPreferences.removeExcludeCategories().get().map( String::toLong, ) val categoriesForManga = getCategories.await(manga.id) .map { it.id } .ifEmpty { listOf(0) } val filteredCategoryManga = if (categoriesForManga.intersect(categoriesToExclude).isNotEmpty()) { chapters.filterNot { it.read } } else { chapters } return if (!downloadPreferences.removeBookmarkedChapters().get()) { filteredCategoryManga.filterNot { it.bookmark } } else { filteredCategoryManga } } fun statusFlow(): Flow = queueState .flatMapLatest { downloads -> downloads .map { download -> download.statusFlow.drop(1).map { download } } .merge() } .onStart { emitAll( queueState.value.filter { download -> download.status == MangaDownload.State.DOWNLOADING }.asFlow(), ) } fun progressFlow(): Flow = queueState .flatMapLatest { downloads -> downloads .map { download -> download.progressFlow.drop(1).map { download } } .merge() } .onStart { emitAll( queueState.value.filter { download -> download.status == MangaDownload.State.DOWNLOADING } .asFlow(), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadNotifier.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.app.PendingIntent import android.content.Context import android.graphics.BitmapFactory import androidx.core.app.NotificationCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import java.util.regex.Pattern /** * DownloadNotifier is used to show notifications when downloading one or multiple chapters. * * @param context context of application */ internal class MangaDownloadNotifier(private val context: Context) { private val preferences: SecurityPreferences by injectLazy() private val progressNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) { setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)) setAutoCancel(false) setOnlyAlertOnce(true) } } private val errorNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_ERROR) { setAutoCancel(false) } } /** * Status of download. Used for correct notification icon. */ private var isDownloading = false /** * Shows a notification from this builder. * * @param id the id of the notification. */ private fun NotificationCompat.Builder.show(id: Int) { context.notify(id, build()) } /** * Dismiss the downloader's notification. Downloader error notifications use a different id, so * those can only be dismissed by the user. */ fun dismissProgress() { context.cancelNotification(Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS) } /** * Called when download progress changes. * * @param download download object containing download information. */ fun onProgressChange(download: MangaDownload) { with(progressNotificationBuilder) { if (!isDownloading) { setSmallIcon(android.R.drawable.stat_sys_download) clearActions() // Open download manager when clicked setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) isDownloading = true // Pause action addAction( R.drawable.ic_pause_24dp, context.stringResource(MR.strings.action_pause), NotificationReceiver.pauseDownloadsPendingBroadcast(context), ) addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_show_manga), NotificationReceiver.openMangaEntryPendingActivity(context, download.manga.id), ) } val downloadingProgressText = context.stringResource( MR.strings.chapter_downloading_progress, download.downloadedImages, download.pages!!.size, ) if (preferences.hideNotificationContent().get()) { setContentTitle(downloadingProgressText) setContentText(null) } else { val title = download.manga.title.chop(15) val quotedTitle = Pattern.quote(title) val chapter = download.chapter.name.replaceFirst( "$quotedTitle[\\s]*[-]*[\\s]*".toRegex(RegexOption.IGNORE_CASE), "", ) setContentTitle("$title - $chapter".chop(30)) setContentText(downloadingProgressText) } setProgress(download.pages!!.size, download.downloadedImages, false) setOngoing(true) show(Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS) } } /** * Show notification when download is paused. */ fun onPaused() { with(progressNotificationBuilder) { setContentTitle(context.stringResource(AYMR.strings.download_paused)) setContentText(context.stringResource(AYMR.strings.download_notifier_download_paused_chapters)) setSmallIcon(R.drawable.ic_pause_24dp) setProgress(0, 0, false) setOngoing(false) clearActions() // Open download manager when clicked setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) // Resume action addAction( R.drawable.ic_play_arrow_24dp, context.stringResource(MR.strings.action_resume), NotificationReceiver.resumeDownloadsPendingBroadcast(context), ) // Clear action addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel_all), NotificationReceiver.clearDownloadsPendingBroadcast(context), ) show(Notifications.ID_DOWNLOAD_CHAPTER_PROGRESS) } // Reset initial values isDownloading = false } /** * Resets the state once downloads are completed. */ fun onComplete() { dismissProgress() // Reset states to default isDownloading = false } /** * Called when the downloader receives a warning. * * @param reason the text to show. * @param timeout duration after which to automatically dismiss the notification. * @param mangaId the id of the entry being warned about * Only works on Android 8+. */ fun onWarning(reason: String, timeout: Long? = null, contentIntent: PendingIntent? = null, mangaId: Long? = null) { with(errorNotificationBuilder) { setContentTitle(context.stringResource(MR.strings.download_notifier_downloader_title)) setStyle(NotificationCompat.BigTextStyle().bigText(reason)) setSmallIcon(R.drawable.ic_warning_white_24dp) setAutoCancel(true) clearActions() setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) if (mangaId != null) { addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_show_manga), NotificationReceiver.openMangaEntryPendingActivity(context, mangaId), ) } setProgress(0, 0, false) timeout?.let { setTimeoutAfter(it) } contentIntent?.let { setContentIntent(it) } show(Notifications.ID_DOWNLOAD_CHAPTER_ERROR) } // Reset download information isDownloading = false } /** * Called when the downloader receives an error. It's shown as a separate notification to avoid * being overwritten. * * @param error string containing error information. * @param chapter string containing chapter title. * @param mangaId the id of the entry that the error occurred on */ fun onError(error: String? = null, chapter: String? = null, mangaTitle: String? = null, mangaId: Long? = null) { // Create notification with(errorNotificationBuilder) { setContentTitle( mangaTitle?.plus(": $chapter") ?: context.stringResource( MR.strings.download_notifier_downloader_title, ), ) setContentText(error ?: context.stringResource(MR.strings.download_notifier_unknown_error)) setSmallIcon(R.drawable.ic_warning_white_24dp) clearActions() setContentIntent(NotificationHandler.openDownloadManagerPendingActivity(context)) if (mangaId != null) { addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_show_manga), NotificationReceiver.openMangaEntryPendingActivity(context, mangaId), ) } setProgress(0, 0, false) show(Notifications.ID_DOWNLOAD_CHAPTER_ERROR) } // Reset download information isDownloading = false } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadPendingDeleter.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.content.Context import androidx.core.content.edit import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * Class used to keep a list of chapters for future deletion. * * @param context the application context. */ class MangaDownloadPendingDeleter( context: Context, private val json: Json = Injekt.get(), ) { /** * Preferences used to store the list of chapters to delete. */ private val preferences = context.getSharedPreferences( "chapters_to_delete", Context.MODE_PRIVATE, ) /** * Last added chapter, used to avoid decoding from the preference too often. */ private var lastAddedEntry: Entry? = null /** * Adds a list of chapters for future deletion. * * @param chapters the chapters to be deleted. * @param manga the manga of the chapters. */ @Synchronized fun addChapters(chapters: List, manga: Manga) { val lastEntry = lastAddedEntry val newEntry = if (lastEntry != null && lastEntry.manga.id == manga.id) { // Append new chapters val newChapters = lastEntry.chapters.addUniqueById(chapters) // If no chapters were added, do nothing if (newChapters.size == lastEntry.chapters.size) return // Last entry matches the manga, reuse it to avoid decoding json from preferences lastEntry.copy(chapters = newChapters) } else { val existingEntry = preferences.getString(manga.id.toString(), null) if (existingEntry != null) { // Existing entry found on preferences, decode json and add the new chapter val savedEntry = json.decodeFromString(existingEntry) // Append new chapters val newChapters = savedEntry.chapters.addUniqueById(chapters) // If no chapters were added, do nothing if (newChapters.size == savedEntry.chapters.size) return savedEntry.copy(chapters = newChapters) } else { // No entry has been found yet, create a new one Entry(chapters.map { it.toEntry() }, manga.toEntry()) } } // Save current state val json = json.encodeToString(newEntry) preferences.edit { putString(newEntry.manga.id.toString(), json) } lastAddedEntry = newEntry } /** * Returns the list of chapters to be deleted grouped by its manga. * * Note: the returned list of manga and chapters only contain basic information needed by the * downloader, so don't use them for anything else. */ @Synchronized fun getPendingChapters(): Map> { val entries = decodeAll() preferences.edit { clear() } lastAddedEntry = null return entries.associate { (chapters, manga) -> manga.toModel() to chapters.map { it.toModel() } } } /** * Decodes all the chapters from preferences. */ private fun decodeAll(): List { return preferences.all.values.mapNotNull { rawEntry -> try { (rawEntry as? String)?.let { json.decodeFromString(it) } } catch (e: Exception) { null } } } /** * Returns a copy of chapter entries ensuring no duplicates by chapter id. */ private fun List.addUniqueById(chapters: List): List { val newList = toMutableList() for (chapter in chapters) { if (none { it.id == chapter.id }) { newList.add(chapter.toEntry()) } } return newList } /** * Returns a manga entry from a manga model. */ private fun Manga.toEntry() = MangaEntry(id, url, title, source) /** * Returns a chapter entry from a chapter model. */ private fun Chapter.toEntry() = ChapterEntry(id, url, name, scanlator) /** * Returns a manga model from a manga entry. */ private fun MangaEntry.toModel() = Manga.create().copy( url = url, title = title, source = source, id = id, ) /** * Returns a chapter model from a chapter entry. */ private fun ChapterEntry.toModel() = Chapter.create().copy( id = id, url = url, name = name, scanlator = scanlator, ) /** * Class used to save an entry of chapters with their manga into preferences. */ @Serializable private data class Entry( val chapters: List, val manga: MangaEntry, ) /** * Class used to save an entry for a chapter into preferences. */ @Serializable private data class ChapterEntry( val id: Long, val url: String, val name: String, val scanlator: String? = null, ) /** * Class used to save an entry for a manga into preferences. */ @Serializable private data class MangaEntry( val id: Long, val url: String, val title: String, val source: Long, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadProvider.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.content.Context import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.util.storage.DiskUtil import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.displayablePath import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This class is used to provide the directories where the downloads should be saved. * It uses the following path scheme: //// * * @param context the application context. */ class MangaDownloadProvider( private val context: Context, private val storageManager: StorageManager = Injekt.get(), ) { private val downloadsDir: UniFile? get() = storageManager.getDownloadsDirectory() /** * Returns the download directory for a manga. For internal use only. * * @param mangaTitle the title of the manga to query. * @param source the source of the manga. */ internal fun getMangaDir(mangaTitle: String, source: MangaSource): UniFile { try { return downloadsDir!! .createDirectory(getSourceDirName(source))!! .createDirectory(getMangaDirName(mangaTitle))!! } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Invalid download directory" } throw Exception( context.stringResource( MR.strings.invalid_location, downloadsDir?.displayablePath ?: "", ), ) } } /** * Returns the download directory for a source if it exists. * * @param source the source to query. */ fun findSourceDir(source: MangaSource): UniFile? { return downloadsDir?.findFile(getSourceDirName(source)) } /** * Returns the download directory for a manga if it exists. * * @param mangaTitle the title of the manga to query. * @param source the source of the manga. */ fun findMangaDir(mangaTitle: String, source: MangaSource): UniFile? { val sourceDir = findSourceDir(source) return sourceDir?.findFile(getMangaDirName(mangaTitle)) } /** * Returns the download directory for a chapter if it exists. * * @param chapterName the name of the chapter to query. * @param chapterScanlator scanlator of the chapter to query * @param mangaTitle the title of the manga to query. * @param source the source of the chapter. */ fun findChapterDir( chapterName: String, chapterScanlator: String?, mangaTitle: String, source: MangaSource, ): UniFile? { val mangaDir = findMangaDir(mangaTitle, source) return getValidChapterDirNames(chapterName, chapterScanlator).asSequence() .mapNotNull { mangaDir?.findFile(it) } .firstOrNull() } /** * Returns a list of downloaded directories for the chapters that exist. * * @param chapters the chapters to query. * @param manga the manga of the chapter. * @param source the source of the chapter. */ fun findChapterDirs(chapters: List, manga: Manga, source: MangaSource): Pair> { val mangaDir = findMangaDir(manga.title, source) ?: return null to emptyList() return mangaDir to chapters.mapNotNull { chapter -> getValidChapterDirNames(chapter.name, chapter.scanlator).asSequence() .mapNotNull { mangaDir.findFile(it) } .firstOrNull() } } /** * Returns the download directory name for a source. * * @param source the source to query. */ fun getSourceDirName(source: MangaSource): String { return DiskUtil.buildValidFilename(source.toString()) } /** * Returns the download directory name for a manga. * * @param mangaTitle the title of the manga to query. */ fun getMangaDirName(mangaTitle: String): String { return DiskUtil.buildValidFilename(mangaTitle) } /** * Returns the chapter directory name for a chapter. * * @param chapterName the name of the chapter to query. * @param chapterScanlator scanlator of the chapter to query */ fun getChapterDirName(chapterName: String, chapterScanlator: String?): String { val newChapterName = sanitizeChapterName(chapterName) return DiskUtil.buildValidFilename( when { !chapterScanlator.isNullOrBlank() -> "${chapterScanlator}_$newChapterName" else -> newChapterName }, ) } /** * Return the new name for the chapter (in case it's empty or blank) * * @param chapterName the name of the chapter */ private fun sanitizeChapterName(chapterName: String): String { return chapterName.ifBlank { "Chapter" } } fun isChapterDirNameChanged(oldChapter: Chapter, newChapter: Chapter): Boolean { return oldChapter.name != newChapter.name || oldChapter.scanlator?.takeIf { it.isNotBlank() } != newChapter.scanlator?.takeIf { it.isNotBlank() } } /** * Returns valid downloaded chapter directory names. * * @param chapterName the name of the chapter to query. * @param chapterScanlator scanlator of the chapter to query */ fun getValidChapterDirNames(chapterName: String, chapterScanlator: String?): List { val chapterDirName = getChapterDirName(chapterName, chapterScanlator) return buildList(2) { // Folder of images add(chapterDirName) // Archived chapters add("$chapterDirName.cbz") } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloadStore.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.content.Context import androidx.core.content.edit import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.source.online.HttpSource import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.interactor.GetChapter import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * This class is used to persist active downloads across application restarts. */ class MangaDownloadStore( context: Context, private val sourceManager: MangaSourceManager = Injekt.get(), private val json: Json = Injekt.get(), private val getManga: GetManga = Injekt.get(), private val getChapter: GetChapter = Injekt.get(), ) { /** * Preference file where active downloads are stored. */ private val preferences = context.getSharedPreferences("active_downloads", Context.MODE_PRIVATE) /** * Counter used to keep the queue order. */ private var counter = 0 /** * Adds a list of downloads to the store. * * @param downloads the list of downloads to add. */ fun addAll(downloads: List) { preferences.edit { downloads.forEach { putString(getKey(it), serialize(it)) } } } /** * Removes a download from the store. * * @param download the download to remove. */ fun remove(download: MangaDownload) { preferences.edit { remove(getKey(download)) } } /** * Removes a list of downloads from the store. * * @param downloads the download to remove. */ fun removeAll(downloads: List) { preferences.edit { downloads.forEach { remove(getKey(it)) } } } /** * Removes all the downloads from the store. */ fun clear() { preferences.edit { clear() } } /** * Returns the preference's key for the given download. * * @param download the download. */ private fun getKey(download: MangaDownload): String { return download.chapter.id.toString() } /** * Returns the list of downloads to restore. It should be called in a background thread. */ fun restore(): List { val objs = preferences.all .mapNotNull { it.value as? String } .mapNotNull { deserialize(it) } .sortedBy { it.order } val downloads = mutableListOf() if (objs.isNotEmpty()) { val cachedManga = mutableMapOf() for ((mangaId, chapterId) in objs) { val manga = cachedManga.getOrPut(mangaId) { runBlocking { getManga.await(mangaId) } } ?: continue val source = sourceManager.get(manga.source) as? HttpSource ?: continue val chapter = runBlocking { getChapter.await(chapterId) } ?: continue downloads.add(MangaDownload(source, manga, chapter)) } } // Clear the store, downloads will be added again immediately. clear() return downloads } /** * Converts a download to a string. * * @param download the download to serialize. */ private fun serialize(download: MangaDownload): String { val obj = DownloadObject(download.manga.id, download.chapter.id, counter++) return json.encodeToString(obj) } /** * Restore a download from a string. * * @param string the download as string. */ private fun deserialize(string: String): DownloadObject? { return try { json.decodeFromString(string) } catch (e: Exception) { null } } } /** * Class used for download serialization * * @param mangaId the id of the manga. * @param chapterId the id of the chapter. * @param order the order of the download in the queue. */ @Serializable private data class DownloadObject(val mangaId: Long, val chapterId: Long, val order: Int) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/MangaDownloader.kt ================================================ package eu.kanade.tachiyomi.data.download.manga import android.content.Context import aniyomi.util.DataSaver import aniyomi.util.DataSaver.Companion.getImage import com.hippo.unifile.UniFile import eu.kanade.domain.entries.manga.model.getComicInfo import eu.kanade.domain.items.chapter.model.toSChapter import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateNotifier import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.source.UnmeteredSource import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.DiskUtil.NOMEDIA_FILE import eu.kanade.tachiyomi.util.storage.saveTo import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.async import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapMerge import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.retryWhen import kotlinx.coroutines.flow.transformLatest import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope import logcat.LogPriority import mihon.core.archive.ZipWriter import nl.adaptivity.xmlutil.serialization.XML import okhttp3.Response import okio.Throttler import okio.buffer import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.storage.extension import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNow import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.core.common.util.system.logcat import tachiyomi.core.metadata.comicinfo.COMIC_INFO_FILE import tachiyomi.core.metadata.comicinfo.ComicInfo import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import java.util.Locale /** * This class is the one in charge of downloading chapters. * * Its queue contains the list of chapters to download. In order to download them, the downloader * subscription must be running and the list of chapters must be sent to them by [downloadsRelay]. * * The queue manipulation must be done in one thread (currently the main thread) to avoid unexpected * behavior, but it's safe to read it from multiple threads. */ class MangaDownloader( private val context: Context, private val provider: MangaDownloadProvider, private val cache: MangaDownloadCache, private val sourceManager: MangaSourceManager = Injekt.get(), private val chapterCache: ChapterCache = Injekt.get(), private val downloadPreferences: DownloadPreferences = Injekt.get(), private val xml: XML = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val getMangaTracks: GetMangaTracks = Injekt.get(), // SY --> private val sourcePreferences: SourcePreferences = Injekt.get(), // SY <-- ) { /** * Store for persisting downloads across restarts. */ private val store = MangaDownloadStore(context) /** * Queue where active downloads are kept. */ private val _queueState = MutableStateFlow>(emptyList()) val queueState = _queueState.asStateFlow() /** * Notifier for the downloader state and progress. */ private val notifier by lazy { MangaDownloadNotifier(context) } /** * The throttler used to control the download speed. */ private val throttler = Throttler() private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private var downloaderJob: Job? = null /** * Whether the downloader is running. */ val isRunning: Boolean get() = downloaderJob?.isActive ?: false /** * Whether the downloader is paused */ @Volatile var isPaused: Boolean = false init { launchNow { val chapters = async { store.restore() } addAllToQueue(chapters.await()) } } /** * Starts the downloader. It doesn't do anything if it's already running or there isn't anything * to download. * * @return true if the downloader is started, false otherwise. */ fun start(): Boolean { if (isRunning || queueState.value.isEmpty()) { return false } val pending = queueState.value.filter { it.status != MangaDownload.State.DOWNLOADED } pending.forEach { if (it.status != MangaDownload.State.QUEUE) it.status = MangaDownload.State.QUEUE } isPaused = false launchDownloaderJob() return pending.isNotEmpty() } /** * Stops the downloader. */ fun stop(reason: String? = null) { cancelDownloaderJob() queueState.value .filter { it.status == MangaDownload.State.DOWNLOADING } .forEach { it.status = MangaDownload.State.ERROR } if (reason != null) { notifier.onWarning(reason) return } if (isPaused && queueState.value.isNotEmpty()) { notifier.onPaused() } else { notifier.onComplete() } isPaused = false MangaDownloadJob.stop(context) } /** * Pauses the downloader */ fun pause() { cancelDownloaderJob() queueState.value .filter { it.status == MangaDownload.State.DOWNLOADING } .forEach { it.status = MangaDownload.State.QUEUE } isPaused = true } /** * Removes everything from the queue. */ fun clearQueue() { cancelDownloaderJob() internalClearQueue() notifier.dismissProgress() } /** * Prepares the subscriptions to start downloading. */ private fun launchDownloaderJob() { if (isRunning) return downloaderJob = scope.launch { val activeDownloadsFlow = queueState.transformLatest { queue -> while (true) { val activeDownloads = queue.asSequence() .filter { it.status.value <= MangaDownload.State.DOWNLOADING.value } // Ignore completed downloads, leave them in the queue .groupBy { it.source } .toList().take(5) // Concurrently download from 5 different sources .map { (_, downloads) -> downloads.first() } emit(activeDownloads) if (activeDownloads.isEmpty()) break // Suspend until a download enters the ERROR state val activeDownloadsErroredFlow = combine(activeDownloads.map(MangaDownload::statusFlow)) { states -> states.contains(MangaDownload.State.ERROR) }.filter { it } activeDownloadsErroredFlow.first() } }.distinctUntilChanged() // Use supervisorScope to cancel child jobs when the downloader job is cancelled supervisorScope { val downloadJobs = mutableMapOf() activeDownloadsFlow.collectLatest { activeDownloads -> val downloadJobsToStop = downloadJobs.filter { it.key !in activeDownloads } downloadJobsToStop.forEach { (download, job) -> job.cancel() downloadJobs.remove(download) } val downloadsToStart = activeDownloads.filter { it !in downloadJobs } downloadsToStart.forEach { download -> downloadJobs[download] = launchDownloadJob(download) } } } } } private fun CoroutineScope.launchDownloadJob(download: MangaDownload) = launchIO { try { downloadChapter(download) // Remove successful download from queue if (download.status == MangaDownload.State.DOWNLOADED) { removeFromQueue(download) } if (areAllDownloadsFinished()) { stop() } } catch (e: Throwable) { if (e is CancellationException) throw e logcat(LogPriority.ERROR, e) notifier.onError(e.message) stop() } } /** * Destroys the downloader subscriptions. */ private fun cancelDownloaderJob() { downloaderJob?.cancel() downloaderJob = null } /** * Creates a download object for every chapter and adds them to the downloads queue. * * @param manga the manga of the chapters to download. * @param chapters the list of chapters to download. * @param autoStart whether to start the downloader after enqueing the chapters. */ fun queueChapters(manga: Manga, chapters: List, autoStart: Boolean) { if (chapters.isEmpty()) return val source = sourceManager.get(manga.source) as? HttpSource ?: return val wasEmpty = queueState.value.isEmpty() val chaptersToQueue = chapters.asSequence() // Filter out those already downloaded. .filter { provider.findChapterDir(it.name, it.scanlator, manga.title, source) == null } // Add chapters to queue from the start. .sortedByDescending { it.sourceOrder } // Filter out those already enqueued. .filter { chapter -> queueState.value.none { it.chapter.id == chapter.id } } // Create a download for each one. .map { MangaDownload(source, manga, it) } .toList() if (chaptersToQueue.isNotEmpty()) { addAllToQueue(chaptersToQueue) // Start downloader if needed if (autoStart && wasEmpty) { val queuedDownloads = queueState.value.count { it: MangaDownload -> it.source !is UnmeteredSource } val maxDownloadsFromSource = queueState.value .groupBy { it.source } .filterKeys { it !is UnmeteredSource } .maxOfOrNull { it.value.size } ?: 0 if ( queuedDownloads > DOWNLOADS_QUEUED_WARNING_THRESHOLD || maxDownloadsFromSource > CHAPTERS_PER_SOURCE_QUEUE_WARNING_THRESHOLD ) { notifier.onWarning( context.stringResource(AYMR.strings.download_queue_size_warning), WARNING_NOTIF_TIMEOUT_MS, NotificationHandler.openUrl(context, MangaLibraryUpdateNotifier.HELP_WARNING_URL), ) } MangaDownloadJob.start(context) } } } /** * Downloads a chapter. * * @param download the chapter to be downloaded. */ private suspend fun downloadChapter(download: MangaDownload) { val mangaDir = provider.getMangaDir(download.manga.title, download.source) val availSpace = DiskUtil.getAvailableStorageSpace(mangaDir) if (availSpace != -1L && availSpace < MIN_DISK_SPACE) { download.status = MangaDownload.State.ERROR notifier.onError( context.stringResource(AYMR.strings.download_insufficient_space), download.chapter.name, download.manga.title, download.manga.id, ) return } val chapterDirname = provider.getChapterDirName(download.chapter.name, download.chapter.scanlator) val tmpDir = mangaDir.createDirectory(chapterDirname + TMP_DIR_SUFFIX)!! try { // If the page list already exists, start from the file val pageList = download.pages ?: run { // Otherwise, pull page list from network and add them to download object val pages = download.source.getPageList(download.chapter.toSChapter()) if (pages.isEmpty()) { throw Exception(context.stringResource(MR.strings.page_list_empty_error)) } // Don't trust index from source val reIndexedPages = pages.mapIndexed { index, page -> Page( index, page.url, page.imageUrl, page.uri, ) } download.pages = reIndexedPages reIndexedPages } val dataSaver = if (sourcePreferences.dataSaverDownloader().get()) { DataSaver(download.source, sourcePreferences) } else { DataSaver.NoOp } // Delete all temporary (unfinished) files tmpDir.listFiles() ?.filter { it.extension == "tmp" } ?.forEach { it.delete() } download.status = MangaDownload.State.DOWNLOADING // Start downloading images, consider we can have downloaded images already // Concurrently do 2 pages at a time pageList.asFlow() .flatMapMerge(concurrency = 2) { page -> flow { // Fetch image URL if necessary if (page.imageUrl.isNullOrEmpty()) { page.status = Page.State.LOAD_PAGE try { page.imageUrl = download.source.getImageUrl(page) } catch (e: Throwable) { page.status = Page.State.ERROR } } withIOContext { getOrDownloadImage(page, download, tmpDir, dataSaver) } emit(page) }.flowOn(Dispatchers.IO) } .collect { // Do when page is downloaded. notifier.onProgressChange(download) } // Do after download completes if (!isDownloadSuccessful(download, tmpDir)) { download.status = MangaDownload.State.ERROR return } createComicInfoFile( tmpDir, download.manga, download.chapter, download.source, ) // Only rename the directory if it's downloaded if (downloadPreferences.saveChaptersAsCBZ().get()) { archiveChapter(mangaDir, chapterDirname, tmpDir) } else { tmpDir.renameTo(chapterDirname) } cache.addChapter(chapterDirname, mangaDir, download.manga) DiskUtil.createNoMediaFile(tmpDir, context) download.status = MangaDownload.State.DOWNLOADED } catch (error: Throwable) { if (error is CancellationException) throw error // If the page list threw, it will resume here logcat(LogPriority.ERROR, error) download.status = MangaDownload.State.ERROR notifier.onError(error.message, download.chapter.name, download.manga.title, download.manga.id) } } /** * Gets the image from the filesystem if it exists or downloads it otherwise. * * @param page the page to download. * @param download the download of the page. * @param tmpDir the temporary directory of the download. */ private suspend fun getOrDownloadImage( page: Page, download: MangaDownload, tmpDir: UniFile, dataSaver: DataSaver, ) { // If the image URL is empty, do nothing if (page.imageUrl == null) { return } val digitCount = (download.pages?.size ?: 0).toString().length.coerceAtLeast(3) val filename = "%0${digitCount}d".format(Locale.ENGLISH, page.number) val tmpFile = tmpDir.findFile("$filename.tmp") // Delete temp file if it exists tmpFile?.delete() // Try to find the image file val imageFile = tmpDir.listFiles()?.firstOrNull { it.name!!.startsWith("$filename.") || it.name!!.startsWith( "${filename}__001", ) } try { // If the image is already downloaded, do nothing. Otherwise download from network val file = when { imageFile != null -> imageFile chapterCache.isImageInCache(page.imageUrl!!) -> copyImageFromCache( chapterCache.getImageFile(page.imageUrl!!), tmpDir, filename, ) else -> downloadImage(page, download.source, tmpDir, filename, dataSaver) } // When the page is ready, set page path, progress (just in case) and status splitTallImageIfNeeded(page, tmpDir) page.uri = file.uri page.progress = 100 page.status = Page.State.READY } catch (e: Throwable) { if (e is CancellationException) throw e // Mark this page as error and allow to download the remaining page.progress = 0 page.status = Page.State.ERROR notifier.onError(e.message, download.chapter.name, download.manga.title, download.manga.id) } } /** * Downloads the image from network to a file in tmpDir. * * @param page the page to download. * @param source the source of the page. * @param tmpDir the temporary directory of the download. * @param filename the filename of the image. */ private suspend fun downloadImage( page: Page, source: HttpSource, tmpDir: UniFile, filename: String, dataSaver: DataSaver, ): UniFile { page.status = Page.State.DOWNLOAD_IMAGE page.progress = 0 return flow { val response = source.getImage(page, dataSaver) val file = tmpDir.createFile("$filename.tmp")!! try { throttler.apply { bytesPerSecond(downloadPreferences.downloadSpeedLimit().get().toLong() * 1024) } val throttledSource = throttler.source(response.body.source()).buffer() throttledSource.saveTo(file.openOutputStream()) throttledSource.close() val extension = getImageExtension(response, file) file.renameTo("$filename.$extension") } catch (e: Exception) { response.close() file.delete() throw e } emit(file) } // Retry 3 times, waiting 2, 4 and 8 seconds between attempts. .retryWhen { _, attempt -> if (attempt < 3) { delay((2L shl attempt.toInt()) * 1000) true } else { false } } .flowOn(Dispatchers.IO) .first() } /** * Copies the image from cache to file in tmpDir. * * @param cacheFile the file from cache. * @param tmpDir the temporary directory of the download. * @param filename the filename of the image. */ private fun copyImageFromCache(cacheFile: File, tmpDir: UniFile, filename: String): UniFile { val tmpFile = tmpDir.createFile("$filename.tmp")!! cacheFile.inputStream().use { input -> tmpFile.openOutputStream().use { output -> input.copyTo(output) } } val extension = ImageUtil.findImageType(cacheFile.inputStream()) ?: return tmpFile tmpFile.renameTo("$filename.${extension.extension}") cacheFile.delete() return tmpFile } /** * Returns the extension of the downloaded image from the network response, or if it's null, * analyze the file. If everything fails, assume it's a jpg. * * @param response the network response of the image. * @param file the file where the image is already downloaded. */ private fun getImageExtension(response: Response, file: UniFile): String { val mime = response.body.contentType()?.run { if (type == "image") "image/$subtype" else null } return ImageUtil.getExtensionFromMimeType(mime) { file.openInputStream() } } private fun splitTallImageIfNeeded(page: Page, tmpDir: UniFile) { if (!downloadPreferences.splitTallImages().get()) return try { val filenamePrefix = "%03d".format(Locale.ENGLISH, page.number) val imageFile = tmpDir.listFiles()?.firstOrNull { it.name.orEmpty().startsWith(filenamePrefix) } ?: error(context.stringResource(MR.strings.download_notifier_split_page_not_found, page.number)) // If the original page was previously split, then skip if (imageFile.name.orEmpty().startsWith("${filenamePrefix}__")) return ImageUtil.splitTallImage(tmpDir, imageFile, filenamePrefix) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to split downloaded image" } } } /** * Checks if the download was successful. * * @param download the download to check. * @param tmpDir the directory where the download is currently stored. */ private fun isDownloadSuccessful( download: MangaDownload, tmpDir: UniFile, ): Boolean { // Page list hasn't been initialized val downloadPageCount = download.pages?.size ?: return false // Ensure that all pages have been downloaded if (download.downloadedImages != downloadPageCount) { return false } // Ensure that the chapter folder has all the pages val downloadedImagesCount = tmpDir.listFiles().orEmpty().count { val fileName = it.name.orEmpty() when { fileName in listOf(COMIC_INFO_FILE, NOMEDIA_FILE) -> false fileName.endsWith(".tmp") -> false // Only count the first split page and not the others fileName.contains("__") && !fileName.endsWith("__001.jpg") -> false else -> true } } return downloadedImagesCount == downloadPageCount } /** * Archive the chapter pages as a CBZ. */ private fun archiveChapter( mangaDir: UniFile, dirname: String, tmpDir: UniFile, ) { val zip = mangaDir.createFile("$dirname.cbz$TMP_DIR_SUFFIX")!! ZipWriter(context, zip).use { writer -> tmpDir.listFiles()?.forEach { file -> writer.write(file) } } zip.renameTo("$dirname.cbz") tmpDir.delete() } /** * Creates a ComicInfo.xml file inside the given directory. */ private suspend fun createComicInfoFile( dir: UniFile, manga: Manga, chapter: Chapter, source: HttpSource, ) { val categories = getCategories.await(manga.id).map { it.name.trim() }.takeUnless { it.isEmpty() } val urls = getMangaTracks.await(manga.id) .mapNotNull { track -> track.remoteUrl.takeUnless { url -> url.isBlank() }?.trim() } .plus(source.getChapterUrl(chapter.toSChapter()).trim()) .distinct() val comicInfo = getComicInfo( manga, chapter, urls, categories, source.name, ) // Remove the old file dir.findFile(COMIC_INFO_FILE)?.delete() dir.createFile(COMIC_INFO_FILE)!!.openOutputStream().use { val comicInfoString = xml.encodeToString(ComicInfo.serializer(), comicInfo) it.write(comicInfoString.toByteArray()) } } /** * Returns true if all the queued downloads are in DOWNLOADED or ERROR state. */ private fun areAllDownloadsFinished(): Boolean { return queueState.value.none { it.status.value <= MangaDownload.State.DOWNLOADING.value } } private fun addAllToQueue(downloads: List) { _queueState.update { downloads.forEach { download -> download.status = MangaDownload.State.QUEUE } store.addAll(downloads) it + downloads } } private fun removeFromQueue(download: MangaDownload) { _queueState.update { store.remove(download) if (download.status == MangaDownload.State.DOWNLOADING || download.status == MangaDownload.State.QUEUE) { download.status = MangaDownload.State.NOT_DOWNLOADED } it - download } } private inline fun removeFromQueueIf(predicate: (MangaDownload) -> Boolean) { _queueState.update { queue -> val downloads = queue.filter { predicate(it) } store.removeAll(downloads) downloads.forEach { download -> if (download.status == MangaDownload.State.DOWNLOADING || download.status == MangaDownload.State.QUEUE ) { download.status = MangaDownload.State.NOT_DOWNLOADED } } queue - downloads } } fun removeFromQueue(chapters: List) { val chapterIds = chapters.map { it.id } removeFromQueueIf { it.chapter.id in chapterIds } } fun removeFromQueue(manga: Manga) { removeFromQueueIf { it.manga.id == manga.id } } private fun internalClearQueue() { _queueState.update { it.forEach { download -> if (download.status == MangaDownload.State.DOWNLOADING || download.status == MangaDownload.State.QUEUE ) { download.status = MangaDownload.State.NOT_DOWNLOADED } } store.clear() emptyList() } } fun updateQueue(downloads: List) { val wasRunning = isRunning if (downloads.isEmpty()) { clearQueue() stop() return } pause() internalClearQueue() addAllToQueue(downloads) if (wasRunning) { start() } } companion object { const val TMP_DIR_SUFFIX = "_tmp" const val WARNING_NOTIF_TIMEOUT_MS = 30_000L const val CHAPTERS_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 15 private const val DOWNLOADS_QUEUED_WARNING_THRESHOLD = 30 } } // Arbitrary minimum required space to start a download: 200 MB private const val MIN_DISK_SPACE = 200L * 1024 * 1024 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/download/manga/model/MangaDownload.kt ================================================ package eu.kanade.tachiyomi.data.download.manga.model import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emitAll import kotlinx.coroutines.flow.flow import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.interactor.GetChapter import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get data class MangaDownload( val source: HttpSource, val manga: Manga, val chapter: Chapter, ) { var pages: List? = null val totalProgress: Int get() = pages?.sumOf(Page::progress) ?: 0 val downloadedImages: Int get() = pages?.count { it.status == Page.State.READY } ?: 0 @Transient private val _statusFlow = MutableStateFlow(State.NOT_DOWNLOADED) @Transient val statusFlow = _statusFlow.asStateFlow() var status: State get() = _statusFlow.value set(status) { _statusFlow.value = status } @Transient val progressFlow = flow { if (pages == null) { emit(0) while (pages == null) { delay(50) } } val progressFlows = pages!!.map(Page::progressFlow) emitAll(combine(progressFlows) { it.average().toInt() }) } .distinctUntilChanged() .debounce(50) val progress: Int get() { val pages = pages ?: return 0 return pages.map(Page::progress).average().toInt() } enum class State(val value: Int) { NOT_DOWNLOADED(0), QUEUE(1), DOWNLOADING(2), DOWNLOADED(3), ERROR(4), } companion object { suspend fun fromChapterId( chapterId: Long, getChapter: GetChapter = Injekt.get(), getManga: GetManga = Injekt.get(), sourceManager: MangaSourceManager = Injekt.get(), ): MangaDownload? { val chapter = getChapter.await(chapterId) ?: return null val manga = getManga.await(chapter.mangaId) ?: return null val source = sourceManager.get(manga.source) as? HttpSource ?: return null return MangaDownload(source, manga, chapter) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/export/LibraryExporter.kt ================================================ package eu.kanade.tachiyomi.data.export import android.content.Context import android.net.Uri import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.manga.model.Manga enum class ExportEntryType { MANGA, ANIME, } data class ExportEntry( val type: ExportEntryType, val title: String, val author: String?, val artist: String?, ) { companion object { fun Anime.toExportEntry(): ExportEntry = ExportEntry( title = this.title, type = ExportEntryType.ANIME, author = this.author, artist = this.artist, ) fun Manga.toExportEntry(): ExportEntry = ExportEntry( title = this.title, type = ExportEntryType.MANGA, author = this.author, artist = this.artist, ) } } object LibraryExporter { data class ExportOptions( val includeTitle: Boolean, val includeType: Boolean, val includeAuthor: Boolean, val includeArtist: Boolean, ) suspend fun exportToCsv( context: Context, uri: Uri, favorites: List, options: ExportOptions, onExportComplete: () -> Unit, ) { withContext(Dispatchers.IO) { context.contentResolver.openOutputStream(uri)?.use { outputStream -> val csvData = generateCsvData(favorites, options) outputStream.write(csvData.toByteArray()) } onExportComplete() } } private val escapeRequired = listOf("\r", "\n", "\"", ",") private fun generateCsvData(favorites: List, options: ExportOptions): String { val columnSize = listOf( options.includeTitle, options.includeType, options.includeAuthor, options.includeArtist, ) .count { it } val rows = buildList(favorites.size) { favorites.forEach { entry -> buildList(columnSize) { if (options.includeTitle) add(entry.title) if (options.includeType) add(entry.type.name.lowercase()) if (options.includeAuthor) add(entry.author) if (options.includeArtist) add(entry.artist) } .let(::add) } } return rows.joinToString("\r\n") { columns -> columns.joinToString(",") columns@{ column -> if (column.isNullOrBlank()) return@columns "" if (escapeRequired.any { column.contains(it) }) { column.replace("\"", "\"\"").let { "\"$it\"" } } else { column } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateJob.kt ================================================ package eu.kanade.tachiyomi.data.library.anime import android.content.Context import android.content.pm.ServiceInfo import android.net.NetworkCapabilities import android.net.NetworkRequest import android.os.Build import androidx.work.BackoffPolicy import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkQuery import androidx.work.WorkerParameters import androidx.work.workDataOf import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.domain.items.episode.interactor.SyncEpisodesWithSource import eu.kanade.tachiyomi.animesource.model.AnimeUpdateStrategy import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.createFileInCacheDir import eu.kanade.tachiyomi.util.system.isConnectedToWifi import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority import mihon.domain.items.episode.interactor.FilterEpisodesForDownload import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.preference.getAndSet import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.anime.interactor.AnimeFetchInterval import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.interactor.GetLibraryAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.model.NoEpisodesException import tachiyomi.domain.items.season.interactor.GetAnimeSeasonsByParentId import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_CHARGING import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_NETWORK_NOT_METERED import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_ONLY_ON_WIFI import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_HAS_UNVIEWED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_NON_COMPLETED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_NON_VIEWED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_OUTSIDE_RELEASE_PERIOD import tachiyomi.domain.source.anime.model.AnimeSourceNotInstalledException import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import java.time.Instant import java.time.ZonedDateTime import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger class AnimeLibraryUpdateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val sourceManager: AnimeSourceManager = Injekt.get() private val libraryPreferences: LibraryPreferences = Injekt.get() private val downloadManager: AnimeDownloadManager = Injekt.get() private val coverCache: AnimeCoverCache = Injekt.get() private val backgroundCache: AnimeBackgroundCache = Injekt.get() private val getLibraryAnime: GetLibraryAnime = Injekt.get() private val getAnime: GetAnime = Injekt.get() private val updateAnime: UpdateAnime = Injekt.get() private val syncEpisodesWithSource: SyncEpisodesWithSource = Injekt.get() private val animeFetchInterval: AnimeFetchInterval = Injekt.get() private val filterEpisodesForDownload: FilterEpisodesForDownload = Injekt.get() private val getAnimeSeasonsByParentId: GetAnimeSeasonsByParentId = Injekt.get() private val notifier = AnimeLibraryUpdateNotifier(context) private var animeToUpdate: List = mutableListOf() override suspend fun doWork(): Result { if (tags.contains(WORK_NAME_AUTO)) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { val preferences = Injekt.get() val restrictions = preferences.autoUpdateDeviceRestrictions().get() if ((DEVICE_ONLY_ON_WIFI in restrictions) && !context.isConnectedToWifi()) { return Result.retry() } } } try { setForeground(getForegroundInfo()) } catch (e: IllegalStateException) { logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } } libraryPreferences.lastUpdatedTimestamp().set(Instant.now().toEpochMilli()) val categoryId = inputData.getLong(KEY_CATEGORY, -1L) addAnimeToQueue(categoryId) return withIOContext { try { updateEpisodeList() Result.success() } catch (e: Exception) { if (e is CancellationException) { // Assume success although cancelled Result.success() } else { logcat(LogPriority.ERROR, e) Result.failure() } } finally { notifier.cancelProgressNotification() } } } override suspend fun getForegroundInfo(): ForegroundInfo { val notifier = AnimeLibraryUpdateNotifier(context) return ForegroundInfo( Notifications.ID_LIBRARY_PROGRESS, notifier.progressNotificationBuilder.build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } /** * Adds list of anime to be updated. * * @param categoryId the ID of the category to update, or -1 if no category specified. */ private suspend fun addAnimeToQueue(categoryId: Long) { val libraryAnime = getLibraryAnime.await() val listToUpdate = if (categoryId != -1L) { libraryAnime.filter { it.category == categoryId } } else { val categoriesToUpdate = libraryPreferences.animeUpdateCategories().get().map { it.toLong() } val includedAnime = if (categoriesToUpdate.isNotEmpty()) { libraryAnime.filter { it.category in categoriesToUpdate } } else { libraryAnime } val categoriesToExclude = libraryPreferences.animeUpdateCategoriesExclude().get().map { it.toLong() } val excludedAnimeIds = if (categoriesToExclude.isNotEmpty()) { libraryAnime.filter { it.category in categoriesToExclude }.map { it.anime.id } } else { emptyList() } includedAnime .filterNot { it.anime.id in excludedAnimeIds } .distinctBy { it.anime.id } } val includeSeasons = libraryPreferences.updateSeasonOnLibraryUpdate().get() val lastToUpdateWithSeasons = listToUpdate.flatMap { libAnime -> when (libAnime.anime.fetchType) { FetchType.Seasons -> { if (includeSeasons) { val seasons = getAnimeSeasonsByParentId.await(libAnime.anime.id) seasons .filter { s -> s.anime.fetchType == FetchType.Episodes && !s.anime.favorite } .map { it.toLibraryAnime() } } else { emptyList() } } FetchType.Episodes -> listOf(libAnime) } } val restrictions = libraryPreferences.autoUpdateItemRestrictions().get() val skippedUpdates = mutableListOf>() val (_, fetchWindowUpperBound) = animeFetchInterval.getWindow(ZonedDateTime.now()) animeToUpdate = lastToUpdateWithSeasons .filter { when { it.anime.updateStrategy != AnimeUpdateStrategy.ALWAYS_UPDATE -> { skippedUpdates.add( it.anime to context.stringResource(MR.strings.skipped_reason_not_always_update), ) false } ENTRY_NON_COMPLETED in restrictions && it.anime.status.toInt() == SAnime.COMPLETED -> { skippedUpdates.add( it.anime to context.stringResource(MR.strings.skipped_reason_completed), ) false } ENTRY_HAS_UNVIEWED in restrictions && it.unseenCount != 0L -> { skippedUpdates.add( it.anime to context.stringResource(MR.strings.skipped_reason_not_caught_up), ) false } ENTRY_NON_VIEWED in restrictions && it.totalCount > 0L && !it.hasStarted -> { skippedUpdates.add( it.anime to context.stringResource(MR.strings.skipped_reason_not_started), ) false } ENTRY_OUTSIDE_RELEASE_PERIOD in restrictions && it.anime.nextUpdate > fetchWindowUpperBound -> { skippedUpdates.add( it.anime to context.stringResource(MR.strings.skipped_reason_not_in_release_period), ) false } else -> true } } .sortedBy { it.anime.title } notifier.showQueueSizeWarningNotificationIfNeeded(animeToUpdate) if (skippedUpdates.isNotEmpty()) { // TODO: surface skipped reasons to user? logcat { skippedUpdates .groupBy { it.second } .map { (reason, entries) -> "$reason: [${entries.map { it.first.title }.sorted().joinToString()}]" } .joinToString() } } } /** * Method that updates anime in [animeToUpdate]. It's called in a background thread, so it's safe * to do heavy operations or network calls here. * For each anime it calls [updateAnime] and updates the notification showing the current * progress. * * @return an observable delivering the progress of each update. */ private suspend fun updateEpisodeList() { val semaphore = Semaphore(5) val progressCount = AtomicInteger(0) val currentlyUpdatingAnime = CopyOnWriteArrayList() val newUpdates = CopyOnWriteArrayList>>() val failedUpdates = CopyOnWriteArrayList>() val hasDownloads = AtomicBoolean(false) val fetchWindow = animeFetchInterval.getWindow(ZonedDateTime.now()) coroutineScope { animeToUpdate.groupBy { it.anime.source }.values .map { animeInSource -> async { semaphore.withPermit { animeInSource.forEach { libraryAnime -> val anime = libraryAnime.anime ensureActive() // Don't continue to update if anime is not in library if (anime.parentId == null && getAnime.await(anime.id)?.favorite != true) { return@forEach } withUpdateNotification( currentlyUpdatingAnime, progressCount, anime, ) { try { val newEpisodes = updateAnime(anime, fetchWindow) .sortedByDescending { it.sourceOrder } if (newEpisodes.isNotEmpty()) { val episodesToDownload = filterEpisodesForDownload.await(anime, newEpisodes) if (episodesToDownload.isNotEmpty()) { hasDownloads.set(true) } libraryPreferences.newAnimeUpdatesCount() .getAndSet { it + newEpisodes.size } // Convert to the anime that contains new episodes newUpdates.add(anime to newEpisodes.toTypedArray()) } } catch (e: Throwable) { val errorMessage = when (e) { is NoEpisodesException -> context.stringResource( AYMR.strings.no_episodes_error, ) // failedUpdates will already have the source, don't need to copy it into the message is AnimeSourceNotInstalledException -> context.stringResource( MR.strings.loader_not_implemented_error, ) else -> e.message } failedUpdates.add(anime to errorMessage) } } } } } } .awaitAll() } notifier.cancelProgressNotification() if (newUpdates.isNotEmpty()) { notifier.showUpdateNotifications(newUpdates) if (hasDownloads.get()) { downloadManager.startDownloads() } } if (failedUpdates.isNotEmpty()) { val errorFile = writeErrorFile(failedUpdates) notifier.showUpdateErrorNotification( failedUpdates.size, errorFile.getUriCompat(context), ) } } private fun downloadEpisodes(anime: Anime, episodes: List) { // We don't want to start downloading while the library is updating, because websites // may don't like it and they could ban the user. downloadManager.downloadEpisodes(anime, episodes, false) } /** * Updates the episodes for the given anime and adds them to the database. * * @param anime the anime to update. * @return a pair of the inserted and removed episodes. */ private suspend fun updateAnime(anime: Anime, fetchWindow: Pair): List { val source = sourceManager.getOrStub(anime.source) // Update anime metadata if needed if (libraryPreferences.autoUpdateMetadata().get()) { val networkAnime = source.getAnimeDetails(anime.toSAnime()) updateAnime.awaitUpdateFromSource(anime, networkAnime, manualFetch = false, coverCache, backgroundCache) } val episodes = source.getEpisodeList(anime.toSAnime()) // Get anime from database to account for if it was removed during the update and // to get latest data so it doesn't get overwritten later on val dbAnime = getAnime.await(anime.id)?.takeIf { it.parentId != null || it.favorite } ?: return emptyList() return syncEpisodesWithSource.await(episodes, dbAnime, source, false, fetchWindow) } private suspend fun withUpdateNotification( updatingAnime: CopyOnWriteArrayList, completed: AtomicInteger, anime: Anime, block: suspend () -> Unit, ) = coroutineScope { ensureActive() updatingAnime.add(anime) notifier.showProgressNotification( updatingAnime, completed.get(), animeToUpdate.size, ) block() ensureActive() updatingAnime.remove(anime) completed.getAndIncrement() notifier.showProgressNotification( updatingAnime, completed.get(), animeToUpdate.size, ) } /** * Writes basic file of update errors to cache dir. */ private fun writeErrorFile(errors: List>): File { try { if (errors.isNotEmpty()) { val file = context.createFileInCacheDir("aniyomi_update_errors.txt") file.bufferedWriter().use { out -> out.write( context.stringResource(MR.strings.library_errors_help, ERROR_LOG_HELP_URL) + "\n\n", ) // Error file format: // ! Error // # Source // - Anime errors.groupBy({ it.second }, { it.first }).forEach { (error, animes) -> out.write("\n! ${error}\n") animes.groupBy { it.source }.forEach { (srcId, animes) -> val source = sourceManager.getOrStub(srcId) out.write(" # $source\n") animes.forEach { out.write(" - ${it.title}\n") } } } } return file } } catch (_: Exception) {} return File("") } companion object { private const val TAG = "AnimeLibraryUpdate" private const val WORK_NAME_AUTO = "AnimeLibraryUpdate-auto" private const val WORK_NAME_MANUAL = "AnimeLibraryUpdate-manual" private const val ERROR_LOG_HELP_URL = "https://aniyomi.org/docs/guides/troubleshooting/" private const val ANIME_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 /** * Key for category to update. */ private const val KEY_CATEGORY = "animeCategory" fun cancelAllWorks(context: Context) { context.workManager.cancelAllWorkByTag(TAG) } fun setupTask( context: Context, prefInterval: Int? = null, ) { val preferences = Injekt.get() val interval = prefInterval ?: preferences.autoUpdateInterval().get() if (interval > 0) { val restrictions = preferences.autoUpdateDeviceRestrictions().get() val networkType = if (DEVICE_NETWORK_NOT_METERED in restrictions) { NetworkType.UNMETERED } else { NetworkType.CONNECTED } val networkRequestBuilder = NetworkRequest.Builder() if (DEVICE_ONLY_ON_WIFI in restrictions) { networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) } if (DEVICE_NETWORK_NOT_METERED in restrictions) { networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) } val constraints = Constraints.Builder() // 'networkRequest' only applies to Android 9+, otherwise 'networkType' is used .setRequiredNetworkRequest(networkRequestBuilder.build(), networkType) .setRequiresCharging(DEVICE_CHARGING in restrictions) .setRequiresBatteryNotLow(true) .build() val request = PeriodicWorkRequestBuilder( interval.toLong(), TimeUnit.HOURS, 10, TimeUnit.MINUTES, ) .addTag(TAG) .addTag(WORK_NAME_AUTO) .setConstraints(constraints) .setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.MINUTES) .build() context.workManager.enqueueUniquePeriodicWork( WORK_NAME_AUTO, ExistingPeriodicWorkPolicy.UPDATE, request, ) } else { context.workManager.cancelUniqueWork(WORK_NAME_AUTO) } } fun startNow( context: Context, category: Category? = null, ): Boolean { val wm = context.workManager if (wm.isRunning(TAG)) { // Already running either as a scheduled or manual job return false } val inputData = workDataOf( KEY_CATEGORY to category?.id, ) val request = OneTimeWorkRequestBuilder() .addTag(TAG) .addTag(WORK_NAME_MANUAL) .setInputData(inputData) .build() wm.enqueueUniqueWork(WORK_NAME_MANUAL, ExistingWorkPolicy.KEEP, request) return true } fun stop(context: Context) { val wm = context.workManager val workQuery = WorkQuery.Builder.fromTags(listOf(TAG)) .addStates(listOf(WorkInfo.State.RUNNING)) .build() wm.getWorkInfos(workQuery).get() // Should only return one work but just in case .forEach { wm.cancelWorkById(it.id) // Re-enqueue cancelled scheduled work if (it.tags.contains(WORK_NAME_AUTO)) { setupTask(context) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateNotifier.kt ================================================ package eu.kanade.tachiyomi.data.library.anime import android.app.Notification import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import coil3.asDrawable import coil3.imageLoader import coil3.request.ImageRequest import coil3.request.transformations import coil3.transform.CircleCropTransformation import eu.kanade.presentation.util.formatEpisodeNumber import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.data.download.anime.AnimeDownloader import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.source.UnmeteredSource import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchUI import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.math.RoundingMode import java.text.NumberFormat class AnimeLibraryUpdateNotifier( private val context: Context, private val securityPreferences: SecurityPreferences = Injekt.get(), private val sourceManager: AnimeSourceManager = Injekt.get(), ) { private val percentFormatter = NumberFormat.getPercentInstance().apply { roundingMode = RoundingMode.DOWN maximumFractionDigits = 0 } /** * Pending intent of action that cancels the library update */ private val cancelIntent by lazy { NotificationReceiver.cancelAnimelibUpdatePendingBroadcast(context) } /** * Bitmap of the app for notifications. */ private val notificationBitmap by lazy { BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher) } /** * Cached progress notification to avoid creating a lot. */ val progressNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_LIBRARY_PROGRESS) { setContentTitle(context.stringResource(MR.strings.app_name)) setSmallIcon(R.drawable.ic_refresh_24dp) setLargeIcon(notificationBitmap) setOngoing(true) setOnlyAlertOnce(true) addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), cancelIntent, ) } } /** * Shows the notification containing the currently updating anime and the progress. * * @param anime the anime that are being updated. * @param current the current progress. * @param total the total progress. */ fun showProgressNotification(anime: List, current: Int, total: Int) { progressNotificationBuilder .setContentTitle( context.stringResource( MR.strings.notification_updating_progress, percentFormatter.format(current.toFloat() / total), ), ) if (!securityPreferences.hideNotificationContent().get()) { val updatingText = anime.joinToString("\n") { it.title.chop(40) } progressNotificationBuilder.setStyle(NotificationCompat.BigTextStyle().bigText(updatingText)) } context.notify( Notifications.ID_LIBRARY_PROGRESS, progressNotificationBuilder .setProgress(total, current, false) .build(), ) } fun showQueueSizeWarningNotification() { context.notify( Notifications.ID_LIBRARY_SIZE_WARNING, Notifications.CHANNEL_LIBRARY_PROGRESS, ) { setContentTitle(context.stringResource(MR.strings.label_warning)) setStyle( NotificationCompat.BigTextStyle().bigText( context.stringResource(MR.strings.notification_size_warning), ), ) setSmallIcon(R.drawable.ic_warning_white_24dp) setTimeoutAfter(AnimeDownloader.WARNING_NOTIF_TIMEOUT_MS) setContentIntent(NotificationHandler.openUrl(context, HELP_WARNING_URL)) } } /** * Warn when excessively checking any single source. */ fun showQueueSizeWarningNotificationIfNeeded(animeToUpdate: List) { val maxUpdatesFromSource = animeToUpdate .groupBy { it.anime.source } .filterKeys { sourceManager.get(it) !is UnmeteredSource } .maxOfOrNull { it.value.size } ?: 0 if (maxUpdatesFromSource <= ANIME_PER_SOURCE_QUEUE_WARNING_THRESHOLD) { return } context.notify( Notifications.ID_LIBRARY_SIZE_WARNING, Notifications.CHANNEL_LIBRARY_PROGRESS, ) { setContentTitle(context.stringResource(MR.strings.label_warning)) setStyle( NotificationCompat.BigTextStyle() .bigText(context.stringResource(MR.strings.notification_size_warning)), ) setSmallIcon(R.drawable.ic_warning_white_24dp) setTimeoutAfter(AnimeDownloader.WARNING_NOTIF_TIMEOUT_MS) setContentIntent(NotificationHandler.openUrl(context, HELP_WARNING_URL)) } } /** * Shows notification containing update entries that failed with action to open full log. * * @param failed Number of entries that failed to update. * @param uri Uri for error log file containing all titles that failed. */ fun showUpdateErrorNotification(failed: Int, uri: Uri) { if (failed == 0) { return } context.notify( Notifications.ID_LIBRARY_ERROR, Notifications.CHANNEL_LIBRARY_ERROR, ) { setContentTitle(context.stringResource(MR.strings.notification_update_error, failed)) setContentText(context.stringResource(MR.strings.action_show_errors)) setSmallIcon(R.drawable.ic_ani) setContentIntent(NotificationReceiver.openErrorLogPendingActivity(context, uri)) } } /** * Shows the notification containing the result of the update done by the service. * * @param updates a list of anime with new updates. */ fun showUpdateNotifications(updates: List>>) { // Parent group notification context.notify( Notifications.ID_NEW_EPISODES, Notifications.CHANNEL_NEW_CHAPTERS_EPISODES, ) { setContentTitle(context.stringResource(AYMR.strings.notification_new_episodes)) if (updates.size == 1 && !securityPreferences.hideNotificationContent().get()) { setContentText(updates.first().first.title.chop(NOTIF_TITLE_MAX_LEN)) } else { setContentText( context.resources.getQuantityString( R.plurals.notification_new_episodes_summary, updates.size, updates.size, ), ) if (!securityPreferences.hideNotificationContent().get()) { setStyle( NotificationCompat.BigTextStyle().bigText( updates.joinToString("\n") { it.first.title.chop(NOTIF_TITLE_MAX_LEN) }, ), ) } } setSmallIcon(R.drawable.ic_ani) setLargeIcon(notificationBitmap) setGroup(Notifications.GROUP_NEW_EPISODES) setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) setGroupSummary(true) priority = NotificationCompat.PRIORITY_HIGH setContentIntent(getNotificationIntent()) setAutoCancel(true) } // Per-anime notification if (!securityPreferences.hideNotificationContent().get()) { launchUI { context.notify( updates.map { (anime, episodes) -> NotificationManagerCompat.NotificationWithIdAndTag( anime.id.hashCode(), createNewEpisodesNotification(anime, episodes), ) }, ) } } } private suspend fun createNewEpisodesNotification(anime: Anime, episodes: Array): Notification { val icon = getAnimeIcon(anime) return context.notificationBuilder(Notifications.CHANNEL_NEW_CHAPTERS_EPISODES) { setContentTitle(anime.title) val description = getNewEpisodesDescription(episodes) setContentText(description) setStyle(NotificationCompat.BigTextStyle().bigText(description)) setSmallIcon(R.drawable.ic_ani) if (icon != null) { setLargeIcon(icon) } setGroup(Notifications.GROUP_NEW_EPISODES) setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) priority = NotificationCompat.PRIORITY_HIGH // Open first episode on tap setContentIntent( NotificationReceiver.openEpisodePendingActivity(context, anime, episodes.first()), ) setAutoCancel(true) // Mark episodes as read action addAction( R.drawable.ic_done_24dp, context.stringResource(AYMR.strings.action_mark_as_seen), NotificationReceiver.markAsViewedPendingBroadcast( context, anime, episodes, Notifications.ID_NEW_EPISODES, ), ) // View episodes action addAction( R.drawable.ic_book_24dp, context.stringResource(AYMR.strings.action_view_episodes), NotificationReceiver.openEpisodePendingActivity( context, anime, Notifications.ID_NEW_EPISODES, ), ) // Download chapters action // Only add the action when chapters is within threshold if (episodes.size <= AnimeDownloader.EPISODES_PER_SOURCE_QUEUE_WARNING_THRESHOLD) { addAction( android.R.drawable.stat_sys_download_done, context.stringResource(MR.strings.action_download), NotificationReceiver.downloadEpisodesPendingBroadcast( context, anime, episodes, Notifications.ID_NEW_CHAPTERS, ), ) } }.build() } /** * Cancels the progress notification. */ fun cancelProgressNotification() { context.cancelNotification(Notifications.ID_LIBRARY_PROGRESS) } private suspend fun getAnimeIcon(anime: Anime): Bitmap? { val request = ImageRequest.Builder(context) .data(anime) .transformations(CircleCropTransformation()) .size(NOTIF_ICON_SIZE) .build() val drawable = context.imageLoader.execute(request).image?.asDrawable(context.resources) return drawable?.getBitmapOrNull() } private fun getNewEpisodesDescription(episodes: Array): String { val displayableEpisodeNumbers = episodes .filter { it.isRecognizedNumber } .sortedBy { it.episodeNumber } .map { formatEpisodeNumber(it.episodeNumber) } .toSet() return when (displayableEpisodeNumbers.size) { // No sensible episode numbers to show (i.e. no episodes have parsed episode number) 0 -> { // "1 new episode" or "5 new episodes" context.resources.getQuantityString( R.plurals.notification_episodes_generic, episodes.size, episodes.size, ) } // Only 1 episode has a parsed episode number 1 -> { val remaining = episodes.size - displayableEpisodeNumbers.size if (remaining == 0) { // "Episode 2.5" context.stringResource( AYMR.strings.notification_episodes_single, displayableEpisodeNumbers.first(), ) } else { // "Episode 2.5 and 10 more" context.stringResource( AYMR.strings.notification_episodes_single_and_more, displayableEpisodeNumbers.first(), remaining, ) } } // Everything else (i.e. multiple parsed episode numbers) else -> { val shouldTruncate = displayableEpisodeNumbers.size > NOTIF_MAX_EPISODES if (shouldTruncate) { // "Episodes 1, 2.5, 3, 4, 5 and 10 more" val remaining = displayableEpisodeNumbers.size - NOTIF_MAX_EPISODES val joinedEpisodeNumbers = displayableEpisodeNumbers.take(NOTIF_MAX_EPISODES).joinToString( ", ", ) context.resources.getQuantityString( R.plurals.notification_episodes_multiple_and_more, remaining, joinedEpisodeNumbers, remaining, ) } else { // "Episodes 1, 2.5, 3" context.stringResource( AYMR.strings.notification_episodes_multiple, displayableEpisodeNumbers.joinToString(", "), ) } } } } /** * Returns an intent to open the main activity. */ private fun getNotificationIntent(): PendingIntent { val intent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP action = Constants.SHORTCUT_UPDATES } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } companion object { const val HELP_WARNING_URL = "https://aniyomi.org/docs/faq/library#why-am-i-warned-about-large-bulk-updates-and-downloads" } } private const val NOTIF_MAX_EPISODES = 5 private const val NOTIF_TITLE_MAX_LEN = 45 private const val NOTIF_ICON_SIZE = 192 private const val ANIME_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeMetadataUpdateJob.kt ================================================ package eu.kanade.tachiyomi.data.library.anime import android.content.Context import android.content.pm.ServiceInfo import android.os.Build import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkQuery import androidx.work.WorkerParameters import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.anime.model.copyFrom import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.prepUpdateBackground import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.interactor.GetLibraryAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.toAnimeUpdate import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.atomic.AtomicInteger class AnimeMetadataUpdateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val sourceManager: AnimeSourceManager = Injekt.get() private val coverCache: AnimeCoverCache = Injekt.get() private val backgroundCache: AnimeBackgroundCache = Injekt.get() private val getLibraryAnime: GetLibraryAnime = Injekt.get() private val updateAnime: UpdateAnime = Injekt.get() private val notifier = AnimeLibraryUpdateNotifier(context) private var animeToUpdate: List = mutableListOf() override suspend fun doWork(): Result { try { setForeground(getForegroundInfo()) } catch (e: IllegalStateException) { logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } } addAnimeToQueue() return withIOContext { try { updateMetadata() Result.success() } catch (e: Exception) { if (e is CancellationException) { // Assume success although cancelled Result.success() } else { logcat(LogPriority.ERROR, e) Result.failure() } } finally { notifier.cancelProgressNotification() } } } override suspend fun getForegroundInfo(): ForegroundInfo { val notifier = AnimeLibraryUpdateNotifier(context) return ForegroundInfo( Notifications.ID_LIBRARY_PROGRESS, notifier.progressNotificationBuilder.build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } /** * Adds list of anime to be updated. */ private suspend fun addAnimeToQueue() { animeToUpdate = getLibraryAnime.await() notifier.showQueueSizeWarningNotificationIfNeeded(animeToUpdate) } private suspend fun updateMetadata() { val semaphore = Semaphore(5) val progressCount = AtomicInteger(0) val currentlyUpdatingAnime = CopyOnWriteArrayList() coroutineScope { animeToUpdate.groupBy { it.anime.source } .values .map { animeInSource -> async { semaphore.withPermit { animeInSource.forEach { libraryAnime -> val anime = libraryAnime.anime ensureActive() withUpdateNotification( currentlyUpdatingAnime, progressCount, anime, ) { val source = sourceManager.get(anime.source) ?: return@withUpdateNotification try { val networkAnime = source.getAnimeDetails(anime.toSAnime()) val updatedAnime = anime .prepUpdateCover(coverCache, networkAnime, true) .prepUpdateBackground(backgroundCache, networkAnime, true) .copyFrom(networkAnime) try { updateAnime.await(updatedAnime.toAnimeUpdate()) } catch (e: Exception) { logcat(LogPriority.ERROR) { "Anime doesn't exist anymore" } } } catch (e: Throwable) { // Ignore errors and continue logcat(LogPriority.ERROR, e) } } } } } } .awaitAll() } notifier.cancelProgressNotification() } private suspend fun withUpdateNotification( updatingAnime: CopyOnWriteArrayList, completed: AtomicInteger, anime: Anime, block: suspend () -> Unit, ) = coroutineScope { ensureActive() updatingAnime.add(anime) notifier.showProgressNotification( updatingAnime, completed.get(), animeToUpdate.size, ) block() ensureActive() updatingAnime.remove(anime) completed.getAndIncrement() notifier.showProgressNotification( updatingAnime, completed.get(), animeToUpdate.size, ) } companion object { private const val TAG = "MetadataUpdate" private const val WORK_NAME_MANUAL = "MetadataUpdate" private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 fun startNow(context: Context): Boolean { val wm = context.workManager if (wm.isRunning(TAG)) { // Already running either as a scheduled or manual job return false } val request = OneTimeWorkRequestBuilder() .addTag(TAG) .addTag(WORK_NAME_MANUAL) .build() wm.enqueueUniqueWork(WORK_NAME_MANUAL, ExistingWorkPolicy.KEEP, request) return true } fun stop(context: Context) { val wm = context.workManager val workQuery = WorkQuery.Builder.fromTags(listOf(TAG)) .addStates(listOf(WorkInfo.State.RUNNING)) .build() wm.getWorkInfos(workQuery).get() // Should only return one work but just in case .forEach { wm.cancelWorkById(it.id) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaLibraryUpdateJob.kt ================================================ package eu.kanade.tachiyomi.data.library.manga import android.content.Context import android.content.pm.ServiceInfo import android.net.NetworkCapabilities import android.net.NetworkRequest import android.os.Build import androidx.work.BackoffPolicy import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkQuery import androidx.work.WorkerParameters import androidx.work.workDataOf import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.domain.items.chapter.interactor.SyncChaptersWithSource import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.UpdateStrategy import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.createFileInCacheDir import eu.kanade.tachiyomi.util.system.isConnectedToWifi import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority import mihon.domain.items.chapter.interactor.FilterChaptersForDownload import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.preference.getAndSet import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.manga.interactor.GetLibraryManga import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.interactor.MangaFetchInterval import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.model.NoChaptersException import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_CHARGING import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_NETWORK_NOT_METERED import tachiyomi.domain.library.service.LibraryPreferences.Companion.DEVICE_ONLY_ON_WIFI import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_HAS_UNVIEWED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_NON_COMPLETED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_NON_VIEWED import tachiyomi.domain.library.service.LibraryPreferences.Companion.ENTRY_OUTSIDE_RELEASE_PERIOD import tachiyomi.domain.source.manga.model.SourceNotInstalledException import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import java.time.Instant import java.time.ZonedDateTime import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger class MangaLibraryUpdateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val sourceManager: MangaSourceManager = Injekt.get() private val libraryPreferences: LibraryPreferences = Injekt.get() private val downloadManager: MangaDownloadManager = Injekt.get() private val coverCache: MangaCoverCache = Injekt.get() private val getLibraryManga: GetLibraryManga = Injekt.get() private val getManga: GetManga = Injekt.get() private val updateManga: UpdateManga = Injekt.get() private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get() private val mangaFetchInterval: MangaFetchInterval = Injekt.get() private val filterChaptersForDownload: FilterChaptersForDownload = Injekt.get() private val notifier = MangaLibraryUpdateNotifier(context) private var mangaToUpdate: List = mutableListOf() override suspend fun doWork(): Result { if (tags.contains(WORK_NAME_AUTO)) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { val preferences = Injekt.get() val restrictions = preferences.autoUpdateDeviceRestrictions().get() if ((DEVICE_ONLY_ON_WIFI in restrictions) && !context.isConnectedToWifi()) { return Result.retry() } } // Find a running manual worker. If exists, try again later if (context.workManager.isRunning(WORK_NAME_MANUAL)) { return Result.retry() } } try { setForeground(getForegroundInfo()) } catch (e: IllegalStateException) { logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } } libraryPreferences.lastUpdatedTimestamp().set(Instant.now().toEpochMilli()) val categoryId = inputData.getLong(KEY_CATEGORY, -1L) addMangaToQueue(categoryId) return withIOContext { try { updateChapterList() Result.success() } catch (e: Exception) { if (e is CancellationException) { // Assume success although cancelled Result.success() } else { logcat(LogPriority.ERROR, e) Result.failure() } } finally { notifier.cancelProgressNotification() } } } override suspend fun getForegroundInfo(): ForegroundInfo { val notifier = MangaLibraryUpdateNotifier(context) return ForegroundInfo( Notifications.ID_LIBRARY_PROGRESS, notifier.progressNotificationBuilder.build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } /** * Adds list of manga to be updated. * * @param categoryId the ID of the category to update, or -1 if no category specified. */ private suspend fun addMangaToQueue(categoryId: Long) { val libraryManga = getLibraryManga.await() val listToUpdate = if (categoryId != -1L) { libraryManga.filter { it.category == categoryId } } else { val categoriesToUpdate = libraryPreferences.mangaUpdateCategories().get().map { it.toLong() } val includedManga = if (categoriesToUpdate.isNotEmpty()) { libraryManga.filter { it.category in categoriesToUpdate } } else { libraryManga } val categoriesToExclude = libraryPreferences.mangaUpdateCategoriesExclude().get().map { it.toLong() } val excludedMangaIds = if (categoriesToExclude.isNotEmpty()) { libraryManga.filter { it.category in categoriesToExclude }.map { it.manga.id } } else { emptyList() } includedManga .filterNot { it.manga.id in excludedMangaIds } .distinctBy { it.manga.id } } val restrictions = libraryPreferences.autoUpdateItemRestrictions().get() val skippedUpdates = mutableListOf>() val (_, fetchWindowUpperBound) = mangaFetchInterval.getWindow(ZonedDateTime.now()) mangaToUpdate = listToUpdate .filter { when { it.manga.updateStrategy != UpdateStrategy.ALWAYS_UPDATE -> { skippedUpdates.add( it.manga to context.stringResource(MR.strings.skipped_reason_not_always_update), ) false } ENTRY_NON_COMPLETED in restrictions && it.manga.status.toInt() == SManga.COMPLETED -> { skippedUpdates.add( it.manga to context.stringResource(MR.strings.skipped_reason_completed), ) false } ENTRY_HAS_UNVIEWED in restrictions && it.unreadCount != 0L -> { skippedUpdates.add( it.manga to context.stringResource(MR.strings.skipped_reason_not_caught_up), ) false } ENTRY_NON_VIEWED in restrictions && it.totalChapters > 0L && !it.hasStarted -> { skippedUpdates.add( it.manga to context.stringResource(MR.strings.skipped_reason_not_started), ) false } ENTRY_OUTSIDE_RELEASE_PERIOD in restrictions && it.manga.nextUpdate > fetchWindowUpperBound -> { skippedUpdates.add( it.manga to context.stringResource(MR.strings.skipped_reason_not_in_release_period), ) false } else -> true } } .sortedBy { it.manga.title } notifier.showQueueSizeWarningNotificationIfNeeded(mangaToUpdate) if (skippedUpdates.isNotEmpty()) { // TODO: surface skipped reasons to user? logcat { skippedUpdates .groupBy { it.second } .map { (reason, entries) -> "$reason: [${entries.map { it.first.title }.sorted().joinToString()}]" } .joinToString() } } } /** * Method that updates manga in [mangaToUpdate]. It's called in a background thread, so it's safe * to do heavy operations or network calls here. * For each manga it calls [updateManga] and updates the notification showing the current * progress. * * @return an observable delivering the progress of each update. */ private suspend fun updateChapterList() { val semaphore = Semaphore(5) val progressCount = AtomicInteger(0) val currentlyUpdatingManga = CopyOnWriteArrayList() val newUpdates = CopyOnWriteArrayList>>() val failedUpdates = CopyOnWriteArrayList>() val hasDownloads = AtomicBoolean(false) val fetchWindow = mangaFetchInterval.getWindow(ZonedDateTime.now()) coroutineScope { mangaToUpdate.groupBy { it.manga.source }.values .map { mangaInSource -> async { semaphore.withPermit { mangaInSource.forEach { libraryManga -> val manga = libraryManga.manga ensureActive() // Don't continue to update if manga is not in library if (getManga.await(manga.id)?.favorite != true) { return@forEach } withUpdateNotification( currentlyUpdatingManga, progressCount, manga, ) { try { val newChapters = updateManga(manga, fetchWindow) .sortedByDescending { it.sourceOrder } if (newChapters.isNotEmpty()) { val chaptersToDownload = filterChaptersForDownload.await(manga, newChapters) if (chaptersToDownload.isNotEmpty()) { downloadChapters(manga, chaptersToDownload) hasDownloads.set(true) } libraryPreferences.newMangaUpdatesCount() .getAndSet { it + newChapters.size } // Convert to the manga that contains new chapters newUpdates.add(manga to newChapters.toTypedArray()) } } catch (e: Throwable) { val errorMessage = when (e) { is NoChaptersException -> context.stringResource( MR.strings.no_chapters_error, ) // failedUpdates will already have the source, don't need to copy it into the message is SourceNotInstalledException -> context.stringResource( MR.strings.loader_not_implemented_error, ) else -> e.message } failedUpdates.add(manga to errorMessage) } } } } } } .awaitAll() } notifier.cancelProgressNotification() if (newUpdates.isNotEmpty()) { notifier.showUpdateNotifications(newUpdates) if (hasDownloads.get()) { downloadManager.startDownloads() } } if (failedUpdates.isNotEmpty()) { val errorFile = writeErrorFile(failedUpdates) notifier.showUpdateErrorNotification( failedUpdates.size, errorFile.getUriCompat(context), ) } } private fun downloadChapters(manga: Manga, chapters: List) { // We don't want to start downloading while the library is updating, because websites // may don't like it and they could ban the user. downloadManager.downloadChapters(manga, chapters, false) } /** * Updates the chapters for the given manga and adds them to the database. * * @param manga the manga to update. * @return a pair of the inserted and removed chapters. */ private suspend fun updateManga(manga: Manga, fetchWindow: Pair): List { val source = sourceManager.getOrStub(manga.source) // Update manga metadata if needed if (libraryPreferences.autoUpdateMetadata().get()) { val networkManga = source.getMangaDetails(manga.toSManga()) updateManga.awaitUpdateFromSource(manga, networkManga, manualFetch = false, coverCache) } val chapters = source.getChapterList(manga.toSManga()) // Get manga from database to account for if it was removed during the update and // to get latest data so it doesn't get overwritten later on val dbManga = getManga.await(manga.id)?.takeIf { it.favorite } ?: return emptyList() return syncChaptersWithSource.await(chapters, dbManga, source, false, fetchWindow) } private suspend fun withUpdateNotification( updatingManga: CopyOnWriteArrayList, completed: AtomicInteger, manga: Manga, block: suspend () -> Unit, ) = coroutineScope { ensureActive() updatingManga.add(manga) notifier.showProgressNotification( updatingManga, completed.get(), mangaToUpdate.size, ) block() ensureActive() updatingManga.remove(manga) completed.getAndIncrement() notifier.showProgressNotification( updatingManga, completed.get(), mangaToUpdate.size, ) } /** * Writes basic file of update errors to cache dir. */ private fun writeErrorFile(errors: List>): File { try { if (errors.isNotEmpty()) { val file = context.createFileInCacheDir("aniyomi_update_errors.txt") file.bufferedWriter().use { out -> out.write( context.stringResource(MR.strings.library_errors_help, ERROR_LOG_HELP_URL) + "\n\n", ) // Error file format: // ! Error // # Source // - Manga errors.groupBy({ it.second }, { it.first }).forEach { (error, mangas) -> out.write("\n! ${error}\n") mangas.groupBy { it.source }.forEach { (srcId, mangas) -> val source = sourceManager.getOrStub(srcId) out.write(" # $source\n") mangas.forEach { out.write(" - ${it.title}\n") } } } } return file } } catch (_: Exception) {} return File("") } companion object { private const val TAG = "LibraryUpdate" private const val WORK_NAME_AUTO = "LibraryUpdate-auto" private const val WORK_NAME_MANUAL = "LibraryUpdate-manual" private const val ERROR_LOG_HELP_URL = "https://aniyomi.org/help/guides/troubleshooting" private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 /** * Key for category to update. */ private const val KEY_CATEGORY = "category" fun cancelAllWorks(context: Context) { context.workManager.cancelAllWorkByTag(TAG) } fun setupTask( context: Context, prefInterval: Int? = null, ) { val preferences = Injekt.get() val interval = prefInterval ?: preferences.autoUpdateInterval().get() if (interval > 0) { val restrictions = preferences.autoUpdateDeviceRestrictions().get() val networkType = if (DEVICE_NETWORK_NOT_METERED in restrictions) { NetworkType.UNMETERED } else { NetworkType.CONNECTED } val networkRequestBuilder = NetworkRequest.Builder() if (DEVICE_ONLY_ON_WIFI in restrictions) { networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) } if (DEVICE_NETWORK_NOT_METERED in restrictions) { networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) } val constraints = Constraints.Builder() // 'networkRequest' only applies to Android 9+, otherwise 'networkType' is used .setRequiredNetworkRequest(networkRequestBuilder.build(), networkType) .setRequiresCharging(DEVICE_CHARGING in restrictions) .setRequiresBatteryNotLow(true) .build() val request = PeriodicWorkRequestBuilder( interval.toLong(), TimeUnit.HOURS, 10, TimeUnit.MINUTES, ) .addTag(TAG) .addTag(WORK_NAME_AUTO) .setConstraints(constraints) .setBackoffCriteria(BackoffPolicy.LINEAR, 10, TimeUnit.MINUTES) .build() context.workManager.enqueueUniquePeriodicWork( WORK_NAME_AUTO, ExistingPeriodicWorkPolicy.UPDATE, request, ) } else { context.workManager.cancelUniqueWork(WORK_NAME_AUTO) } } fun startNow( context: Context, category: Category? = null, ): Boolean { val wm = context.workManager if (wm.isRunning(TAG)) { // Already running either as a scheduled or manual job return false } val inputData = workDataOf( KEY_CATEGORY to category?.id, ) val request = OneTimeWorkRequestBuilder() .addTag(TAG) .addTag(WORK_NAME_MANUAL) .setInputData(inputData) .build() wm.enqueueUniqueWork(WORK_NAME_MANUAL, ExistingWorkPolicy.KEEP, request) return true } fun stop(context: Context) { val wm = context.workManager val workQuery = WorkQuery.Builder.fromTags(listOf(TAG)) .addStates(listOf(WorkInfo.State.RUNNING)) .build() wm.getWorkInfos(workQuery).get() // Should only return one work but just in case .forEach { wm.cancelWorkById(it.id) // Re-enqueue cancelled scheduled work if (it.tags.contains(WORK_NAME_AUTO)) { setupTask(context) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaLibraryUpdateNotifier.kt ================================================ package eu.kanade.tachiyomi.data.library.manga import android.app.Notification import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import coil3.asDrawable import coil3.imageLoader import coil3.request.ImageRequest import coil3.request.transformations import coil3.transform.CircleCropTransformation import eu.kanade.presentation.util.formatChapterNumber import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.data.download.manga.MangaDownloader import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.source.UnmeteredSource import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchUI import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.math.RoundingMode import java.text.NumberFormat class MangaLibraryUpdateNotifier( private val context: Context, private val securityPreferences: SecurityPreferences = Injekt.get(), private val sourceManager: MangaSourceManager = Injekt.get(), ) { private val percentFormatter = NumberFormat.getPercentInstance().apply { roundingMode = RoundingMode.DOWN maximumFractionDigits = 0 } /** * Pending intent of action that cancels the library update */ private val cancelIntent by lazy { NotificationReceiver.cancelLibraryUpdatePendingBroadcast(context) } /** * Bitmap of the app for notifications. */ private val notificationBitmap by lazy { BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher) } /** * Cached progress notification to avoid creating a lot. */ val progressNotificationBuilder by lazy { context.notificationBuilder(Notifications.CHANNEL_LIBRARY_PROGRESS) { setContentTitle(context.stringResource(MR.strings.app_name)) setSmallIcon(R.drawable.ic_refresh_24dp) setLargeIcon(notificationBitmap) setOngoing(true) setOnlyAlertOnce(true) addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), cancelIntent, ) } } /** * Shows the notification containing the currently updating manga and the progress. * * @param manga the manga that are being updated. * @param current the current progress. * @param total the total progress. */ fun showProgressNotification(manga: List, current: Int, total: Int) { progressNotificationBuilder .setContentTitle( context.stringResource( MR.strings.notification_updating_progress, percentFormatter.format(current.toFloat() / total), ), ) if (!securityPreferences.hideNotificationContent().get()) { val updatingText = manga.joinToString("\n") { it.title.chop(40) } progressNotificationBuilder.setStyle(NotificationCompat.BigTextStyle().bigText(updatingText)) } context.notify( Notifications.ID_LIBRARY_PROGRESS, progressNotificationBuilder .setProgress(total, current, false) .build(), ) } /** * Warn when excessively checking any single source. */ fun showQueueSizeWarningNotificationIfNeeded(mangaToUpdate: List) { val maxUpdatesFromSource = mangaToUpdate .groupBy { it.manga.source } .filterKeys { sourceManager.get(it) !is UnmeteredSource } .maxOfOrNull { it.value.size } ?: 0 if (maxUpdatesFromSource <= MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD) { return } context.notify( Notifications.ID_LIBRARY_SIZE_WARNING, Notifications.CHANNEL_LIBRARY_PROGRESS, ) { setContentTitle(context.stringResource(MR.strings.label_warning)) setStyle( NotificationCompat.BigTextStyle() .bigText(context.stringResource(MR.strings.notification_size_warning)), ) setSmallIcon(R.drawable.ic_warning_white_24dp) setTimeoutAfter(MangaDownloader.WARNING_NOTIF_TIMEOUT_MS) setContentIntent(NotificationHandler.openUrl(context, HELP_WARNING_URL)) } } /** * Shows notification containing update entries that failed with action to open full log. * * @param failed Number of entries that failed to update. * @param uri Uri for error log file containing all titles that failed. */ fun showUpdateErrorNotification(failed: Int, uri: Uri) { if (failed == 0) { return } context.notify( Notifications.ID_LIBRARY_ERROR, Notifications.CHANNEL_LIBRARY_ERROR, ) { setContentTitle(context.stringResource(MR.strings.notification_update_error, failed)) setContentText(context.stringResource(MR.strings.action_show_errors)) setSmallIcon(R.drawable.ic_ani) setContentIntent(NotificationReceiver.openErrorLogPendingActivity(context, uri)) } } /** * Shows the notification containing the result of the update done by the service. * * @param updates a list of manga with new updates. */ fun showUpdateNotifications(updates: List>>) { // Parent group notification context.notify( Notifications.ID_NEW_CHAPTERS, Notifications.CHANNEL_NEW_CHAPTERS_EPISODES, ) { setContentTitle(context.stringResource(MR.strings.notification_new_chapters)) if (updates.size == 1 && !securityPreferences.hideNotificationContent().get()) { setContentText(updates.first().first.title.chop(NOTIF_TITLE_MAX_LEN)) } else { setContentText( context.resources.getQuantityString( R.plurals.notification_new_chapters_summary, updates.size, updates.size, ), ) if (!securityPreferences.hideNotificationContent().get()) { setStyle( NotificationCompat.BigTextStyle().bigText( updates.joinToString("\n") { it.first.title.chop(NOTIF_TITLE_MAX_LEN) }, ), ) } } setSmallIcon(R.drawable.ic_ani) setLargeIcon(notificationBitmap) setGroup(Notifications.GROUP_NEW_CHAPTERS) setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) setGroupSummary(true) priority = NotificationCompat.PRIORITY_HIGH setContentIntent(getNotificationIntent()) setAutoCancel(true) } // Per-manga notification if (!securityPreferences.hideNotificationContent().get()) { launchUI { context.notify( updates.map { (manga, chapters) -> NotificationManagerCompat.NotificationWithIdAndTag( manga.id.hashCode(), createNewChaptersNotification(manga, chapters), ) }, ) } } } private suspend fun createNewChaptersNotification(manga: Manga, chapters: Array): Notification { val icon = getMangaIcon(manga) return context.notificationBuilder(Notifications.CHANNEL_NEW_CHAPTERS_EPISODES) { setContentTitle(manga.title) val description = getNewChaptersDescription(chapters) setContentText(description) setStyle(NotificationCompat.BigTextStyle().bigText(description)) setSmallIcon(R.drawable.ic_ani) if (icon != null) { setLargeIcon(icon) } setGroup(Notifications.GROUP_NEW_CHAPTERS) setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) priority = NotificationCompat.PRIORITY_HIGH // Open first chapter on tap setContentIntent( NotificationReceiver.openChapterPendingActivity( context, manga, chapters.first(), ), ) setAutoCancel(true) // Mark chapters as read action addAction( R.drawable.ic_done_24dp, context.stringResource(MR.strings.action_mark_as_read), NotificationReceiver.markAsViewedPendingBroadcast( context, manga, chapters, Notifications.ID_NEW_CHAPTERS, ), ) // View chapters action addAction( R.drawable.ic_book_24dp, context.stringResource(MR.strings.action_view_chapters), NotificationReceiver.openChapterPendingActivity( context, manga, Notifications.ID_NEW_CHAPTERS, ), ) // Download chapters action // Only add the action when chapters is within threshold if (chapters.size <= MangaDownloader.CHAPTERS_PER_SOURCE_QUEUE_WARNING_THRESHOLD) { addAction( android.R.drawable.stat_sys_download_done, context.stringResource(MR.strings.action_download), NotificationReceiver.downloadChaptersPendingBroadcast( context, manga, chapters, Notifications.ID_NEW_CHAPTERS, ), ) } }.build() } /** * Cancels the progress notification. */ fun cancelProgressNotification() { context.cancelNotification(Notifications.ID_LIBRARY_PROGRESS) } private suspend fun getMangaIcon(manga: Manga): Bitmap? { val request = ImageRequest.Builder(context) .data(manga) .transformations(CircleCropTransformation()) .size(NOTIF_ICON_SIZE) .build() val drawable = context.imageLoader.execute(request).image?.asDrawable(context.resources) return drawable?.getBitmapOrNull() } private fun getNewChaptersDescription(chapters: Array): String { val displayableChapterNumbers = chapters .filter { it.isRecognizedNumber } .sortedBy { it.chapterNumber } .map { formatChapterNumber(it.chapterNumber) } .toSet() return when (displayableChapterNumbers.size) { // No sensible chapter numbers to show (i.e. no chapters have parsed chapter number) 0 -> { // "1 new chapter" or "5 new chapters" context.resources.getQuantityString( R.plurals.notification_chapters_generic, chapters.size, chapters.size, ) } // Only 1 chapter has a parsed chapter number 1 -> { val remaining = chapters.size - displayableChapterNumbers.size if (remaining == 0) { // "Chapter 2.5" context.stringResource( MR.strings.notification_chapters_single, displayableChapterNumbers.first(), ) } else { // "Chapter 2.5 and 10 more" context.stringResource( MR.strings.notification_chapters_single_and_more, displayableChapterNumbers.first(), remaining, ) } } // Everything else (i.e. multiple parsed chapter numbers) else -> { val shouldTruncate = displayableChapterNumbers.size > NOTIF_MAX_CHAPTERS if (shouldTruncate) { // "Chapters 1, 2.5, 3, 4, 5 and 10 more" val remaining = displayableChapterNumbers.size - NOTIF_MAX_CHAPTERS val joinedChapterNumbers = displayableChapterNumbers.take(NOTIF_MAX_CHAPTERS).joinToString( ", ", ) context.resources.getQuantityString( R.plurals.notification_chapters_multiple_and_more, remaining, joinedChapterNumbers, remaining, ) } else { // "Chapters 1, 2.5, 3" context.stringResource( MR.strings.notification_chapters_multiple, displayableChapterNumbers.joinToString(", "), ) } } } } /** * Returns an intent to open the main activity. */ private fun getNotificationIntent(): PendingIntent { val intent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP action = Constants.SHORTCUT_UPDATES } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } companion object { // TODO: Change when implemented on Aniyomi website const val HELP_WARNING_URL = "https://aniyomi.org/docs/faq/library#why-am-i-warned-about-large-bulk-updates-and-downloads" } } private const val NOTIF_MAX_CHAPTERS = 5 private const val NOTIF_TITLE_MAX_LEN = 45 private const val NOTIF_ICON_SIZE = 192 private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/library/manga/MangaMetadataUpdateJob.kt ================================================ package eu.kanade.tachiyomi.data.library.manga import android.content.Context import android.content.pm.ServiceInfo import android.os.Build import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkQuery import androidx.work.WorkerParameters import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.entries.manga.model.copyFrom import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.prepUpdateCover import eu.kanade.tachiyomi.util.system.isRunning import eu.kanade.tachiyomi.util.system.workManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.ensureActive import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.interactor.GetLibraryManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.toMangaUpdate import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.atomic.AtomicInteger class MangaMetadataUpdateJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val sourceManager: MangaSourceManager = Injekt.get() private val coverCache: MangaCoverCache = Injekt.get() private val getLibraryManga: GetLibraryManga = Injekt.get() private val updateManga: UpdateManga = Injekt.get() private val notifier = MangaLibraryUpdateNotifier(context) private var mangaToUpdate: List = mutableListOf() override suspend fun doWork(): Result { try { setForeground(getForegroundInfo()) } catch (e: IllegalStateException) { logcat(LogPriority.ERROR, e) { "Not allowed to set foreground job" } } addMangaToQueue() return withIOContext { try { updateMetadata() Result.success() } catch (e: Exception) { if (e is CancellationException) { // Assume success although cancelled Result.success() } else { logcat(LogPriority.ERROR, e) Result.failure() } } finally { notifier.cancelProgressNotification() } } } override suspend fun getForegroundInfo(): ForegroundInfo { val notifier = MangaLibraryUpdateNotifier(context) return ForegroundInfo( Notifications.ID_LIBRARY_PROGRESS, notifier.progressNotificationBuilder.build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } /** * Adds list of manga to be updated. */ private suspend fun addMangaToQueue() { mangaToUpdate = getLibraryManga.await() notifier.showQueueSizeWarningNotificationIfNeeded(mangaToUpdate) } private suspend fun updateMetadata() { val semaphore = Semaphore(5) val progressCount = AtomicInteger(0) val currentlyUpdatingManga = CopyOnWriteArrayList() coroutineScope { mangaToUpdate.groupBy { it.manga.source } .values .map { mangaInSource -> async { semaphore.withPermit { mangaInSource.forEach { libraryManga -> val manga = libraryManga.manga ensureActive() withUpdateNotification( currentlyUpdatingManga, progressCount, manga, ) { val source = sourceManager.get(manga.source) ?: return@withUpdateNotification try { val networkManga = source.getMangaDetails(manga.toSManga()) val updatedManga = manga.prepUpdateCover(coverCache, networkManga, true) .copyFrom(networkManga) try { updateManga.await(updatedManga.toMangaUpdate()) } catch (e: Exception) { logcat(LogPriority.ERROR) { "Manga doesn't exist anymore" } } } catch (e: Throwable) { // Ignore errors and continue logcat(LogPriority.ERROR, e) } } } } } } .awaitAll() } notifier.cancelProgressNotification() } private suspend fun withUpdateNotification( updatingManga: CopyOnWriteArrayList, completed: AtomicInteger, manga: Manga, block: suspend () -> Unit, ) = coroutineScope { ensureActive() updatingManga.add(manga) notifier.showProgressNotification( updatingManga, completed.get(), mangaToUpdate.size, ) block() ensureActive() updatingManga.remove(manga) completed.getAndIncrement() notifier.showProgressNotification( updatingManga, completed.get(), mangaToUpdate.size, ) } companion object { private const val TAG = "MetadataUpdate" private const val WORK_NAME_MANUAL = "MetadataUpdate" private const val MANGA_PER_SOURCE_QUEUE_WARNING_THRESHOLD = 60 fun startNow(context: Context): Boolean { val wm = context.workManager if (wm.isRunning(TAG)) { // Already running either as a scheduled or manual job return false } val request = OneTimeWorkRequestBuilder() .addTag(TAG) .addTag(WORK_NAME_MANUAL) .build() wm.enqueueUniqueWork(WORK_NAME_MANUAL, ExistingWorkPolicy.KEEP, request) return true } fun stop(context: Context) { val wm = context.workManager val workQuery = WorkQuery.Builder.fromTags(listOf(TAG)) .addStates(listOf(WorkInfo.State.RUNNING)) .build() wm.getWorkInfos(workQuery).get() // Should only return one work but just in case .forEach { wm.cancelWorkById(it.id) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationHandler.kt ================================================ package eu.kanade.tachiyomi.data.notification import android.app.PendingIntent import android.content.Context import android.content.Intent import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionInstaller import eu.kanade.tachiyomi.ui.main.MainActivity /** * Class that manages [PendingIntent] of activity's */ object NotificationHandler { /** * Returns [PendingIntent] that starts a download activity. * * @param context context of application */ internal fun openDownloadManagerPendingActivity(context: Context): PendingIntent { val intent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP action = Constants.SHORTCUT_DOWNLOADS } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a download activity. * * @param context context of application */ internal fun openAnimeDownloadManagerPendingActivity(context: Context): PendingIntent { val intent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT action = Constants.SHORTCUT_ANIME_DOWNLOADS } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a gallery activity * * @param context context of application * @param file file containing image */ internal fun openImagePendingActivity(context: Context, uri: Uri): PendingIntent { val intent = Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, "image/*") flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that prompts user with apk install intent * * @param context context * @param uri uri of apk that is installed */ fun installApkPendingActivity(context: Context, uri: Uri): PendingIntent { val intent = Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, MangaExtensionInstaller.APK_MIME) flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION } return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) } fun openUrl(context: Context, url: String): PendingIntent { val notificationIntent = Intent(Intent.ACTION_VIEW, url.toUri()) return PendingIntent.getActivity( context, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt ================================================ package eu.kanade.tachiyomi.data.notification import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.data.backup.restore.BackupRestoreJob import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateJob import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateJob import eu.kanade.tachiyomi.data.updater.AppUpdateDownloadJob import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.player.PlayerActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.runBlocking import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.interactor.GetChapter import tachiyomi.domain.items.chapter.interactor.UpdateChapter import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.model.toChapterUpdate import tachiyomi.domain.items.episode.interactor.GetEpisode import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.model.toEpisodeUpdate import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID /** * Global [BroadcastReceiver] that runs on UI thread * Pending Broadcasts should be made from here. * NOTE: Use local broadcasts if possible. */ class NotificationReceiver : BroadcastReceiver() { private val getManga: GetManga by injectLazy() private val getAnime: GetAnime by injectLazy() private val getChapter: GetChapter by injectLazy() private val getEpisode: GetEpisode by injectLazy() private val updateChapter: UpdateChapter by injectLazy() private val updateEpisode: UpdateEpisode by injectLazy() private val mangaDownloadManager: MangaDownloadManager by injectLazy() private val animeDownloadManager: AnimeDownloadManager by injectLazy() override fun onReceive(context: Context, intent: Intent) { when (intent.action) { // Dismiss notification ACTION_DISMISS_NOTIFICATION -> dismissNotification( context, intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1), ) // Resume the download service ACTION_RESUME_DOWNLOADS -> mangaDownloadManager.startDownloads() // Pause the download service ACTION_PAUSE_DOWNLOADS -> mangaDownloadManager.pauseDownloads() // Clear the download queue ACTION_CLEAR_DOWNLOADS -> mangaDownloadManager.clearQueue() ACTION_RESUME_ANIME_DOWNLOADS -> animeDownloadManager.startDownloads() // Pause the download service ACTION_PAUSE_ANIME_DOWNLOADS -> animeDownloadManager.pauseDownloads() // Clear the download queue ACTION_CLEAR_ANIME_DOWNLOADS -> animeDownloadManager.clearQueue() // Launch share activity and dismiss notification ACTION_SHARE_IMAGE -> shareImage( context, intent.getStringExtra(EXTRA_URI)!!.toUri(), ) // Share backup file ACTION_SHARE_BACKUP -> shareFile( context, intent.getParcelableExtraCompat(EXTRA_URI)!!, "application/x-protobuf+gzip", ) ACTION_CANCEL_RESTORE -> cancelRestore(context) // Cancel library update and dismiss notification ACTION_CANCEL_LIBRARY_UPDATE -> cancelLibraryUpdate(context) ACTION_CANCEL_ANIMELIB_UPDATE -> cancelAnimelibUpdate(context) // Start downloading app update ACTION_START_APP_UPDATE -> startDownloadAppUpdate(context, intent) // Cancel downloading app update ACTION_CANCEL_APP_UPDATE_DOWNLOAD -> cancelDownloadAppUpdate(context) // Open reader activity ACTION_OPEN_CHAPTER -> { openChapter( context, intent.getLongExtra(EXTRA_MANGA_ID, -1), intent.getLongExtra(EXTRA_CHAPTER_ID, -1), ) } // Open player activity ACTION_OPEN_EPISODE -> { openEpisode( context, intent.getLongExtra(EXTRA_MANGA_ID, -1), intent.getLongExtra(EXTRA_CHAPTER_ID, -1), ) } // Mark updated manga chapters as read ACTION_MARK_AS_READ -> { val notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) if (notificationId > -1) { dismissNotification( context, notificationId, intent.getIntExtra(EXTRA_GROUP_ID, 0), ) } val urls = intent.getStringArrayExtra(EXTRA_CHAPTER_URL) ?: return val mangaId = intent.getLongExtra(EXTRA_MANGA_ID, -1) if (mangaId > -1) { markAsRead(urls, mangaId) } } // Mark updated anime episodes as seen ACTION_MARK_AS_SEEN -> { val notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) if (notificationId > -1) { dismissNotification( context, notificationId, intent.getIntExtra(EXTRA_GROUP_ID, 0), ) } val urls = intent.getStringArrayExtra(EXTRA_CHAPTER_URL) ?: return val animeId = intent.getLongExtra(EXTRA_MANGA_ID, -1) if (animeId > -1) { markAsSeen(urls, animeId) } } // Download manga chapters ACTION_DOWNLOAD_CHAPTER -> { val notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) if (notificationId > -1) { dismissNotification( context, notificationId, intent.getIntExtra(EXTRA_GROUP_ID, 0), ) } val urls = intent.getStringArrayExtra(EXTRA_CHAPTER_URL) ?: return val mangaId = intent.getLongExtra(EXTRA_MANGA_ID, -1) if (mangaId > -1) { downloadChapters(urls, mangaId) } } // Download anime episodes ACTION_DOWNLOAD_EPISODE -> { val notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) if (notificationId > -1) { dismissNotification( context, notificationId, intent.getIntExtra(EXTRA_GROUP_ID, 0), ) } val urls = intent.getStringArrayExtra(EXTRA_CHAPTER_URL) ?: return val animeId = intent.getLongExtra(EXTRA_MANGA_ID, -1) if (animeId > -1) { downloadEpisodes(urls, animeId) } } } } /** * Dismiss the notification * * @param notificationId the id of the notification */ private fun dismissNotification(context: Context, notificationId: Int) { context.cancelNotification(notificationId) context.notificationManager.cancelAll() } /** * Called to start share intent to share image * * @param context context of application * @param uri path of file */ private fun shareImage(context: Context, uri: Uri) { context.startActivity(uri.toShareIntent(context)) } /** * Called to start share intent to share backup file * * @param context context of application * @param path path of file */ private fun shareFile(context: Context, uri: Uri, fileMimeType: String) { context.startActivity(uri.toShareIntent(context, fileMimeType)) } /** * Starts reader activity * * @param context context of application * @param mangaId id of manga * @param chapterId id of chapter */ private fun openChapter(context: Context, mangaId: Long, chapterId: Long) { val manga = runBlocking { getManga.await(mangaId) } val chapter = runBlocking { getChapter.await(chapterId) } if (manga != null && chapter != null) { val intent = ReaderActivity.newIntent(context, manga.id, chapter.id).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP } context.startActivity(intent) } else { context.toast(context.stringResource(AYMR.strings.download_error)) } } /** * Starts player activity * * @param context context of application * @param animeId id of anime * @param episodeId id of episode */ private fun openEpisode(context: Context, animeId: Long, episodeId: Long) { val anime = runBlocking { getAnime.await(animeId) } val episode = runBlocking { getEpisode.await(episodeId) } if (anime != null && episode != null) { val intent = PlayerActivity.newIntent(context, anime.id, episode.id).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP } context.startActivity(intent) } else { context.toast(context.stringResource(AYMR.strings.download_error)) } } /** * Method called when user wants to stop a backup restore job. * * @param context context of application */ private fun cancelRestore(context: Context) { BackupRestoreJob.stop(context) } /** * Method called when user wants to stop a library update * * @param context context of application */ private fun cancelLibraryUpdate(context: Context) { MangaLibraryUpdateJob.stop(context) } /** * Method called when user wants to stop a library update * * @param context context of application */ private fun cancelAnimelibUpdate(context: Context) { AnimeLibraryUpdateJob.stop(context) } private fun startDownloadAppUpdate(context: Context, intent: Intent) { val url = intent.getStringExtra(AppUpdateDownloadJob.EXTRA_DOWNLOAD_URL) ?: return AppUpdateDownloadJob.start(context, url) } private fun cancelDownloadAppUpdate(context: Context) { AppUpdateDownloadJob.stop(context) } /** * Method called when user wants to mark manga chapters as read * * @param chapterUrls URLs of chapter to mark as read * @param mangaId id of manga */ private fun markAsRead(chapterUrls: Array, mangaId: Long) { val downloadPreferences: DownloadPreferences = Injekt.get() val sourceManager: MangaSourceManager = Injekt.get() launchIO { val toUpdate = chapterUrls.mapNotNull { getChapter.await(it, mangaId) } .map { val chapter = it.copy(read = true) if (downloadPreferences.removeAfterMarkedAsRead().get()) { val manga = getManga.await(mangaId) if (manga != null) { val source = sourceManager.get(manga.source) if (source != null) { mangaDownloadManager.deleteChapters(listOf(it), manga, source) } } } chapter.toChapterUpdate() } updateChapter.awaitAll(toUpdate) } } /** * Method called when user wants to mark anime episodes as seen * * @param episodeUrls URLs of episodes to mark as seen * @param animeId id of anime */ private fun markAsSeen(episodeUrls: Array, animeId: Long) { val downloadPreferences: DownloadPreferences = Injekt.get() val sourceManager: AnimeSourceManager = Injekt.get() launchIO { val toUpdate = episodeUrls.mapNotNull { getEpisode.await(it, animeId) } .map { val episode = it.copy(seen = true) if (downloadPreferences.removeAfterMarkedAsRead().get()) { val anime = getAnime.await(animeId) if (anime != null) { val source = sourceManager.get(anime.source) if (source != null) { animeDownloadManager.deleteEpisodes(listOf(it), anime, source) } } } episode.toEpisodeUpdate() } updateEpisode.awaitAll(toUpdate) } } /** * Method called when user wants to download chapters * * @param chapterUrls URLs of chapter to download * @param mangaId id of manga */ private fun downloadChapters(chapterUrls: Array, mangaId: Long) { launchIO { val manga = getManga.await(mangaId) ?: return@launchIO val chapters = chapterUrls.mapNotNull { getChapter.await(it, mangaId) } mangaDownloadManager.downloadChapters(manga, chapters) } } /** * Method called when user wants to download episodes * * @param episodeUrls URLs of episode to download * @param animeId id of manga */ private fun downloadEpisodes(episodeUrls: Array, animeId: Long) { launchIO { val anime = getAnime.await(animeId) ?: return@launchIO val episodes = episodeUrls.mapNotNull { getEpisode.await(it, animeId) } animeDownloadManager.downloadEpisodes(anime, episodes) } } companion object { private const val NAME = "NotificationReceiver" private const val ACTION_SHARE_IMAGE = "$ID.$NAME.SHARE_IMAGE" private const val ACTION_SHARE_BACKUP = "$ID.$NAME.SEND_BACKUP" private const val ACTION_CANCEL_RESTORE = "$ID.$NAME.CANCEL_RESTORE" private const val ACTION_CANCEL_LIBRARY_UPDATE = "$ID.$NAME.CANCEL_LIBRARY_UPDATE" private const val ACTION_CANCEL_ANIMELIB_UPDATE = "$ID.$NAME.CANCEL_ANIMELIB_UPDATE" private const val ACTION_START_APP_UPDATE = "$ID.$NAME.ACTION_START_APP_UPDATE" private const val ACTION_CANCEL_APP_UPDATE_DOWNLOAD = "$ID.$NAME.CANCEL_APP_UPDATE_DOWNLOAD" private const val ACTION_MARK_AS_READ = "$ID.$NAME.MARK_AS_READ" private const val ACTION_MARK_AS_SEEN = "$ID.$NAME.MARK_AS_SEEN" private const val ACTION_OPEN_CHAPTER = "$ID.$NAME.ACTION_OPEN_CHAPTER" private const val ACTION_OPEN_EPISODE = "$ID.$NAME.ACTION_OPEN_EPISODE" private const val ACTION_DOWNLOAD_CHAPTER = "$ID.$NAME.ACTION_DOWNLOAD_CHAPTER" private const val ACTION_DOWNLOAD_EPISODE = "$ID.$NAME.ACTION_DOWNLOAD_EPISODE" private const val ACTION_OPEN_ENTRY = "$ID.$NAME.ACTION_OPEN_ENTRY" private const val ACTION_RESUME_DOWNLOADS = "$ID.$NAME.ACTION_RESUME_DOWNLOADS" private const val ACTION_PAUSE_DOWNLOADS = "$ID.$NAME.ACTION_PAUSE_DOWNLOADS" private const val ACTION_CLEAR_DOWNLOADS = "$ID.$NAME.ACTION_CLEAR_DOWNLOADS" private const val ACTION_RESUME_ANIME_DOWNLOADS = "$ID.$NAME.ACTION_RESUME_ANIME_DOWNLOADS" private const val ACTION_PAUSE_ANIME_DOWNLOADS = "$ID.$NAME.ACTION_PAUSE_ANIME_DOWNLOADS" private const val ACTION_CLEAR_ANIME_DOWNLOADS = "$ID.$NAME.ACTION_CLEAR_ANIME_DOWNLOADS" private const val ACTION_DISMISS_NOTIFICATION = "$ID.$NAME.ACTION_DISMISS_NOTIFICATION" private const val EXTRA_URI = "$ID.$NAME.URI" private const val EXTRA_NOTIFICATION_ID = "$ID.$NAME.NOTIFICATION_ID" private const val EXTRA_GROUP_ID = "$ID.$NAME.EXTRA_GROUP_ID" private const val EXTRA_MANGA_ID = "$ID.$NAME.EXTRA_MANGA_ID" private const val EXTRA_CHAPTER_ID = "$ID.$NAME.EXTRA_CHAPTER_ID" private const val EXTRA_CHAPTER_URL = "$ID.$NAME.EXTRA_CHAPTER_URL" /** * Returns a [PendingIntent] that resumes the download of a chapter * * @param context context of application * @return [PendingIntent] */ internal fun resumeDownloadsPendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_RESUME_DOWNLOADS } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that pauses the download queue * * @param context context of application * @return [PendingIntent] */ internal fun pauseDownloadsPendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_PAUSE_DOWNLOADS } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns a [PendingIntent] that clears the download queue * * @param context context of application * @return [PendingIntent] */ internal fun clearDownloadsPendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_CLEAR_DOWNLOADS } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns a [PendingIntent] that resumes the download of a chapter * * @param context context of application * @return [PendingIntent] */ internal fun resumeAnimeDownloadsPendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_RESUME_ANIME_DOWNLOADS } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that pauses the download queue * * @param context context of application * @return [PendingIntent] */ internal fun pauseAnimeDownloadsPendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_PAUSE_ANIME_DOWNLOADS } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns a [PendingIntent] that clears the download queue * * @param context context of application * @return [PendingIntent] */ internal fun clearAnimeDownloadsPendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_CLEAR_ANIME_DOWNLOADS } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a service which dismissed the notification * * @param context context of application * @param notificationId id of notification * @return [PendingIntent] */ internal fun dismissNotificationPendingBroadcast(context: Context, notificationId: Int): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_DISMISS_NOTIFICATION putExtra(EXTRA_NOTIFICATION_ID, notificationId) } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a service which dismissed the notification * * @param context context of application * @param notificationId id of notification * @return [PendingIntent] */ internal fun dismissNotification( context: Context, notificationId: Int, groupId: Int? = null, ) { /* Group notifications always have at least 2 notifications: - Group summary notification - Single manga notification If the single notification is dismissed by the system, ie by a user swipe or tapping on the notification, it will auto dismiss the group notification if there's no other single updates. When programmatically dismissing this notification, the group notification is not automatically dismissed. */ val groupKey = context.notificationManager.activeNotifications.find { it.id == notificationId }?.groupKey if (groupId != null && groupId != 0 && !groupKey.isNullOrEmpty()) { val notifications = context.notificationManager.activeNotifications.filter { it.groupKey == groupKey } if (notifications.size == 2) { context.cancelNotification(groupId) return } } context.cancelNotification(notificationId) } /** * Returns [PendingIntent] that starts a share activity * * @param context context of application * @param uri location path of file * @param notificationId id of notification * @return [PendingIntent] */ internal fun shareImagePendingBroadcast(context: Context, uri: Uri): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_SHARE_IMAGE putExtra(EXTRA_URI, uri.toString()) } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a watcher activity containing episode. * * @param context context of application * @param anime anime of episode * @param episode episode that needs to be opened */ internal fun openEpisodePendingActivity(context: Context, anime: Anime, episode: Episode): PendingIntent { val newIntent = PlayerActivity.newIntent(context, anime.id, episode.id) return PendingIntent.getActivity( context, anime.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the anime info controller. * * @param context context of application * @param anime anime of episode */ internal fun openEpisodePendingActivity(context: Context, anime: Anime, groupId: Int): PendingIntent { val newIntent = Intent(context, MainActivity::class.java).setAction(Constants.SHORTCUT_ANIME) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .putExtra(Constants.ANIME_EXTRA, anime.id) .putExtra("notificationId", anime.id.hashCode()) .putExtra("groupId", groupId) return PendingIntent.getActivity( context, anime.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that marks an episode as seen and deletes it if preferred * * @param context context of application * @param anime anime of episode */ internal fun markAsViewedPendingBroadcast( context: Context, anime: Anime, episodes: Array, groupId: Int, ): PendingIntent { val newIntent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_MARK_AS_SEEN putExtra(EXTRA_CHAPTER_URL, episodes.map { it.url }.toTypedArray()) putExtra(EXTRA_MANGA_ID, anime.id) putExtra(EXTRA_NOTIFICATION_ID, anime.id.hashCode()) putExtra(EXTRA_GROUP_ID, groupId) } return PendingIntent.getBroadcast( context, anime.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a reader activity containing chapter. * * @param context context of application * @param manga manga of chapter * @param chapter chapter that needs to be opened */ internal fun openChapterPendingActivity(context: Context, manga: Manga, chapter: Chapter): PendingIntent { val newIntent = ReaderActivity.newIntent(context, manga.id, chapter.id) return PendingIntent.getActivity( context, manga.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the manga info controller. * * @param context context of application * @param manga manga of chapter */ internal fun openChapterPendingActivity(context: Context, manga: Manga, groupId: Int): PendingIntent { val newIntent = Intent(context, MainActivity::class.java).setAction(Constants.SHORTCUT_MANGA) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .putExtra(Constants.MANGA_EXTRA, manga.id) .putExtra("notificationId", manga.id.hashCode()) .putExtra("groupId", groupId) return PendingIntent.getActivity( context, manga.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that marks a chapter as read and deletes it if preferred * * @param context context of application * @param manga manga of chapter */ internal fun markAsViewedPendingBroadcast( context: Context, manga: Manga, chapters: Array, groupId: Int, ): PendingIntent { val newIntent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_MARK_AS_READ putExtra(EXTRA_CHAPTER_URL, chapters.map { it.url }.toTypedArray()) putExtra(EXTRA_MANGA_ID, manga.id) putExtra(EXTRA_NOTIFICATION_ID, manga.id.hashCode()) putExtra(EXTRA_GROUP_ID, groupId) } return PendingIntent.getBroadcast( context, manga.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that downloads chapters * * @param context context of application * @param manga manga of chapter */ internal fun downloadChaptersPendingBroadcast( context: Context, manga: Manga, chapters: Array, groupId: Int, ): PendingIntent { val newIntent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_DOWNLOAD_CHAPTER putExtra(EXTRA_CHAPTER_URL, chapters.map { it.url }.toTypedArray()) putExtra(EXTRA_MANGA_ID, manga.id) putExtra(EXTRA_NOTIFICATION_ID, manga.id.hashCode()) putExtra(EXTRA_GROUP_ID, groupId) } return PendingIntent.getBroadcast( context, manga.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that downloads episodes * * @param context context of application * @param anime anime of episode */ internal fun downloadEpisodesPendingBroadcast( context: Context, anime: Anime, episodes: Array, groupId: Int, ): PendingIntent { val newIntent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_DOWNLOAD_EPISODE putExtra(EXTRA_CHAPTER_URL, episodes.map { it.url }.toTypedArray()) putExtra(EXTRA_MANGA_ID, anime.id) putExtra(EXTRA_NOTIFICATION_ID, anime.id.hashCode()) putExtra(EXTRA_GROUP_ID, groupId) } return PendingIntent.getBroadcast( context, anime.id.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the manga info controller * * @param context context of application * @param mangaId id of the entry to open */ internal fun openMangaEntryPendingActivity(context: Context, mangaId: Long): PendingIntent { val newIntent = Intent(context, MainActivity::class.java).setAction(Constants.SHORTCUT_MANGA) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .putExtra(Constants.MANGA_EXTRA, mangaId) .putExtra("notificationId", mangaId.hashCode()) return PendingIntent.getActivity( context, mangaId.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the anime info controller * * @param context context of application * @param animeId id of the entry to open */ internal fun openAnimeEntryPendingActivity(context: Context, animeId: Long): PendingIntent { val newIntent = Intent(context, MainActivity::class.java).setAction(Constants.SHORTCUT_ANIME) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .putExtra(Constants.ANIME_EXTRA, animeId) .putExtra("notificationId", animeId.hashCode()) return PendingIntent.getActivity( context, animeId.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a service which stops the library update * * @param context context of application * @return [PendingIntent] */ internal fun cancelLibraryUpdatePendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_CANCEL_LIBRARY_UPDATE } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a service which stops the library update * * @param context context of application * @return [PendingIntent] */ internal fun cancelAnimelibUpdatePendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_CANCEL_ANIMELIB_UPDATE } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts the [AppUpdateDownloadJob] to download an app update. * * @param context context of application * @return [PendingIntent] */ internal fun downloadAppUpdatePendingBroadcast( context: Context, url: String, title: String? = null, ): PendingIntent { return Intent(context, NotificationReceiver::class.java).run { action = ACTION_START_APP_UPDATE putExtra(AppUpdateDownloadJob.EXTRA_DOWNLOAD_URL, url) title?.let { putExtra(AppUpdateDownloadJob.EXTRA_DOWNLOAD_TITLE, it) } PendingIntent.getBroadcast( context, 0, this, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } } /** * */ internal fun cancelDownloadAppUpdatePendingBroadcast(context: Context): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_CANCEL_APP_UPDATE_DOWNLOAD } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the extensions controller. * * @param context context of application * @return [PendingIntent] */ internal fun openExtensionsPendingActivity(context: Context): PendingIntent { val intent = Intent(context, MainActivity::class.java).apply { action = Constants.SHORTCUT_EXTENSIONS addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the extensions controller. * * @param context context of application * @return [PendingIntent] */ internal fun openAnimeExtensionsPendingActivity(context: Context): PendingIntent { val intent = Intent(context, MainActivity::class.java).apply { action = Constants.SHORTCUT_ANIMEEXTENSIONS addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) } return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that starts a share activity for a backup file. * * @param context context of application * @param uri uri of backup file * @return [PendingIntent] */ internal fun shareBackupPendingBroadcast(context: Context, uri: Uri): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_SHARE_BACKUP putExtra(EXTRA_URI, uri) } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } /** * Returns [PendingIntent] that opens the error log file in an external viewer * * @param context context of application * @param uri uri of error log file * @return [PendingIntent] */ internal fun openErrorLogPendingActivity(context: Context, uri: Uri): PendingIntent { val intent = Intent().apply { action = Intent.ACTION_VIEW setDataAndType(uri, "text/plain") flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION } return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) } /** * Returns [PendingIntent] that cancels a backup restore job. * * @param context context of application * @param notificationId id of notification * @return [PendingIntent] */ internal fun cancelRestorePendingBroadcast(context: Context, notificationId: Int): PendingIntent { val intent = Intent(context, NotificationReceiver::class.java).apply { action = ACTION_CANCEL_RESTORE putExtra(EXTRA_NOTIFICATION_ID, notificationId) } return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt ================================================ package eu.kanade.tachiyomi.data.notification import android.content.Context import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat.IMPORTANCE_DEFAULT import androidx.core.app.NotificationManagerCompat.IMPORTANCE_HIGH import androidx.core.app.NotificationManagerCompat.IMPORTANCE_LOW import eu.kanade.tachiyomi.util.system.buildNotificationChannel import eu.kanade.tachiyomi.util.system.buildNotificationChannelGroup import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR /** * Class to manage the basic information of all the notifications used in the app. */ object Notifications { /** * Common notification channel and ids used anywhere. */ const val CHANNEL_COMMON = "common_channel" const val ID_DOWNLOAD_IMAGE = 2 /** * Notification channel and ids used by the library updater. */ private const val GROUP_LIBRARY = "group_library" const val CHANNEL_LIBRARY_PROGRESS = "library_progress_channel" const val ID_LIBRARY_PROGRESS = -101 const val ID_LIBRARY_SIZE_WARNING = -103 const val CHANNEL_LIBRARY_ERROR = "library_errors_channel" const val ID_LIBRARY_ERROR = -102 /** * Notification channel and ids used by the downloader. */ private const val GROUP_DOWNLOADER = "group_downloader" const val CHANNEL_DOWNLOADER_PROGRESS = "downloader_progress_channel" const val ID_DOWNLOAD_CHAPTER_PROGRESS = -201 const val ID_DOWNLOAD_EPISODE_PROGRESS = -203 const val CHANNEL_DOWNLOADER_ERROR = "downloader_error_channel" const val ID_DOWNLOAD_CHAPTER_ERROR = -202 const val ID_DOWNLOAD_EPISODE_ERROR = -204 /** * Notification channel and ids used by the library updater. */ const val CHANNEL_NEW_CHAPTERS_EPISODES = "new_chapters_episodes_channel" const val ID_NEW_CHAPTERS = -301 const val ID_NEW_EPISODES = -1301 const val GROUP_NEW_CHAPTERS = "eu.kanade.tachiyomi.NEW_CHAPTERS" const val GROUP_NEW_EPISODES = "eu.kanade.tachiyomi.NEW_EPISODES" /** * Notification channel and ids used by the backup/restore system. */ private const val GROUP_BACKUP_RESTORE = "group_backup_restore" const val CHANNEL_BACKUP_RESTORE_PROGRESS = "backup_restore_progress_channel" const val ID_BACKUP_PROGRESS = -501 const val ID_RESTORE_PROGRESS = -503 const val CHANNEL_BACKUP_RESTORE_COMPLETE = "backup_restore_complete_channel_v2" const val ID_BACKUP_COMPLETE = -502 const val ID_RESTORE_COMPLETE = -504 /** * Notification channel used for Incognito Mode */ const val CHANNEL_INCOGNITO_MODE = "incognito_mode_channel" const val ID_INCOGNITO_MODE = -701 /** * Notification channel and ids used for app and extension updates. */ private const val GROUP_APK_UPDATES = "group_apk_updates" const val CHANNEL_APP_UPDATE = "app_apk_update_channel" const val ID_APP_UPDATER = 1 const val ID_APP_UPDATE_PROMPT = 2 const val ID_APP_UPDATE_ERROR = 3 const val CHANNEL_EXTENSIONS_UPDATE = "ext_apk_update_channel" const val ID_UPDATES_TO_EXTS = -401 const val ID_EXTENSION_INSTALLER = -402 private val deprecatedChannels = listOf( "downloader_channel", "downloader_complete_channel", "backup_restore_complete_channel", "library_channel", "library_progress_channel", "updates_ext_channel", "downloader_cache_renewal", "crash_logs_channel", "library_skipped_channel", ) /** * Creates the notification channels introduced in Android Oreo. * This won't do anything on Android versions that don't support notification channels. * * @param context The application context. */ fun createChannels(context: Context) { val notificationManager = NotificationManagerCompat.from(context) // Delete old notification channels deprecatedChannels.forEach(notificationManager::deleteNotificationChannel) notificationManager.createNotificationChannelGroupsCompat( listOf( buildNotificationChannelGroup(GROUP_BACKUP_RESTORE) { setName(context.stringResource(MR.strings.label_backup)) }, buildNotificationChannelGroup(GROUP_DOWNLOADER) { setName(context.stringResource(MR.strings.download_notifier_downloader_title)) }, buildNotificationChannelGroup(GROUP_LIBRARY) { setName(context.stringResource(MR.strings.label_library)) }, buildNotificationChannelGroup(GROUP_APK_UPDATES) { setName(context.stringResource(MR.strings.label_recent_updates)) }, ), ) notificationManager.createNotificationChannelsCompat( listOf( buildNotificationChannel(CHANNEL_COMMON, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.channel_common)) }, buildNotificationChannel(CHANNEL_LIBRARY_PROGRESS, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.channel_progress)) setGroup(GROUP_LIBRARY) setShowBadge(false) }, buildNotificationChannel(CHANNEL_LIBRARY_ERROR, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.channel_errors)) setGroup(GROUP_LIBRARY) setShowBadge(false) }, buildNotificationChannel(CHANNEL_NEW_CHAPTERS_EPISODES, IMPORTANCE_DEFAULT) { setName(context.stringResource(AYMR.strings.channel_new_chapters_episodes)) }, buildNotificationChannel(CHANNEL_DOWNLOADER_PROGRESS, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.channel_progress)) setGroup(GROUP_DOWNLOADER) setShowBadge(false) }, buildNotificationChannel(CHANNEL_DOWNLOADER_ERROR, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.channel_errors)) setGroup(GROUP_DOWNLOADER) setShowBadge(false) }, buildNotificationChannel(CHANNEL_BACKUP_RESTORE_PROGRESS, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.channel_progress)) setGroup(GROUP_BACKUP_RESTORE) setShowBadge(false) }, buildNotificationChannel(CHANNEL_BACKUP_RESTORE_COMPLETE, IMPORTANCE_HIGH) { setName(context.stringResource(MR.strings.channel_complete)) setGroup(GROUP_BACKUP_RESTORE) setShowBadge(false) setSound(null, null) }, buildNotificationChannel(CHANNEL_INCOGNITO_MODE, IMPORTANCE_LOW) { setName(context.stringResource(MR.strings.pref_incognito_mode)) }, buildNotificationChannel(CHANNEL_APP_UPDATE, IMPORTANCE_DEFAULT) { setGroup(GROUP_APK_UPDATES) setName(context.stringResource(MR.strings.channel_app_updates)) }, buildNotificationChannel(CHANNEL_EXTENSIONS_UPDATE, IMPORTANCE_DEFAULT) { setGroup(GROUP_APK_UPDATES) setName(context.stringResource(MR.strings.channel_ext_updates)) }, ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt ================================================ package eu.kanade.tachiyomi.data.preference import android.content.SharedPreferences import androidx.core.content.edit import androidx.preference.PreferenceDataStore class SharedPreferencesDataStore(private val prefs: SharedPreferences) : PreferenceDataStore() { override fun getBoolean(key: String?, defValue: Boolean): Boolean { return prefs.getBoolean(key, defValue) } override fun putBoolean(key: String?, value: Boolean) { prefs.edit { putBoolean(key, value) } } override fun getInt(key: String?, defValue: Int): Int { return prefs.getInt(key, defValue) } override fun putInt(key: String?, value: Int) { prefs.edit { putInt(key, value) } } override fun getLong(key: String?, defValue: Long): Long { return prefs.getLong(key, defValue) } override fun putLong(key: String?, value: Long) { prefs.edit { putLong(key, value) } } override fun getFloat(key: String?, defValue: Float): Float { return prefs.getFloat(key, defValue) } override fun putFloat(key: String?, value: Float) { prefs.edit { putFloat(key, value) } } override fun getString(key: String?, defValue: String?): String? { return prefs.getString(key, defValue) } override fun putString(key: String?, value: String?) { prefs.edit { putString(key, value) } } override fun getStringSet(key: String?, defValues: MutableSet?): MutableSet? { return prefs.getStringSet(key, defValues) } override fun putStringSet(key: String?, values: MutableSet?) { prefs.edit { putStringSet(key, values) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/saver/ImageSaver.kt ================================================ package eu.kanade.tachiyomi.data.saver import android.content.ContentUris import android.content.Context import android.graphics.Bitmap import android.net.Uri import android.os.Build import android.os.Environment import android.provider.MediaStore import android.webkit.MimeTypeMap import androidx.annotation.RequiresApi import androidx.core.content.contentValuesOf import androidx.core.net.toUri import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.cacheImageDir import eu.kanade.tachiyomi.util.storage.getUriCompat import logcat.LogPriority import okio.IOException import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.ImageUtil import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.File import java.io.InputStream import java.time.Instant typealias ImageBackground = Image.Cover class ImageSaver( val context: Context, ) { fun save(image: Image): Uri { val data = image.data val type = ImageUtil.findImageType(data) ?: throw IllegalArgumentException("Not an image") val filename = DiskUtil.buildValidFilename("${image.name}.${type.extension}") if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || image.location !is Location.Pictures) { return save(data(), image.location.directory(context), filename) } return saveApi29(image, type, filename, data) } private fun save(inputStream: InputStream, directory: File, filename: String): Uri { directory.mkdirs() val destFile = File(directory, filename) inputStream.use { input -> destFile.outputStream().use { output -> input.copyTo(output) } } DiskUtil.scanMedia(context, destFile.toUri()) return destFile.getUriCompat(context) } @RequiresApi(Build.VERSION_CODES.Q) private fun saveApi29( image: Image, type: ImageUtil.ImageType, filename: String, data: () -> InputStream, ): Uri { val isMimeTypeSupported = MimeTypeMap.getSingleton().hasMimeType(type.mime) val pictureDir = if (isMimeTypeSupported) { MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) } else { MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) } val imageLocation = (image.location as Location.Pictures).relativePath val relativePath = listOf( if (isMimeTypeSupported) Environment.DIRECTORY_PICTURES else Environment.DIRECTORY_DOCUMENTS, context.stringResource(MR.strings.app_name), imageLocation, ).joinToString(File.separator) val contentValues = contentValuesOf( MediaStore.MediaColumns.RELATIVE_PATH to relativePath, MediaStore.MediaColumns.DISPLAY_NAME to if (isMimeTypeSupported) image.name else filename, MediaStore.MediaColumns.MIME_TYPE to type.mime, MediaStore.MediaColumns.DATE_MODIFIED to Instant.now().epochSecond, ) val picture = findUriOrDefault(relativePath, filename) { context.contentResolver.insert( pictureDir, contentValues, ) ?: throw IOException(context.stringResource(MR.strings.error_saving_picture)) } try { data().use { input -> context.contentResolver.openOutputStream(picture, "w").use { output -> input.copyTo(output!!) } } } catch (e: Exception) { logcat(LogPriority.ERROR, e) throw IOException(context.stringResource(MR.strings.error_saving_picture)) } DiskUtil.scanMedia(context, picture) return picture } @RequiresApi(Build.VERSION_CODES.Q) private fun findUriOrDefault(path: String, filename: String, default: () -> Uri): Uri { val projection = arrayOf( MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.Images.Media.MIME_TYPE, MediaStore.MediaColumns.RELATIVE_PATH, MediaStore.MediaColumns.DATE_MODIFIED, ) val selection = "${MediaStore.MediaColumns.RELATIVE_PATH}=? AND ${MediaStore.MediaColumns.DISPLAY_NAME}=?" // Need to make sure it ends with the separator val normalizedPath = "${path.removeSuffix(File.separator)}${File.separator}" context.contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, arrayOf(normalizedPath, filename), null, ).use { cursor -> if (cursor != null && cursor.count >= 1) { if (cursor.moveToFirst()) { val id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID)) return ContentUris.withAppendedId( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id, ) } } } return default() } } sealed class Image( open val name: String, open val location: Location, ) { data class Cover( val bitmap: Bitmap, override val name: String, override val location: Location, ) : Image(name, location) data class Page( val inputStream: () -> InputStream, override val name: String, override val location: Location, ) : Image(name, location) val data: () -> InputStream get() { return when (this) { is Cover -> { { val baos = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos) ByteArrayInputStream(baos.toByteArray()) } } is Page -> inputStream } } } sealed interface Location { @ConsistentCopyVisibility data class Pictures(val relativePath: String) : Location { companion object { fun create(relativePath: String = ""): Pictures { return Pictures(relativePath) } } } data object Cache : Location fun directory(context: Context): File { return when (this) { Cache -> context.cacheImageDir is Pictures -> { val file = File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), context.stringResource(MR.strings.app_name), ) if (relativePath.isNotEmpty()) { return File( file, relativePath, ) } file } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/AnimeTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import android.app.Application import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.anime.interactor.AddAnimeTracks import eu.kanade.domain.track.anime.model.toDomainTrack import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack private val addTracks: AddAnimeTracks by injectLazy() private val insertTrack: InsertAnimeTrack by injectLazy() interface AnimeTracker { // Common functions fun getCompletionStatus(): Long fun getScoreList(): ImmutableList fun indexToScore(index: Int): Double { return index.toDouble() } // Anime specific functions fun getStatusListAnime(): List fun getWatchingStatus(): Long fun getRewatchingStatus(): Long // TODO: Store all scores as 10 point in the future maybe? fun get10PointScore(track: DomainAnimeTrack): Double { return track.score } fun displayScore(track: DomainAnimeTrack): String suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean = false): AnimeTrack suspend fun bind(track: AnimeTrack, hasSeenEpisodes: Boolean = false): AnimeTrack suspend fun searchAnime(query: String): List suspend fun refresh(track: AnimeTrack): AnimeTrack // TODO: move this to an interactor, and update all trackers based on common data suspend fun register(item: AnimeTrack, animeId: Long) { item.anime_id = animeId try { addTracks.bind(this, item, animeId) } catch (e: Throwable) { withUIContext { Injekt.get().toast(e.message) } } } suspend fun setRemoteAnimeStatus(track: AnimeTrack, status: Long) { track.status = status if (track.status == getCompletionStatus() && track.total_episodes != 0L) { track.last_episode_seen = track.total_episodes.toDouble() } updateRemote(track) } suspend fun setRemoteLastEpisodeSeen(track: AnimeTrack, episodeNumber: Int) { if (track.last_episode_seen == 0.0 && track.last_episode_seen < episodeNumber && track.status != getRewatchingStatus() ) { track.status = getWatchingStatus() } track.last_episode_seen = episodeNumber.toDouble() if (track.total_episodes != 0L && track.last_episode_seen.toLong() == track.total_episodes) { track.status = getCompletionStatus() track.finished_watching_date = System.currentTimeMillis() } updateRemote(track) } suspend fun setRemoteScore(track: AnimeTrack, scoreString: String) { track.score = indexToScore(getScoreList().indexOf(scoreString)) updateRemote(track) } suspend fun setRemoteStartDate(track: AnimeTrack, epochMillis: Long) { track.started_watching_date = epochMillis updateRemote(track) } suspend fun setRemoteFinishDate(track: AnimeTrack, epochMillis: Long) { track.finished_watching_date = epochMillis updateRemote(track) } suspend fun setRemotePrivate(track: AnimeTrack, private: Boolean) { track.private = private updateRemote(track) } private suspend fun updateRemote(track: AnimeTrack): Unit = withIOContext { try { update(track) track.toDomainTrack(idRequired = false)?.let { insertTrack.await(it) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to update remote track data id=${track.id}" } withUIContext { Injekt.get().toast(e.message) } } } fun getStatusForAnime(status: Long): StringResource? } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import androidx.annotation.CallSuper import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.tachiyomi.network.NetworkHelper import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import okhttp3.OkHttpClient import uy.kohesive.injekt.injectLazy abstract class BaseTracker( override val id: Long, override val name: String, ) : Tracker { val trackPreferences: TrackPreferences by injectLazy() val networkService: NetworkHelper by injectLazy() override val client: OkHttpClient get() = networkService.client // Application and remote support for reading dates override val supportsReadingDates: Boolean = false override val supportsPrivateTracking: Boolean = false @CallSuper override fun logout() { trackPreferences.setCredentials(this, "", "") } override val isLoggedIn: Boolean get() = getUsername().isNotEmpty() && getPassword().isNotEmpty() override val isLoggedInFlow: Flow by lazy { combine( trackPreferences.trackUsername(this).changes(), trackPreferences.trackPassword(this).changes(), ) { username, password -> username.isNotEmpty() && password.isNotEmpty() } } override fun getUsername() = trackPreferences.trackUsername(this).get() override fun getPassword() = trackPreferences.trackPassword(this).get() override fun saveCredentials(username: String, password: String) { trackPreferences.setCredentials(this, username, password) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/DeletableAnimeTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import tachiyomi.domain.track.anime.model.AnimeTrack /** *Tracker that support deleting am entry from a user's list */ interface DeletableAnimeTracker { suspend fun delete(track: AnimeTrack) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/DeletableMangaTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import tachiyomi.domain.track.manga.model.MangaTrack /** * Tracker that support deleting am entry from a user's list */ interface DeletableMangaTracker { suspend fun delete(track: MangaTrack) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/EnhancedAnimeTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.track.anime.model.AnimeTrack /** * An Enhanced Track Service will never prompt the user to match a manga with the remote. * It is expected that such Track Service can only work with specific sources and unique IDs. */ interface EnhancedAnimeTracker { /** * This Tracker will only work with the sources that are accepted by this filter function. */ fun accept(source: AnimeSource): Boolean { return source::class.qualifiedName in getAcceptedSources() } /** * Fully qualified source classes that this track service is compatible with. */ fun getAcceptedSources(): List fun loginNoop() /** * match is similar to Tracker.search, but only return zero or one match. */ suspend fun match(anime: Anime): AnimeTrackSearch? /** * Checks whether the provided source/track/anime triplet is from this AnimeTracker */ fun isTrackFrom(track: AnimeTrack, anime: Anime, source: AnimeSource?): Boolean /** * Migrates the given track for the anime to the newSource, if possible */ fun migrateTrack(track: AnimeTrack, anime: Anime, newSource: AnimeSource): AnimeTrack? } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/EnhancedMangaTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.source.MangaSource import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.track.manga.model.MangaTrack /** * A tracker that will never prompt the user to manually bind an entry. * It is expected that such tracker can only work with specific sources and unique IDs. */ interface EnhancedMangaTracker { /** * This Tracker will only work with the sources that are accepted by this filter function. */ fun accept(source: MangaSource): Boolean { return source::class.qualifiedName in getAcceptedSources() } /** * Fully qualified source classes that this track service is compatible with. */ fun getAcceptedSources(): List fun loginNoop() /** * match is similar to Tracker.search, but only return zero or one match. */ suspend fun match(manga: Manga): MangaTrackSearch? /** * Checks whether the provided source/track/manga triplet is from this [MangaTrack] */ fun isTrackFrom(track: MangaTrack, manga: Manga, source: MangaSource?): Boolean /** * Migrates the given track for the manga to the newSource, if possible */ fun migrateTrack(track: MangaTrack, manga: Manga, newSource: MangaSource): MangaTrack? } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/MangaTracker.kt ================================================ package eu.kanade.tachiyomi.data.track import android.app.Application import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.manga.interactor.AddMangaTracks import eu.kanade.domain.track.manga.model.toDomainTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import logcat.LogPriority import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.track.manga.interactor.InsertMangaTrack import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.manga.model.MangaTrack as DomainTrack private val addTracks: AddMangaTracks by injectLazy() private val insertTrack: InsertMangaTrack by injectLazy() interface MangaTracker { // Common functions fun getCompletionStatus(): Long fun getScoreList(): ImmutableList fun indexToScore(index: Int): Double { return index.toDouble() } // Manga specific functions fun getStatusListManga(): List fun getReadingStatus(): Long fun getRereadingStatus(): Long // TODO: Store all scores as 10 point in the future maybe? fun get10PointScore(track: DomainTrack): Double { return track.score } fun displayScore(track: DomainTrack): String suspend fun update(track: MangaTrack, didReadChapter: Boolean = false): MangaTrack suspend fun bind(track: MangaTrack, hasReadChapters: Boolean = false): MangaTrack suspend fun searchManga(query: String): List suspend fun refresh(track: MangaTrack): MangaTrack suspend fun register(item: MangaTrack, mangaId: Long) { item.manga_id = mangaId try { addTracks.bind(this, item, mangaId) } catch (e: Throwable) { withUIContext { Injekt.get().toast(e.message) } } } suspend fun setRemoteMangaStatus(track: MangaTrack, status: Long) { track.status = status if (track.status == getCompletionStatus() && track.total_chapters != 0L) { track.last_chapter_read = track.total_chapters.toDouble() } updateRemote(track) } suspend fun setRemoteLastChapterRead(track: MangaTrack, chapterNumber: Int) { if (track.last_chapter_read == 0.0 && track.last_chapter_read < chapterNumber && track.status != getRereadingStatus() ) { track.status = getReadingStatus() } track.last_chapter_read = chapterNumber.toDouble() if (track.total_chapters != 0L && track.last_chapter_read.toLong() == track.total_chapters ) { track.status = getCompletionStatus() track.finished_reading_date = System.currentTimeMillis() } updateRemote(track) } suspend fun setRemoteScore(track: MangaTrack, scoreString: String) { track.score = indexToScore(getScoreList().indexOf(scoreString)) updateRemote(track) } suspend fun setRemoteStartDate(track: MangaTrack, epochMillis: Long) { track.started_reading_date = epochMillis updateRemote(track) } suspend fun setRemoteFinishDate(track: MangaTrack, epochMillis: Long) { track.finished_reading_date = epochMillis updateRemote(track) } suspend fun setRemotePrivate(track: MangaTrack, private: Boolean) { track.private = private updateRemote(track) } private suspend fun updateRemote(track: MangaTrack): Unit = withIOContext { try { update(track) track.toDomainTrack(idRequired = false)?.let { insertTrack.await(it) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to update remote track data id=${track.id}" } withUIContext { Injekt.get().toast(e.message) } } } fun getStatusForManga(status: Long): StringResource? } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt ================================================ package eu.kanade.tachiyomi.data.track import androidx.annotation.CallSuper import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.Flow import okhttp3.OkHttpClient interface Tracker { val id: Long val name: String val client: OkHttpClient // Application and remote support for reading dates val supportsReadingDates: Boolean val supportsPrivateTracking: Boolean @DrawableRes fun getLogo(): Int @ColorInt fun getLogoColor(): Int fun getCompletionStatus(): Long fun getScoreList(): ImmutableList suspend fun login(username: String, password: String) @CallSuper fun logout() val isLoggedIn: Boolean val isLoggedInFlow: Flow fun getUsername(): String fun getPassword(): String fun saveCredentials(username: String, password: String) val animeService: AnimeTracker get() = this as AnimeTracker val mangaService: MangaTracker get() = this as MangaTracker } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerManager.kt ================================================ package eu.kanade.tachiyomi.data.track import android.content.Context import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.bangumi.Bangumi import eu.kanade.tachiyomi.data.track.jellyfin.Jellyfin import eu.kanade.tachiyomi.data.track.kavita.Kavita import eu.kanade.tachiyomi.data.track.kitsu.Kitsu import eu.kanade.tachiyomi.data.track.komga.Komga import eu.kanade.tachiyomi.data.track.mangaupdates.MangaUpdates import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList import eu.kanade.tachiyomi.data.track.shikimori.Shikimori import eu.kanade.tachiyomi.data.track.simkl.Simkl import eu.kanade.tachiyomi.data.track.suwayomi.Suwayomi import kotlinx.coroutines.flow.combine class TrackerManager(context: Context) { companion object { const val ANILIST = 2L const val KITSU = 3L const val KAVITA = 8L const val SIMKL = 101L const val JELLYFIN = 102L } val myAnimeList = MyAnimeList(1L) val aniList = Anilist(ANILIST) val kitsu = Kitsu(KITSU) val shikimori = Shikimori(4L) val bangumi = Bangumi(5L) val komga = Komga(6L) val mangaUpdates = MangaUpdates(7L) val kavita = Kavita(KAVITA) val suwayomi = Suwayomi(9L) val simkl = Simkl(SIMKL) val jellyfin = Jellyfin(JELLYFIN) val trackers = listOf( myAnimeList, aniList, kitsu, shikimori, bangumi, komga, mangaUpdates, kavita, suwayomi, simkl, jellyfin, ) fun loggedInTrackers() = trackers.filter { it.isLoggedIn } fun loggedInTrackersFlow() = combine(trackers.map { it.isLoggedInFlow }) { it.mapIndexedNotNull { index, isLoggedIn -> if (isLoggedIn) trackers[index] else null } } fun get(id: Long) = trackers.find { it.id == id } fun getAll(ids: Set) = trackers.filter { it.id in ids } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.domain.track.manga.model.toDbTrack import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.DeletableAnimeTracker import eu.kanade.tachiyomi.data.track.DeletableMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.anilist.dto.ALOAuth import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.json.Json import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class Anilist(id: Long) : BaseTracker( id, "AniList", ), MangaTracker, AnimeTracker, DeletableMangaTracker, DeletableAnimeTracker { companion object { const val READING = 1L const val WATCHING = 11L const val COMPLETED = 2L const val ON_HOLD = 3L const val DROPPED = 4L const val PLAN_TO_READ = 5L const val PLAN_TO_WATCH = 15L const val REREADING = 6L const val REWATCHING = 16L const val POINT_100 = "POINT_100" const val POINT_10 = "POINT_10" const val POINT_10_DECIMAL = "POINT_10_DECIMAL" const val POINT_5 = "POINT_5" const val POINT_3 = "POINT_3" } private val json: Json by injectLazy() private val interceptor by lazy { AnilistInterceptor(this, getPassword()) } private val api by lazy { AnilistApi(client, interceptor) } override val supportsReadingDates: Boolean = true override val supportsPrivateTracking: Boolean = true private val scorePreference = trackPreferences.anilistScoreType() init { // If the preference is an int from APIv1, logout user to force using APIv2 try { scorePreference.get() } catch (e: ClassCastException) { logout() scorePreference.delete() } } override fun getLogo() = R.drawable.ic_tracker_anilist override fun getLogoColor() = Color.rgb(18, 25, 35) override fun getStatusListManga(): List { return listOf(READING, PLAN_TO_READ, COMPLETED, REREADING, ON_HOLD, DROPPED) } override fun getStatusListAnime(): List { return listOf(WATCHING, PLAN_TO_WATCH, COMPLETED, REWATCHING, ON_HOLD, DROPPED) } override fun getStatusForManga(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed REREADING -> MR.strings.repeating ON_HOLD -> MR.strings.paused DROPPED -> MR.strings.dropped else -> null } override fun getStatusForAnime(status: Long): StringResource? = when (status) { WATCHING -> AYMR.strings.watching PLAN_TO_WATCH -> AYMR.strings.plan_to_watch COMPLETED -> MR.strings.completed REWATCHING -> AYMR.strings.repeating_anime ON_HOLD -> MR.strings.paused DROPPED -> MR.strings.dropped else -> null } override fun getReadingStatus(): Long = READING override fun getWatchingStatus(): Long = WATCHING override fun getRereadingStatus(): Long = REREADING override fun getRewatchingStatus(): Long = REWATCHING override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList { return when (scorePreference.get()) { // 10 point POINT_10 -> IntRange(0, 10).map(Int::toString).toImmutableList() // 100 point POINT_100 -> IntRange(0, 100).map(Int::toString).toImmutableList() // 5 stars POINT_5 -> IntRange(0, 5).map { "$it ★" }.toImmutableList() // Smiley POINT_3 -> persistentListOf("-", "😦", "😐", "😊") // 10 point decimal POINT_10_DECIMAL -> IntRange(0, 100).map { (it / 10f).toString() }.toImmutableList() else -> throw Exception("Unknown score type") } } override fun get10PointScore(track: DomainMangaTrack): Double { // Score is stored in 100 point format return track.score / 10.0 } override fun get10PointScore(track: DomainAnimeTrack): Double { // Score is stored in 100 point format return track.score / 10.0 } override fun indexToScore(index: Int): Double { return when (scorePreference.get()) { // 10 point POINT_10 -> index * 10.0 // 100 point POINT_100 -> index.toDouble() // 5 stars POINT_5 -> when (index) { 0 -> 0.0 else -> index * 20.0 - 10.0 } // Smiley POINT_3 -> when (index) { 0 -> 0.0 else -> index * 25.0 + 10.0 } // 10 point decimal POINT_10_DECIMAL -> index.toDouble() else -> throw Exception("Unknown score type") } } override fun displayScore(track: DomainMangaTrack): String { val score = track.score return when (scorePreference.get()) { POINT_5 -> when (score) { 0.0 -> "0 ★" else -> "${((score + 10) / 20).toInt()} ★" } POINT_3 -> when { score == 0.0 -> "0" score <= 35 -> "😦" score <= 60 -> "😐" else -> "😊" } else -> track.toApiScore() } } override fun displayScore(track: DomainAnimeTrack): String { val score = track.score return when (scorePreference.get()) { POINT_5 -> when (score) { 0.0 -> "0 ★" else -> "${((score + 10) / 20).toInt()} ★" } POINT_3 -> when { score == 0.0 -> "0" score <= 35 -> "😦" score <= 60 -> "😐" else -> "😊" } else -> track.toApiScore() } } private suspend fun add(track: MangaTrack): MangaTrack { return api.addLibManga(track) } private suspend fun add(track: AnimeTrack): AnimeTrack { return api.addLibAnime(track) } override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { // If user was using API v1 fetch library_id if (track.library_id == null || track.library_id!! == 0L) { val libManga = api.findLibManga(track, getUsername().toInt()) ?: throw Exception("$track not found on user library") track.library_id = libManga.library_id } if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED track.finished_reading_date = System.currentTimeMillis() } else if (track.status != REREADING) { track.status = READING if (track.last_chapter_read == 1.0) { track.started_reading_date = System.currentTimeMillis() } } } } return api.updateLibManga(track) } override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { // If user was using API v1 fetch library_id if (track.library_id == null || track.library_id!! == 0L) { val libManga = api.findLibAnime(track, getUsername().toInt()) ?: throw Exception("$track not found on user library") track.library_id = libManga.library_id } if (track.status != COMPLETED) { if (didWatchEpisode) { if (track.last_episode_seen.toLong() == track.total_episodes && track.total_episodes > 0) { track.status = COMPLETED track.finished_watching_date = System.currentTimeMillis() } else if (track.status != REWATCHING) { track.status = WATCHING if (track.last_episode_seen == 1.0) { track.started_watching_date = System.currentTimeMillis() } } } } return api.updateLibAnime(track) } override suspend fun delete(track: DomainMangaTrack) { if (track.libraryId == null || track.libraryId == 0L) { val libManga = api.findLibManga(track.toDbTrack(), getUsername().toInt()) ?: return return api.deleteLibManga(track.copy(id = libManga.library_id!!)) } api.deleteLibManga(track) } override suspend fun delete(track: DomainAnimeTrack) { if (track.libraryId == null || track.libraryId!! == 0L) { val libAnime = api.findLibAnime(track.toDbTrack(), getUsername().toInt()) ?: return return api.deleteLibAnime(track.copy(id = libAnime.library_id!!)) } api.deleteLibAnime(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { val remoteTrack = api.findLibManga(track, getUsername().toInt()) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack, copyRemotePrivate = false) track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { val isRereading = track.status == REREADING track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun bind(track: AnimeTrack, hasReadChapters: Boolean): AnimeTrack { val remoteTrack = api.findLibAnime(track, getUsername().toInt()) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack, copyRemotePrivate = false) track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { val isRereading = track.status == REWATCHING track.status = if (!isRereading && hasReadChapters) WATCHING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) WATCHING else PLAN_TO_WATCH track.score = 0.0 add(track) } } override suspend fun searchManga(query: String): List { return api.search(query) } override suspend fun searchAnime(query: String): List { return api.searchAnime(query) } override suspend fun refresh(track: MangaTrack): MangaTrack { val remoteTrack = api.getLibManga(track, getUsername().toInt()) track.copyPersonalFrom(remoteTrack) track.title = remoteTrack.title track.total_chapters = remoteTrack.total_chapters return track } override suspend fun refresh(track: AnimeTrack): AnimeTrack { val remoteTrack = api.getLibAnime(track, getUsername().toInt()) track.copyPersonalFrom(remoteTrack) track.title = remoteTrack.title track.total_episodes = remoteTrack.total_episodes return track } override suspend fun login(username: String, password: String) = login(password) suspend fun login(token: String) { try { val oauth = api.createOAuth(token) interceptor.setAuth(oauth) val (username, scoreType) = api.getCurrentUser() scorePreference.set(scoreType) saveCredentials(username.toString(), oauth.accessToken) } catch (e: Throwable) { logout() } } override fun logout() { super.logout() trackPreferences.trackToken(this).delete() interceptor.setAuth(null) } fun saveOAuth(alOAuth: ALOAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(alOAuth)) } fun loadOAuth(): ALOAuth? { return try { json.decodeFromString(trackPreferences.trackToken(this).get()) } catch (e: Exception) { null } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.anilist.dto.ALAddEntryResult import eu.kanade.tachiyomi.data.track.anilist.dto.ALCurrentUserResult import eu.kanade.tachiyomi.data.track.anilist.dto.ALOAuth import eu.kanade.tachiyomi.data.track.anilist.dto.ALSearchResult import eu.kanade.tachiyomi.data.track.anilist.dto.ALUserListEntryQueryResult import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.jsonMime import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonNull import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.time.Instant import java.time.ZoneId import java.time.ZonedDateTime import kotlin.time.Duration.Companion.minutes import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { private val json: Json by injectLazy() private val authClient = client.newBuilder() .addInterceptor(interceptor) .rateLimit(permits = 85, period = 1.minutes) .build() suspend fun addLibManga(track: MangaTrack): MangaTrack { return withIOContext { val query = """ |mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}private: Boolean) { |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status, private: ${'$'}private) { | id | status |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("mangaId", track.remote_id) put("progress", track.last_chapter_read.toInt()) put("status", track.toApiStatus()) put("private", track.private) } } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .let { track } } } } suspend fun updateLibManga(track: MangaTrack): MangaTrack { return withIOContext { val query = """ |mutation UpdateManga( |${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}private: Boolean, |${'$'}score: Int, ${'$'}startedAt: FuzzyDateInput, ${'$'}completedAt: FuzzyDateInput |) { |SaveMediaListEntry( |id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, private: ${'$'}private, |scoreRaw: ${'$'}score, startedAt: ${'$'}startedAt, completedAt: ${'$'}completedAt |) { |id |status |progress |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("listId", track.library_id) put("progress", track.last_chapter_read.toInt()) put("status", track.toApiStatus()) put("score", track.score.toInt()) put("startedAt", createDate(track.started_reading_date)) put("completedAt", createDate(track.finished_reading_date)) put("private", track.private) } } authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() track } } suspend fun deleteLibManga(track: DomainMangaTrack) { withIOContext { val query = """ |mutation DeleteManga(${'$'}listId: Int) { |DeleteMediaListEntry(id: ${'$'}listId) { |deleted |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("listId", track.libraryId) } } authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() } } suspend fun addLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val query = """ |mutation AddAnime(${'$'}animeId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}private: Boolean) { |SaveMediaListEntry (mediaId: ${'$'}animeId, progress: ${'$'}progress, status: ${'$'}status, private: ${'$'}private) { | id | status |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("animeId", track.remote_id) put("progress", track.last_episode_seen.toInt()) put("status", track.toApiStatus()) put("private", track.private) } } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .let { track } } } } suspend fun updateLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val query = """ |mutation UpdateAnime( |${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}private: Boolean, |${'$'}score: Int, ${'$'}startedAt: FuzzyDateInput, ${'$'}completedAt: FuzzyDateInput |) { |SaveMediaListEntry( |id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, private: ${'$'}private, |scoreRaw: ${'$'}score, startedAt: ${'$'}startedAt, completedAt: ${'$'}completedAt |) { |id |status |progress |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("listId", track.library_id) put("progress", track.last_episode_seen.toInt()) put("status", track.toApiStatus()) put("score", track.score.toInt()) put("startedAt", createDate(track.started_watching_date)) put("completedAt", createDate(track.finished_watching_date)) put("private", track.private) } } authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() track } } suspend fun deleteLibAnime(track: DomainAnimeTrack) { return withIOContext { val query = """ |mutation DeleteAnime(${'$'}listId: Int) { |DeleteMediaListEntry(id: ${'$'}listId) { |deleted |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("listId", track.libraryId) } } authClient.newCall(POST(API_URL, body = payload.toString().toRequestBody(jsonMime))) .awaitSuccess() } } suspend fun search(search: String): List { return withIOContext { val query = """ |query Search(${'$'}query: String) { |Page (perPage: 50) { |media(search: ${'$'}query, type: MANGA, format_not_in: [NOVEL]) { |id |staff { |edges { |role |id |node { |name { |full |userPreferred |native |} |} |} |} |title { |userPreferred |} |coverImage { |large |} |format |status |chapters |description |startDate { |year |month |day |} |averageScore |} |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("query", search) } } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .data.page.media .map { it.toALManga().toTrack() } } } } suspend fun searchAnime(search: String): List { return withIOContext { val query = """ |query Search(${'$'}query: String) { |Page (perPage: 50) { |media(search: ${'$'}query, type: ANIME) { |id |studios { |edges { |isMain |node { |name |} |} |} |title { |userPreferred |} |coverImage { |large |} |format |status |episodes |description |startDate { |year |month |day |} |averageScore |} |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("query", search) } } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .data.page.media .map { it.toALAnime().toTrack() } } } } suspend fun findLibManga(track: MangaTrack, userid: Int): MangaTrack? { return withIOContext { val query = """ |query (${'$'}id: Int!, ${'$'}manga_id: Int!) { |Page { |mediaList(userId: ${'$'}id, type: MANGA, mediaId: ${'$'}manga_id) { |id |status |scoreRaw: score(format: POINT_100) |progress |private |startedAt { |year |month |day |} |completedAt { |year |month |day |} |media { |id |title { |userPreferred |} |coverImage { |large |} |format |status |chapters |description |startDate { |year |month |day |} |staff { |edges { |role |id |node { |name { |full |userPreferred |native |} |} |} |} |} |} |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("id", userid) put("manga_id", track.remote_id) } } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .data.page.mediaList .map { it.toALUserManga() } .firstOrNull() ?.toTrack() } } } suspend fun findLibAnime(track: AnimeTrack, userid: Int): AnimeTrack? { return withIOContext { val query = """ |query (${'$'}id: Int!, ${'$'}anime_id: Int!) { |Page { |mediaList(userId: ${'$'}id, type: ANIME, mediaId: ${'$'}anime_id) { |id |status |scoreRaw: score(format: POINT_100) |progress |private |startedAt { |year |month |day |} |completedAt { |year |month |day |} |media { |id |title { |userPreferred |} |coverImage { |large |} |format |status |episodes |description |startDate { |year |month |day |} |studios { |edges { |isMain |node { |name |} |} |} |} |} |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) putJsonObject("variables") { put("id", userid) put("anime_id", track.remote_id) } } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .data.page.mediaList .map { it.toALUserAnime() } .firstOrNull() ?.toTrack() } } } suspend fun getLibManga(track: MangaTrack, userId: Int): MangaTrack { return findLibManga(track, userId) ?: throw Exception("Could not find manga") } suspend fun getLibAnime(track: AnimeTrack, userId: Int): AnimeTrack { return findLibAnime(track, userId) ?: throw Exception("Could not find anime") } fun createOAuth(token: String): ALOAuth { return ALOAuth(token, "Bearer", System.currentTimeMillis() + 31536000000, 31536000000) } suspend fun getCurrentUser(): Pair { return withIOContext { val query = """ |query User { |Viewer { |id |mediaListOptions { |scoreFormat |} |} |} | """.trimMargin() val payload = buildJsonObject { put("query", query) } with(json) { authClient.newCall( POST( API_URL, body = payload.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .let { val viewer = it.data.viewer Pair(viewer.id, viewer.mediaListOptions.scoreFormat) } } } } private fun createDate(dateValue: Long): JsonObject { if (dateValue == 0L) { return buildJsonObject { put("year", JsonNull) put("month", JsonNull) put("day", JsonNull) } } val dateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(dateValue), ZoneId.systemDefault()) return buildJsonObject { put("year", dateTime.year) put("month", dateTime.monthValue) put("day", dateTime.dayOfMonth) } } companion object { private const val CLIENT_ID = "5338" private const val API_URL = "https://graphql.anilist.co/" private const val BASE_URL = "https://anilist.co/api/v2/" private const val BASE_MANGA_URL = "https://anilist.co/manga/" private const val BASE_ANIME_URL = "https://anilist.co/anime/" fun mangaUrl(mediaId: Long): String { return BASE_MANGA_URL + mediaId } fun animeUrl(mediaId: Long): String { return BASE_ANIME_URL + mediaId } fun authUrl(): Uri = "${BASE_URL}oauth/authorize".toUri().buildUpon() .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("response_type", "token") .build() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.track.anilist.dto.ALOAuth import eu.kanade.tachiyomi.data.track.anilist.dto.isExpired import okhttp3.Interceptor import okhttp3.Response import java.io.IOException class AnilistInterceptor(val anilist: Anilist, private var token: String?) : Interceptor { /** * OAuth object used for authenticated requests. * * Anilist returns the date without milliseconds. We fix that and make the token expire 1 minute * before its original expiration date. */ private var oauth: ALOAuth? = null set(value) { field = value?.copy(expires = value.expires * 1000 - 60 * 1000) } override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() if (token.isNullOrEmpty()) { throw Exception("Not authenticated with Anilist") } if (oauth == null) { oauth = anilist.loadOAuth() } // Refresh access token if null or expired. if (oauth!!.isExpired()) { anilist.logout() throw IOException("Token expired") } // Throw on null auth. if (oauth == null) { throw IOException("No authentication token") } // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.accessToken}") .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) } /** * Called when the user authenticates with Anilist for the first time. Sets the refresh token * and the oauth object. */ fun setAuth(oauth: ALOAuth?) { token = oauth?.accessToken this.oauth = oauth anilist.saveOAuth(oauth) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistUtils.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack fun MangaTrack.toApiStatus() = when (status) { Anilist.READING -> "CURRENT" Anilist.COMPLETED -> "COMPLETED" Anilist.ON_HOLD -> "PAUSED" Anilist.DROPPED -> "DROPPED" Anilist.PLAN_TO_READ -> "PLANNING" Anilist.REREADING -> "REPEATING" else -> throw NotImplementedError("Unknown status: $status") } fun AnimeTrack.toApiStatus() = when (status) { Anilist.WATCHING -> "CURRENT" Anilist.COMPLETED -> "COMPLETED" Anilist.ON_HOLD -> "PAUSED" Anilist.DROPPED -> "DROPPED" Anilist.PLAN_TO_WATCH -> "PLANNING" Anilist.REWATCHING -> "REPEATING" else -> throw NotImplementedError("Unknown status: $status") } private val preferences: TrackPreferences by injectLazy() private fun Double.toApiScore(): String = when (preferences.anilistScoreType().get()) { // 10 point "POINT_10" -> (this.toInt() / 10).toString() // 100 point "POINT_100" -> this.toInt().toString() // 5 stars "POINT_5" -> when { this == 0.0 -> "0" this < 30 -> "1" this < 50 -> "2" this < 70 -> "3" this < 90 -> "4" else -> "5" } // Smiley "POINT_3" -> when { this == 0.0 -> "0" this <= 35 -> ":(" this <= 60 -> ":|" else -> ":)" } // 10 point decimal "POINT_10_DECIMAL" -> (this / 10).toString() else -> throw NotImplementedError("Unknown score type") } fun DomainMangaTrack.toApiScore(): String = this.score.toApiScore() fun DomainAnimeTrack.toApiScore(): String = this.score.toApiScore() ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALAddEntry.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class ALAddEntryResult( val data: ALAddEntryData, ) @Serializable data class ALAddEntryData( @SerialName("SaveMediaListEntry") val entry: ALAddEntryEntry, ) @Serializable data class ALAddEntryEntry( val id: Long, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALAnime.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.anilist.AnilistApi import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.util.lang.htmlDecode import java.text.SimpleDateFormat import java.util.Locale data class ALAnime( val remoteId: Long, val title: String, val imageUrl: String, val description: String?, val format: String, val publishingStatus: String, val startDateFuzzy: Long, val totalEpisodes: Long, val averageScore: Int, val studios: ALStudios, ) { fun toTrack() = AnimeTrackSearch.create(TrackerManager.ANILIST).apply { remote_id = remoteId title = this@ALAnime.title total_episodes = totalEpisodes cover_url = imageUrl summary = description?.htmlDecode() ?: "" score = averageScore.toDouble() tracking_url = AnilistApi.animeUrl(remote_id) publishing_status = publishingStatus publishing_type = format if (startDateFuzzy != 0L) { start_date = try { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(startDateFuzzy) } catch (e: IllegalArgumentException) { "" } } authors = studios.edges .filter { it.isMain } .ifEmpty { studios.edges } .take(3) .map { it.node.name } } } data class ALUserAnime( val libraryId: Long, val listStatus: String, val scoreRaw: Int, val episodesSeen: Int, val startDateFuzzy: Long, val completedDateFuzzy: Long, val anime: ALAnime, val private: Boolean, ) { fun toTrack() = AnimeTrack.create(TrackerManager.ANILIST).apply { remote_id = anime.remoteId title = anime.title status = toTrackStatus() score = scoreRaw.toDouble() started_watching_date = startDateFuzzy finished_watching_date = completedDateFuzzy last_episode_seen = episodesSeen.toDouble() library_id = libraryId total_episodes = anime.totalEpisodes private = this@ALUserAnime.private } private fun toTrackStatus() = when (listStatus) { "CURRENT" -> Anilist.WATCHING "COMPLETED" -> Anilist.COMPLETED "PAUSED" -> Anilist.ON_HOLD "DROPPED" -> Anilist.DROPPED "PLANNING" -> Anilist.PLAN_TO_WATCH "REPEATING" -> Anilist.REWATCHING else -> throw NotImplementedError("Unknown status: $listStatus") } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALFuzzyDate.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.Serializable import java.time.LocalDate import java.time.ZoneId @Serializable data class ALFuzzyDate( val year: Int?, val month: Int?, val day: Int?, ) { fun toEpochMilli(): Long = try { LocalDate.of(year!!, month!!, day!!) .atStartOfDay(ZoneId.systemDefault()) .toInstant() .toEpochMilli() } catch (_: Exception) { 0L } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALManga.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.anilist.AnilistApi import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.util.lang.htmlDecode import java.text.SimpleDateFormat import java.util.Locale data class ALManga( val remoteId: Long, val title: String, val imageUrl: String, val description: String?, val format: String, val publishingStatus: String, val startDateFuzzy: Long, val totalChapters: Long, val averageScore: Int, val staff: ALStaff, ) { fun toTrack() = MangaTrackSearch.create(TrackerManager.ANILIST).apply { remote_id = remoteId title = this@ALManga.title total_chapters = totalChapters cover_url = imageUrl summary = description?.htmlDecode() ?: "" score = averageScore.toDouble() tracking_url = AnilistApi.mangaUrl(remote_id) publishing_status = publishingStatus publishing_type = format if (startDateFuzzy != 0L) { start_date = try { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(startDateFuzzy) } catch (e: IllegalArgumentException) { "" } } staff.edges.forEach { val name = it.node.name() ?: return@forEach if ("Story" in it.role) authors += name if ("Art" in it.role) artists += name } } } data class ALUserManga( val libraryId: Long, val listStatus: String, val scoreRaw: Int, val chaptersRead: Int, val startDateFuzzy: Long, val completedDateFuzzy: Long, val manga: ALManga, val private: Boolean, ) { fun toTrack() = MangaTrack.create(TrackerManager.ANILIST).apply { remote_id = manga.remoteId title = manga.title status = toTrackStatus() score = scoreRaw.toDouble() started_reading_date = startDateFuzzy finished_reading_date = completedDateFuzzy last_chapter_read = chaptersRead.toDouble() library_id = libraryId total_chapters = manga.totalChapters private = this@ALUserManga.private } private fun toTrackStatus() = when (listStatus) { "CURRENT" -> Anilist.READING "COMPLETED" -> Anilist.COMPLETED "PAUSED" -> Anilist.ON_HOLD "DROPPED" -> Anilist.DROPPED "PLANNING" -> Anilist.PLAN_TO_READ "REPEATING" -> Anilist.REREADING else -> throw NotImplementedError("Unknown status: $listStatus") } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALOAuth.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class ALOAuth( @SerialName("access_token") val accessToken: String, @SerialName("token_type") val tokenType: String, val expires: Long, @SerialName("expires_in") val expiresIn: Long, ) fun ALOAuth.isExpired() = System.currentTimeMillis() > expires ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class ALSearchResult( val data: ALSearchPage, ) @Serializable data class ALSearchPage( @SerialName("Page") val page: ALSearchMedia, ) @Serializable data class ALSearchMedia( val media: List, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALSearchItem.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.Serializable @Serializable data class ALSearchItem( val id: Long, val title: ALItemTitle, val coverImage: ItemCover, val description: String?, val format: String?, val status: String?, val startDate: ALFuzzyDate, val chapters: Long?, val episodes: Long?, val averageScore: Int?, val staff: ALStaff?, val studios: ALStudios?, ) { fun toALManga(): ALManga = ALManga( remoteId = id, title = title.userPreferred, imageUrl = coverImage.large, description = description, format = format?.replace("_", "-") ?: "", publishingStatus = status ?: "", startDateFuzzy = startDate.toEpochMilli(), totalChapters = chapters ?: 0, averageScore = averageScore ?: -1, staff = staff!!, ) fun toALAnime(): ALAnime = ALAnime( remoteId = id, title = title.userPreferred, imageUrl = coverImage.large, description = description, format = format?.replace("_", "-") ?: "", publishingStatus = status ?: "", startDateFuzzy = startDate.toEpochMilli(), totalEpisodes = episodes ?: 0, averageScore = averageScore ?: -1, studios = studios!!, ) } @Serializable data class ALItemTitle( val userPreferred: String, ) @Serializable data class ItemCover( val large: String, ) @Serializable data class ALStaff( val edges: List, ) @Serializable data class ALStaffEdge( val role: String, val id: Int, val node: ALStaffNode, ) @Serializable data class ALStaffNode( val name: ALStaffName, ) @Serializable data class ALStaffName( val userPreferred: String?, val native: String?, val full: String?, ) { operator fun invoke(): String? { return userPreferred ?: full ?: native } } @Serializable data class ALStudios( val edges: List, ) @Serializable data class ALStudiosEdge( val isMain: Boolean, val node: ALStudiosNode, ) @Serializable data class ALStudiosNode( val name: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALUser.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class ALCurrentUserResult( val data: ALUserViewer, ) @Serializable data class ALUserViewer( @SerialName("Viewer") val viewer: ALUserViewerData, ) @Serializable data class ALUserViewerData( val id: Int, val mediaListOptions: ALUserListOptions, ) @Serializable data class ALUserListOptions( val scoreFormat: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALUserList.kt ================================================ package eu.kanade.tachiyomi.data.track.anilist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class ALUserListEntryQueryResult( val data: ALUserListEntryPage, ) @Serializable data class ALUserListEntryPage( @SerialName("Page") val page: ALUserListMediaList, ) @Serializable data class ALUserListMediaList( val mediaList: List, ) @Serializable data class ALUserListItem( val id: Long, val status: String, val scoreRaw: Int, val progress: Int, val startedAt: ALFuzzyDate, val completedAt: ALFuzzyDate, val media: ALSearchItem, val private: Boolean, ) { fun toALUserManga(): ALUserManga { return ALUserManga( libraryId = this@ALUserListItem.id, listStatus = status, scoreRaw = scoreRaw, chaptersRead = progress, startDateFuzzy = startedAt.toEpochMilli(), completedDateFuzzy = completedAt.toEpochMilli(), manga = media.toALManga(), private = private, ) } fun toALUserAnime(): ALUserAnime { return ALUserAnime( libraryId = this@ALUserListItem.id, listStatus = status, scoreRaw = scoreRaw, episodesSeen = progress, startDateFuzzy = startedAt.toEpochMilli(), completedDateFuzzy = completedAt.toEpochMilli(), anime = media.toALAnime(), private = private, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.bangumi.dto.BGMOAuth import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class Bangumi(id: Long) : BaseTracker(id, "Bangumi"), MangaTracker, AnimeTracker { private val json: Json by injectLazy() private val interceptor by lazy { BangumiInterceptor(this) } private val api by lazy { BangumiApi(id, client, interceptor) } override val supportsPrivateTracking: Boolean = true override fun getScoreList(): ImmutableList = SCORE_LIST override fun indexToScore(index: Int): Double { return index.toDouble() } override fun displayScore(track: DomainMangaTrack): String { return track.score.toInt().toString() } override fun displayScore(track: DomainAnimeTrack): String { return track.score.toInt().toString() } private suspend fun add(track: MangaTrack): MangaTrack { return api.addLibManga(track) } private suspend fun add(track: AnimeTrack): AnimeTrack { return api.addLibAnime(track) } override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING } } } return api.updateLibManga(track) } override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { if (track.status != COMPLETED) { if (didWatchEpisode) { if (track.last_episode_seen.toLong() == track.total_episodes && track.total_episodes > 0) { track.status = COMPLETED } else { track.status = READING } } } return api.updateLibAnime(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { val statusTrack = api.statusLibManga(track, getUsername()) return if (statusTrack != null) { track.copyPersonalFrom(statusTrack, copyRemotePrivate = false) track.library_id = statusTrack.library_id track.score = statusTrack.score track.last_chapter_read = statusTrack.last_chapter_read track.total_chapters = statusTrack.total_chapters if (track.status != COMPLETED) { track.status = if (hasReadChapters) READING else statusTrack.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun bind(track: AnimeTrack, hasSeenEpisodes: Boolean): AnimeTrack { val statusTrack = api.statusLibAnime(track, getUsername()) return if (statusTrack != null) { track.copyPersonalFrom(statusTrack, copyRemotePrivate = false) track.library_id = statusTrack.library_id track.score = statusTrack.score track.last_episode_seen = statusTrack.last_episode_seen track.total_episodes = statusTrack.total_episodes if (track.status != COMPLETED) { track.status = if (hasSeenEpisodes) READING else statusTrack.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasSeenEpisodes) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun searchManga(query: String): List { return api.search(query) } override suspend fun searchAnime(query: String): List { return api.searchAnime(query) } override suspend fun refresh(track: MangaTrack): MangaTrack { val remoteStatusTrack = api.statusLibManga(track, getUsername()) ?: throw Exception("Could not find manga") track.copyPersonalFrom(remoteStatusTrack) return track } override suspend fun refresh(track: AnimeTrack): AnimeTrack { val remoteStatusTrack = api.statusLibAnime(track, getUsername()) ?: throw Exception("Could not find anime") track.copyPersonalFrom(remoteStatusTrack) return track } override fun getLogo() = R.drawable.ic_tracker_bangumi override fun getLogoColor() = Color.rgb(240, 145, 153) override fun getStatusListManga(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ) } override fun getStatusListAnime(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ) } override fun getStatusForManga(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped else -> null } override fun getStatusForAnime(status: Long): StringResource? = when (status) { READING -> AYMR.strings.watching PLAN_TO_READ -> AYMR.strings.plan_to_watch COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped else -> null } override fun getReadingStatus(): Long = READING override fun getWatchingStatus(): Long = READING override fun getRereadingStatus(): Long = -1 override fun getRewatchingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETED override suspend fun login(username: String, password: String) = login(password) suspend fun login(code: String) { try { val oauth = api.accessToken(code) interceptor.newAuth(oauth) // Users can set a 'username' (not nickname) once which effectively // replaces the stringified ID in certain queries. // If no username is set, the API returns the user ID as a strings var username = api.getUsername() saveCredentials(username, oauth.accessToken) } catch (_: Throwable) { logout() } } fun saveToken(oauth: BGMOAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oauth)) } fun restoreToken(): BGMOAuth? { return try { json.decodeFromString(trackPreferences.trackToken(this).get()) } catch (_: Exception) { null } } override fun logout() { super.logout() trackPreferences.trackToken(this).delete() interceptor.newAuth(null) } companion object { const val PLAN_TO_READ = 1L const val COMPLETED = 2L const val READING = 3L const val ON_HOLD = 4L const val DROPPED = 5L private val SCORE_LIST = IntRange(0, 10) .map(Int::toString) .toImmutableList() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.bangumi.dto.BGMCollectionResponse import eu.kanade.tachiyomi.data.track.bangumi.dto.BGMOAuth import eu.kanade.tachiyomi.data.track.bangumi.dto.BGMSearchResult import eu.kanade.tachiyomi.data.track.bangumi.dto.BGMUser import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.add import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonArray import kotlinx.serialization.json.putJsonObject import okhttp3.CacheControl import okhttp3.FormBody import okhttp3.Headers.Companion.headersOf import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy class BangumiApi( private val trackId: Long, private val client: OkHttpClient, interceptor: BangumiInterceptor, ) { private val json: Json by injectLazy() private val authClient = client.newBuilder().addInterceptor(interceptor).build() suspend fun addLibManga(track: MangaTrack): MangaTrack { return withIOContext { val url = "$API_URL/v0/users/-/collections/${track.remote_id}" val body = buildJsonObject { put("type", track.toApiStatus()) put("rate", track.score.toInt().coerceIn(0, 10)) put("ep_status", track.last_chapter_read.toInt()) put("private", track.private) } .toString() .toRequestBody() // Returns with 202 Accepted on success with no body authClient.newCall(POST(url, body = body, headers = headersOf("Content-Type", APP_JSON))) .awaitSuccess() track } } suspend fun addLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val url = "$API_URL/v0/users/-/collections/${track.remote_id}" val body = buildJsonObject { put("type", track.toApiStatus()) put("rate", track.score.toInt().coerceIn(0, 10)) put("ep_status", track.last_episode_seen.toInt()) put("private", track.private) } .toString() .toRequestBody() // Returns with 202 Accepted on success with no body authClient.newCall(POST(url, body = body, headers = headersOf("Content-Type", APP_JSON))) .awaitSuccess() track } } suspend fun updateLibManga(track: MangaTrack): MangaTrack { return withIOContext { val url = "$API_URL/v0/users/-/collections/${track.remote_id}" val body = buildJsonObject { put("type", track.toApiStatus()) put("rate", track.score.toInt().coerceIn(0, 10)) put("ep_status", track.last_chapter_read.toInt()) put("private", track.private) } .toString() .toRequestBody() val request = Request.Builder() .url(url) .patch(body) .headers(headersOf("Content-Type", APP_JSON)) .build() // Returns with 204 No Content authClient.newCall(request) .awaitSuccess() track } } suspend fun updateLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val url = "$API_URL/v0/users/-/collections/${track.remote_id}" val body = buildJsonObject { put("type", track.toApiStatus()) put("rate", track.score.toInt().coerceIn(0, 10)) put("ep_status", track.last_episode_seen.toInt()) put("private", track.private) } .toString() .toRequestBody() val request = Request.Builder() .url(url) .patch(body) .headers(headersOf("Content-Type", APP_JSON)) .build() // Returns with 204 No Content authClient.newCall(request) .awaitSuccess() track } } suspend fun search(search: String): List { // This API is marked as experimental in the documentation // but that has been the case since 2022 with few significant // changes to the schema for this endpoint since // "实验性 API, 本 schema 和实际的 API 行为都可能随时发生改动" return withIOContext { val url = "$API_URL/v0/search/subjects?limit=20" val body = buildJsonObject { put("keyword", search) put("sort", "match") putJsonObject("filter") { putJsonArray("type") { add(1) // "Book" (书籍) type } } } .toString() .toRequestBody() with(json) { authClient.newCall(POST(url, body = body, headers = headersOf("Content-Type", APP_JSON))) .awaitSuccess() .parseAs() .data .filter { it.platform == null || it.platform == "漫画" } .map { it.toMangaTrackSearch(trackId) } } } } suspend fun searchAnime(search: String): List { // This API is marked as experimental in the documentation // but that has been the case since 2022 with few significant // changes to the schema for this endpoint since // "实验性 API, 本 schema 和实际的 API 行为都可能随时发生改动" return withIOContext { val url = "$API_URL/v0/search/subjects?limit=20" val body = buildJsonObject { put("keyword", search) put("sort", "match") putJsonObject("filter") { putJsonArray("type") { add(2) // "Anime" (动画) type } } } .toString() .toRequestBody() with(json) { authClient.newCall(POST(url, body = body, headers = headersOf("Content-Type", APP_JSON))) .awaitSuccess() .parseAs() .data .map { it.toAnimeTrackSearch(trackId) } } } } suspend fun statusLibManga(track: MangaTrack, username: String): MangaTrack? { return withIOContext { val url = "$API_URL/v0/users/$username/collections/${track.remote_id}" with(json) { try { authClient.newCall(GET(url, cache = CacheControl.FORCE_NETWORK)) .awaitSuccess() .parseAs() .let { track.status = it.getStatus() track.last_chapter_read = it.epStatus?.toDouble() ?: 0.0 track.score = it.rate?.toDouble() ?: 0.0 track.total_chapters = it.subject?.eps?.toLong() ?: 0L track } } catch (e: HttpException) { if (e.code == 404) { // "subject is not collected by user" null } else { throw e } } } } } suspend fun statusLibAnime(track: AnimeTrack, username: String): AnimeTrack? { return withIOContext { val url = "$API_URL/v0/users/$username/collections/${track.remote_id}" with(json) { try { authClient.newCall(GET(url, cache = CacheControl.FORCE_NETWORK)) .awaitSuccess() .parseAs() .let { track.status = it.getStatus() track.last_episode_seen = it.epStatus?.toDouble() ?: 0.0 track.score = it.rate?.toDouble() ?: 0.0 track.total_episodes = it.subject?.eps?.toLong() ?: 0L track } } catch (e: HttpException) { if (e.code == 404) { // "subject is not collected by user" null } else { throw e } } } } } suspend fun accessToken(code: String): BGMOAuth { return withIOContext { val body = FormBody.Builder() .add("grant_type", "authorization_code") .add("client_id", CLIENT_ID) .add("client_secret", CLIENT_SECRET) .add("code", code) .add("redirect_uri", REDIRECT_URL) .build() with(json) { client.newCall(POST(OAUTH_URL, body = body)) .awaitSuccess() .parseAs() } } } suspend fun getUsername(): String { return withIOContext { with(json) { authClient.newCall(GET("$API_URL/v0/me")) .awaitSuccess() .parseAs() .username } } } companion object { private const val CLIENT_ID = "bgm293165b66d7e58156" private const val CLIENT_SECRET = "21d5f5c19ac24b4bc9c855ffa2387030" private const val API_URL = "https://api.bgm.tv" private const val OAUTH_URL = "https://bgm.tv/oauth/access_token" private const val LOGIN_URL = "https://bgm.tv/oauth/authorize" private const val REDIRECT_URL = "aniyomi://bangumi-auth" private const val APP_JSON = "application/json" fun authUrl(): Uri = LOGIN_URL.toUri().buildUpon() .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("response_type", "code") .appendQueryParameter("redirect_uri", REDIRECT_URL) .build() fun refreshTokenRequest(token: String) = POST( OAUTH_URL, body = FormBody.Builder() .add("grant_type", "refresh_token") .add("client_id", CLIENT_ID) .add("client_secret", CLIENT_SECRET) .add("refresh_token", token) .add("redirect_uri", REDIRECT_URL) .build(), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.track.bangumi.dto.BGMOAuth import eu.kanade.tachiyomi.data.track.bangumi.dto.isExpired import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response import uy.kohesive.injekt.injectLazy class BangumiInterceptor(private val bangumi: Bangumi) : Interceptor { private val json: Json by injectLazy() /** * OAuth object used for authenticated requests. */ private var oauth: BGMOAuth? = bangumi.restoreToken() override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() var currAuth: BGMOAuth = oauth ?: throw Exception("Not authenticated with Bangumi") if (currAuth.isExpired()) { val response = chain.proceed(BangumiApi.refreshTokenRequest(currAuth.refreshToken!!)) if (response.isSuccessful) { currAuth = json.decodeFromString(response.body.string()) newAuth(currAuth) } else { response.close() } } return originalRequest.newBuilder() .header( "User-Agent", "jmir1/Aniyomi/v${BuildConfig.VERSION_NAME} (Android) (https://github.com/aniyomiorg/aniyomi)", ) .apply { addHeader("Authorization", "Bearer ${currAuth.accessToken}") } .build() .let(chain::proceed) } fun newAuth(oauth: BGMOAuth?) { this.oauth = if (oauth == null) { null } else { BGMOAuth( oauth.accessToken, oauth.tokenType, System.currentTimeMillis() / 1000, oauth.expiresIn, oauth.refreshToken, this.oauth?.userId, ) } bangumi.saveToken(oauth) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiUtils.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack fun MangaTrack.toApiStatus() = when (status) { Bangumi.PLAN_TO_READ -> 1 Bangumi.COMPLETED -> 2 Bangumi.READING -> 3 Bangumi.ON_HOLD -> 4 Bangumi.DROPPED -> 5 else -> throw NotImplementedError("Unknown status: $status") } fun AnimeTrack.toApiStatus() = when (status) { Bangumi.PLAN_TO_READ -> 1 Bangumi.COMPLETED -> 2 Bangumi.READING -> 3 Bangumi.ON_HOLD -> 4 Bangumi.DROPPED -> 5 else -> throw NotImplementedError("Unknown status: $status") } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/dto/BGMCollectionResponse.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi.dto import eu.kanade.tachiyomi.data.track.bangumi.Bangumi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class BGMCollectionResponse( val rate: Int?, val type: Int?, @SerialName("ep_status") val epStatus: Int? = 0, @SerialName("vol_status") val volStatus: Int? = 0, val private: Boolean = false, val subject: BGMSlimSubject? = null, ) { fun getStatus(): Long = when (type) { 1 -> Bangumi.PLAN_TO_READ 2 -> Bangumi.COMPLETED 3 -> Bangumi.READING 4 -> Bangumi.ON_HOLD 5 -> Bangumi.DROPPED else -> throw NotImplementedError("Unknown status: $type") } } @Serializable // Incomplete DTO with only our needed attributes data class BGMSlimSubject( val volumes: Int?, val eps: Int?, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/dto/BGMOAuth.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi.dto import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class BGMOAuth( @SerialName("access_token") val accessToken: String, @SerialName("token_type") val tokenType: String, @SerialName("created_at") @EncodeDefault val createdAt: Long = System.currentTimeMillis() / 1000, @SerialName("expires_in") val expiresIn: Long, @SerialName("refresh_token") val refreshToken: String?, @SerialName("user_id") val userId: Long?, ) // Access token refresh before expired fun BGMOAuth.isExpired() = (System.currentTimeMillis() / 1000) > (createdAt + expiresIn - 3600) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/dto/BGMSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi.dto import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class BGMSearchResult( val total: Int, val limit: Int, val offset: Int, val data: List = emptyList(), ) @Serializable // Incomplete DTO with only our needed attributes data class BGMSubject( val id: Long, @SerialName("name_cn") val nameCn: String, val name: String, val summary: String?, val date: String?, // YYYY-MM-DD val images: BGMSubjectImages?, val volumes: Long = 0, val eps: Long = 0, val rating: BGMSubjectRating?, val platform: String?, ) { fun toMangaTrackSearch(trackId: Long): MangaTrackSearch = MangaTrackSearch.create(trackId).apply { remote_id = this@BGMSubject.id title = nameCn.ifBlank { name } cover_url = images?.common.orEmpty() summary = if (nameCn.isNotBlank()) { "作品原名:$name" + this@BGMSubject.summary?.let { "\n${it.trim()}" }.orEmpty() } else { this@BGMSubject.summary?.trim().orEmpty() } score = rating?.score ?: -1.0 tracking_url = "https://bangumi.tv/subject/${this@BGMSubject.id}" total_chapters = eps start_date = date ?: "" } fun toAnimeTrackSearch(trackId: Long): AnimeTrackSearch = AnimeTrackSearch.create(trackId).apply { remote_id = this@BGMSubject.id title = nameCn.ifBlank { name } cover_url = images?.common.orEmpty() summary = if (nameCn.isNotBlank()) { "作品原名:$name" + this@BGMSubject.summary?.let { "\n${it.trim()}" }.orEmpty() } else { this@BGMSubject.summary?.trim().orEmpty() } score = rating?.score ?: -1.0 tracking_url = "https://bangumi.tv/subject/${this@BGMSubject.id}" total_episodes = eps start_date = date ?: "" } } @Serializable // Incomplete DTO with only our needed attributes data class BGMSubjectImages( val common: String?, ) @Serializable // Incomplete DTO with only our needed attributes data class BGMSubjectRating( val score: Double?, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/dto/BGMUser.kt ================================================ package eu.kanade.tachiyomi.data.track.bangumi.dto import kotlinx.serialization.Serializable @Serializable // Incomplete DTO with only our needed attributes data class BGMUser( val username: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/Jellyfin.kt ================================================ package eu.kanade.tachiyomi.data.track.jellyfin import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import okhttp3.Dns import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.domain.track.anime.model.AnimeTrack as DomainTrack class Jellyfin(id: Long) : BaseTracker(id, "Jellyfin"), EnhancedAnimeTracker, AnimeTracker { companion object { const val UNSEEN = 1L const val WATCHING = 2L const val COMPLETED = 3L } override val client by lazy { networkService.client.newBuilder() .addInterceptor(JellyfinInterceptor()) .dns(Dns.SYSTEM) // don't use DNS over HTTPS as it breaks IP addressing .build() } val api by lazy { JellyfinApi(id, client) } override fun getLogo() = R.drawable.ic_tracker_jellyfin override fun getLogoColor() = Color.rgb(0, 11, 37) override fun getStatusListAnime(): List = listOf(UNSEEN, WATCHING, COMPLETED) override fun getStatusForAnime(status: Long): StringResource? = when (status) { UNSEEN -> AYMR.strings.unseen WATCHING -> AYMR.strings.watching COMPLETED -> MR.strings.completed else -> null } override fun getWatchingStatus(): Long = WATCHING override fun getRewatchingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() override fun displayScore(track: DomainTrack): String = "" override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { return api.updateProgress(track) } override suspend fun bind(track: AnimeTrack, hasSeenEpisodes: Boolean): AnimeTrack { return track } override suspend fun searchAnime(query: String): List = throw Exception("Not used") override suspend fun refresh(track: AnimeTrack): AnimeTrack { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) track.total_episodes = remoteTrack.total_episodes return track } override suspend fun login(username: String, password: String) { saveCredentials("user", "pass") } override fun loginNoop() { saveCredentials("user", "pass") } override fun getAcceptedSources() = listOf("eu.kanade.tachiyomi.animeextension.all.jellyfin.Jellyfin") override suspend fun match(anime: Anime): AnimeTrackSearch? = try { api.getTrackSearch(anime.url) } catch (e: Exception) { null } override fun isTrackFrom(track: DomainTrack, anime: Anime, source: AnimeSource?): Boolean = track.remoteUrl == anime.url && source?.let { accept(it) } == true override fun migrateTrack(track: DomainTrack, anime: Anime, newSource: AnimeSource): DomainTrack? { return if (accept(newSource)) { track.copy(remoteUrl = anime.url) } else { null } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/JellyfinApi.kt ================================================ package eu.kanade.tachiyomi.data.track.jellyfin import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.jellyfin.dto.JFItem import eu.kanade.tachiyomi.data.track.jellyfin.dto.JFItemList import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import logcat.LogPriority import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.OkHttpClient import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.text.SimpleDateFormat import java.util.Date import java.util.Locale import kotlin.math.abs class JellyfinApi( private val trackId: Long, private val client: OkHttpClient, ) { private val json: Json by injectLazy() suspend fun getTrackSearch(url: String): AnimeTrackSearch = withIOContext { try { val httpUrl = url.toHttpUrl() val fragment = httpUrl.fragment!! val track = with(json) { client.newCall(GET(url)) .awaitSuccess() .parseAs() .toTrack() }.apply { tracking_url = url } when { fragment.startsWith("seriesId") -> { getTrackFromSeries(track, httpUrl) } else -> track } } catch (e: Exception) { logcat(LogPriority.WARN, e) { "Could not get item: $url" } throw e } } private fun JFItem.toTrack(): AnimeTrackSearch = AnimeTrackSearch.create( trackId, ).also { it.title = name it.total_episodes = 1 if (userData.played) { it.last_episode_seen = 1.0 it.status = Jellyfin.COMPLETED } else { it.last_episode_seen = 0.0 it.status = Jellyfin.UNSEEN } } private fun getEpisodesUrl(url: HttpUrl): HttpUrl { val fragment = url.fragment!! return url.newBuilder().apply { encodedPath("/") fragment(null) encodedQuery(null) addPathSegment("Shows") addPathSegment(fragment.split(",").last()) addPathSegment("Episodes") addQueryParameter("seasonId", url.pathSegments.last()) addQueryParameter("userId", url.pathSegments[1]) addQueryParameter("Fields", "Overview,MediaSources") }.build() } private suspend fun getTrackFromSeries(track: AnimeTrackSearch, url: HttpUrl): AnimeTrackSearch { val episodesUrl = getEpisodesUrl(url) val episodes = with(json) { client.newCall(GET(episodesUrl)) .awaitSuccess() .parseAs() }.items val totalEpisodes = episodes.last().indexNumber!! val firstUnwatched = episodes.indexOfFirst { !it.userData.played } if (firstUnwatched == 0) { return track.apply { this.total_episodes = totalEpisodes this.last_episode_seen = 0.0 this.status = Jellyfin.UNSEEN } } if (firstUnwatched == -1) { return track.apply { this.total_episodes = totalEpisodes this.last_episode_seen = totalEpisodes.toDouble() this.status = Jellyfin.COMPLETED } } val lastContinuousSeen = episodes[firstUnwatched - 1].indexNumber!! return track.apply { this.total_episodes = totalEpisodes this.last_episode_seen = lastContinuousSeen.toDouble() this.status = Jellyfin.WATCHING } } suspend fun updateProgress(track: AnimeTrack): AnimeTrack { val httpUrl = track.tracking_url.toHttpUrl() val fragment = httpUrl.fragment!! val itemId = if (fragment.startsWith("movie")) { httpUrl.pathSegments.last() } else { val episodesUrl = getEpisodesUrl(httpUrl) val episodes = with(json) { client.newCall(GET(episodesUrl)) .awaitSuccess() .parseAs() }.items episodes.firstOrNull { it.indexNumber!!.equalsTo(track.last_episode_seen) }?.id } if (itemId != null) { val time = DATE_FORMATTER.format(Date()) val postUrl = httpUrl.newBuilder().apply { fragment(null) removePathSegment(3) removePathSegment(2) addPathSegment("PlayedItems") addPathSegment(itemId) addQueryParameter("DatePlayed", time) }.build().toString() client.newCall( POST(postUrl), ).awaitSuccess() } return getTrackSearch(track.tracking_url) } private fun Long.equalsTo(other: Double): Boolean { return abs(this - other) < 0.001 } companion object { private val DATE_FORMATTER = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/JellyfinInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.jellyfin import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.sourcePreferences import okhttp3.Interceptor import okhttp3.Response import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.injectLazy import java.io.IOException import java.security.MessageDigest class JellyfinInterceptor : Interceptor { private val sourceManager: AnimeSourceManager by injectLazy() private val apiKeys = mutableMapOf() override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() // Add the User-Agent header to the original request. val uaRequest = originalRequest.newBuilder() .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() // Check api keys if (originalRequest.url.queryParameter("api_key") != null) { return chain.proceed(uaRequest) } val userId = originalRequest.url.queryParameter("userId") ?: originalRequest.url.pathSegments[1] val apiKey = apiKeys[userId] ?: getApiKey(userId)?.also { apiKeys[userId] = it } ?: throw IOException("Please log in through the extension") val authUrl = originalRequest.url.newBuilder() .addQueryParameter("api_key", apiKey) .build() val authRequest = uaRequest.newBuilder().url(authUrl).build() return chain.proceed(authRequest) } private fun getId(suffix: Int): Long { val key = "jellyfin" + (if (suffix == 1) "" else " ($suffix)") + "/all/$JELLYFIN_VERSION_ID" val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray()) return (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) } .reduce(Long::or) and Long.MAX_VALUE } private fun getApiKey(userId: String): String? { for (i in 1..MAX_JELLYFIN_SOURCES) { val sourceId = getId(i) val preferences = (sourceManager.get(sourceId) as ConfigurableAnimeSource).sourcePreferences() val sourceUserId = preferences.getString("user_id", "") if (sourceUserId.isNullOrEmpty()) { continue // Source not configured } if (sourceUserId == userId) { return preferences.getString("api_key", "") } } return null } companion object { private const val JELLYFIN_VERSION_ID = 1 private const val MAX_JELLYFIN_SOURCES = 10 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/jellyfin/dto/JFItem.kt ================================================ package eu.kanade.tachiyomi.data.track.jellyfin.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class JFItem( @SerialName("Name") val name: String, @SerialName("Id") val id: String, @SerialName("UserData") val userData: JFUserData, @SerialName("IndexNumber") val indexNumber: Long? = null, ) @Serializable data class JFUserData( @SerialName("Played") val played: Boolean, ) @Serializable data class JFItemList( @SerialName("Items") val items: List, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt ================================================ package eu.kanade.tachiyomi.data.track.kavita import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.sourcePreferences import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.security.MessageDigest import tachiyomi.domain.track.manga.model.MangaTrack as DomainTrack class Kavita(id: Long) : BaseTracker(id, "Kavita"), EnhancedMangaTracker, MangaTracker { companion object { const val UNREAD = 1L const val READING = 2L const val COMPLETED = 3L } var authentications: OAuth? = null private val interceptor by lazy { KavitaInterceptor(this) } val api by lazy { KavitaApi(client, interceptor) } private val sourceManager: MangaSourceManager by injectLazy() override fun getLogo(): Int = R.drawable.ic_tracker_kavita override fun getLogoColor() = Color.rgb(74, 198, 148) override fun getStatusListManga(): List = listOf(UNREAD, READING, COMPLETED) override fun getStatusForManga(status: Long): StringResource? = when (status) { UNREAD -> MR.strings.unread READING -> MR.strings.reading COMPLETED -> MR.strings.completed else -> null } override fun getReadingStatus(): Long = READING override fun getRereadingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() override fun displayScore(track: DomainTrack): String = "" override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING } } } return api.updateProgress(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { return track } override suspend fun searchManga(query: String): List { TODO("Not yet implemented: search") } override suspend fun refresh(track: MangaTrack): MangaTrack { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) track.total_chapters = remoteTrack.total_chapters return track } override suspend fun login(username: String, password: String) { saveCredentials("user", "pass") } // [Tracker].isLogged works by checking that credentials are saved. // By saving dummy, unused credentials, we can activate the tracker simply by login/logout override fun loginNoop() { saveCredentials("user", "pass") } override fun getAcceptedSources() = listOf("eu.kanade.tachiyomi.extension.all.kavita.Kavita") override suspend fun match(manga: Manga): MangaTrackSearch? = try { api.getTrackSearch(manga.url) } catch (e: Exception) { null } override fun isTrackFrom(track: DomainTrack, manga: Manga, source: MangaSource?): Boolean = track.remoteUrl == manga.url && source?.let { accept(it) } == true override fun migrateTrack(track: DomainTrack, manga: Manga, newSource: MangaSource): DomainTrack? = if (accept(newSource)) { track.copy(remoteUrl = manga.url) } else { null } fun loadOAuth() { val oauth = OAuth() for (id in 1..3) { val authentication = oauth.authentications[id - 1] val sourceId by lazy { val key = "kavita_$id/all/1" // Hardcoded versionID to 1 val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray()) (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) } .reduce(Long::or) and Long.MAX_VALUE } val preferences = (sourceManager.get(sourceId) as ConfigurableSource).sourcePreferences() val prefApiUrl = preferences.getString("APIURL", "") val prefApiKey = preferences.getString("APIKEY", "") if (prefApiUrl.isNullOrEmpty() || prefApiKey.isNullOrEmpty()) { // Source not configured. Skip continue } val token = api.getNewToken(apiUrl = prefApiUrl, apiKey = prefApiKey) if (token.isNullOrEmpty()) { // Source is not accessible. Skip continue } authentication.apiUrl = prefApiUrl authentication.jwtToken = token.toString() } authentications = oauth } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaApi.kt ================================================ package eu.kanade.tachiyomi.data.track.kavita import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import logcat.LogPriority import okhttp3.Dns import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.io.IOException import java.net.SocketTimeoutException class KavitaApi(private val client: OkHttpClient, interceptor: KavitaInterceptor) { private val json: Json by injectLazy() private val authClient = client.newBuilder() .dns(Dns.SYSTEM) .addInterceptor(interceptor) .build() fun getApiFromUrl(url: String): String { return url.split("/api/").first() + "/api" } /* * Uses url to compare against each source APIURL's to get the correct custom source preference. * Now having source preference we can do getString("APIKEY") * Authenticates to get the token * Saves the token in the var jwtToken */ fun getNewToken(apiUrl: String, apiKey: String): String? { val request = POST( "$apiUrl/Plugin/authenticate?apiKey=$apiKey&pluginName=Tachiyomi-Kavita", body = "{}".toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()), ) try { with(json) { client.newCall(request).execute().use { when (it.code) { 200 -> return it.parseAs().token 401 -> { logcat(LogPriority.WARN) { "Unauthorized / api key not valid: Cleaned api URL: " + "$apiUrl, Api key is empty: ${apiKey.isEmpty()}" } throw IOException("Unauthorized / api key not valid") } 500 -> { logcat( LogPriority.WARN, ) { "Error fetching JWT token. Cleaned api URL: " + "$apiUrl, Api key is empty: ${apiKey.isEmpty()}" } throw IOException("Error fetching JWT token") } else -> {} } } } // Not sure which one to catch } catch (e: SocketTimeoutException) { logcat(LogPriority.WARN) { "Could not fetch JWT token. Probably due to connectivity " + "issue or the url '$apiUrl' is not available, skipping" } return null } catch (e: Exception) { logcat(LogPriority.ERROR) { "Unhandled exception fetching JWT token for url: '$apiUrl'" } throw IOException(e) } return null } private fun getApiVolumesUrl(url: String): String { return "${getApiFromUrl(url)}/Series/volumes?seriesId=${getIdFromUrl(url)}" } /* Strips serie id from URL */ private fun getIdFromUrl(url: String): Int { return url.substringAfterLast("/").toInt() } /* * Returns total chapters in the series. * Ignores volumes. * Volumes consisting of 1 file treated as chapter */ private fun getTotalChapters(url: String): Long { val requestUrl = getApiVolumesUrl(url) try { val listVolumeDto = with(json) { authClient.newCall(GET(requestUrl)) .execute() .parseAs>() } var volumeNumber = 0L var maxChapterNumber = 0L for (volume in listVolumeDto) { if (volume.chapters.maxOf { it.number!!.toFloat() } == 0f) { volumeNumber++ } else if (maxChapterNumber < volume.chapters.maxOf { it.number!!.toFloat() }) { maxChapterNumber = volume.chapters.maxOf { it.number!!.toFloat().toLong() } } } return if (maxChapterNumber > volumeNumber) maxChapterNumber else volumeNumber } catch (e: Exception) { logcat(LogPriority.WARN, e) { "Exception fetching Total Chapters. Request:$requestUrl" } throw e } } private fun getLatestChapterRead(url: String): Double { val seriesId = getIdFromUrl(url) val requestUrl = "${getApiFromUrl(url)}/Tachiyomi/latest-chapter?seriesId=$seriesId" try { with(json) { authClient.newCall(GET(requestUrl)).execute().use { if (it.code == 200) { return it.parseAs().number!!.replace(",", ".").toDouble() } if (it.code == 204) { return 0.0 } } } } catch (e: Exception) { logcat( LogPriority.WARN, e, ) { "Exception getting latest chapter read. Could not get itemRequest: $requestUrl" } throw e } return 0.0 } suspend fun getTrackSearch(url: String): MangaTrackSearch = withIOContext { try { val seriesDto: SeriesDto = with(json) { authClient.newCall(GET(url)) .awaitSuccess() .parseAs() } val track = seriesDto.toTrack() track.apply { cover_url = seriesDto.thumbnail_url.toString() tracking_url = url total_chapters = getTotalChapters(url) title = seriesDto.name status = when (seriesDto.pagesRead) { seriesDto.pages -> Kavita.COMPLETED 0 -> Kavita.UNREAD else -> Kavita.READING } last_chapter_read = getLatestChapterRead(url) } } catch (e: Exception) { logcat(LogPriority.WARN, e) { "Could not get item: $url" } throw e } } suspend fun updateProgress(track: MangaTrack): MangaTrack { val requestUrl = "${getApiFromUrl( track.tracking_url, )}/Tachiyomi/mark-chapter-until-as-read?seriesId=${getIdFromUrl( track.tracking_url, )}&chapterNumber=${track.last_chapter_read}" authClient.newCall( POST( requestUrl, body = "{}".toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()), ), ) .awaitSuccess() return getTrackSearch(track.tracking_url) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.kavita import eu.kanade.tachiyomi.BuildConfig import okhttp3.Interceptor import okhttp3.Response class KavitaInterceptor(private val kavita: Kavita) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() if (kavita.authentications == null) { kavita.loadOAuth() } val jwtToken = kavita.authentications?.getToken( kavita.api.getApiFromUrl(originalRequest.url.toString()), ) // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer $jwtToken") .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/KavitaModels.kt ================================================ package eu.kanade.tachiyomi.data.track.kavita import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.serialization.Serializable @Serializable data class SeriesDto( val id: Int, val name: String, val originalName: String = "", val thumbnail_url: String? = "", val stringResourcedName: String? = "", val sortName: String? = "", val pages: Int, val coverImageLocked: Boolean = true, val pagesRead: Int, val userRating: Int? = 0, val userReview: String? = "", val format: Int, val created: String? = "", val libraryId: Int, val libraryName: String? = "", ) { fun toTrack(): MangaTrackSearch = MangaTrackSearch.create(TrackerManager.KAVITA).also { it.title = name it.summary = "" } } @Serializable data class VolumeDto( val id: Int, val number: Int, val name: String, val pages: Int, val pagesRead: Int, val lastModified: String, val created: String, val seriesId: Int, val chapters: List = emptyList(), ) @Serializable data class ChapterDto( val id: Int? = -1, val range: String? = "", val number: String? = "-1", val pages: Int? = 0, val isSpecial: Boolean? = false, val title: String? = "", val pagesRead: Int? = 0, val coverImageLocked: Boolean? = false, val volumeId: Int? = -1, val created: String? = "", ) @Serializable data class AuthenticationDto( val username: String, val token: String, val apiKey: String, ) class OAuth( val authentications: List = listOf( SourceAuth(1), SourceAuth(2), SourceAuth(3), ), ) { fun getToken(apiUrl: String): String? { for (authentication in authentications) { if (authentication.apiUrl == apiUrl) { return authentication.jwtToken } } return null } } data class SourceAuth( var sourceId: Int, var apiUrl: String = "", var jwtToken: String = "", ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.DeletableAnimeTracker import eu.kanade.tachiyomi.data.track.DeletableMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuOAuth import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import java.text.DecimalFormat import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class Kitsu(id: Long) : BaseTracker( id, "Kitsu", ), AnimeTracker, MangaTracker, DeletableMangaTracker, DeletableAnimeTracker { companion object { const val READING = 1L const val WATCHING = 11L const val COMPLETED = 2L const val ON_HOLD = 3L const val DROPPED = 4L const val PLAN_TO_READ = 5L const val PLAN_TO_WATCH = 15L } override val supportsReadingDates: Boolean = true override val supportsPrivateTracking: Boolean = true private val json: Json by injectLazy() private val interceptor by lazy { KitsuInterceptor(this) } private val api by lazy { KitsuApi(client, interceptor) } override fun getLogo() = R.drawable.ic_tracker_kitsu override fun getLogoColor() = Color.rgb(51, 37, 50) override fun getStatusListManga(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ) } override fun getStatusListAnime(): List { return listOf(WATCHING, PLAN_TO_WATCH, COMPLETED, ON_HOLD, DROPPED) } override fun getStatusForManga(status: Long): StringResource? = when (status) { READING -> AYMR.strings.currently_reading PLAN_TO_READ -> AYMR.strings.want_to_read COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped else -> null } override fun getStatusForAnime(status: Long): StringResource? = when (status) { WATCHING -> AYMR.strings.currently_watching PLAN_TO_WATCH -> AYMR.strings.want_to_watch COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped else -> null } override fun getReadingStatus(): Long = READING override fun getWatchingStatus(): Long = WATCHING override fun getRereadingStatus(): Long = -1 override fun getRewatchingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList { val df = DecimalFormat("0.#") return (listOf("0") + IntRange(2, 20).map { df.format(it / 2f) }).toImmutableList() } override fun indexToScore(index: Int): Double { return if (index > 0) (index + 1) / 2.0 else 0.0 } override fun displayScore(track: DomainMangaTrack): String { val df = DecimalFormat("0.#") return df.format(track.score) } override fun displayScore(track: DomainAnimeTrack): String { val df = DecimalFormat("0.#") return df.format(track.score) } private suspend fun add(track: MangaTrack): MangaTrack { return api.addLibManga(track, getUserId()) } private suspend fun add(track: AnimeTrack): AnimeTrack { return api.addLibAnime(track, getUserId()) } override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED track.finished_reading_date = System.currentTimeMillis() } else { track.status = READING if (track.last_chapter_read == 1.0) { track.started_reading_date = System.currentTimeMillis() } } } } return api.updateLibManga(track) } override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { if (track.status != COMPLETED) { if (didWatchEpisode) { if (track.last_episode_seen.toLong() == track.total_episodes && track.total_episodes > 0) { track.status = COMPLETED track.finished_watching_date = System.currentTimeMillis() } else { track.status = WATCHING if (track.last_episode_seen == 1.0) { track.started_watching_date = System.currentTimeMillis() } } } } return api.updateLibAnime(track) } override suspend fun delete(track: DomainMangaTrack) { api.removeLibManga(track) } override suspend fun delete(track: DomainAnimeTrack) { api.removeLibAnime(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { val remoteTrack = api.findLibManga(track, getUserId()) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack, copyRemotePrivate = false) track.remote_id = remoteTrack.remote_id if (track.status != COMPLETED) { track.status = if (hasReadChapters) READING else track.status } update(track) } else { track.status = if (hasReadChapters) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun bind(track: AnimeTrack, hasWatchedEpisodes: Boolean): AnimeTrack { val remoteTrack = api.findLibAnime(track, getUserId()) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack, copyRemotePrivate = false) track.remote_id = remoteTrack.remote_id if (track.status != COMPLETED) { track.status = if (hasWatchedEpisodes) WATCHING else track.status } update(track) } else { track.status = if (hasWatchedEpisodes) WATCHING else PLAN_TO_WATCH track.score = 0.0 add(track) } } override suspend fun searchManga(query: String): List { return api.search(query) } override suspend fun searchAnime(query: String): List { return api.searchAnime(query) } override suspend fun refresh(track: MangaTrack): MangaTrack { val remoteTrack = api.getLibManga(track) track.copyPersonalFrom(remoteTrack) track.total_chapters = remoteTrack.total_chapters return track } override suspend fun refresh(track: AnimeTrack): AnimeTrack { val remoteTrack = api.getLibAnime(track) track.copyPersonalFrom(remoteTrack) track.total_episodes = remoteTrack.total_episodes return track } override suspend fun login(username: String, password: String) { val token = api.login(username, password) interceptor.newAuth(token) val userId = api.getCurrentUser() saveCredentials(username, userId) } override fun logout() { super.logout() interceptor.newAuth(null) } private fun getUserId(): String { return getPassword() } fun saveToken(oauth: KitsuOAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oauth)) } fun restoreToken(): KitsuOAuth? { return try { json.decodeFromString(trackPreferences.trackToken(this).get()) } catch (_: Exception) { null } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuAddEntryResult import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuAlgoliaSearchResult import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuCurrentUserResult import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuListSearchResult import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuOAuth import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuSearchResult import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.network.DELETE import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.jsonMime import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject import okhttp3.FormBody import okhttp3.Headers.Companion.headersOf import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.net.URLEncoder import java.nio.charset.StandardCharsets import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) { private val json: Json by injectLazy() private val authClient = client.newBuilder().addInterceptor(interceptor).build() suspend fun addLibManga(track: MangaTrack, userId: String): MangaTrack { return withIOContext { val data = buildJsonObject { putJsonObject("data") { put("type", "libraryEntries") putJsonObject("attributes") { put("status", track.toApiStatus()) put("progress", track.last_chapter_read.toInt()) put("private", track.private) } putJsonObject("relationships") { putJsonObject("user") { putJsonObject("data") { put("id", userId) put("type", "users") } } putJsonObject("media") { putJsonObject("data") { put("id", track.remote_id) put("type", "manga") } } } } } with(json) { authClient.newCall( POST( "${BASE_URL}library-entries", headers = headersOf("Content-Type", VND_API_JSON), body = data.toString().toRequestBody(VND_JSON_MEDIA_TYPE), ), ) .awaitSuccess() .parseAs() .let { track.remote_id = it.data.id track } } } } suspend fun addLibAnime(track: AnimeTrack, userId: String): AnimeTrack { return withIOContext { val data = buildJsonObject { putJsonObject("data") { put("type", "libraryEntries") putJsonObject("attributes") { put("status", track.toApiStatus()) put("progress", track.last_episode_seen.toInt()) put("private", track.private) } putJsonObject("relationships") { putJsonObject("user") { putJsonObject("data") { put("id", userId) put("type", "users") } } putJsonObject("media") { putJsonObject("data") { put("id", track.remote_id) put("type", "anime") } } } } } with(json) { authClient.newCall( POST( "${BASE_URL}library-entries", headers = headersOf("Content-Type", VND_API_JSON), body = data.toString().toRequestBody(VND_JSON_MEDIA_TYPE), ), ) .awaitSuccess() .parseAs() .let { track.remote_id = it.data.id track } } } } suspend fun updateLibManga(track: MangaTrack): MangaTrack { return withIOContext { val data = buildJsonObject { putJsonObject("data") { put("type", "libraryEntries") put("id", track.remote_id) putJsonObject("attributes") { put("status", track.toApiStatus()) put("progress", track.last_chapter_read.toInt()) put("ratingTwenty", track.toApiScore()) put("startedAt", KitsuDateHelper.convert(track.started_reading_date)) put("finishedAt", KitsuDateHelper.convert(track.finished_reading_date)) put("private", track.private) } } } authClient.newCall( Request.Builder() .url("${BASE_URL}library-entries/${track.remote_id}") .headers( headersOf("Content-Type", VND_API_JSON), ) .patch(data.toString().toRequestBody(VND_JSON_MEDIA_TYPE)) .build(), ) .awaitSuccess() track } } suspend fun updateLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val data = buildJsonObject { putJsonObject("data") { put("type", "libraryEntries") put("id", track.remote_id) putJsonObject("attributes") { put("status", track.toApiStatus()) put("progress", track.last_episode_seen.toInt()) put("ratingTwenty", track.toApiScore()) put("startedAt", KitsuDateHelper.convert(track.started_watching_date)) put("finishedAt", KitsuDateHelper.convert(track.finished_watching_date)) put("private", track.private) } } } authClient.newCall( Request.Builder() .url("${BASE_URL}library-entries/${track.remote_id}") .headers( headersOf("Content-Type", VND_API_JSON), ) .patch(data.toString().toRequestBody(VND_JSON_MEDIA_TYPE)) .build(), ) .awaitSuccess() track } } suspend fun removeLibManga(track: DomainMangaTrack) { withIOContext { authClient.newCall( DELETE( "${BASE_URL}library-entries/${track.remoteId}", headers = headersOf("Content-Type", VND_API_JSON), ), ) .awaitSuccess() } } suspend fun removeLibAnime(track: DomainAnimeTrack) { withIOContext { authClient.newCall( DELETE( "${BASE_URL}library-entries/${track.remoteId}", headers = headersOf("Content-Type", VND_API_JSON), ), ) .awaitSuccess() } } suspend fun search(query: String): List { return withIOContext { with(json) { authClient.newCall(GET(ALGOLIA_KEY_URL)) .awaitSuccess() .parseAs() .let { algoliaSearch(it.media.key, query) } } } } suspend fun searchAnime(query: String): List { return withIOContext { with(json) { authClient.newCall(GET(ALGOLIA_KEY_URL)) .awaitSuccess() .parseAs() .let { algoliaSearchAnime(it.media.key, query) } } } } private suspend fun algoliaSearch(key: String, query: String): List { return withIOContext { val jsonObject = buildJsonObject { put( "params", "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$ALGOLIA_FILTER", ) } with(json) { client.newCall( POST( ALGOLIA_URL, headers = headersOf( "X-Algolia-Application-Id", ALGOLIA_APP_ID, "X-Algolia-API-Key", key, ), body = jsonObject.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .hits .filter { it.subtype != "novel" } .map { it.toMangaTrack() } } } } private suspend fun algoliaSearchAnime(key: String, query: String): List { return withIOContext { val jsonObject = buildJsonObject { put( "params", "query=${URLEncoder.encode(query, StandardCharsets.UTF_8.name())}$ALGOLIA_FILTER_ANIME", ) } with(json) { client.newCall( POST( ALGOLIA_URL, headers = headersOf( "X-Algolia-Application-Id", ALGOLIA_APP_ID, "X-Algolia-API-Key", key, ), body = jsonObject.toString().toRequestBody(jsonMime), ), ) .awaitSuccess() .parseAs() .hits .filter { it.subtype != "novel" } .map { it.toAnimeTrack() } } } } suspend fun findLibManga(track: MangaTrack, userId: String): MangaTrack? { return withIOContext { val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[manga_id]=${track.remote_id}&filter[user_id]=$userId") .appendQueryParameter("include", "manga") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .let { if (it.data.isNotEmpty() && it.included.isNotEmpty()) { it.firstToMangaTrack() } else { null } } } } } suspend fun findLibAnime(track: AnimeTrack, userId: String): AnimeTrack? { return withIOContext { val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[anime_id]=${track.remote_id}&filter[user_id]=$userId") .appendQueryParameter("include", "anime") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .let { if (it.data.isNotEmpty() && it.included.isNotEmpty()) { it.firstToAnimeTrack() } else { null } } } } } suspend fun getLibManga(track: MangaTrack): MangaTrack { return withIOContext { val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[id]=${track.remote_id}") .appendQueryParameter("include", "manga") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .let { if (it.data.isNotEmpty() && it.included.isNotEmpty()) { it.firstToMangaTrack() } else { throw Exception("Could not find manga") } } } } } suspend fun getLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val url = "${BASE_URL}library-entries".toUri().buildUpon() .encodedQuery("filter[id]=${track.remote_id}") .appendQueryParameter("include", "anime") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .let { if (it.data.isNotEmpty() && it.included.isNotEmpty()) { it.firstToAnimeTrack() } else { throw Exception("Could not find manga") } } } } } suspend fun login(username: String, password: String): KitsuOAuth { return withIOContext { val formBody: RequestBody = FormBody.Builder() .add("username", username) .add("password", password) .add("grant_type", "password") .add("client_id", CLIENT_ID) .add("client_secret", CLIENT_SECRET) .build() with(json) { client.newCall(POST(LOGIN_URL, body = formBody)) .awaitSuccess() .parseAs() } } } suspend fun getCurrentUser(): String { return withIOContext { val url = "${BASE_URL}users".toUri().buildUpon() .encodedQuery("filter[self]=true") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .data[0] .id } } } companion object { private const val CLIENT_ID = "dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd" private const val CLIENT_SECRET = "54d7307928f63414defd96399fc31ba847961ceaecef3a5fd93144e960c0e151" private const val BASE_URL = "https://kitsu.app/api/edge/" private const val LOGIN_URL = "https://kitsu.app/api/oauth/token" private const val BASE_MANGA_URL = "https://kitsu.app/manga/" private const val BASE_ANIME_URL = "https://kitsu.app/anime/" private const val ALGOLIA_KEY_URL = "https://kitsu.app/api/edge/algolia-keys/media/" private const val ALGOLIA_URL = "https://AWQO5J657S-dsn.algolia.net/1/indexes/production_media/query/" private const val ALGOLIA_APP_ID = "AWQO5J657S" private const val ALGOLIA_FILTER = "&facetFilters=%5B%22kind%3Amanga%22%5D&attributesToRetrieve=" + "%5B%22synopsis%22%2C%22averageRating%22%2C%22canonicalTitle%22%2C%22chapterCount%22%2C%22" + "posterImage%22%2C%22startDate%22%2C%22subtype%22%2C%22endDate%22%2C%20%22id%22%5D" private const val ALGOLIA_FILTER_ANIME = "&facetFilters=%5B%22kind%3Aanime%22%5D&attributesToRetrieve=" + "%5B%22synopsis%22%2C%22averageRating%22%2C%22canonicalTitle%22%2C%22episodeCount%22%2C%22" + "posterImage%22%2C%22startDate%22%2C%22subtype%22%2C%22endDate%22%2C%20%22id%22%5D" private const val VND_API_JSON = "application/vnd.api+json" private val VND_JSON_MEDIA_TYPE = VND_API_JSON.toMediaType() fun mangaUrl(remoteId: Long): String { return BASE_MANGA_URL + remoteId } fun animeUrl(remoteId: Long): String { return BASE_ANIME_URL + remoteId } fun refreshTokenRequest(token: String) = POST( LOGIN_URL, body = FormBody.Builder() .add("grant_type", "refresh_token") .add("refresh_token", token) .add("client_id", CLIENT_ID) .add("client_secret", CLIENT_SECRET) .build(), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuDateHelper.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu import java.text.SimpleDateFormat import java.util.Date import java.util.Locale object KitsuDateHelper { private const val PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" private val formatter = SimpleDateFormat(PATTERN, Locale.ENGLISH) fun convert(dateValue: Long): String? { if (dateValue == 0L) return null return formatter.format(Date(dateValue)) } fun parse(dateString: String?): Long { if (dateString == null) return 0L val dateValue = formatter.parse(dateString) return dateValue?.time ?: return 0 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.track.kitsu.dto.KitsuOAuth import eu.kanade.tachiyomi.data.track.kitsu.dto.isExpired import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response import uy.kohesive.injekt.injectLazy class KitsuInterceptor(private val kitsu: Kitsu) : Interceptor { private val json: Json by injectLazy() /** * OAuth object used for authenticated requests. */ private var oauth: KitsuOAuth? = kitsu.restoreToken() override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val currAuth = oauth ?: throw Exception("Not authenticated with Kitsu") val refreshToken = currAuth.refreshToken!! // Refresh access token if expired. if (currAuth.isExpired()) { val response = chain.proceed(KitsuApi.refreshTokenRequest(refreshToken)) if (response.isSuccessful) { newAuth(json.decodeFromString(response.body.string())) } else { response.close() } } // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.accessToken}") .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .header("Accept", "application/vnd.api+json") .header("Content-Type", "application/vnd.api+json") .build() return chain.proceed(authRequest) } fun newAuth(oauth: KitsuOAuth?) { this.oauth = oauth kitsu.saveToken(oauth) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuUtils.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack fun MangaTrack.toApiStatus() = when (status) { Kitsu.READING -> "current" Kitsu.COMPLETED -> "completed" Kitsu.ON_HOLD -> "on_hold" Kitsu.DROPPED -> "dropped" Kitsu.PLAN_TO_READ -> "planned" else -> throw Exception("Unknown status") } fun AnimeTrack.toApiStatus() = when (status) { Kitsu.WATCHING -> "current" Kitsu.COMPLETED -> "completed" Kitsu.ON_HOLD -> "on_hold" Kitsu.DROPPED -> "dropped" Kitsu.PLAN_TO_WATCH -> "planned" else -> throw Exception("Unknown status") } fun MangaTrack.toApiScore(): String? { return if (score > 0) (score * 2).toInt().toString() else null } fun AnimeTrack.toApiScore(): String? { return if (score > 0) (score * 2).toInt().toString() else null } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuAddEntry.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu.dto import kotlinx.serialization.Serializable @Serializable data class KitsuAddEntryResult( val data: KitsuAddEntryItem, ) @Serializable data class KitsuAddEntryItem( val id: Long, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu.dto import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.kitsu.Kitsu import eu.kanade.tachiyomi.data.track.kitsu.KitsuApi import eu.kanade.tachiyomi.data.track.kitsu.KitsuDateHelper import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.serialization.Serializable @Serializable data class KitsuListSearchResult( val data: List, val included: List = emptyList(), ) { fun firstToMangaTrack(): MangaTrackSearch { require(data.isNotEmpty()) { "Missing User data from Kitsu" } require(included.isNotEmpty()) { "Missing Manga data from Kitsu" } val userData = data[0] val userDataAttrs = userData.attributes val manga = included[0].attributes return MangaTrackSearch.create(TrackerManager.KITSU).apply { remote_id = userData.id title = manga.canonicalTitle total_chapters = manga.chapterCount ?: 0 cover_url = manga.posterImage?.original ?: "" summary = manga.synopsis ?: "" tracking_url = KitsuApi.mangaUrl(remote_id) publishing_status = manga.status publishing_type = manga.mangaType ?: "" start_date = userDataAttrs.startedAt ?: "" started_reading_date = KitsuDateHelper.parse(userDataAttrs.startedAt) finished_reading_date = KitsuDateHelper.parse(userDataAttrs.finishedAt) status = when (userDataAttrs.status) { "current" -> Kitsu.READING "completed" -> Kitsu.COMPLETED "on_hold" -> Kitsu.ON_HOLD "dropped" -> Kitsu.DROPPED "planned" -> Kitsu.PLAN_TO_READ else -> throw Exception("Unknown status") } score = userDataAttrs.ratingTwenty?.let { it / 2.0 } ?: 0.0 last_chapter_read = userDataAttrs.progress.toDouble() private = userDataAttrs.private } } fun firstToAnimeTrack(): AnimeTrackSearch { require(data.isNotEmpty()) { "Missing User data from Kitsu" } require(included.isNotEmpty()) { "Missing Manga data from Kitsu" } val userData = data[0] val userDataAttrs = userData.attributes val anime = included[0].attributes return AnimeTrackSearch.create(TrackerManager.KITSU).apply { remote_id = userData.id title = anime.canonicalTitle total_episodes = anime.episodeCount ?: 0 cover_url = anime.posterImage?.original ?: "" summary = anime.synopsis ?: "" tracking_url = KitsuApi.animeUrl(remote_id) publishing_status = anime.status publishing_type = anime.showType ?: "" start_date = userDataAttrs.startedAt ?: "" started_watching_date = KitsuDateHelper.parse(userDataAttrs.startedAt) finished_watching_date = KitsuDateHelper.parse(userDataAttrs.finishedAt) status = when (userDataAttrs.status) { "current" -> Kitsu.WATCHING "completed" -> Kitsu.COMPLETED "on_hold" -> Kitsu.ON_HOLD "dropped" -> Kitsu.DROPPED "planned" -> Kitsu.PLAN_TO_WATCH else -> throw Exception("Unknown status") } score = userDataAttrs.ratingTwenty?.let { it / 2.0 } ?: 0.0 last_episode_seen = userDataAttrs.progress.toDouble() private = userDataAttrs.private } } } @Serializable data class KitsuListSearchItemData( val id: Long, val attributes: KitsuListSearchItemDataAttributes, ) @Serializable data class KitsuListSearchItemDataAttributes( val status: String, val startedAt: String?, val finishedAt: String?, val ratingTwenty: Int?, val progress: Int, val private: Boolean, ) @Serializable data class KitsuListSearchItemIncluded( val id: Long, val attributes: KitsuListSearchItemIncludedAttributes, ) @Serializable data class KitsuListSearchItemIncludedAttributes( val canonicalTitle: String, val chapterCount: Long?, val episodeCount: Long?, val mangaType: String?, val showType: String?, val posterImage: KitsuSearchItemCover?, val synopsis: String?, val startDate: String?, val status: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuOAuth.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class KitsuOAuth( @SerialName("access_token") val accessToken: String, @SerialName("token_type") val tokenType: String, @SerialName("created_at") val createdAt: Long, @SerialName("expires_in") val expiresIn: Long, @SerialName("refresh_token") val refreshToken: String?, ) fun KitsuOAuth.isExpired() = (System.currentTimeMillis() / 1000) > (createdAt + expiresIn - 3600) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu.dto import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.kitsu.KitsuApi import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.serialization.Serializable import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @Serializable data class KitsuSearchResult( val media: KitsuSearchResultData, ) @Serializable data class KitsuSearchResultData( val key: String, ) @Serializable data class KitsuAlgoliaSearchResult( val hits: List, ) @Serializable data class KitsuAlgoliaSearchItem( val id: Long, val canonicalTitle: String, val chapterCount: Long?, val episodeCount: Long?, val subtype: String?, val posterImage: KitsuSearchItemCover?, val synopsis: String?, val averageRating: Double?, val startDate: Long?, val endDate: Long?, ) { fun toMangaTrack(): MangaTrackSearch { return MangaTrackSearch.create(TrackerManager.KITSU).apply { remote_id = this@KitsuAlgoliaSearchItem.id title = canonicalTitle total_chapters = chapterCount ?: 0 cover_url = posterImage?.original ?: "" summary = synopsis ?: "" tracking_url = KitsuApi.mangaUrl(remote_id) score = averageRating ?: -1.0 publishing_status = if (endDate == null) "Publishing" else "Finished" publishing_type = subtype ?: "" start_date = startDate?.let { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(Date(it * 1000)) } ?: "" } } fun toAnimeTrack(): AnimeTrackSearch { return AnimeTrackSearch.create(TrackerManager.KITSU).apply { remote_id = this@KitsuAlgoliaSearchItem.id title = canonicalTitle total_episodes = episodeCount ?: 0 cover_url = posterImage?.original ?: "" summary = synopsis ?: "" tracking_url = KitsuApi.animeUrl(remote_id) score = averageRating ?: -1.0 publishing_status = if (endDate == null) "Publishing" else "Finished" publishing_type = subtype ?: "" start_date = startDate?.let { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(Date(it * 1000)) } ?: "" } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuSearchItemCover.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu.dto import kotlinx.serialization.Serializable @Serializable data class KitsuSearchItemCover( val original: String?, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuUser.kt ================================================ package eu.kanade.tachiyomi.data.track.kitsu.dto import kotlinx.serialization.Serializable @Serializable data class KitsuCurrentUserResult( val data: List, ) @Serializable data class KitsuUser( val id: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt ================================================ package eu.kanade.tachiyomi.data.track.komga import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.source.MangaSource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import okhttp3.Dns import okhttp3.OkHttpClient import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.domain.track.manga.model.MangaTrack as DomainTrack class Komga(id: Long) : BaseTracker(id, "Komga"), EnhancedMangaTracker, MangaTracker { companion object { const val UNREAD = 1L const val READING = 2L const val COMPLETED = 3L } override val client: OkHttpClient = networkService.client.newBuilder() .dns(Dns.SYSTEM) // don't use DNS over HTTPS as it breaks IP addressing .build() val api by lazy { KomgaApi(id, client) } override fun getLogo() = R.drawable.ic_tracker_komga override fun getLogoColor() = Color.rgb(51, 37, 50) override fun getStatusListManga(): List = listOf(UNREAD, READING, COMPLETED) override fun getStatusForManga(status: Long): StringResource? = when (status) { UNREAD -> MR.strings.unread READING -> MR.strings.reading COMPLETED -> MR.strings.completed else -> null } override fun getReadingStatus(): Long = READING override fun getRereadingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() override fun displayScore(track: DomainTrack): String = "" override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING } } } return api.updateProgress(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { return track } override suspend fun searchManga(query: String): List = throw Exception( "Not used", ) override suspend fun refresh(track: MangaTrack): MangaTrack { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) track.total_chapters = remoteTrack.total_chapters return track } override suspend fun login(username: String, password: String) { saveCredentials("user", "pass") } // [Tracker].isLogged works by checking that credentials are saved. // By saving dummy, unused credentials, we can activate the tracker simply by login/logout override fun loginNoop() { saveCredentials("user", "pass") } override fun getAcceptedSources() = listOf("eu.kanade.tachiyomi.extension.all.komga.Komga") override suspend fun match(manga: Manga): MangaTrackSearch? = try { api.getTrackSearch(manga.url) } catch (e: Exception) { null } override fun isTrackFrom(track: DomainTrack, manga: Manga, source: MangaSource?): Boolean = track.remoteUrl == manga.url && source?.let { accept(it) } == true override fun migrateTrack(track: DomainTrack, manga: Manga, newSource: MangaSource): DomainTrack? = if (accept(newSource)) { track.copy(remoteUrl = manga.url) } else { null } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaApi.kt ================================================ package eu.kanade.tachiyomi.data.track.komga import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import logcat.LogPriority import okhttp3.Headers import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy private const val READLIST_API = "/api/v1/readlists" class KomgaApi( private val trackId: Long, private val client: OkHttpClient, ) { private val headers: Headers by lazy { Headers.Builder() .add("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() } private val json: Json by injectLazy() suspend fun getTrackSearch(url: String): MangaTrackSearch = withIOContext { try { val track = with(json) { if (url.contains(READLIST_API)) { client.newCall(GET(url, headers)) .awaitSuccess() .parseAs() .toTrack() } else { client.newCall(GET(url, headers)) .awaitSuccess() .parseAs() .toTrack() } } val progress = client .newCall( GET("${url.replace("/api/v1/series/", "/api/v2/series/")}/read-progress/tachiyomi", headers), ) .awaitSuccess().let { with(json) { if (url.contains("/api/v1/series/")) { it.parseAs() } else { it.parseAs().toV2() } } } track.apply { cover_url = "$url/thumbnail" tracking_url = url total_chapters = progress.maxNumberSort.toLong() status = when (progress.booksCount) { progress.booksUnreadCount -> Komga.UNREAD progress.booksReadCount -> Komga.COMPLETED else -> Komga.READING } last_chapter_read = progress.lastReadContinuousNumberSort } } catch (e: Exception) { logcat(LogPriority.WARN, e) { "Could not get item: $url" } throw e } } suspend fun updateProgress(track: MangaTrack): MangaTrack { val payload = if (track.tracking_url.contains("/api/v1/series/")) { json.encodeToString(ReadProgressUpdateV2Dto(track.last_chapter_read)) } else { json.encodeToString(ReadProgressUpdateDto(track.last_chapter_read.toInt())) } client.newCall( Request.Builder() .url( "${track.tracking_url.replace("/api/v1/series/", "/api/v2/series/")}/read-progress/tachiyomi", ) .headers(headers) .put(payload.toRequestBody("application/json".toMediaType())) .build(), ) .awaitSuccess() return getTrackSearch(track.tracking_url) } private fun SeriesDto.toTrack(): MangaTrackSearch = MangaTrackSearch.create(trackId).also { it.title = metadata.title it.summary = metadata.summary it.publishing_status = metadata.status } private fun ReadListDto.toTrack(): MangaTrackSearch = MangaTrackSearch.create( trackId, ).also { it.title = name } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/komga/KomgaModels.kt ================================================ package eu.kanade.tachiyomi.data.track.komga import kotlinx.serialization.Serializable @Serializable data class SeriesDto( val id: String, val libraryId: String, val name: String, val created: String?, val lastModified: String?, val fileLastModified: String, val booksCount: Int, val booksReadCount: Int, val booksUnreadCount: Int, val booksInProgressCount: Int, val metadata: SeriesMetadataDto, val booksMetadata: BookMetadataAggregationDto, ) @Serializable data class SeriesMetadataDto( val status: String, val created: String?, val lastModified: String?, val title: String, val titleSort: String, val summary: String, val summaryLock: Boolean, val readingDirection: String, val readingDirectionLock: Boolean, val publisher: String, val publisherLock: Boolean, val ageRating: Int?, val ageRatingLock: Boolean, val language: String, val languageLock: Boolean, val genres: Set, val genresLock: Boolean, val tags: Set, val tagsLock: Boolean, ) @Serializable data class BookMetadataAggregationDto( val authors: List = emptyList(), val releaseDate: String?, val summary: String, val summaryNumber: String, val created: String, val lastModified: String, ) @Serializable data class AuthorDto( val name: String, val role: String, ) @Serializable data class ReadProgressUpdateDto( val lastBookRead: Int, ) @Serializable data class ReadProgressUpdateV2Dto( val lastBookNumberSortRead: Double, ) @Serializable data class ReadListDto( val id: String, val name: String, val bookIds: List, val createdDate: String, val lastModifiedDate: String, val filtered: Boolean, ) @Serializable data class ReadProgressDto( val booksCount: Int, val booksReadCount: Int, val booksUnreadCount: Int, val booksInProgressCount: Int, val lastReadContinuousIndex: Int, ) { fun toV2() = ReadProgressV2Dto( booksCount, booksReadCount, booksUnreadCount, booksInProgressCount, lastReadContinuousIndex.toDouble(), booksCount.toFloat(), ) } @Serializable data class ReadProgressV2Dto( val booksCount: Int, val booksReadCount: Int, val booksUnreadCount: Int, val booksInProgressCount: Int, val lastReadContinuousNumberSort: Double, val maxNumberSort: Float, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.DeletableMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MUListItem import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MURating import eu.kanade.tachiyomi.data.track.mangaupdates.dto.copyTo import eu.kanade.tachiyomi.data.track.mangaupdates.dto.toTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import tachiyomi.i18n.MR import tachiyomi.domain.track.manga.model.MangaTrack as DomainTrack class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), MangaTracker, DeletableMangaTracker { companion object { const val READING_LIST = 0L const val WISH_LIST = 1L const val COMPLETE_LIST = 2L const val UNFINISHED_LIST = 3L const val ON_HOLD_LIST = 4L private val SCORE_LIST = (0..10) .flatMap { decimal -> when (decimal) { 0 -> listOf("-") 10 -> listOf("10.0") else -> (0..9).map { fraction -> "$decimal.$fraction" } } } .toImmutableList() } private val interceptor by lazy { MangaUpdatesInterceptor(this) } private val api by lazy { MangaUpdatesApi(interceptor, client) } override fun getLogo(): Int = R.drawable.ic_manga_updates override fun getLogoColor(): Int = Color.rgb(146, 160, 173) override fun getStatusListManga(): List { return listOf(READING_LIST, COMPLETE_LIST, ON_HOLD_LIST, UNFINISHED_LIST, WISH_LIST) } override fun getStatusForManga(status: Long): StringResource? = when (status) { READING_LIST -> MR.strings.reading_list WISH_LIST -> MR.strings.wish_list COMPLETE_LIST -> MR.strings.complete_list ON_HOLD_LIST -> MR.strings.on_hold_list UNFINISHED_LIST -> MR.strings.unfinished_list else -> null } override fun getReadingStatus(): Long = READING_LIST override fun getRereadingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETE_LIST override fun getScoreList(): ImmutableList = SCORE_LIST override fun indexToScore(index: Int): Double = if (index == 0) 0.0 else SCORE_LIST[index].toDouble() override fun displayScore(track: DomainTrack): String = track.score.toString() override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETE_LIST && didReadChapter) { track.status = READING_LIST } api.updateSeriesListItem(track) return track } override suspend fun delete(track: DomainTrack) { api.deleteSeriesFromList(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { return try { val (series, rating) = api.getSeriesListItem(track) track.copyFrom(series, rating) } catch (e: Exception) { track.score = 0.0 api.addSeriesToList(track, hasReadChapters) track } } override suspend fun searchManga(query: String): List { return api.search(query) .map { it.toTrackSearch(id) } } override suspend fun refresh(track: MangaTrack): MangaTrack { val (series, rating) = api.getSeriesListItem(track) return track.copyFrom(series, rating) } private fun MangaTrack.copyFrom(item: MUListItem, rating: MURating?): MangaTrack = apply { item.copyTo(this) score = rating?.rating ?: 0.0 } override suspend fun login(username: String, password: String) { val authenticated = api.authenticate(username, password) ?: throw Throwable( "Unable to login", ) saveCredentials(authenticated.uid.toString(), authenticated.sessionToken) interceptor.newAuth(authenticated.sessionToken) } fun restoreSession(): String? { return trackPreferences.trackPassword(this).get().ifBlank { null } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.mangaupdates.MangaUpdates.Companion.READING_LIST import eu.kanade.tachiyomi.data.track.mangaupdates.MangaUpdates.Companion.WISH_LIST import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MUContext import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MUListItem import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MULoginResponse import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MURating import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MURecord import eu.kanade.tachiyomi.data.track.mangaupdates.dto.MUSearchResult import eu.kanade.tachiyomi.network.DELETE import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.PUT import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.add import kotlinx.serialization.json.addJsonObject import kotlinx.serialization.json.buildJsonArray import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.manga.model.MangaTrack as DomainTrack class MangaUpdatesApi( interceptor: MangaUpdatesInterceptor, private val client: OkHttpClient, ) { private val json: Json by injectLazy() private val authClient by lazy { client.newBuilder() .addInterceptor(interceptor) .build() } suspend fun getSeriesListItem(track: MangaTrack): Pair { val listItem = with(json) { authClient.newCall(GET("$BASE_URL/v1/lists/series/${track.remote_id}")) .awaitSuccess() .parseAs() } val rating = getSeriesRating(track) return listItem to rating } suspend fun addSeriesToList(track: MangaTrack, hasReadChapters: Boolean) { val status = if (hasReadChapters) READING_LIST else WISH_LIST val body = buildJsonArray { addJsonObject { putJsonObject("series") { put("id", track.remote_id) } put("list_id", status) } } authClient.newCall( POST( url = "$BASE_URL/v1/lists/series", body = body.toString().toRequestBody(CONTENT_TYPE), ), ) .awaitSuccess() .let { if (it.code == 200) { track.status = status track.last_chapter_read = 1.0 } } } suspend fun updateSeriesListItem(track: MangaTrack) { val body = buildJsonArray { addJsonObject { putJsonObject("series") { put("id", track.remote_id) } put("list_id", track.status) putJsonObject("status") { put("chapter", track.last_chapter_read.toInt()) } } } authClient.newCall( POST( url = "$BASE_URL/v1/lists/series/update", body = body.toString().toRequestBody(CONTENT_TYPE), ), ) .awaitSuccess() updateSeriesRating(track) } suspend fun deleteSeriesFromList(track: DomainTrack) { val body = buildJsonArray { add(track.remoteId) } authClient.newCall( POST( url = "$BASE_URL/v1/lists/series/delete", body = body.toString().toRequestBody(CONTENT_TYPE), ), ) .awaitSuccess() } private suspend fun getSeriesRating(track: MangaTrack): MURating? { return try { with(json) { authClient.newCall(GET("$BASE_URL/v1/series/${track.remote_id}/rating")) .awaitSuccess() .parseAs() } } catch (e: Exception) { null } } private suspend fun updateSeriesRating(track: MangaTrack) { if (track.score < 0.0) return if (track.score != 0.0) { val body = buildJsonObject { put("rating", track.score) } authClient.newCall( PUT( url = "$BASE_URL/v1/series/${track.remote_id}/rating", body = body.toString().toRequestBody(CONTENT_TYPE), ), ) .awaitSuccess() } else { authClient.newCall( DELETE(url = "$BASE_URL/v1/series/${track.remote_id}/rating"), ) .awaitSuccess() } } suspend fun search(query: String): List { val body = buildJsonObject { put("search", query) put( "filter_types", buildJsonArray { add("drama cd") add("novel") }, ) } return with(json) { client.newCall( POST( url = "$BASE_URL/v1/series/search", body = body.toString().toRequestBody(CONTENT_TYPE), ), ) .awaitSuccess() .parseAs() .results .map { it.record } } } suspend fun authenticate(username: String, password: String): MUContext? { val body = buildJsonObject { put("username", username) put("password", password) } return with(json) { client.newCall( PUT( url = "$BASE_URL/v1/account/login", body = body.toString().toRequestBody(CONTENT_TYPE), ), ) .awaitSuccess() .parseAs() .context } } companion object { private const val BASE_URL = "https://api.mangaupdates.com" private val CONTENT_TYPE = "application/vnd.api+json".toMediaType() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates import eu.kanade.tachiyomi.BuildConfig import okhttp3.Interceptor import okhttp3.Response import java.io.IOException class MangaUpdatesInterceptor( mangaUpdates: MangaUpdates, ) : Interceptor { private var token: String? = mangaUpdates.restoreSession() override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val token = token ?: throw IOException("Not authenticated with MangaUpdates") // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer $token") .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) } fun newAuth(token: String?) { this.token = token } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUContext.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MUContext( @SerialName("session_token") val sessionToken: String, val uid: Long, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUImage.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.Serializable @Serializable data class MUImage( val url: MUUrl? = null, val height: Int? = null, val width: Int? = null, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUListItem.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.mangaupdates.MangaUpdates.Companion.READING_LIST import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MUListItem( val series: MUSeries? = null, @SerialName("list_id") val listId: Long? = null, val status: MUStatus? = null, val priority: Int? = null, ) fun MUListItem.copyTo(track: MangaTrack): MangaTrack { return track.apply { this.status = listId ?: READING_LIST this.last_chapter_read = this@copyTo.status?.chapter?.toDouble() ?: 0.0 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MULoginResponse.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.Serializable @Serializable data class MULoginResponse( val context: MUContext, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MURating.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import kotlinx.serialization.Serializable @Serializable data class MURating( val rating: Double? = null, ) fun MURating.copyTo(track: MangaTrack): MangaTrack { return track.apply { this.score = rating ?: 0.0 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MURecord.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.util.lang.htmlDecode import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MURecord( @SerialName("series_id") val seriesId: Long? = null, val title: String? = null, val url: String? = null, val description: String? = null, val image: MUImage? = null, val type: String? = null, val year: String? = null, @SerialName("bayesian_rating") val bayesianRating: Double? = null, @SerialName("rating_votes") val ratingVotes: Int? = null, @SerialName("latest_chapter") val latestChapter: Int? = null, ) fun MURecord.toTrackSearch(id: Long): MangaTrackSearch { return MangaTrackSearch.create(id).apply { remote_id = this@toTrackSearch.seriesId ?: 0L title = this@toTrackSearch.title?.htmlDecode() ?: "" total_chapters = 0 cover_url = this@toTrackSearch.image?.url?.original ?: "" summary = this@toTrackSearch.description?.htmlDecode() ?: "" tracking_url = this@toTrackSearch.url ?: "" publishing_status = "" publishing_type = this@toTrackSearch.type.toString() start_date = this@toTrackSearch.year.toString() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.Serializable @Serializable data class MUSearchResult( val results: List, ) @Serializable data class MUSearchResultItem( val record: MURecord, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUSeries.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.Serializable @Serializable data class MUSeries( val id: Long? = null, val title: String? = null, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUStatus.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.Serializable @Serializable data class MUStatus( val volume: Int? = null, val chapter: Int? = null, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUUrl.kt ================================================ package eu.kanade.tachiyomi.data.track.mangaupdates.dto import kotlinx.serialization.Serializable @Serializable data class MUUrl( val original: String? = null, val thumb: String? = null, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/model/AnimeTrackSearch.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.track.model import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack class AnimeTrackSearch : AnimeTrack { override var id: Long? = null override var anime_id: Long = 0 override var tracker_id: Long = 0 override var remote_id: Long = 0 override var library_id: Long? = null override lateinit var title: String override var last_episode_seen: Double = 0.0 override var total_episodes: Long = 0 override var score: Double = -1.0 override var status: Long = 0 override var started_watching_date: Long = 0 override var finished_watching_date: Long = 0 override var private: Boolean = false override lateinit var tracking_url: String var authors: List = emptyList() var artists: List = emptyList() var cover_url: String = "" var summary: String = "" var publishing_status: String = "" var publishing_type: String = "" var start_date: String = "" override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as AnimeTrackSearch if (anime_id != other.anime_id) return false if (tracker_id != other.tracker_id) return false if (remote_id != other.remote_id) return false return true } override fun hashCode(): Int { var result = anime_id.hashCode() result = 31 * result + tracker_id.hashCode() result = 31 * result + remote_id.hashCode() return result } companion object { fun create(serviceId: Long): AnimeTrackSearch = AnimeTrackSearch().apply { tracker_id = serviceId } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/model/MangaTrackSearch.kt ================================================ @file:Suppress("PropertyName") package eu.kanade.tachiyomi.data.track.model import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack class MangaTrackSearch : MangaTrack { override var id: Long? = null override var manga_id: Long = 0 override var tracker_id: Long = 0 override var remote_id: Long = 0 override var library_id: Long? = null override lateinit var title: String override var last_chapter_read: Double = 0.0 override var total_chapters: Long = 0 override var score: Double = -1.0 override var status: Long = 0 override var started_reading_date: Long = 0 override var finished_reading_date: Long = 0 override var private: Boolean = false override lateinit var tracking_url: String var authors: List = emptyList() var artists: List = emptyList() var cover_url: String = "" var summary: String = "" var publishing_status: String = "" var publishing_type: String = "" var start_date: String = "" override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as MangaTrackSearch if (manga_id != other.manga_id) return false if (tracker_id != other.tracker_id) return false if (remote_id != other.remote_id) return false return true } override fun hashCode(): Int { var result = manga_id.hashCode() result = 31 * result + tracker_id.hashCode() result = 31 * result + remote_id.hashCode() return result } companion object { fun create(serviceId: Long): MangaTrackSearch = MangaTrackSearch().apply { tracker_id = serviceId } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.DeletableAnimeTracker import eu.kanade.tachiyomi.data.track.DeletableMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALOAuth import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.json.Json import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class MyAnimeList(id: Long) : BaseTracker( id, "MyAnimeList", ), MangaTracker, AnimeTracker, DeletableMangaTracker, DeletableAnimeTracker { companion object { const val READING = 1L const val WATCHING = 11L const val COMPLETED = 2L const val ON_HOLD = 3L const val DROPPED = 4L const val PLAN_TO_READ = 6L const val PLAN_TO_WATCH = 16L const val REREADING = 7L const val REWATCHING = 17L private const val SEARCH_ID_PREFIX = "id:" private const val SEARCH_LIST_PREFIX = "my:" private val SCORE_LIST = IntRange(0, 10) .map(Int::toString) .toImmutableList() } private val json: Json by injectLazy() private val interceptor by lazy { MyAnimeListInterceptor(this) } private val api by lazy { MyAnimeListApi(id, client, interceptor) } override val supportsReadingDates: Boolean = true override fun getLogo() = R.drawable.ic_tracker_mal override fun getLogoColor() = Color.rgb(46, 81, 162) override fun getStatusListManga(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ, REREADING) } override fun getStatusListAnime(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_WATCH, REWATCHING) } override fun getStatusForManga(status: Long): StringResource? = when (status) { READING -> MR.strings.reading COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped PLAN_TO_READ -> MR.strings.plan_to_read REREADING -> MR.strings.repeating else -> null } override fun getStatusForAnime(status: Long): StringResource? = when (status) { WATCHING -> AYMR.strings.watching COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped PLAN_TO_WATCH -> AYMR.strings.plan_to_watch REWATCHING -> AYMR.strings.repeating_anime else -> null } override fun getReadingStatus(): Long = READING override fun getWatchingStatus(): Long = WATCHING override fun getRereadingStatus(): Long = REREADING override fun getRewatchingStatus(): Long = REWATCHING override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = SCORE_LIST override fun indexToScore(index: Int): Double { return index.toDouble() } override fun displayScore(track: DomainMangaTrack): String { return track.score.toInt().toString() } override fun displayScore(track: DomainAnimeTrack): String { return track.score.toInt().toString() } private suspend fun add(track: MangaTrack): MangaTrack { return api.updateItem(track) } private suspend fun add(track: AnimeTrack): AnimeTrack { return api.updateItem(track) } override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED track.finished_reading_date = System.currentTimeMillis() } else if (track.status != REREADING) { track.status = READING if (track.last_chapter_read == 1.0) { track.started_reading_date = System.currentTimeMillis() } } } } return api.updateItem(track) } override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { if (track.status != COMPLETED) { if (didWatchEpisode) { if (track.last_episode_seen.toLong() == track.total_episodes && track.total_episodes > 0) { track.status = COMPLETED track.finished_watching_date = System.currentTimeMillis() } else if (track.status != REWATCHING) { track.status = WATCHING if (track.last_episode_seen == 1.0) { track.started_watching_date = System.currentTimeMillis() } } } } return api.updateItem(track) } override suspend fun delete(track: DomainMangaTrack) { api.deleteMangaItem(track) } override suspend fun delete(track: DomainAnimeTrack) { api.deleteAnimeItem(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { val remoteTrack = api.findListItem(track) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack) track.remote_id = remoteTrack.remote_id if (track.status != COMPLETED) { val isRereading = track.status == REREADING track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun bind(track: AnimeTrack, hasSeenEpisodes: Boolean): AnimeTrack { val remoteTrack = api.findListItem(track) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack) track.remote_id = remoteTrack.remote_id if (track.status != COMPLETED) { val isRewatching = track.status == REWATCHING track.status = if (!isRewatching && hasSeenEpisodes) WATCHING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasSeenEpisodes) WATCHING else PLAN_TO_WATCH track.score = 0.0 add(track) } } override suspend fun searchManga(query: String): List { if (query.startsWith(SEARCH_ID_PREFIX)) { query.substringAfter(SEARCH_ID_PREFIX).toIntOrNull()?.let { id -> return listOf(api.getMangaDetails(id)) } } if (query.startsWith(SEARCH_LIST_PREFIX)) { query.substringAfter(SEARCH_LIST_PREFIX).let { title -> return api.findListItems(title) } } return api.search(query) } override suspend fun searchAnime(query: String): List { if (query.startsWith(SEARCH_ID_PREFIX)) { query.substringAfter(SEARCH_ID_PREFIX).toIntOrNull()?.let { id -> return listOf(api.getAnimeDetails(id)) } } if (query.startsWith(SEARCH_LIST_PREFIX)) { query.substringAfter(SEARCH_LIST_PREFIX).let { title -> return api.findListItemsAnime(title) } } return api.searchAnime(query) } override suspend fun refresh(track: MangaTrack): MangaTrack { return api.findListItem(track) ?: add(track) } override suspend fun refresh(track: AnimeTrack): AnimeTrack { return api.findListItem(track) ?: add(track) } override suspend fun login(username: String, password: String) = login(password) suspend fun login(authCode: String) { try { val oauth = api.getAccessToken(authCode) interceptor.setAuth(oauth) val username = api.getCurrentUser() saveCredentials(username, oauth.accessToken) } catch (e: Throwable) { logout() } } override fun logout() { super.logout() trackPreferences.trackToken(this).delete() interceptor.setAuth(null) } fun getIfAuthExpired(): Boolean { return trackPreferences.trackAuthExpired(this).get() } fun setAuthExpired() { trackPreferences.trackAuthExpired(this).set(true) } fun saveOAuth(oAuth: MALOAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oAuth)) } fun loadOAuth(): MALOAuth? { return try { json.decodeFromString(trackPreferences.trackToken(this).get()) } catch (e: Exception) { null } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALAnime import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALListAnimeItem import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALListAnimeItemStatus import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALListMangaItem import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALListMangaItemStatus import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALManga import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALOAuth import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALSearchResult import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALUser import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALUserSearchResult import eu.kanade.tachiyomi.network.DELETE import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import eu.kanade.tachiyomi.util.PkceUtil import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.serialization.json.Json import okhttp3.FormBody import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import java.text.SimpleDateFormat import java.util.Locale import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class MyAnimeListApi( private val trackId: Long, private val client: OkHttpClient, interceptor: MyAnimeListInterceptor, ) { private val json: Json by injectLazy() private val authClient = client.newBuilder().addInterceptor(interceptor).build() suspend fun getAccessToken(authCode: String): MALOAuth { return withIOContext { val formBody: RequestBody = FormBody.Builder() .add("client_id", CLIENT_ID) .add("code", authCode) .add("code_verifier", codeVerifier) .add("grant_type", "authorization_code") .build() with(json) { client.newCall(POST("$BASE_OAUTH_URL/token", body = formBody)) .awaitSuccess() .parseAs() } } } suspend fun getCurrentUser(): String { return withIOContext { val request = Request.Builder() .url("$BASE_API_URL/users/@me") .get() .build() with(json) { authClient.newCall(request) .awaitSuccess() .parseAs() .name } } } suspend fun search(query: String): List { return withIOContext { val url = "$BASE_API_URL/manga".toUri().buildUpon() // MAL API throws a 400 when the query is over 64 characters... .appendQueryParameter("q", query.take(64)) .appendQueryParameter("nsfw", "true") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .data .map { async { getMangaDetails(it.node.id) } } .awaitAll() .filter { !it.publishing_type.contains("novel") } } } } suspend fun searchAnime(query: String): List { return withIOContext { val url = "$BASE_API_URL/anime".toUri().buildUpon() // MAL API throws a 400 when the query is over 64 characters... .appendQueryParameter("q", query.take(64)) .appendQueryParameter("q", query) .appendQueryParameter("nsfw", "true") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .data .map { async { getAnimeDetails(it.node.id) } } .awaitAll() } } } suspend fun getMangaDetails(id: Int): MangaTrackSearch { return withIOContext { val url = "$BASE_API_URL/manga".toUri().buildUpon() .appendPath(id.toString()) .appendQueryParameter( "fields", "id,title,synopsis,num_chapters,mean,main_picture,status,media_type,start_date", ) .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .let { MangaTrackSearch.create(trackId).apply { remote_id = it.id title = it.title summary = it.synopsis total_chapters = it.numChapters score = it.mean cover_url = it.covers?.large.orEmpty() tracking_url = "https://myanimelist.net/manga/$remote_id" publishing_status = it.status.replace("_", " ") publishing_type = it.mediaType.replace("_", " ") start_date = it.startDate ?: "" } } } } } suspend fun getAnimeDetails(id: Int): AnimeTrackSearch { return withIOContext { val url = "$BASE_API_URL/anime".toUri().buildUpon() .appendPath(id.toString()) .appendQueryParameter( "fields", "id,title,synopsis,num_episodes,mean,main_picture,status,media_type,start_date", ) .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .let { AnimeTrackSearch.create(trackId).apply { remote_id = it.id title = it.title summary = it.synopsis total_episodes = it.numEpisodes score = it.mean cover_url = it.covers?.large.orEmpty() tracking_url = "https://myanimelist.net/anime/$remote_id" publishing_status = it.status.replace("_", " ") publishing_type = it.mediaType.replace("_", " ") start_date = it.startDate ?: "" } } } } } suspend fun updateItem(track: MangaTrack): MangaTrack { return withIOContext { val formBodyBuilder = FormBody.Builder() .add("status", track.toMyAnimeListStatus() ?: "reading") .add("is_rereading", (track.status == MyAnimeList.REREADING).toString()) .add("score", track.score.toString()) .add("num_chapters_read", track.last_chapter_read.toInt().toString()) convertToIsoDate(track.started_reading_date)?.let { formBodyBuilder.add("start_date", it) } convertToIsoDate(track.finished_reading_date)?.let { formBodyBuilder.add("finish_date", it) } val request = Request.Builder() .url(mangaUrl(track.remote_id).toString()) .put(formBodyBuilder.build()) .build() with(json) { authClient.newCall(request) .awaitSuccess() .parseAs() .let { parseMangaItem(it, track) } } } } suspend fun updateItem(track: AnimeTrack): AnimeTrack { return withIOContext { val formBodyBuilder = FormBody.Builder() .add("status", track.toMyAnimeListStatus() ?: "watching") .add("is_rewatching", (track.status == MyAnimeList.REWATCHING).toString()) .add("score", track.score.toString()) .add("num_watched_episodes", track.last_episode_seen.toInt().toString()) convertToIsoDate(track.started_watching_date)?.let { formBodyBuilder.add("start_date", it) } convertToIsoDate(track.finished_watching_date)?.let { formBodyBuilder.add("finish_date", it) } val request = Request.Builder() .url(animeUrl(track.remote_id).toString()) .put(formBodyBuilder.build()) .build() with(json) { authClient.newCall(request) .awaitSuccess() .parseAs() .let { parseAnimeItem(it, track) } } } } suspend fun deleteMangaItem(track: DomainMangaTrack) { withIOContext { authClient .newCall(DELETE(mangaUrl(track.remoteId).toString())) .awaitSuccess() } } suspend fun deleteAnimeItem(track: DomainAnimeTrack) { withIOContext { authClient .newCall(DELETE(animeUrl(track.remoteId).toString())) .awaitSuccess() } } suspend fun findListItem(track: MangaTrack): MangaTrack? { return withIOContext { val uri = "$BASE_API_URL/manga".toUri().buildUpon() .appendPath(track.remote_id.toString()) .appendQueryParameter("fields", "num_chapters,my_list_status{start_date,finish_date}") .build() with(json) { authClient.newCall(GET(uri.toString())) .awaitSuccess() .parseAs() .let { item -> track.total_chapters = item.numChapters item.myListStatus?.let { parseMangaItem(it, track) } } } } } suspend fun findListItem(track: AnimeTrack): AnimeTrack? { return withIOContext { val uri = "$BASE_API_URL/anime".toUri().buildUpon() .appendPath(track.remote_id.toString()) .appendQueryParameter("fields", "num_episodes,my_list_status{start_date,finish_date}") .build() with(json) { authClient.newCall(GET(uri.toString())) .awaitSuccess() .parseAs() .let { item -> track.total_episodes = item.numEpisodes item.myListStatus?.let { parseAnimeItem(it, track) } } } } } suspend fun findListItems(query: String, offset: Int = 0): List { return withIOContext { val myListSearchResult = getListPage(offset) val matches = myListSearchResult.data .filter { it.node.title.contains(query, ignoreCase = true) } .map { async { getMangaDetails(it.node.id) } } .awaitAll() // Check next page if there's more if (!myListSearchResult.paging.next.isNullOrBlank()) { matches + findListItems(query, offset + LIST_PAGINATION_AMOUNT) } else { matches } } } suspend fun findListItemsAnime(query: String, offset: Int = 0): List { return withIOContext { val myListSearchResult = getListPage(offset) val matches = myListSearchResult.data .filter { it.node.title.contains(query, ignoreCase = true) } .map { async { getAnimeDetails(it.node.id) } } .awaitAll() // Check next page if there's more if (!myListSearchResult.paging.next.isNullOrBlank()) { matches + findListItemsAnime(query, offset + LIST_PAGINATION_AMOUNT) } else { matches } } } private suspend fun getListPage(offset: Int): MALUserSearchResult { return withIOContext { val urlBuilder = "$BASE_API_URL/users/@me/mangalist".toUri().buildUpon() .appendQueryParameter("fields", "list_status{start_date,finish_date}") .appendQueryParameter("limit", LIST_PAGINATION_AMOUNT.toString()) if (offset > 0) { urlBuilder.appendQueryParameter("offset", offset.toString()) } val request = Request.Builder() .url(urlBuilder.build().toString()) .get() .build() with(json) { authClient.newCall(request) .awaitSuccess() .parseAs() } } } private fun parseMangaItem(listStatus: MALListMangaItemStatus, track: MangaTrack): MangaTrack { return track.apply { val isRereading = listStatus.isRereading status = if (isRereading) MyAnimeList.REREADING else getStatus(listStatus.status) last_chapter_read = listStatus.numChaptersRead score = listStatus.score.toDouble() listStatus.startDate?.let { started_reading_date = parseDate(it) } listStatus.finishDate?.let { finished_reading_date = parseDate(it) } } } private fun parseAnimeItem(listStatus: MALListAnimeItemStatus, track: AnimeTrack): AnimeTrack { return track.apply { val isRewatching = listStatus.isRewatching status = if (isRewatching) MyAnimeList.REWATCHING else getStatus(listStatus.status) last_episode_seen = listStatus.numEpisodesWatched score = listStatus.score.toDouble() listStatus.startDate?.let { started_watching_date = parseDate(it) } listStatus.finishDate?.let { finished_watching_date = parseDate(it) } } } private fun parseDate(isoDate: String): Long { return SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(isoDate)?.time ?: 0L } private fun convertToIsoDate(epochTime: Long): String? { if (epochTime == 0L) { return "" } return try { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) outputDf.format(epochTime) } catch (e: Exception) { null } } companion object { private const val CLIENT_ID = "686b980ff4240fccce7f6a654cea07ce" private const val BASE_OAUTH_URL = "https://myanimelist.net/v1/oauth2" private const val BASE_API_URL = "https://api.myanimelist.net/v2" private const val LIST_PAGINATION_AMOUNT = 250 private var codeVerifier: String = "" fun authUrl(): Uri = "$BASE_OAUTH_URL/authorize".toUri().buildUpon() .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("code_challenge", getPkceChallengeCode()) .appendQueryParameter("response_type", "code") .build() fun mangaUrl(id: Long): Uri = "$BASE_API_URL/manga".toUri().buildUpon() .appendPath(id.toString()) .appendPath("my_list_status") .build() fun animeUrl(id: Long): Uri = "$BASE_API_URL/anime".toUri().buildUpon() .appendPath(id.toString()) .appendPath("my_list_status") .build() fun refreshTokenRequest(oauth: MALOAuth): Request { val formBody: RequestBody = FormBody.Builder() .add("client_id", CLIENT_ID) .add("refresh_token", oauth.refreshToken) .add("grant_type", "refresh_token") .build() // Add the Authorization header manually as this particular // request is called by the interceptor itself so it doesn't reach // the part where the token is added automatically. val headers = Headers.Builder() .add("Authorization", "Bearer ${oauth.accessToken}") .build() return POST("$BASE_OAUTH_URL/token", body = formBody, headers = headers) } private fun getPkceChallengeCode(): String { codeVerifier = PkceUtil.generateCodeVerifier() return codeVerifier } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist import eu.kanade.tachiyomi.data.track.myanimelist.dto.MALOAuth import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response import uy.kohesive.injekt.injectLazy import java.io.IOException class MyAnimeListInterceptor(private val myanimelist: MyAnimeList) : Interceptor { private val json: Json by injectLazy() private var oauth: MALOAuth? = myanimelist.loadOAuth() private val tokenExpired get() = myanimelist.getIfAuthExpired() override fun intercept(chain: Interceptor.Chain): Response { if (tokenExpired) { throw MALTokenExpired() } val originalRequest = chain.request() if (oauth?.isExpired() == true) { refreshToken(chain) } if (oauth == null) { throw IOException("MAL: User is not authenticated") } // Add the authorization header to the original request val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.accessToken}") // .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) } /** * Called when the user authenticates with MyAnimeList for the first time. Sets the refresh token * and the oauth object. */ fun setAuth(oauth: MALOAuth?) { this.oauth = oauth myanimelist.saveOAuth(oauth) } private fun refreshToken(chain: Interceptor.Chain): MALOAuth = synchronized(this) { if (tokenExpired) throw MALTokenExpired() oauth?.takeUnless { it.isExpired() }?.let { return@synchronized it } val response = try { chain.proceed(MyAnimeListApi.refreshTokenRequest(oauth!!)) } catch (_: Throwable) { throw MALTokenRefreshFailed() } if (response.code == 401) { myanimelist.setAuthExpired() throw MALTokenExpired() } return runCatching { if (response.isSuccessful) { with(json) { response.parseAs() } } else { response.close() null } } .getOrNull() ?.also { this.oauth = it myanimelist.saveOAuth(it) } ?: throw MALTokenRefreshFailed() } } class MALTokenRefreshFailed : IOException("MAL: Failed to refresh account token") class MALTokenExpired : IOException("MAL: Login has expired") ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListUtils.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack fun MangaTrack.toMyAnimeListStatus() = when (status) { MyAnimeList.READING -> "reading" MyAnimeList.COMPLETED -> "completed" MyAnimeList.ON_HOLD -> "on_hold" MyAnimeList.DROPPED -> "dropped" MyAnimeList.PLAN_TO_READ -> "plan_to_read" MyAnimeList.REREADING -> "reading" else -> null } fun AnimeTrack.toMyAnimeListStatus() = when (status) { MyAnimeList.WATCHING -> "watching" MyAnimeList.READING -> "watching" MyAnimeList.COMPLETED -> "completed" MyAnimeList.ON_HOLD -> "on_hold" MyAnimeList.DROPPED -> "dropped" MyAnimeList.PLAN_TO_READ -> "plan_to_watch" MyAnimeList.REREADING -> "watching" MyAnimeList.PLAN_TO_WATCH -> "plan_to_watch" MyAnimeList.REWATCHING -> "watching" else -> null } fun getStatus(status: String?) = when (status) { "reading" -> MyAnimeList.READING "watching" -> MyAnimeList.WATCHING "completed" -> MyAnimeList.COMPLETED "on_hold" -> MyAnimeList.ON_HOLD "dropped" -> MyAnimeList.DROPPED "plan_to_read" -> MyAnimeList.PLAN_TO_READ "plan_to_watch" -> MyAnimeList.PLAN_TO_WATCH else -> MyAnimeList.READING } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALAnime.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MALAnime( val id: Long, val title: String, val synopsis: String = "", @SerialName("num_episodes") val numEpisodes: Long, val mean: Double = -1.0, @SerialName("main_picture") val covers: MALAnimeCovers?, val status: String, @SerialName("media_type") val mediaType: String, @SerialName("start_date") val startDate: String?, ) @Serializable data class MALAnimeCovers( val large: String = "", ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALList.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MALListAnimeItem( @SerialName("num_episodes") val numEpisodes: Long, @SerialName("my_list_status") val myListStatus: MALListAnimeItemStatus?, ) @Serializable data class MALListAnimeItemStatus( @SerialName("is_rewatching") val isRewatching: Boolean, val status: String, @SerialName("num_episodes_watched") val numEpisodesWatched: Double, val score: Int, @SerialName("start_date") val startDate: String?, @SerialName("finish_date") val finishDate: String?, ) @Serializable data class MALListMangaItem( @SerialName("num_chapters") val numChapters: Long, @SerialName("my_list_status") val myListStatus: MALListMangaItemStatus?, ) @Serializable data class MALListMangaItemStatus( @SerialName("is_rereading") val isRereading: Boolean, val status: String, @SerialName("num_chapters_read") val numChaptersRead: Double, val score: Int, @SerialName("start_date") val startDate: String?, @SerialName("finish_date") val finishDate: String?, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALManga.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MALManga( val id: Long, val title: String, val synopsis: String = "", @SerialName("num_chapters") val numChapters: Long, val mean: Double = -1.0, @SerialName("main_picture") val covers: MALMangaCovers?, val status: String, @SerialName("media_type") val mediaType: String, @SerialName("start_date") val startDate: String?, ) @Serializable data class MALMangaCovers( val large: String = "", ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALOAuth.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class MALOAuth( @SerialName("token_type") val tokenType: String, @SerialName("refresh_token") val refreshToken: String, @SerialName("access_token") val accessToken: String, @SerialName("expires_in") val expiresIn: Long, @SerialName("created_at") @EncodeDefault val createdAt: Long = System.currentTimeMillis() / 1000, ) { // Assumes expired a minute earlier private val adjustedExpiresIn: Long = (expiresIn - 60) fun isExpired() = createdAt + adjustedExpiresIn < System.currentTimeMillis() / 1000 } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.Serializable @Serializable data class MALSearchResult( val data: List, ) @Serializable data class MALSearchResultNode( val node: MALSearchResultItem, ) @Serializable data class MALSearchResultItem( val id: Int, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALUser.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.Serializable @Serializable data class MALUser( val name: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/dto/MALUserListSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.myanimelist.dto import kotlinx.serialization.Serializable @Serializable data class MALUserSearchResult( val data: List, val paging: MALUserSearchPaging, ) @Serializable data class MALUserSearchItem( val node: MALUserSearchItemNode, ) @Serializable data class MALUserSearchPaging( val next: String?, ) @Serializable data class MALUserSearchItemNode( val id: Int, val title: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.DeletableAnimeTracker import eu.kanade.tachiyomi.data.track.DeletableMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.data.track.shikimori.dto.SMOAuth import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class Shikimori(id: Long) : BaseTracker( id, "Shikimori", ), MangaTracker, AnimeTracker, DeletableMangaTracker, DeletableAnimeTracker { companion object { const val READING = 1L const val COMPLETED = 2L const val ON_HOLD = 3L const val DROPPED = 4L const val PLAN_TO_READ = 5L const val REREADING = 6L private val SCORE_LIST = IntRange(0, 10) .map(Int::toString) .toImmutableList() } private val json: Json by injectLazy() private val interceptor by lazy { ShikimoriInterceptor(this) } private val api by lazy { ShikimoriApi(id, client, interceptor) } override fun getScoreList(): ImmutableList = SCORE_LIST override fun indexToScore(index: Int): Double { return index.toDouble() } override fun displayScore(track: DomainMangaTrack): String { return track.score.toInt().toString() } override fun displayScore(track: DomainAnimeTrack): String { return track.score.toInt().toString() } private suspend fun add(track: MangaTrack): MangaTrack { return api.addLibManga(track, getUsername()) } private suspend fun add(track: AnimeTrack): AnimeTrack { return api.addLibAnime(track, getUsername()) } override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else if (track.status != REREADING) { track.status = READING } } } return api.updateLibManga(track, getUsername()) } override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { if (track.status != COMPLETED) { if (didWatchEpisode) { if (track.last_episode_seen.toLong() == track.total_episodes && track.total_episodes > 0) { track.status = COMPLETED } else if (track.status != REREADING) { track.status = READING } } } return api.updateLibAnime(track, getUsername()) } override suspend fun delete(track: DomainMangaTrack) { api.deleteLibManga(track) } override suspend fun delete(track: DomainAnimeTrack) { api.deleteLibAnime(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { val remoteTrack = api.findLibManga(track, getUsername()) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack) track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { val isRereading = track.status == REREADING track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun bind(track: AnimeTrack, hasReadChapters: Boolean): AnimeTrack { val remoteTrack = api.findLibAnime(track, getUsername()) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack) track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { val isRereading = track.status == REREADING track.status = if (!isRereading && hasReadChapters) READING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasReadChapters) READING else PLAN_TO_READ track.score = 0.0 add(track) } } override suspend fun searchManga(query: String): List { return api.search(query) } override suspend fun searchAnime(query: String): List { return api.searchAnime(query) } override suspend fun refresh(track: MangaTrack): MangaTrack { api.findLibManga(track, getUsername())?.let { remoteTrack -> track.library_id = remoteTrack.library_id track.copyPersonalFrom(remoteTrack) track.total_chapters = remoteTrack.total_chapters } ?: throw Exception("Could not find manga") return track } override suspend fun refresh(track: AnimeTrack): AnimeTrack { api.findLibAnime(track, getUsername())?.let { remoteTrack -> track.library_id = remoteTrack.library_id track.copyPersonalFrom(remoteTrack) track.total_episodes = remoteTrack.total_episodes } ?: throw Exception("Could not find anime") return track } override fun getLogo() = R.drawable.ic_tracker_shikimori override fun getLogoColor() = Color.rgb(40, 40, 40) override fun getStatusListManga(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ, REREADING) } override fun getStatusListAnime(): List { return listOf(READING, COMPLETED, ON_HOLD, DROPPED, PLAN_TO_READ, REREADING) } override fun getStatusForManga(status: Long): StringResource? = when (status) { READING -> MR.strings.reading PLAN_TO_READ -> MR.strings.plan_to_read COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped REREADING -> MR.strings.repeating else -> null } override fun getStatusForAnime(status: Long): StringResource? = when (status) { READING -> AYMR.strings.watching PLAN_TO_READ -> AYMR.strings.plan_to_watch COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold DROPPED -> MR.strings.dropped REREADING -> AYMR.strings.repeating_anime else -> null } override fun getReadingStatus(): Long = READING override fun getWatchingStatus(): Long = READING override fun getRereadingStatus(): Long = REREADING override fun getRewatchingStatus(): Long = REREADING override fun getCompletionStatus(): Long = COMPLETED override suspend fun login(username: String, password: String) = login(password) suspend fun login(code: String) { try { val oauth = api.accessToken(code) interceptor.newAuth(oauth) val user = api.getCurrentUser() saveCredentials(user.toString(), oauth.accessToken) } catch (e: Throwable) { logout() } } fun saveToken(oauth: SMOAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oauth)) } fun restoreToken(): SMOAuth? { return try { json.decodeFromString(trackPreferences.trackToken(this).get()) } catch (e: Exception) { null } } override fun logout() { super.logout() trackPreferences.trackToken(this).delete() interceptor.newAuth(null) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.data.track.shikimori.dto.SMAddEntryResponse import eu.kanade.tachiyomi.data.track.shikimori.dto.SMEntry import eu.kanade.tachiyomi.data.track.shikimori.dto.SMOAuth import eu.kanade.tachiyomi.data.track.shikimori.dto.SMUser import eu.kanade.tachiyomi.data.track.shikimori.dto.SMUserListEntry import eu.kanade.tachiyomi.network.DELETE import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.jsonMime import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject import okhttp3.FormBody import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack import tachiyomi.domain.track.manga.model.MangaTrack as DomainMangaTrack class ShikimoriApi( private val trackId: Long, private val client: OkHttpClient, interceptor: ShikimoriInterceptor, ) { private val json: Json by injectLazy() private val authClient = client.newBuilder().addInterceptor(interceptor).build() suspend fun addLibManga(track: MangaTrack, userId: String): MangaTrack { return withIOContext { with(json) { val payload = buildJsonObject { putJsonObject("user_rate") { put("user_id", userId) put("target_id", track.remote_id) put("target_type", "Manga") put("chapters", track.last_chapter_read.toInt()) put("score", track.score.toInt()) put("status", track.toShikimoriStatus()) } } authClient.newCall( POST( "$API_URL/v2/user_rates", body = payload.toString().toRequestBody(jsonMime), ), ).awaitSuccess() .parseAs() .let { track.library_id = it.id } track } } } suspend fun updateLibManga(track: MangaTrack, userId: String): MangaTrack = addLibManga( track, userId, ) suspend fun deleteLibManga(track: DomainMangaTrack) { withIOContext { authClient .newCall(DELETE("$API_URL/v2/user_rates/${track.libraryId}")) .awaitSuccess() } } suspend fun addLibAnime(track: AnimeTrack, userId: String): AnimeTrack { return withIOContext { with(json) { val payload = buildJsonObject { putJsonObject("user_rate") { put("user_id", userId) put("target_id", track.remote_id) put("target_type", "Anime") put("episodes", track.last_episode_seen.toInt()) put("score", track.score.toInt()) put("status", track.toShikimoriStatus()) } } authClient.newCall( POST( "$API_URL/v2/user_rates", body = payload.toString().toRequestBody(jsonMime), ), ).awaitSuccess() .parseAs() .let { track.library_id = it.id } track } } } suspend fun updateLibAnime(track: AnimeTrack, userId: String): AnimeTrack = addLibAnime( track, userId, ) suspend fun deleteLibAnime(track: DomainAnimeTrack) { withIOContext { authClient .newCall(DELETE("$API_URL/v2/user_rates/${track.libraryId}")) .awaitSuccess() } } suspend fun search(search: String): List { return withIOContext { val url = "$API_URL/mangas".toUri().buildUpon() .appendQueryParameter("order", "popularity") .appendQueryParameter("search", search) .appendQueryParameter("limit", "20") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs>() .map { it.toMangaTrack(trackId) } } } } suspend fun searchAnime(search: String): List { return withIOContext { val url = "$API_URL/animes".toUri().buildUpon() .appendQueryParameter("order", "popularity") .appendQueryParameter("search", search) .appendQueryParameter("limit", "20") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs>() .map { it.toAnimeTrack(trackId) } } } } suspend fun findLibManga(track: MangaTrack, userId: String): MangaTrack? { return withIOContext { val urlMangas = "$API_URL/mangas".toUri().buildUpon() .appendPath(track.remote_id.toString()) .build() val manga = with(json) { authClient.newCall(GET(urlMangas.toString())) .awaitSuccess() .parseAs() } val url = "$API_URL/v2/user_rates".toUri().buildUpon() .appendQueryParameter("user_id", userId) .appendQueryParameter("target_id", track.remote_id.toString()) .appendQueryParameter("target_type", "Manga") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs>() .let { entries -> if (entries.size > 1) { throw Exception("Too many manga in response") } entries .map { it.toMangaTrack(trackId, manga) } .firstOrNull() } } } } suspend fun findLibAnime(track: AnimeTrack, user_id: String): AnimeTrack? { return withIOContext { val urlAnimes = "$API_URL/animes".toUri().buildUpon() .appendPath(track.remote_id.toString()) .build() val anime = with(json) { authClient.newCall(GET(urlAnimes.toString())) .awaitSuccess() .parseAs() } val url = "$API_URL/v2/user_rates".toUri().buildUpon() .appendQueryParameter("user_id", user_id) .appendQueryParameter("target_id", track.remote_id.toString()) .appendQueryParameter("target_type", "Anime") .build() with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs>() .let { entries -> if (entries.size > 1) { throw Exception("Too many manga in response") } entries .map { it.toAnimeTrack(trackId, anime) } .firstOrNull() } } } } suspend fun getCurrentUser(): Int { return with(json) { authClient.newCall(GET("$API_URL/users/whoami")) .awaitSuccess() .parseAs() .id } } suspend fun accessToken(code: String): SMOAuth { return withIOContext { with(json) { client.newCall(accessTokenRequest(code)) .awaitSuccess() .parseAs() } } } private fun accessTokenRequest(code: String) = POST( OAUTH_URL, body = FormBody.Builder() .add("grant_type", "authorization_code") .add("client_id", CLIENT_ID) .add("client_secret", CLIENT_SECRET) .add("code", code) .add("redirect_uri", REDIRECT_URL) .build(), ) companion object { const val BASE_URL = "https://shikimori.one" private const val API_URL = "$BASE_URL/api" private const val OAUTH_URL = "$BASE_URL/oauth/token" private const val LOGIN_URL = "$BASE_URL/oauth/authorize" private const val REDIRECT_URL = "aniyomi://shikimori-auth" private const val CLIENT_ID = "aOAYRqOLwxpA8skpcQIXetNy4cw2rn2fRzScawlcQ5U" private const val CLIENT_SECRET = "jqjmORn6bh2046ulkm4lHEwJ3OA1RmO3FD2sR9f6Clw" fun authUrl(): Uri = LOGIN_URL.toUri().buildUpon() .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("redirect_uri", REDIRECT_URL) .appendQueryParameter("response_type", "code") .build() fun refreshTokenRequest(token: String) = POST( OAUTH_URL, body = FormBody.Builder() .add("grant_type", "refresh_token") .add("client_id", CLIENT_ID) .add("client_secret", CLIENT_SECRET) .add("refresh_token", token) .build(), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.track.shikimori.dto.SMOAuth import eu.kanade.tachiyomi.data.track.shikimori.dto.isExpired import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.Response import uy.kohesive.injekt.injectLazy class ShikimoriInterceptor(private val shikimori: Shikimori) : Interceptor { private val json: Json by injectLazy() /** * OAuth object used for authenticated requests. */ private var oauth: SMOAuth? = shikimori.restoreToken() override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val currAuth = oauth ?: throw Exception("Not authenticated with Shikimori") val refreshToken = currAuth.refreshToken!! // Refresh access token if expired. if (currAuth.isExpired()) { val response = chain.proceed(ShikimoriApi.refreshTokenRequest(refreshToken)) if (response.isSuccessful) { newAuth(json.decodeFromString(response.body.string())) } else { response.close() } } // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth!!.accessToken}") .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) } fun newAuth(oauth: SMOAuth?) { this.oauth = oauth shikimori.saveToken(oauth) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriUtils.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack fun MangaTrack.toShikimoriStatus() = when (status) { Shikimori.READING -> "watching" Shikimori.COMPLETED -> "completed" Shikimori.ON_HOLD -> "on_hold" Shikimori.DROPPED -> "dropped" Shikimori.PLAN_TO_READ -> "planned" Shikimori.REREADING -> "rewatching" else -> throw NotImplementedError("Unknown status: $status") } fun AnimeTrack.toShikimoriStatus() = when (status) { Shikimori.READING -> "watching" Shikimori.COMPLETED -> "completed" Shikimori.ON_HOLD -> "on_hold" Shikimori.DROPPED -> "dropped" Shikimori.PLAN_TO_READ -> "planned" Shikimori.REREADING -> "rewatching" else -> throw NotImplementedError("Unknown status: $status") } fun toTrackStatus(status: String) = when (status) { "watching" -> Shikimori.READING "completed" -> Shikimori.COMPLETED "on_hold" -> Shikimori.ON_HOLD "dropped" -> Shikimori.DROPPED "planned" -> Shikimori.PLAN_TO_READ "rewatching" -> Shikimori.REREADING else -> throw NotImplementedError("Unknown status: $status") } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/dto/SMAddEntryResponse.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori.dto import kotlinx.serialization.Serializable @Serializable data class SMAddEntryResponse( val id: Long, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/dto/SMEntry.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori.dto import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class SMEntry( val id: Long, val name: String, val chapters: Long?, val episodes: Long?, val image: SUEntryCover, val score: Double, val url: String, val status: String, val kind: String, @SerialName("aired_on") val airedOn: String?, ) { fun toMangaTrack(trackId: Long): MangaTrackSearch { return MangaTrackSearch.create(trackId).apply { remote_id = this@SMEntry.id title = name total_chapters = chapters!! cover_url = ShikimoriApi.BASE_URL + image.preview summary = "" score = this@SMEntry.score tracking_url = ShikimoriApi.BASE_URL + url publishing_status = this@SMEntry.status publishing_type = kind start_date = airedOn ?: "" } } fun toAnimeTrack(trackId: Long): AnimeTrackSearch { return AnimeTrackSearch.create(trackId).apply { remote_id = this@SMEntry.id title = name total_episodes = episodes!! cover_url = ShikimoriApi.BASE_URL + image.preview summary = "" score = this@SMEntry.score tracking_url = ShikimoriApi.BASE_URL + url publishing_status = this@SMEntry.status publishing_type = kind start_date = airedOn ?: "" } } } @Serializable data class SUEntryCover( val preview: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/dto/SMOAuth.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class SMOAuth( @SerialName("access_token") val accessToken: String, @SerialName("token_type") val tokenType: String, @SerialName("created_at") val createdAt: Long, @SerialName("expires_in") val expiresIn: Long, @SerialName("refresh_token") val refreshToken: String?, ) // Access token lives 1 day fun SMOAuth.isExpired() = (System.currentTimeMillis() / 1000) > (createdAt + expiresIn - 3600) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/dto/SMUser.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori.dto import kotlinx.serialization.Serializable @Serializable data class SMUser( val id: Int, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/dto/SMUserListEntry.kt ================================================ package eu.kanade.tachiyomi.data.track.shikimori.dto import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi import eu.kanade.tachiyomi.data.track.shikimori.toTrackStatus import kotlinx.serialization.Serializable @Serializable data class SMUserListEntry( val id: Long, val chapters: Double, val episodes: Double, val score: Int, val status: String, ) { fun toMangaTrack(trackId: Long, manga: SMEntry): MangaTrack { return MangaTrack.create(trackId).apply { title = manga.name remote_id = this@SMUserListEntry.id total_chapters = manga.chapters!! library_id = this@SMUserListEntry.id last_chapter_read = this@SMUserListEntry.chapters score = this@SMUserListEntry.score.toDouble() status = toTrackStatus(this@SMUserListEntry.status) tracking_url = ShikimoriApi.BASE_URL + manga.url } } fun toAnimeTrack(trackId: Long, anime: SMEntry): AnimeTrack { return AnimeTrack.create(trackId).apply { title = anime.name remote_id = this@SMUserListEntry.id total_episodes = anime.episodes!! library_id = this@SMUserListEntry.id last_episode_seen = this@SMUserListEntry.episodes score = this@SMUserListEntry.score.toDouble() status = toTrackStatus(this@SMUserListEntry.status) tracking_url = ShikimoriApi.BASE_URL + anime.url } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/Simkl.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.simkl.dto.SimklOAuth import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.anime.model.AnimeTrack as DomainAnimeTrack class Simkl(id: Long) : BaseTracker(id, "Simkl"), AnimeTracker { companion object { const val WATCHING = 1L const val COMPLETED = 2L const val ON_HOLD = 3L const val NOT_INTERESTING = 4L const val PLAN_TO_WATCH = 5L private val SCORE_LIST = IntRange(0, 10) .map(Int::toString) .toImmutableList() } private val json: Json by injectLazy() private val interceptor by lazy { SimklInterceptor(this) } private val api by lazy { SimklApi(client, interceptor) } override fun getScoreList(): ImmutableList = SCORE_LIST override fun displayScore(track: DomainAnimeTrack): String { return track.score.toInt().toString() } private suspend fun add(track: AnimeTrack): AnimeTrack { return api.addLibAnime(track) } override suspend fun update(track: AnimeTrack, didWatchEpisode: Boolean): AnimeTrack { if (track.status != COMPLETED) { if (didWatchEpisode) { if (track.last_episode_seen.toLong() == track.total_episodes && track.total_episodes > 0) { track.status = COMPLETED } else { track.status = WATCHING } } } return api.updateLibAnime(track) } override suspend fun bind(track: AnimeTrack, hasSeenEpisodes: Boolean): AnimeTrack { val remoteTrack = api.findLibAnime(track) return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack) track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { track.status = if (hasSeenEpisodes) WATCHING else track.status } update(track) } else { // Set default fields if it's not found in the list track.status = if (hasSeenEpisodes) WATCHING else PLAN_TO_WATCH track.score = 0.0 add(track) } } override suspend fun searchAnime(query: String): List { return api.searchAnime(query, "anime") + api.searchAnime(query, "tv") + api.searchAnime(query, "movie") } override suspend fun refresh(track: AnimeTrack): AnimeTrack { api.findLibAnime(track)?.let { remoteTrack -> track.copyPersonalFrom(remoteTrack) track.total_episodes = remoteTrack.total_episodes } return track } override fun getLogo() = R.drawable.ic_tracker_simkl override fun getLogoColor() = Color.rgb(0, 0, 0) override fun getStatusListAnime(): List { return listOf(WATCHING, COMPLETED, ON_HOLD, NOT_INTERESTING, PLAN_TO_WATCH) } override fun getStatusForAnime(status: Long): StringResource? = when (status) { WATCHING -> AYMR.strings.watching PLAN_TO_WATCH -> AYMR.strings.plan_to_watch COMPLETED -> MR.strings.completed ON_HOLD -> MR.strings.on_hold NOT_INTERESTING -> AYMR.strings.not_interesting else -> null } override fun getWatchingStatus(): Long = WATCHING override fun getRewatchingStatus(): Long = 0 override fun getCompletionStatus(): Long = COMPLETED override suspend fun login(username: String, password: String) = login(password) suspend fun login(code: String) { try { val oauth = api.accessToken(code) interceptor.newAuth(oauth) val user = api.getCurrentUser() saveCredentials(user.toString(), oauth.accessToken) } catch (e: Throwable) { logout() } } fun saveToken(oauth: SimklOAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oauth)) } fun restoreToken(): SimklOAuth? { return try { json.decodeFromString(trackPreferences.trackToken(this).get()) } catch (e: Exception) { null } } override fun logout() { super.logout() trackPreferences.trackToken(this).delete() interceptor.newAuth(null) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklApi.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl import android.net.Uri import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.simkl.dto.SimklOAuth import eu.kanade.tachiyomi.data.track.simkl.dto.SimklSearchResult import eu.kanade.tachiyomi.data.track.simkl.dto.SimklSyncResult import eu.kanade.tachiyomi.data.track.simkl.dto.SimklSyncWatched import eu.kanade.tachiyomi.data.track.simkl.dto.SimklUser import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.jsonMime import eu.kanade.tachiyomi.network.parseAs import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json import kotlinx.serialization.json.addJsonObject import kotlinx.serialization.json.buildJsonArray import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonArray import kotlinx.serialization.json.putJsonObject import okhttp3.OkHttpClient import okhttp3.RequestBody.Companion.toRequestBody import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.injectLazy class SimklApi(private val client: OkHttpClient, interceptor: SimklInterceptor) { private val json: Json by injectLazy() private val authClient = client.newBuilder().addInterceptor(interceptor).build() suspend fun addLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { val type = track.tracking_url .substringAfter("/") .substringBefore("/") val mediaType = if (type == "movies") "movies" else "shows" addToList(track, mediaType) track } } private suspend fun addToList(track: AnimeTrack, mediaType: String) { val payload = buildJsonObject { putJsonArray(mediaType) { addJsonObject { putJsonObject("ids") { put("simkl", track.remote_id) } put("to", track.toSimklStatus()) } } }.toString().toRequestBody(jsonMime) authClient.newCall( POST("$API_URL/sync/add-to-list", body = payload), ).awaitSuccess() } private suspend fun updateRating(track: AnimeTrack, mediaType: String) { val payload = buildJsonObject { putJsonArray(mediaType) { addJsonObject { putJsonObject("ids") { put("simkl", track.remote_id) } put("rating", track.score.toInt()) } } }.toString().toRequestBody(jsonMime) if (track.score == 0.0) { authClient.newCall( POST("$API_URL/sync/ratings/remove", body = payload), ).awaitSuccess() } else { authClient.newCall( POST("$API_URL/sync/ratings", body = payload), ).awaitSuccess() } } private suspend fun updateProgress(track: AnimeTrack) { // first remove authClient.newCall( POST("$API_URL/sync/history/remove", body = buildProgressObject(track, false)), ).awaitSuccess() // then add again authClient.newCall( POST("$API_URL/sync/history", body = buildProgressObject(track, true)), ).awaitSuccess() } private fun buildProgressObject(track: AnimeTrack, add: Boolean = true) = buildJsonObject { putJsonArray("shows") { addJsonObject { putJsonObject("ids") { put("simkl", track.remote_id) } putJsonArray("seasons") { addJsonObject { put("number", 1) if (add) { putJsonArray("episodes") { for (epNum in 1..track.last_episode_seen.toInt()) { addJsonObject { put("number", epNum) } } } } } } } } }.toString().toRequestBody(jsonMime) suspend fun updateLibAnime(track: AnimeTrack): AnimeTrack { return withIOContext { // determine media type val type = track.tracking_url .substringAfter("/") .substringBefore("/") val mediaType = if (type == "movies") "movies" else "shows" // update progress only for shows if (type != "movies") { updateProgress(track) } // add to correct list addToList(track, mediaType) // update rating updateRating(track, mediaType) track } } suspend fun searchAnime(search: String, type: String): List { return withIOContext { val searchUrl = "$API_URL/search/$type".toUri().buildUpon() .appendQueryParameter("q", search) .appendQueryParameter("extended", "full") .appendQueryParameter("client_id", CLIENT_ID) .build() with(json) { client.newCall(GET(searchUrl.toString())) .awaitSuccess() .parseAs>() .map { it.toTrackSearch(type) } } } } /** * Checks if the given [track] exists in the user's list and * returns all info about it or null if it isn't found. */ suspend fun findLibAnime(track: AnimeTrack): AnimeTrack? { return withIOContext { val payload = buildJsonArray { addJsonObject { put("simkl", track.remote_id) } }.toString().toRequestBody(jsonMime) val foundAnime = with(json) { authClient.newCall( POST("$API_URL/sync/watched", body = payload), ) .awaitSuccess() .parseAs>() .firstOrNull() ?: return@withIOContext null } if (foundAnime.result != true) return@withIOContext null val lastWatched = foundAnime.lastWatched ?: return@withIOContext null val status = foundAnime.list ?: return@withIOContext null val type = track.tracking_url .substringAfter("/") .substringBefore("/") val queryType = if (type == "tv") "shows" else type val url = "$API_URL/sync/all-items/$queryType/$status".toUri().buildUpon() .appendQueryParameter("date_from", lastWatched) .build() val typeName = if (type == "movies") "movie" else "show" val listAnime = with(json) { authClient.newCall(GET(url.toString())) .awaitSuccess() .parseAs() .getFromType(queryType) ?.firstOrNull { item -> item.getFromType(typeName).ids.simkl == track.remote_id } ?: return@withIOContext null } listAnime.toAnimeTrack(typeName, type, status) } } fun getCurrentUser(): Int { return runBlocking { with(json) { authClient.newCall(GET("$API_URL/users/settings")) .awaitSuccess() .parseAs() .account.id } } } suspend fun accessToken(code: String): SimklOAuth { return withIOContext { with(json) { client.newCall(accessTokenRequest(code)) .awaitSuccess() .parseAs() } } } private fun accessTokenRequest(code: String) = POST( OAUTH_URL, body = buildJsonObject { put("code", code) put("client_id", CLIENT_ID) put("client_secret", CLIENT_SECRET) put("redirect_uri", REDIRECT_URL) put("grant_type", "authorization_code") }.toString().toRequestBody(jsonMime), ) companion object { const val CLIENT_ID = "aa62a7da32518aae5d5049a658b87fa4837c3b739e06ed250b315aab6af82b0e" private const val CLIENT_SECRET = "2bec9c1d0c00a1e9b0e9e096a71f88d555a6f52da7923df07906df3b21351783" private const val BASE_URL = "https://simkl.com" private const val API_URL = "https://api.simkl.com" private const val OAUTH_URL = "$API_URL/oauth/token" private const val LOGIN_URL = "$BASE_URL/oauth/authorize" const val POSTERS_URL = "https://simkl.in/posters/" private const val REDIRECT_URL = "aniyomi://simkl-auth" fun authUrl(): Uri = LOGIN_URL.toUri().buildUpon() .appendQueryParameter("response_type", "code") .appendQueryParameter("client_id", CLIENT_ID) .appendQueryParameter("redirect_uri", REDIRECT_URL) .build() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklInterceptor.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.track.simkl.SimklApi.Companion.CLIENT_ID import eu.kanade.tachiyomi.data.track.simkl.dto.SimklOAuth import okhttp3.Interceptor import okhttp3.Response class SimklInterceptor(val simkl: Simkl) : Interceptor { /** * OAuth object used for authenticated requests. */ private var oauth: SimklOAuth? = simkl.restoreToken() override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() val oauth = oauth ?: throw Exception("Not authenticated with Simkl") // Add the authorization header to the original request. val authRequest = originalRequest.newBuilder() .addHeader("Authorization", "Bearer ${oauth.accessToken}") .addHeader("simkl-api-key", CLIENT_ID) .header("User-Agent", "Aniyomi v${BuildConfig.VERSION_NAME} (${BuildConfig.APPLICATION_ID})") .build() return chain.proceed(authRequest) } fun newAuth(oauth: SimklOAuth?) { this.oauth = oauth simkl.saveToken(oauth) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/SimklUtils.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack fun AnimeTrack.toSimklStatus() = when (status) { Simkl.WATCHING -> "watching" Simkl.COMPLETED -> "completed" Simkl.ON_HOLD -> "hold" Simkl.NOT_INTERESTING -> "notinteresting" Simkl.PLAN_TO_WATCH -> "plantowatch" else -> throw NotImplementedError("Unknown status: $status") } fun toTrackStatus(status: String) = when (status) { "watching" -> Simkl.WATCHING "completed" -> Simkl.COMPLETED "hold" -> Simkl.ON_HOLD "dropped", "notinteresting" -> Simkl.NOT_INTERESTING "plantowatch" -> Simkl.PLAN_TO_WATCH else -> throw NotImplementedError("Unknown status: $status") } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/dto/SimklOAuth.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class SimklOAuth( @SerialName("access_token") val accessToken: String, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/dto/SimklSearch.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl.dto import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.data.track.simkl.SimklApi.Companion.POSTERS_URL import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class SimklSearchResult( val ids: SimlkSearchResultIds, @SerialName("title_romaji") val titleRomaji: String?, val title: String?, @SerialName("ep_count") val epCount: Long?, val poster: String?, @SerialName("all_titles") val allTitles: List?, val url: String, val status: String?, val type: String?, val year: Int?, ) { fun toTrackSearch(fallbackType: String): AnimeTrackSearch { return AnimeTrackSearch.create(TrackerManager.SIMKL).apply { remote_id = ids.simklId title = titleRomaji ?: this@SimklSearchResult.title!! total_episodes = epCount ?: 1 cover_url = poster?.let { "$POSTERS_URL${it}_m.webp" } ?: "" summary = allTitles?.joinToString("\n", prefix = "All titles:\n") ?: "" tracking_url = url publishing_status = this@SimklSearchResult.status ?: "ended" publishing_type = type ?: fallbackType start_date = year?.toString() ?: "" } } } @Serializable data class SimlkSearchResultIds( @SerialName("simkl_id") val simklId: Long, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/dto/SimklSyncItem.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl.dto import eu.kanade.tachiyomi.data.database.models.anime.AnimeTrack import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.simkl.toTrackStatus import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class SimklSyncResult( val anime: List?, val tv: List?, val movies: List?, ) { fun getFromType(type: String): List? { return when (type) { "anime" -> anime "tv" -> tv "movies" -> movies else -> throw Exception("Unknown type: $type") } } } @Serializable data class SimklSyncItem( val show: SimklSyncResultItem?, val movie: SimklSyncResultItem?, @SerialName("total_episodes_count") val totalEpisodesCount: Long?, @SerialName("watched_episodes_count") val watchedEpisodesCount: Double?, @SerialName("user_rating") val userRating: Int?, ) { fun toAnimeTrack(typeName: String, type: String, statusString: String): AnimeTrack { val resultData = getFromType(typeName) return AnimeTrack.create(TrackerManager.SIMKL).apply { title = resultData.title remote_id = resultData.ids.simkl if (typeName != "movie") { total_episodes = totalEpisodesCount!! last_episode_seen = watchedEpisodesCount!! } else { total_episodes = 1 last_episode_seen = if (statusString == "completed") 1.0 else 0.0 } score = userRating?.toDouble() ?: 0.0 status = toTrackStatus(statusString) tracking_url = "/$type/${resultData.ids.simkl}" } } fun getFromType(typeName: String): SimklSyncResultItem { return when (typeName) { "show" -> show!! "movie" -> movie!! else -> throw Exception("Unknown type: $typeName") } } } @Serializable data class SimklSyncResultItem( val title: String, val ids: SimklSyncResultIds, ) @Serializable data class SimklSyncResultIds( val simkl: Long, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/dto/SimklSyncWatched.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class SimklSyncWatched( val result: Boolean?, @SerialName("last_watched") val lastWatched: String?, val list: String?, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/simkl/dto/SimklUser.kt ================================================ package eu.kanade.tachiyomi.data.track.simkl.dto import kotlinx.serialization.Serializable @Serializable data class SimklUser( val account: SimklUserAccount, ) @Serializable data class SimklUserAccount( val id: Int, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt ================================================ package eu.kanade.tachiyomi.data.track.suwayomi import android.graphics.Color import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.BaseTracker import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.source.MangaSource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.domain.entries.manga.model.Manga as DomainManga import tachiyomi.domain.track.manga.model.MangaTrack as DomainTrack class Suwayomi(id: Long) : BaseTracker(id, "Suwayomi"), EnhancedMangaTracker, MangaTracker { val api by lazy { SuwayomiApi(id) } override fun getLogo() = R.drawable.ic_tracker_suwayomi override fun getLogoColor() = Color.rgb(255, 35, 35) // TODO companion object { const val UNREAD = 1L const val READING = 2L const val COMPLETED = 3L } override fun getStatusListManga(): List = listOf(UNREAD, READING, COMPLETED) override fun getStatusForManga(status: Long): StringResource? = when (status) { UNREAD -> MR.strings.unread READING -> MR.strings.reading COMPLETED -> MR.strings.completed else -> null } override fun getReadingStatus(): Long = READING override fun getRereadingStatus(): Long = -1 override fun getCompletionStatus(): Long = COMPLETED override fun getScoreList(): ImmutableList = persistentListOf() override fun displayScore(track: DomainTrack): String = "" override suspend fun update(track: MangaTrack, didReadChapter: Boolean): MangaTrack { if (track.status != COMPLETED) { if (didReadChapter) { if (track.last_chapter_read.toLong() == track.total_chapters && track.total_chapters > 0) { track.status = COMPLETED } else { track.status = READING } } } return api.updateProgress(track) } override suspend fun bind(track: MangaTrack, hasReadChapters: Boolean): MangaTrack { return track } override suspend fun searchManga(query: String): List { TODO("Not yet implemented") } override suspend fun refresh(track: MangaTrack): MangaTrack { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) track.total_chapters = remoteTrack.total_chapters return track } override suspend fun login(username: String, password: String) { saveCredentials("user", "pass") } override fun loginNoop() { saveCredentials("user", "pass") } override fun getAcceptedSources(): List = listOf( "eu.kanade.tachiyomi.extension.all.tachidesk.Tachidesk", ) override suspend fun match(manga: DomainManga): MangaTrackSearch? = try { api.getTrackSearch(manga.url) } catch (e: Exception) { null } override fun isTrackFrom(track: DomainTrack, manga: DomainManga, source: MangaSource?): Boolean = source?.let { accept( it, ) } == true override fun migrateTrack(track: DomainTrack, manga: DomainManga, newSource: MangaSource): DomainTrack? = if (accept(newSource)) { track.copy(remoteUrl = manga.url) } else { null } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt ================================================ package eu.kanade.tachiyomi.data.track.suwayomi import android.app.Application import android.content.SharedPreferences import eu.kanade.tachiyomi.data.database.models.manga.MangaTrack import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.PUT import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.serialization.json.Json import okhttp3.Credentials import okhttp3.Dns import okhttp3.FormBody import okhttp3.Headers import okhttp3.OkHttpClient import tachiyomi.core.common.util.lang.withIOContext import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.nio.charset.Charset import java.security.MessageDigest class SuwayomiApi(private val trackId: Long) { private val network by injectLazy() private val json: Json by injectLazy() private val client: OkHttpClient = network.client.newBuilder() .dns(Dns.SYSTEM) // don't use DNS over HTTPS as it breaks IP addressing .build() private fun headersBuilder(): Headers.Builder = Headers.Builder().apply { add("User-Agent", network.defaultUserAgentProvider()) if (basePassword.isNotEmpty() && baseLogin.isNotEmpty()) { val credentials = Credentials.basic(baseLogin, basePassword) add("Authorization", credentials) } } private val headers: Headers by lazy { headersBuilder().build() } private val baseUrl by lazy { getPrefBaseUrl() } private val baseLogin by lazy { getPrefBaseLogin() } private val basePassword by lazy { getPrefBasePassword() } suspend fun getTrackSearch(trackUrl: String): MangaTrackSearch = withIOContext { val url = try { // test if getting api url or manga id val mangaId = trackUrl.toLong() "$baseUrl/api/v1/manga/$mangaId" } catch (e: NumberFormatException) { trackUrl } val manga = with(json) { client.newCall(GET("$url/full", headers)) .awaitSuccess() .parseAs() } MangaTrackSearch.create(trackId).apply { title = manga.title cover_url = "$url/thumbnail" summary = manga.description.orEmpty() tracking_url = url total_chapters = manga.chapterCount publishing_status = manga.status last_chapter_read = manga.lastChapterRead?.chapterNumber ?: 0.0 status = when (manga.unreadCount) { manga.chapterCount -> Suwayomi.UNREAD 0L -> Suwayomi.COMPLETED else -> Suwayomi.READING } } } suspend fun updateProgress(track: MangaTrack): MangaTrack { val url = track.tracking_url val chapters = with(json) { client.newCall(GET("$url/chapters", headers)) .awaitSuccess() .parseAs>() } val lastChapterIndex = chapters.first { it.chapterNumber == track.last_chapter_read }.index client.newCall( PUT( "$url/chapter/$lastChapterIndex", headers, FormBody.Builder(Charset.forName("utf8")) .add("markPrevRead", "true") .add("read", "true") .build(), ), ).awaitSuccess() return getTrackSearch(track.tracking_url) } private val sourceId by lazy { val key = "tachidesk/en/1" val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray()) (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE } private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$sourceId", 0x0000) } private fun getPrefBaseUrl(): String = preferences.getString(ADDRESS_TITLE, ADDRESS_DEFAULT)!! private fun getPrefBaseLogin(): String = preferences.getString(LOGIN_TITLE, LOGIN_DEFAULT)!! private fun getPrefBasePassword(): String = preferences.getString( PASSWORD_TITLE, PASSWORD_DEFAULT, )!! } private const val ADDRESS_TITLE = "Server URL Address" private const val ADDRESS_DEFAULT = "" private const val LOGIN_TITLE = "Login (Basic Auth)" private const val LOGIN_DEFAULT = "" private const val PASSWORD_TITLE = "Password (Basic Auth)" private const val PASSWORD_DEFAULT = "" ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiModels.kt ================================================ package eu.kanade.tachiyomi.data.track.suwayomi import kotlinx.serialization.Serializable @Serializable data class SourceDataClass( val id: String, val name: String, val lang: String, val iconUrl: String, /** The Source provides a latest listing */ val supportsLatest: Boolean, /** The Source implements [ConfigurableSource] */ val isConfigurable: Boolean, /** The Source class has a @Nsfw annotation */ val isNsfw: Boolean, /** A nicer version of [name] */ val displayName: String, ) @Serializable data class MangaDataClass( val id: Int, val sourceId: String, val url: String, val title: String, val thumbnailUrl: String?, val initialized: Boolean, val artist: String?, val author: String?, val description: String?, val genre: List, val status: String, val inLibrary: Boolean, val inLibraryAt: Long, val source: SourceDataClass?, val meta: Map, val realUrl: String?, val lastFetchedAt: Long?, val chaptersLastFetchedAt: Long?, val freshData: Boolean, val unreadCount: Long?, val downloadCount: Long?, val chapterCount: Long, // actually is nullable server side, but should be set at this time val lastChapterRead: ChapterDataClass?, val age: Long?, val chaptersAge: Long?, ) @Serializable data class ChapterDataClass( val id: Int, val url: String, val name: String, val uploadDate: Long, val chapterNumber: Double, val scanlator: String?, val mangaId: Int, /** chapter is read */ val read: Boolean, /** chapter is bookmarked */ val bookmarked: Boolean, /** last read page, zero means not read/no data */ val lastPageRead: Int, /** last read page, zero means not read/no data */ val lastReadAt: Long, /** this chapter's index, starts with 1 */ val index: Int, /** the date we fist saw this chapter*/ val fetchedAt: Long, /** is chapter downloaded */ val downloaded: Boolean, /** used to construct pages in the front-end */ val pageCount: Int, /** total chapter count, used to calculate if there's a next and prev chapter */ val chapterCount: Int?, /** used to store client specific values */ val meta: Map, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateChecker.kt ================================================ package eu.kanade.tachiyomi.data.updater import android.content.Context import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.util.system.isPreviewBuildType import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.release.interactor.GetApplicationRelease import uy.kohesive.injekt.injectLazy class AppUpdateChecker { private val getApplicationRelease: GetApplicationRelease by injectLazy() suspend fun checkForUpdate(context: Context, forceCheck: Boolean = false): GetApplicationRelease.Result { // Disabling app update checks for older Android versions that we're going to drop support for // if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { // return GetApplicationRelease.Result.OsTooOld // } return withIOContext { val result = getApplicationRelease.await( GetApplicationRelease.Arguments( isPreviewBuildType, BuildConfig.COMMIT_COUNT.toInt(), BuildConfig.VERSION_NAME, GITHUB_REPO, forceCheck, ), ) when (result) { is GetApplicationRelease.Result.NewUpdate -> AppUpdateNotifier(context).promptUpdate( result.release, ) else -> {} } result } } } val GITHUB_REPO: String by lazy { if (isPreviewBuildType) { "aniyomiorg/aniyomi-preview" } else { "aniyomiorg/aniyomi" } } val RELEASE_TAG: String by lazy { if (isPreviewBuildType) { "r${BuildConfig.COMMIT_COUNT}" } else { "v${BuildConfig.VERSION_NAME}" } } val RELEASE_URL = "https://github.com/$GITHUB_REPO/releases/tag/$RELEASE_TAG" ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateDownloadJob.kt ================================================ package eu.kanade.tachiyomi.data.updater import android.content.Context import android.content.pm.ServiceInfo import android.os.Build import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkerParameters import androidx.work.workDataOf import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.ProgressListener import eu.kanade.tachiyomi.network.await import eu.kanade.tachiyomi.network.newCachelessCallWithProgress import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.storage.saveTo import eu.kanade.tachiyomi.util.system.workManager import logcat.LogPriority import okhttp3.internal.http2.ErrorCode import okhttp3.internal.http2.StreamResetException import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import java.io.File import kotlin.coroutines.cancellation.CancellationException class AppUpdateDownloadJob(private val context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) { private val notifier = AppUpdateNotifier(context) private val network: NetworkHelper by injectLazy() override suspend fun doWork(): Result { val url = inputData.getString(EXTRA_DOWNLOAD_URL) val title = inputData.getString(EXTRA_DOWNLOAD_TITLE) ?: context.stringResource(MR.strings.app_name) if (url.isNullOrEmpty()) { return Result.failure() } try { setForeground(getForegroundInfo()) } catch (e: IllegalStateException) { logcat(LogPriority.ERROR, e) { "Not allowed to run on foreground service" } } withIOContext { downloadApk(title, url) } return Result.success() } override suspend fun getForegroundInfo(): ForegroundInfo { return ForegroundInfo( Notifications.ID_APP_UPDATER, notifier.onDownloadStarted().build(), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC } else { 0 }, ) } /** * Called to start downloading apk of new update * * @param url url location of file */ private suspend fun downloadApk(title: String, url: String) { // Show notification download starting. notifier.onDownloadStarted(title) val progressListener = object : ProgressListener { // Progress of the download var savedProgress = 0 // Keep track of the last notification sent to avoid posting too many. var lastTick = 0L override fun update(bytesRead: Long, contentLength: Long, done: Boolean) { val progress = (100 * (bytesRead.toFloat() / contentLength)).toInt() val currentTime = System.currentTimeMillis() if (progress > savedProgress && currentTime - 200 > lastTick) { savedProgress = progress lastTick = currentTime notifier.onProgressChange(progress) } } } try { // Download the new update. val response = network.client.newCachelessCallWithProgress(GET(url), progressListener) .await() // File where the apk will be saved. val apkFile = File(context.externalCacheDir, "update.apk") if (response.isSuccessful) { response.body.source().saveTo(apkFile) } else { response.close() throw Exception("Unsuccessful response") } notifier.cancel() notifier.promptInstall(apkFile.getUriCompat(context)) } catch (e: Exception) { val shouldCancel = e is CancellationException || (e is StreamResetException && e.errorCode == ErrorCode.CANCEL) if (shouldCancel) { notifier.cancel() } else { notifier.onDownloadError(url) } } } companion object { private const val TAG = "AppUpdateDownload" const val EXTRA_DOWNLOAD_URL = "DOWNLOAD_URL" const val EXTRA_DOWNLOAD_TITLE = "DOWNLOAD_TITLE" fun start(context: Context, url: String, title: String? = null) { val constraints = Constraints( requiredNetworkType = NetworkType.CONNECTED, ) val request = OneTimeWorkRequestBuilder() .setConstraints(constraints) .addTag(TAG) .setInputData( workDataOf( EXTRA_DOWNLOAD_URL to url, EXTRA_DOWNLOAD_TITLE to title, ), ) .build() context.workManager.enqueueUniqueWork(TAG, ExistingWorkPolicy.REPLACE, request) } fun stop(context: Context) { context.workManager.cancelUniqueWork(TAG) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/data/updater/AppUpdateNotifier.kt ================================================ package eu.kanade.tachiyomi.data.updater import android.annotation.SuppressLint import android.app.PendingIntent import android.content.Context import android.content.Intent import android.net.Uri import androidx.core.app.NotificationCompat import androidx.core.net.toUri import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notify import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.release.model.Release import tachiyomi.i18n.MR internal class AppUpdateNotifier(private val context: Context) { private val notificationBuilder = context.notificationBuilder(Notifications.CHANNEL_APP_UPDATE) /** * Call to show notification. * * @param id id of the notification channel. */ private fun NotificationCompat.Builder.show(id: Int = Notifications.ID_APP_UPDATER) { context.notify(id, build()) } fun cancel() { NotificationReceiver.dismissNotification(context, Notifications.ID_APP_UPDATER) } @SuppressLint("LaunchActivityFromNotification") fun promptUpdate(release: Release) { val updateIntent = NotificationReceiver.downloadAppUpdatePendingBroadcast( context, release.downloadLink, release.version, ) val releaseIntent = Intent(Intent.ACTION_VIEW, release.releaseLink.toUri()).run { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP PendingIntent.getActivity( context, release.hashCode(), this, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } with(notificationBuilder) { setContentTitle(context.stringResource(MR.strings.update_check_notification_update_available)) setContentText(release.version) setSmallIcon(android.R.drawable.stat_sys_download_done) setContentIntent(updateIntent) clearActions() addAction( android.R.drawable.stat_sys_download_done, context.stringResource(MR.strings.action_download), updateIntent, ) addAction( R.drawable.ic_info_24dp, context.stringResource(MR.strings.whats_new), releaseIntent, ) } notificationBuilder.show() } /** * Call when apk download starts. * * @param title tile of notification. */ fun onDownloadStarted(title: String? = null): NotificationCompat.Builder { with(notificationBuilder) { title?.let { setContentTitle(title) } setContentText( context.stringResource(MR.strings.update_check_notification_download_in_progress), ) setSmallIcon(android.R.drawable.stat_sys_download) setOngoing(true) clearActions() addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), NotificationReceiver.cancelDownloadAppUpdatePendingBroadcast(context), ) } notificationBuilder.show() return notificationBuilder } /** * Call when apk download progress changes. * * @param progress progress of download (xx%/100). */ fun onProgressChange(progress: Int) { with(notificationBuilder) { setProgress(100, progress, false) setOnlyAlertOnce(true) } notificationBuilder.show() } /** * Call when apk download is finished. * * @param uri path location of apk. */ fun promptInstall(uri: Uri) { val installIntent = NotificationHandler.installApkPendingActivity(context, uri) with(notificationBuilder) { setContentText(context.stringResource(MR.strings.update_check_notification_download_complete)) setSmallIcon(android.R.drawable.stat_sys_download_done) setOnlyAlertOnce(false) setProgress(0, 0, false) setContentIntent(installIntent) setOngoing(true) clearActions() addAction( R.drawable.ic_system_update_alt_white_24dp, context.stringResource(MR.strings.action_install), installIntent, ) addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), NotificationReceiver.dismissNotificationPendingBroadcast( context, Notifications.ID_APP_UPDATE_PROMPT, ), ) } notificationBuilder.show(Notifications.ID_APP_UPDATE_PROMPT) } /** * Call when apk download throws a error * * @param url web location of apk to download. */ fun onDownloadError(url: String) { with(notificationBuilder) { setContentText(context.stringResource(MR.strings.update_check_notification_download_error)) setSmallIcon(R.drawable.ic_warning_white_24dp) setOnlyAlertOnce(false) setProgress(0, 0, false) clearActions() addAction( R.drawable.ic_refresh_24dp, context.stringResource(MR.strings.action_retry), NotificationReceiver.downloadAppUpdatePendingBroadcast(context, url), ) addAction( R.drawable.ic_close_24dp, context.stringResource(MR.strings.action_cancel), NotificationReceiver.dismissNotificationPendingBroadcast(context, Notifications.ID_APP_UPDATE_ERROR), ) } notificationBuilder.show(Notifications.ID_APP_UPDATE_ERROR) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt ================================================ package eu.kanade.tachiyomi.di import android.app.Application import android.os.Build import androidx.core.content.ContextCompat import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory import app.cash.sqldelight.driver.android.AndroidSqliteDriver import data.History import data.Mangas import dataanime.Animehistory import dataanime.Animes import eu.kanade.domain.track.anime.store.DelayedAnimeTrackingStore import eu.kanade.domain.track.manga.store.DelayedMangaTrackingStore import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadProvider import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.download.manga.MangaDownloadProvider import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.network.JavaScriptEngine import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.anime.AndroidAnimeSourceManager import eu.kanade.tachiyomi.source.manga.AndroidMangaSourceManager import eu.kanade.tachiyomi.ui.player.ExternalIntents import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory import kotlinx.serialization.json.Json import kotlinx.serialization.protobuf.ProtoBuf import nl.adaptivity.xmlutil.XmlDeclMode.Charset import nl.adaptivity.xmlutil.core.XmlVersion import nl.adaptivity.xmlutil.serialization.XML import tachiyomi.core.common.storage.AndroidStorageFolderProvider import tachiyomi.data.AnimeUpdateStrategyColumnAdapter import tachiyomi.data.Database import tachiyomi.data.DateColumnAdapter import tachiyomi.data.FetchTypeColumnAdapter import tachiyomi.data.MangaUpdateStrategyColumnAdapter import tachiyomi.data.StringListColumnAdapter import tachiyomi.data.handlers.anime.AndroidAnimeDatabaseHandler import tachiyomi.data.handlers.anime.AnimeDatabaseHandler import tachiyomi.data.handlers.manga.AndroidMangaDatabaseHandler import tachiyomi.data.handlers.manga.MangaDatabaseHandler import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.storage.service.StorageManager import tachiyomi.mi.data.AnimeDatabase import tachiyomi.source.local.entries.anime.LocalAnimeFetchTypeManager import tachiyomi.source.local.image.anime.LocalAnimeBackgroundManager import tachiyomi.source.local.image.anime.LocalAnimeCoverManager import tachiyomi.source.local.image.anime.LocalEpisodeThumbnailManager import tachiyomi.source.local.image.manga.LocalMangaCoverManager import tachiyomi.source.local.io.anime.LocalAnimeSourceFileSystem import tachiyomi.source.local.io.manga.LocalMangaSourceFileSystem import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.addSingleton import uy.kohesive.injekt.api.addSingletonFactory import uy.kohesive.injekt.api.get class AppModule(val app: Application) : InjektModule { override fun InjektRegistrar.registerInjectables() { addSingleton(app) val sqlDriverManga = AndroidSqliteDriver( schema = Database.Schema, context = app, name = "tachiyomi.db", factory = if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Support database inspector in Android Studio FrameworkSQLiteOpenHelperFactory() } else { RequerySQLiteOpenHelperFactory() }, callback = object : AndroidSqliteDriver.Callback(Database.Schema) { override fun onOpen(db: SupportSQLiteDatabase) { super.onOpen(db) setPragma(db, "foreign_keys = ON") setPragma(db, "journal_mode = WAL") setPragma(db, "synchronous = NORMAL") } private fun setPragma(db: SupportSQLiteDatabase, pragma: String) { val cursor = db.query("PRAGMA $pragma") cursor.moveToFirst() cursor.close() } }, ) val sqlDriverAnime = AndroidSqliteDriver( schema = AnimeDatabase.Schema, context = app, name = "tachiyomi.animedb", factory = if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Support database inspector in Android Studio FrameworkSQLiteOpenHelperFactory() } else { RequerySQLiteOpenHelperFactory() }, callback = object : AndroidSqliteDriver.Callback(AnimeDatabase.Schema) { override fun onOpen(db: SupportSQLiteDatabase) { super.onOpen(db) setPragma(db, "foreign_keys = ON") setPragma(db, "journal_mode = WAL") setPragma(db, "synchronous = NORMAL") } private fun setPragma(db: SupportSQLiteDatabase, pragma: String) { val cursor = db.query("PRAGMA $pragma") cursor.moveToFirst() cursor.close() } }, ) addSingletonFactory { Database( driver = sqlDriverManga, historyAdapter = History.Adapter( last_readAdapter = DateColumnAdapter, ), mangasAdapter = Mangas.Adapter( genreAdapter = StringListColumnAdapter, update_strategyAdapter = MangaUpdateStrategyColumnAdapter, ), ) } addSingletonFactory { AnimeDatabase( driver = sqlDriverAnime, animehistoryAdapter = Animehistory.Adapter( last_seenAdapter = DateColumnAdapter, ), animesAdapter = Animes.Adapter( genreAdapter = StringListColumnAdapter, update_strategyAdapter = AnimeUpdateStrategyColumnAdapter, fetch_typeAdapter = FetchTypeColumnAdapter, ), ) } addSingletonFactory { AndroidMangaDatabaseHandler( get(), sqlDriverManga, ) } addSingletonFactory { AndroidAnimeDatabaseHandler( get(), sqlDriverAnime, ) } addSingletonFactory { Json { ignoreUnknownKeys = true explicitNulls = false } } addSingletonFactory { XML { defaultPolicy { ignoreUnknownChildren() } autoPolymorphic = true xmlDeclMode = Charset indent = 2 xmlVersion = XmlVersion.XML10 } } addSingletonFactory { ProtoBuf } addSingletonFactory { ChapterCache(app, get()) } addSingletonFactory { MangaCoverCache(app) } addSingletonFactory { AnimeCoverCache(app) } addSingletonFactory { AnimeBackgroundCache(app) } addSingletonFactory { NetworkHelper(app, get()) } addSingletonFactory { JavaScriptEngine(app) } addSingletonFactory { AndroidMangaSourceManager(app, get(), get()) } addSingletonFactory { AndroidAnimeSourceManager(app, get(), get()) } addSingletonFactory { MangaExtensionManager(app) } addSingletonFactory { AnimeExtensionManager(app) } addSingletonFactory { MangaDownloadProvider(app) } addSingletonFactory { MangaDownloadManager(app) } addSingletonFactory { MangaDownloadCache(app) } addSingletonFactory { AnimeDownloadProvider(app) } addSingletonFactory { AnimeDownloadManager(app) } addSingletonFactory { AnimeDownloadCache(app) } addSingletonFactory { TrackerManager(app) } addSingletonFactory { DelayedAnimeTrackingStore(app) } addSingletonFactory { DelayedMangaTrackingStore(app) } addSingletonFactory { ImageSaver(app) } addSingletonFactory { AndroidStorageFolderProvider(app) } addSingletonFactory { LocalMangaSourceFileSystem(get()) } addSingletonFactory { LocalMangaCoverManager(app, get()) } addSingletonFactory { LocalAnimeSourceFileSystem(get()) } addSingletonFactory { LocalAnimeBackgroundManager(app, get()) } addSingletonFactory { LocalAnimeCoverManager(app, get()) } addSingletonFactory { LocalAnimeFetchTypeManager(app, get()) } addSingletonFactory { LocalEpisodeThumbnailManager(app, get()) } addSingletonFactory { StorageManager(app, get()) } addSingletonFactory { ExternalIntents() } // Asynchronously init expensive components for a faster cold start ContextCompat.getMainExecutor(app).execute { get() get() get() get() get() get() get() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt ================================================ package eu.kanade.tachiyomi.di import android.app.Application import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.player.settings.AdvancedPlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.DecoderPreferences import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.system.isDebugBuildType import tachiyomi.core.common.preference.AndroidPreferenceStore import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.storage.AndroidStorageFolderProvider import tachiyomi.domain.backup.service.BackupPreferences import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.storage.service.StoragePreferences import uy.kohesive.injekt.api.InjektModule import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.addSingletonFactory import uy.kohesive.injekt.api.get class PreferenceModule(val app: Application) : InjektModule { override fun InjektRegistrar.registerInjectables() { addSingletonFactory { AndroidPreferenceStore(app) } addSingletonFactory { NetworkPreferences( preferenceStore = get(), verboseLogging = isDebugBuildType, ) } addSingletonFactory { SourcePreferences(get()) } addSingletonFactory { SecurityPreferences(get()) } addSingletonFactory { LibraryPreferences(get()) } addSingletonFactory { ReaderPreferences(get()) } addSingletonFactory { PlayerPreferences(get()) } addSingletonFactory { GesturePreferences(get()) } addSingletonFactory { DecoderPreferences(get()) } addSingletonFactory { SubtitlePreferences(get()) } addSingletonFactory { AudioPreferences(get()) } addSingletonFactory { AdvancedPlayerPreferences(get()) } addSingletonFactory { TrackPreferences(get()) } addSingletonFactory { DownloadPreferences(get()) } addSingletonFactory { BackupPreferences(get()) } addSingletonFactory { StoragePreferences( folderProvider = get(), preferenceStore = get(), ) } addSingletonFactory { UiPreferences(get()) } addSingletonFactory { BasePreferences(app, get()) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionUpdateNotifier.kt ================================================ package eu.kanade.tachiyomi.extension import android.content.Context import androidx.core.app.NotificationCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.notify import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class ExtensionUpdateNotifier( private val context: Context, private val securityPreferences: SecurityPreferences = Injekt.get(), ) { fun promptUpdates(names: List, anime: Boolean = false) { context.notify( Notifications.ID_UPDATES_TO_EXTS, Notifications.CHANNEL_EXTENSIONS_UPDATE, ) { setContentTitle( context.resources.getQuantityString( R.plurals.update_check_notification_ext_updates, names.size, names.size, ), ) if (!securityPreferences.hideNotificationContent().get()) { val extNames = names.joinToString(", ") setContentText(extNames) setStyle(NotificationCompat.BigTextStyle().bigText(extNames)) } setSmallIcon(R.drawable.ic_extension_24dp) if (!anime) { setContentIntent(NotificationReceiver.openExtensionsPendingActivity(context)) } else { setContentIntent(NotificationReceiver.openAnimeExtensionsPendingActivity(context)) } setAutoCancel(true) } } fun dismiss() { context.cancelNotification(Notifications.ID_UPDATES_TO_EXTS) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/InstallStep.kt ================================================ package eu.kanade.tachiyomi.extension enum class InstallStep { Idle, Pending, Downloading, Installing, Installed, Error, ; fun isCompleted(): Boolean { return this == Installed || this == Error || this == Idle } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt ================================================ package eu.kanade.tachiyomi.extension.anime import android.content.Context import android.graphics.drawable.Drawable import eu.kanade.domain.extension.anime.interactor.TrustAnimeExtension import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.api.AnimeExtensionApi import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionInstallReceiver import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionInstaller import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionLoader import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import logcat.LogPriority import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Locale /** * The manager of anime extensions installed as another apk which extend the available sources. It handles * the retrieval of remotely available anime extensions as well as installing, updating and removing them. * To avoid malicious distribution, every anime extension must be signed and it will only be loaded if its * signature is trusted, otherwise the user will be prompted with a warning to trust it before being * loaded. * * @param context The application context. * @param preferences The application preferences. */ class AnimeExtensionManager( private val context: Context, private val preferences: SourcePreferences = Injekt.get(), private val trustExtension: TrustAnimeExtension = Injekt.get(), ) { val scope = CoroutineScope(SupervisorJob()) private val _isInitialized = MutableStateFlow(false) val isInitialized: StateFlow = _isInitialized.asStateFlow() /** * API where all the available anime extensions can be found. */ private val api = AnimeExtensionApi() /** * The installer which installs, updates and uninstalls the anime extensions. */ private val installer by lazy { AnimeExtensionInstaller(context) } private val iconMap = mutableMapOf() private val installedExtensionsMapFlow = MutableStateFlow(emptyMap()) val installedExtensionsFlow = installedExtensionsMapFlow.mapExtensions(scope) private val availableExtensionsMapFlow = MutableStateFlow(emptyMap()) val availableExtensionsFlow = availableExtensionsMapFlow.mapExtensions(scope) private val untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) val untrustedExtensionsFlow = untrustedExtensionsMapFlow.mapExtensions(scope) init { initAnimeExtensions() AnimeExtensionInstallReceiver(AnimeInstallationListener()).register(context) } private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet() fun getExtensionPackage(sourceId: Long): String? { return installedExtensionsFlow.value.find { extension -> extension.sources.any { it.id == sourceId } } ?.pkgName } fun getExtensionPackageAsFlow(sourceId: Long): Flow { return installedExtensionsFlow.map { extensions -> extensions.find { extension -> extension.sources.any { it.id == sourceId } } ?.pkgName } } fun getAppIconForSource(sourceId: Long): Drawable? { val pkgName = installedExtensionsMapFlow.value.values .find { ext -> ext.sources.any { it.id == sourceId } } ?.pkgName ?: return null return iconMap[pkgName] ?: iconMap.getOrPut(pkgName) { AnimeExtensionLoader.getAnimeExtensionPackageInfoFromPkgName(context, pkgName)!!.applicationInfo!! .loadIcon(context.packageManager) } } private var availableAnimeExtensionsSourcesData: Map = emptyMap() private fun setupAvailableAnimeExtensionsSourcesDataMap( animeextensions: List, ) { if (animeextensions.isEmpty()) return availableAnimeExtensionsSourcesData = animeextensions .flatMap { ext -> ext.sources.map { it.toStubSource() } } .associateBy { it.id } } fun getSourceData(id: Long) = availableAnimeExtensionsSourcesData[id] /** * Loads and registers the installed animeextensions. */ private fun initAnimeExtensions() { val animeextensions = AnimeExtensionLoader.loadExtensions(context) installedExtensionsMapFlow.value = animeextensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } untrustedExtensionsMapFlow.value = animeextensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } _isInitialized.value = true } /** * Finds the available anime extensions in the [api] and updates [availableExtensionsMapFlow]. */ suspend fun findAvailableExtensions() { val extensions: List = try { api.findExtensions() } catch (e: Exception) { logcat(LogPriority.ERROR, e) withUIContext { context.toast(MR.strings.extension_api_error) } emptyList() } enableAdditionalSubLanguages(extensions) availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } updatedInstalledAnimeExtensionsStatuses(extensions) setupAvailableAnimeExtensionsSourcesDataMap(extensions) } /** * Enables the additional sub-languages in the app first run. This addresses * the issue where users still need to enable some specific languages even when * the device language is inside that major group. As an example, if a user * has a zh device language, the app will also enable zh-Hans and zh-Hant. * * If the user have already changed the enabledLanguages preference value once, * the new languages will not be added to respect the user enabled choices. */ private fun enableAdditionalSubLanguages(animeextensions: List) { if (subLanguagesEnabledOnFirstRun || animeextensions.isEmpty()) { return } // Use the source lang as some aren't present on the animeextension level. val availableLanguages = animeextensions .flatMap(AnimeExtension.Available::sources) .distinctBy(AnimeExtension.Available.AnimeSource::lang) .map(AnimeExtension.Available.AnimeSource::lang) val deviceLanguage = Locale.getDefault().language val defaultLanguages = preferences.enabledLanguages().defaultValue() val languagesToEnable = availableLanguages.filter { it != deviceLanguage && it.startsWith(deviceLanguage) } preferences.enabledLanguages().set(defaultLanguages + languagesToEnable) subLanguagesEnabledOnFirstRun = true } /** * Sets the update field of the installed animeextensions with the given [availableExtensions]. * * @param availableExtensions The list of animeextensions given by the [api]. */ private fun updatedInstalledAnimeExtensionsStatuses( availableExtensions: List, ) { if (availableExtensions.isEmpty()) { preferences.animeExtensionUpdatesCount().set(0) return } val installedExtensionsMap = installedExtensionsMapFlow.value.toMutableMap() var changed = false for ((pkgName, extension) in installedExtensionsMap) { val availableExt = availableExtensions.find { it.pkgName == pkgName } if (availableExt == null && !extension.isObsolete) { installedExtensionsMap[pkgName] = extension.copy(isObsolete = true) changed = true } else if (availableExt != null) { val hasUpdate = extension.updateExists(availableExt) if (extension.hasUpdate != hasUpdate) { installedExtensionsMap[pkgName] = extension.copy( hasUpdate = hasUpdate, repoUrl = availableExt.repoUrl, ) } else { installedExtensionsMap[pkgName] = extension.copy( repoUrl = availableExt.repoUrl, ) } changed = true } } if (changed) { installedExtensionsMapFlow.value = installedExtensionsMap } updatePendingUpdatesCount() } /** * Returns a flow of the installation process for the given anime extension. It will complete * once the anime extension is installed or throws an error. The process will be canceled if * unsubscribed before its completion. * * @param extension The anime extension to be installed. */ fun installExtension(extension: AnimeExtension.Available): Flow { return installer.downloadAndInstall(api.getApkUrl(extension), extension) } /** * Returns a flow of the installation process for the given anime extension. It will complete * once the anime extension is updated or throws an error. The process will be canceled if * unsubscribed before its completion. * * @param extension The anime extension to be updated. */ fun updateExtension(extension: AnimeExtension.Installed): Flow { val availableExt = availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() return installExtension(availableExt) } fun cancelInstallUpdateExtension(extension: AnimeExtension) { installer.cancelInstall(extension.pkgName) } /** * Sets to "installing" status of an anime extension installation. * * @param downloadId The id of the download. */ fun setInstalling(downloadId: Long) { installer.updateInstallStep(downloadId, InstallStep.Installing) } fun updateInstallStep(downloadId: Long, step: InstallStep) { installer.updateInstallStep(downloadId, step) } /** * Uninstalls the anime extension that matches the given package name. * * @param extension The extension to uninstall. */ fun uninstallExtension(extension: AnimeExtension) { installer.uninstallApk(extension.pkgName) } /** * Adds the given extension to the list of trusted extensions. It also loads in background the * now trusted extensions. * * @param extension the extension to trust */ suspend fun trust(extension: AnimeExtension.Untrusted) { untrustedExtensionsMapFlow.value[extension.pkgName] ?: return trustExtension.trust(extension.pkgName, extension.versionCode, extension.signatureHash) untrustedExtensionsMapFlow.value -= extension.pkgName AnimeExtensionLoader.loadExtensionFromPkgName(context, extension.pkgName) .let { it as? AnimeLoadResult.Success } ?.let { registerNewExtension(it.extension) } } /** * Registers the given anime extension in this and the source managers. * * @param extension The anime extension to be registered. */ private fun registerNewExtension(extension: AnimeExtension.Installed) { installedExtensionsMapFlow.value += extension } /** * Registers the given updated anime extension in this and the source managers previously removing * the outdated ones. * * @param extension The anime extension to be registered. */ private fun registerUpdatedExtension(extension: AnimeExtension.Installed) { installedExtensionsMapFlow.value += extension } /** * Unregisters the animeextension in this and the source managers given its package name. Note this * method is called for every uninstalled application in the system. * * @param pkgName The package name of the uninstalled application. */ private fun unregisterAnimeExtension(pkgName: String) { installedExtensionsMapFlow.value -= pkgName untrustedExtensionsMapFlow.value -= pkgName } /** * Listener which receives events of the anime extensions being installed, updated or removed. */ private inner class AnimeInstallationListener : AnimeExtensionInstallReceiver.Listener { override fun onExtensionInstalled(extension: AnimeExtension.Installed) { registerNewExtension(extension.withUpdateCheck()) updatePendingUpdatesCount() } override fun onExtensionUpdated(extension: AnimeExtension.Installed) { registerUpdatedExtension(extension.withUpdateCheck()) updatePendingUpdatesCount() } override fun onExtensionUntrusted(extension: AnimeExtension.Untrusted) { installedExtensionsMapFlow.value -= extension.pkgName untrustedExtensionsMapFlow.value += extension updatePendingUpdatesCount() } override fun onPackageUninstalled(pkgName: String) { AnimeExtensionLoader.uninstallPrivateExtension(context, pkgName) unregisterAnimeExtension(pkgName) updatePendingUpdatesCount() } } /** * AnimeExtension method to set the update field of an installed anime extension. */ private fun AnimeExtension.Installed.withUpdateCheck(): AnimeExtension.Installed { return if (updateExists()) { copy(hasUpdate = true) } else { this } } private fun AnimeExtension.Installed.updateExists( availableExtension: AnimeExtension.Available? = null, ): Boolean { val availableExt = availableExtension ?: availableExtensionsMapFlow.value[pkgName] ?: return false return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } private fun updatePendingUpdatesCount() { val pendingUpdateCount = installedExtensionsMapFlow.value.values.count { it.hasUpdate } preferences.animeExtensionUpdatesCount().set(pendingUpdateCount) if (pendingUpdateCount == 0) { ExtensionUpdateNotifier(context).dismiss() } } private operator fun Map.plus(extension: T) = plus(extension.pkgName to extension) private fun StateFlow>.mapExtensions( scope: CoroutineScope, ): StateFlow> { return map { it.values.toList() }.stateIn(scope, SharingStarted.Lazily, value.values.toList()) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/api/AnimeExtensionApi.kt ================================================ package eu.kanade.tachiyomi.extension.anime.api import android.content.Context import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionLoader import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import logcat.LogPriority import mihon.domain.extensionrepo.anime.interactor.GetAnimeExtensionRepo import mihon.domain.extensionrepo.anime.interactor.UpdateAnimeExtensionRepo import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.time.Instant import kotlin.time.Duration.Companion.days internal class AnimeExtensionApi { private val networkService: NetworkHelper by injectLazy() private val preferenceStore: PreferenceStore by injectLazy() private val getExtensionRepo: GetAnimeExtensionRepo by injectLazy() private val updateExtensionRepo: UpdateAnimeExtensionRepo by injectLazy() private val animeExtensionManager: AnimeExtensionManager by injectLazy() private val json: Json by injectLazy() private val lastExtCheck: Preference by lazy { preferenceStore.getLong("last_ext_check", 0) } suspend fun findExtensions(): List { return withIOContext { getExtensionRepo.getAll() .map { async { getExtensions(it) } } .awaitAll() .flatten() } } private suspend fun getExtensions(extRepo: ExtensionRepo): List { val repoBaseUrl = extRepo.baseUrl return try { val response = networkService.client .newCall(GET("$repoBaseUrl/index.min.json")) .awaitSuccess() with(json) { response .parseAs>() .toExtensions(repoBaseUrl) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Failed to get extensions from $repoBaseUrl" } emptyList() } } suspend fun checkForUpdates( context: Context, fromAvailableExtensionList: Boolean = false, ): List? { // Limit checks to once a day at most if (fromAvailableExtensionList && Instant.now().toEpochMilli() < lastExtCheck.get() + 1.days.inWholeMilliseconds ) { return null } // Update extension repo details updateExtensionRepo.awaitAll() val extensions = if (fromAvailableExtensionList) { animeExtensionManager.availableExtensionsFlow.value } else { findExtensions().also { lastExtCheck.set(Instant.now().toEpochMilli()) } } val installedExtensions = AnimeExtensionLoader.loadExtensions(context) .filterIsInstance() .map { it.extension } val extensionsWithUpdate = mutableListOf() for (installedExt in installedExtensions) { val pkgName = installedExt.pkgName val availableExt = extensions.find { it.pkgName == pkgName } ?: continue val hasUpdatedVer = availableExt.versionCode > installedExt.versionCode val hasUpdatedLib = availableExt.libVersion > installedExt.libVersion val hasUpdate = hasUpdatedVer || hasUpdatedLib if (hasUpdate) { extensionsWithUpdate.add(installedExt) } } if (extensionsWithUpdate.isNotEmpty()) { ExtensionUpdateNotifier(context).promptUpdates( names = extensionsWithUpdate.map { it.name }, anime = true, ) } return extensionsWithUpdate } private fun List.toExtensions(repoUrl: String): List { return this .filter { val libVersion = it.extractLibVersion() libVersion >= AnimeExtensionLoader.LIB_VERSION_MIN && libVersion <= AnimeExtensionLoader.LIB_VERSION_MAX } .map { AnimeExtension.Available( name = it.name.substringAfter("Aniyomi: "), pkgName = it.pkg, versionName = it.version, versionCode = it.code, libVersion = it.extractLibVersion(), lang = it.lang, isNsfw = it.nsfw == 1, sources = it.sources?.map(extensionAnimeSourceMapper).orEmpty(), apkName = it.apk, iconUrl = "$repoUrl/icon/${it.pkg}.png", repoUrl = repoUrl, ) } } fun getApkUrl(extension: AnimeExtension.Available): String { return "${extension.repoUrl}/apk/${extension.apkName}" } private fun AnimeExtensionJsonObject.extractLibVersion(): Double { return version.substringBeforeLast('.').toDouble() } } @Serializable private data class AnimeExtensionJsonObject( val name: String, val pkg: String, val apk: String, val lang: String, val code: Long, val version: String, val nsfw: Int, val sources: List?, ) @Serializable private data class AnimeExtensionSourceJsonObject( val id: Long, val lang: String, val name: String, val baseUrl: String, ) private val extensionAnimeSourceMapper: (AnimeExtensionSourceJsonObject) -> AnimeExtension.Available.AnimeSource = { AnimeExtension.Available.AnimeSource( id = it.id, lang = it.lang, name = it.name, baseUrl = it.baseUrl, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/InstallerAnime.kt ================================================ package eu.kanade.tachiyomi.extension.anime.installer import android.app.Service import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.Uri import androidx.annotation.CallSuper import androidx.localbroadcastmanager.content.LocalBroadcastManager import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import uy.kohesive.injekt.injectLazy import java.util.Collections import java.util.concurrent.atomic.AtomicReference /** * Base implementation class for extension installer. To be used inside a foreground [Service]. */ abstract class InstallerAnime(private val service: Service) { private val extensionManager: AnimeExtensionManager by injectLazy() private var waitingInstall = AtomicReference(null) private val queue = Collections.synchronizedList(mutableListOf()) private val cancelReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val downloadId = intent.getLongExtra(EXTRA_DOWNLOAD_ID, -1).takeIf { it >= 0 } ?: return cancelQueue(downloadId) } } /** * Installer readiness. If false, queue check will not run. * * @see checkQueue */ abstract var ready: Boolean /** * Add an item to install queue. * * @param downloadId Download ID as known by [ExtensionManager] * @param uri Uri of APK to install */ fun addToQueue(downloadId: Long, uri: Uri) { queue.add(Entry(downloadId, uri)) checkQueue() } /** * Proceeds to install the APK of this entry inside this method. Call [continueQueue] * when the install process for this entry is finished to continue the queue. * * @param entry The [Entry] of item to process * @see continueQueue */ @CallSuper open fun processEntry(entry: Entry) { extensionManager.setInstalling(entry.downloadId) } /** * Called before queue continues. Override this to handle when the removed entry is * currently being processed. * * @return true if this entry can be removed from queue. */ open fun cancelEntry(entry: Entry): Boolean { return true } /** * Tells the queue to continue processing the next entry and updates the install step * of the completed entry ([waitingInstall]) to [ExtensionManager]. * * @param resultStep new install step for the processed entry. * @see waitingInstall */ fun continueQueue(resultStep: InstallStep) { val completedEntry = waitingInstall.getAndSet(null) if (completedEntry != null) { extensionManager.updateInstallStep(completedEntry.downloadId, resultStep) checkQueue() } } /** * Checks the queue. The provided service will be stopped if the queue is empty. * Will not be run when not ready. * * @see ready */ fun checkQueue() { if (!ready) { return } if (queue.isEmpty()) { service.stopSelf() return } val nextEntry = queue.first() if (waitingInstall.compareAndSet(null, nextEntry)) { queue.removeAt(0) processEntry(nextEntry) } } /** * Call this method when the provided service is destroyed. */ @CallSuper open fun onDestroy() { LocalBroadcastManager.getInstance(service).unregisterReceiver(cancelReceiver) queue.forEach { extensionManager.updateInstallStep(it.downloadId, InstallStep.Error) } queue.clear() waitingInstall.set(null) } protected fun getActiveEntry(): Entry? = waitingInstall.get() /** * Cancels queue for the provided download ID if exists. * * @param downloadId Download ID as known by [ExtensionManager] */ private fun cancelQueue(downloadId: Long) { val waitingInstall = this.waitingInstall.get() val toCancel = queue.find { it.downloadId == downloadId } ?: waitingInstall ?: return if (cancelEntry(toCancel)) { queue.remove(toCancel) if (waitingInstall == toCancel) { // Currently processing removed entry, continue queue this.waitingInstall.set(null) checkQueue() } extensionManager.updateInstallStep(downloadId, InstallStep.Idle) } } /** * Install item to queue. * * @param downloadId Download ID as known by [ExtensionManager] * @param uri Uri of APK to install */ data class Entry(val downloadId: Long, val uri: Uri) init { val filter = IntentFilter(ACTION_CANCEL_QUEUE) LocalBroadcastManager.getInstance(service).registerReceiver(cancelReceiver, filter) } companion object { private const val ACTION_CANCEL_QUEUE = "InstallerAnime.action.CANCEL_QUEUE" private const val EXTRA_DOWNLOAD_ID = "InstallerAnime.extra.DOWNLOAD_ID" /** * Attempts to cancel the installation entry for the provided download ID. * * @param downloadId Download ID as known by [ExtensionManager] */ fun cancelInstallQueue(context: Context, downloadId: Long) { val intent = Intent(ACTION_CANCEL_QUEUE) intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId) LocalBroadcastManager.getInstance(context).sendBroadcast(intent) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt ================================================ package eu.kanade.tachiyomi.extension.anime.installer import android.app.PendingIntent import android.app.Service import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageInstaller import android.os.Build import androidx.core.content.ContextCompat import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.util.lang.use import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.getUriSize import logcat.LogPriority import tachiyomi.core.common.util.system.logcat class PackageInstallerInstallerAnime(private val service: Service) : InstallerAnime(service) { private val packageInstaller = service.packageManager.packageInstaller private val packageActionReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE)) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { val userAction = intent.getParcelableExtraCompat(Intent.EXTRA_INTENT) if (userAction == null) { logcat(LogPriority.ERROR) { "Fatal error for $intent" } continueQueue(InstallStep.Error) return } userAction.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) service.startActivity(userAction) } PackageInstaller.STATUS_FAILURE_ABORTED -> { continueQueue(InstallStep.Idle) } PackageInstaller.STATUS_SUCCESS -> continueQueue(InstallStep.Installed) else -> continueQueue(InstallStep.Error) } } } private var activeSession: Pair? = null // Always ready override var ready = true override fun processEntry(entry: Entry) { super.processEntry(entry) activeSession = null try { val installParams = PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL, ) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { installParams.setRequireUserAction( PackageInstaller.SessionParams.USER_ACTION_NOT_REQUIRED, ) } activeSession = entry to packageInstaller.createSession(installParams) val fileSize = service.getUriSize(entry.uri) ?: throw IllegalStateException() installParams.setSize(fileSize) val inputStream = service.contentResolver.openInputStream(entry.uri) ?: throw IllegalStateException() val session = packageInstaller.openSession(activeSession!!.second) val outputStream = session.openWrite(entry.downloadId.toString(), 0, fileSize) session.use { arrayOf(inputStream, outputStream).use { inputStream.copyTo(outputStream) session.fsync(outputStream) } val intentSender = PendingIntent.getBroadcast( service, activeSession!!.second, Intent(INSTALL_ACTION).setPackage(service.packageName), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0, ).intentSender session.commit(intentSender) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } activeSession?.let { (_, sessionId) -> packageInstaller.abandonSession(sessionId) } continueQueue(InstallStep.Error) } } override fun cancelEntry(entry: Entry): Boolean { activeSession?.let { (activeEntry, sessionId) -> if (activeEntry == entry) { packageInstaller.abandonSession(sessionId) return false } } return true } override fun onDestroy() { service.unregisterReceiver(packageActionReceiver) super.onDestroy() } init { ContextCompat.registerReceiver( service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_EXPORTED, ) } } private const val INSTALL_ACTION = "PackageInstallerInstaller.INSTALL_ACTION" ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/ShizukuInstallerAnime.kt ================================================ package eu.kanade.tachiyomi.extension.anime.installer import android.app.Service import android.content.pm.PackageManager import android.os.Process import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.util.system.getUriSize import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import logcat.LogPriority import rikka.shizuku.Shizuku import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import java.io.BufferedReader import java.io.InputStream class ShizukuInstallerAnime(private val service: Service) : InstallerAnime(service) { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val shizukuDeadListener = Shizuku.OnBinderDeadListener { logcat(LogPriority.ERROR) { "Shizuku was killed prematurely" } service.stopSelf() } private val shizukuPermissionListener = object : Shizuku.OnRequestPermissionResultListener { override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) { if (requestCode == SHIZUKU_PERMISSION_REQUEST_CODE) { if (grantResult == PackageManager.PERMISSION_GRANTED) { ready = true checkQueue() } else { service.stopSelf() } Shizuku.removeRequestPermissionResultListener(this) } } } override var ready = false override fun processEntry(entry: Entry) { super.processEntry(entry) scope.launch { var sessionId: String? = null try { val size = service.getUriSize(entry.uri) ?: throw IllegalStateException() service.contentResolver.openInputStream(entry.uri)!!.use { val userId = Process.myUserHandle().hashCode() val createCommand = "pm install-create --user $userId -r -i ${service.packageName} -S $size" val createResult = exec(createCommand) sessionId = SESSION_ID_REGEX.find(createResult.out)?.value ?: throw RuntimeException("Failed to create install session") val writeResult = exec("pm install-write -S $size $sessionId base -", it) if (writeResult.resultCode != 0) { throw RuntimeException("Failed to write APK to session $sessionId") } val commitResult = exec("pm install-commit $sessionId") if (commitResult.resultCode != 0) { throw RuntimeException("Failed to commit install session $sessionId") } continueQueue(InstallStep.Installed) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } if (sessionId != null) { exec("pm install-abandon $sessionId") } continueQueue(InstallStep.Error) } } } // Don't cancel if entry is already started installing override fun cancelEntry(entry: Entry): Boolean = getActiveEntry() != entry override fun onDestroy() { Shizuku.removeBinderDeadListener(shizukuDeadListener) Shizuku.removeRequestPermissionResultListener(shizukuPermissionListener) scope.cancel() super.onDestroy() } private fun exec(command: String, stdin: InputStream? = null): ShellResult { @Suppress("DEPRECATION") val process = Shizuku.newProcess(arrayOf("sh", "-c", command), null, null) if (stdin != null) { process.outputStream.use { stdin.copyTo(it) } } val output = process.inputStream.bufferedReader().use(BufferedReader::readText) val resultCode = process.waitFor() return ShellResult(resultCode, output) } private data class ShellResult(val resultCode: Int, val out: String) init { Shizuku.addBinderDeadListener(shizukuDeadListener) ready = if (Shizuku.pingBinder()) { if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { true } else { Shizuku.addRequestPermissionResultListener(shizukuPermissionListener) Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) false } } else { logcat(LogPriority.ERROR) { "Shizuku is not ready to use" } service.toast(MR.strings.ext_installer_shizuku_stopped) service.stopSelf() false } } } private const val SHIZUKU_PERMISSION_REQUEST_CODE = 14045 private val SESSION_ID_REGEX = Regex("(?<=\\[).+?(?=])") ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/model/AnimeExtension.kt ================================================ package eu.kanade.tachiyomi.extension.anime.model import android.graphics.drawable.Drawable import eu.kanade.tachiyomi.animesource.AnimeSource import tachiyomi.domain.source.anime.model.StubAnimeSource sealed class AnimeExtension { abstract val name: String abstract val pkgName: String abstract val versionName: String abstract val versionCode: Long abstract val libVersion: Double abstract val lang: String? abstract val isNsfw: Boolean data class Installed( override val name: String, override val pkgName: String, override val versionName: String, override val versionCode: Long, override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, val pkgFactory: String?, val sources: List, val icon: Drawable?, val hasUpdate: Boolean = false, val isObsolete: Boolean = false, val isShared: Boolean, val repoUrl: String? = null, ) : AnimeExtension() data class Available( override val name: String, override val pkgName: String, override val versionName: String, override val versionCode: Long, override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, val sources: List, val apkName: String, val iconUrl: String, val repoUrl: String, ) : AnimeExtension() { data class AnimeSource( val id: Long, val lang: String, val name: String, val baseUrl: String, ) { fun toStubSource(): StubAnimeSource { return StubAnimeSource( id = this.id, lang = this.lang, name = this.name, ) } } } data class Untrusted( override val name: String, override val pkgName: String, override val versionName: String, override val versionCode: Long, override val libVersion: Double, val signatureHash: String, override val lang: String? = null, override val isNsfw: Boolean = false, ) : AnimeExtension() } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/model/AnimeLoadResult.kt ================================================ package eu.kanade.tachiyomi.extension.anime.model sealed interface AnimeLoadResult { data class Success(val extension: AnimeExtension.Installed) : AnimeLoadResult data class Untrusted(val extension: AnimeExtension.Untrusted) : AnimeLoadResult data object Error : AnimeLoadResult } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt ================================================ package eu.kanade.tachiyomi.extension.anime.util import android.app.Activity import android.content.Intent import android.os.Bundle import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller import eu.kanade.tachiyomi.util.system.toast import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds /** * Activity used to install extensions, because we can only receive the result of the installation * with [startActivityForResult], which we need to update the UI. */ class AnimeExtensionInstallActivity : Activity() { // MIUI package installer bug workaround private var ignoreUntil = 0L private var ignoreResult = false private var hasIgnoredResult = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @Suppress("DEPRECATION") val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE) .setDataAndType(intent.data, intent.type) .putExtra(Intent.EXTRA_RETURN_RESULT, true) .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) if (hasMiuiPackageInstaller) { ignoreResult = true ignoreUntil = System.nanoTime() + 1.seconds.inWholeNanoseconds } try { startActivityForResult(installIntent, INSTALL_REQUEST_CODE) } catch (error: Exception) { // Either install package can't be found (probably bots) or there's a security exception // with the download manager. Nothing we can workaround. toast(error.message) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (ignoreResult && System.nanoTime() < ignoreUntil) { hasIgnoredResult = true return } if (requestCode == INSTALL_REQUEST_CODE) { checkInstallationResult(resultCode) } finish() } override fun onStart() { super.onStart() if (hasIgnoredResult) { checkInstallationResult(RESULT_CANCELED) finish() } } private fun checkInstallationResult(resultCode: Int) { val downloadId = intent.extras!!.getLong(AnimeExtensionInstaller.EXTRA_DOWNLOAD_ID) val extensionManager = Injekt.get() val newStep = when (resultCode) { RESULT_OK -> InstallStep.Installed RESULT_CANCELED -> InstallStep.Idle else -> InstallStep.Error } extensionManager.updateInstallStep(downloadId, newStep) } } private const val INSTALL_REQUEST_CODE = 500 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt ================================================ package eu.kanade.tachiyomi.extension.anime.util import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import androidx.core.content.ContextCompat import androidx.core.net.toUri import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.system.logcat /** * Broadcast receiver that listens for the system's packages installed, updated or removed, and only * notifies the given [listener] when the package is an extension. * * @param listener The listener that should be notified of extension installation events. */ internal class AnimeExtensionInstallReceiver(private val listener: Listener) : BroadcastReceiver() { val scope = CoroutineScope(SupervisorJob()) fun register(context: Context) { ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_NOT_EXPORTED) } private val filter = IntentFilter().apply { addAction(Intent.ACTION_PACKAGE_ADDED) addAction(Intent.ACTION_PACKAGE_REPLACED) addAction(Intent.ACTION_PACKAGE_REMOVED) addAction(ACTION_EXTENSION_ADDED) addAction(ACTION_EXTENSION_REPLACED) addAction(ACTION_EXTENSION_REMOVED) addDataScheme("package") } /** * Called when one of the events of the [filter] is received. When the package is an extension, * it's loaded in background and it notifies the [listener] when finished. */ override fun onReceive(context: Context, intent: Intent?) { if (intent == null) return when (intent.action) { Intent.ACTION_PACKAGE_ADDED, ACTION_EXTENSION_ADDED -> { if (isReplacing(intent)) return scope.launch { when (val result = getExtensionFromIntent(context, intent)) { is AnimeLoadResult.Success -> listener.onExtensionInstalled(result.extension) is AnimeLoadResult.Untrusted -> listener.onExtensionUntrusted(result.extension) else -> {} } } } Intent.ACTION_PACKAGE_REPLACED, ACTION_EXTENSION_REPLACED -> { scope.launch { when (val result = getExtensionFromIntent(context, intent)) { is AnimeLoadResult.Success -> listener.onExtensionUpdated(result.extension) is AnimeLoadResult.Untrusted -> listener.onExtensionUntrusted(result.extension) else -> {} } } } Intent.ACTION_PACKAGE_REMOVED, ACTION_EXTENSION_REMOVED -> { if (isReplacing(intent)) return val pkgName = getPackageNameFromIntent(intent) if (pkgName != null) { listener.onPackageUninstalled(pkgName) } } } } /** * Returns true if this package is performing an update. * * @param intent The intent that triggered the event. */ private fun isReplacing(intent: Intent): Boolean { return intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) } /** * Returns the extension triggered by the given intent. * * @param context The application context. * @param intent The intent containing the package name of the extension. */ private suspend fun getExtensionFromIntent(context: Context, intent: Intent?): AnimeLoadResult { val pkgName = getPackageNameFromIntent(intent) if (pkgName == null) { logcat(LogPriority.WARN) { "Package name not found" } return AnimeLoadResult.Error } return AnimeExtensionLoader.loadExtensionFromPkgName(context, pkgName) } /** * Returns the package name of the installed, updated or removed application. */ private fun getPackageNameFromIntent(intent: Intent?): String? { return intent?.data?.encodedSchemeSpecificPart ?: return null } /** * Listener that receives extension installation events. */ interface Listener { fun onExtensionInstalled(extension: AnimeExtension.Installed) fun onExtensionUpdated(extension: AnimeExtension.Installed) fun onExtensionUntrusted(extension: AnimeExtension.Untrusted) fun onPackageUninstalled(pkgName: String) } companion object { private const val ACTION_EXTENSION_ADDED = "${BuildConfig.APPLICATION_ID}.ACTION_EXTENSION_ADDED" private const val ACTION_EXTENSION_REPLACED = "${BuildConfig.APPLICATION_ID}.ACTION_EXTENSION_REPLACED" private const val ACTION_EXTENSION_REMOVED = "${BuildConfig.APPLICATION_ID}.ACTION_EXTENSION_REMOVED" fun notifyAdded(context: Context, pkgName: String) { notify(context, pkgName, ACTION_EXTENSION_ADDED) } fun notifyReplaced(context: Context, pkgName: String) { notify(context, pkgName, ACTION_EXTENSION_REPLACED) } fun notifyRemoved(context: Context, pkgName: String) { notify(context, pkgName, ACTION_EXTENSION_REMOVED) } private fun notify(context: Context, pkgName: String, action: String) { Intent(action).apply { data = "package:$pkgName".toUri() `package` = context.packageName context.sendBroadcast(this) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallService.kt ================================================ package eu.kanade.tachiyomi.extension.anime.util import android.app.Service import android.content.Context import android.content.Intent import android.net.Uri import android.os.IBinder import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.extension.anime.installer.InstallerAnime import eu.kanade.tachiyomi.extension.anime.installer.PackageInstallerInstallerAnime import eu.kanade.tachiyomi.extension.anime.installer.ShizukuInstallerAnime import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionInstaller.Companion.EXTRA_DOWNLOAD_ID import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import eu.kanade.tachiyomi.util.system.notificationBuilder import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR class AnimeExtensionInstallService : Service() { private var installer: InstallerAnime? = null override fun onCreate() { val notification = notificationBuilder(Notifications.CHANNEL_EXTENSIONS_UPDATE) { setSmallIcon(R.drawable.ic_ani) setAutoCancel(false) setOngoing(true) setShowWhen(false) setContentTitle(stringResource(MR.strings.ext_install_service_notif)) setProgress(100, 100, true) }.build() startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val uri = intent?.data val id = intent?.getLongExtra(EXTRA_DOWNLOAD_ID, -1)?.takeIf { it != -1L } val installerUsed = intent?.getSerializableExtraCompat( EXTRA_INSTALLER, ) if (uri == null || id == null || installerUsed == null) { stopSelf() return START_NOT_STICKY } if (installer == null) { installer = when (installerUsed) { BasePreferences.ExtensionInstaller.PACKAGEINSTALLER -> PackageInstallerInstallerAnime( this, ) BasePreferences.ExtensionInstaller.SHIZUKU -> ShizukuInstallerAnime(this) else -> { logcat(LogPriority.ERROR) { "Not implemented for installer $installerUsed" } stopSelf() return START_NOT_STICKY } } } installer!!.addToQueue(id, uri) return START_NOT_STICKY } override fun onDestroy() { installer?.onDestroy() installer = null } override fun onBind(i: Intent?): IBinder? = null companion object { private const val EXTRA_INSTALLER = "EXTRA_INSTALLER" fun getIntent( context: Context, downloadId: Long, uri: Uri, installer: BasePreferences.ExtensionInstaller, ): Intent { return Intent(context, AnimeExtensionInstallService::class.java) .setDataAndType(uri, AnimeExtensionInstaller.APK_MIME) .putExtra(EXTRA_DOWNLOAD_ID, downloadId) .putExtra(EXTRA_INSTALLER, installer) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt ================================================ package eu.kanade.tachiyomi.extension.anime.util import android.app.DownloadManager import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.Uri import android.os.Environment import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.net.toUri import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.installer.InstallerAnime import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.isPackageInstalled import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.transformWhile import logcat.LogPriority import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import kotlin.time.Duration.Companion.seconds /** * The installer which installs, updates and uninstalls the extensions. * * @param context The application context. */ internal class AnimeExtensionInstaller(private val context: Context) { /** * The system's download manager */ private val downloadManager = context.getSystemService()!! /** * The broadcast receiver which listens to download completion events. */ private val downloadReceiver = DownloadCompletionReceiver() /** * The currently requested downloads, with the package name (unique id) as key, and the id * returned by the download manager. */ private val activeDownloads = hashMapOf() private val downloadsStateFlows = hashMapOf>() private val extensionInstaller = Injekt.get().extensionInstaller() /** * Adds the given extension to the downloads queue and returns an observable containing its * step in the installation process. * * @param url The url of the apk. * @param extension The extension to install. */ fun downloadAndInstall(url: String, extension: AnimeExtension): Flow { val pkgName = extension.pkgName val oldDownload = activeDownloads[pkgName] if (oldDownload != null) { deleteDownload(pkgName) } // Register the receiver after removing (and unregistering) the previous download downloadReceiver.register() val downloadUri = url.toUri() val request = DownloadManager.Request(downloadUri) .setTitle(extension.name) .setMimeType(APK_MIME) .setDestinationInExternalFilesDir( context, Environment.DIRECTORY_DOWNLOADS, downloadUri.lastPathSegment, ) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) val id = downloadManager.enqueue(request) activeDownloads[pkgName] = id val downloadStateFlow = MutableStateFlow(InstallStep.Pending) downloadsStateFlows[id] = downloadStateFlow // Poll download status val pollStatusFlow = downloadStatusFlow(id).mapNotNull { downloadStatus -> // Map to our model when (downloadStatus) { DownloadManager.STATUS_PENDING -> InstallStep.Pending DownloadManager.STATUS_RUNNING -> InstallStep.Downloading else -> null } } return merge(downloadStateFlow, pollStatusFlow).transformWhile { emit(it) // Stop when the application is installed or errors !it.isCompleted() }.onCompletion { // Always notify on main thread withUIContext { // Always remove the download when unsubscribed deleteDownload(pkgName) } } } /** * Returns a flow that polls the given download id for its status every second, as the * manager doesn't have any notification system. It'll stop once the download finishes. * * @param id The id of the download to poll. */ private fun downloadStatusFlow(id: Long): Flow = flow { val query = DownloadManager.Query().setFilterById(id) while (true) { // Get the current download status val downloadStatus = downloadManager.query(query).use { cursor -> if (!cursor.moveToFirst()) return@flow cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS)) } emit(downloadStatus) // Stop polling when the download fails or finishes if (downloadStatus == DownloadManager.STATUS_SUCCESSFUL || downloadStatus == DownloadManager.STATUS_FAILED ) { return@flow } delay(1.seconds) } } // Ignore duplicate results .distinctUntilChanged() /** * Starts an intent to install the extension at the given uri. * * @param uri The uri of the extension to install. */ fun installApk(downloadId: Long, uri: Uri) { when (val installer = extensionInstaller.get()) { BasePreferences.ExtensionInstaller.LEGACY -> { val intent = Intent(context, AnimeExtensionInstallActivity::class.java) .setDataAndType(uri, APK_MIME) .putExtra(EXTRA_DOWNLOAD_ID, downloadId) .setFlags( Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION, ) context.startActivity(intent) } BasePreferences.ExtensionInstaller.PRIVATE -> { val extensionManager = Injekt.get() val tempFile = File(context.cacheDir, "temp_$downloadId") if (tempFile.exists() && !tempFile.delete()) { // Unlikely but just in case extensionManager.updateInstallStep(downloadId, InstallStep.Error) return } try { context.contentResolver.openInputStream(uri)?.use { input -> tempFile.outputStream().use { output -> input.copyTo(output) } } if (AnimeExtensionLoader.installPrivateExtensionFile(context, tempFile)) { extensionManager.updateInstallStep(downloadId, InstallStep.Installed) } else { extensionManager.updateInstallStep(downloadId, InstallStep.Error) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to read downloaded extension file." } extensionManager.updateInstallStep(downloadId, InstallStep.Error) } tempFile.delete() } else -> { val intent = AnimeExtensionInstallService.getIntent(context, downloadId, uri, installer) ContextCompat.startForegroundService(context, intent) } } } /** * Cancels extension install and remove from download manager and installer. */ fun cancelInstall(pkgName: String) { val downloadId = activeDownloads.remove(pkgName) ?: return downloadManager.remove(downloadId) InstallerAnime.cancelInstallQueue(context, downloadId) } /** * Starts an intent to uninstall the extension by the given package name. * * @param pkgName The package name of the extension to uninstall */ fun uninstallApk(pkgName: String) { if (context.isPackageInstalled(pkgName)) { @Suppress("DEPRECATION") val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE, "package:$pkgName".toUri()) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context.startActivity(intent) } else { AnimeExtensionLoader.uninstallPrivateExtension(context, pkgName) AnimeExtensionInstallReceiver.notifyRemoved(context, pkgName) } } /** * Sets the step of the installation of an extension. * * @param downloadId The id of the download. * @param step New install step. */ fun updateInstallStep(downloadId: Long, step: InstallStep) { downloadsStateFlows[downloadId]?.let { it.value = step } } /** * Deletes the download for the given package name. * * @param pkgName The package name of the download to delete. */ private fun deleteDownload(pkgName: String) { val downloadId = activeDownloads.remove(pkgName) if (downloadId != null) { downloadManager.remove(downloadId) downloadsStateFlows.remove(downloadId) } if (activeDownloads.isEmpty()) { downloadReceiver.unregister() } } /** * Receiver that listens to download status events. */ private inner class DownloadCompletionReceiver : BroadcastReceiver() { /** * Whether this receiver is currently registered. */ private var isRegistered = false /** * Registers this receiver if it's not already. */ fun register() { if (isRegistered) return isRegistered = true val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED) } /** * Unregisters this receiver if it's not already. */ fun unregister() { if (!isRegistered) return isRegistered = false context.unregisterReceiver(this) } /** * Called when a download event is received. It looks for the download in the current active * downloads and notifies its installation step. */ override fun onReceive(context: Context, intent: Intent?) { val id = intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) ?: return // Avoid events for downloads we didn't request if (id !in activeDownloads.values) return val uri = downloadManager.getUriForDownloadedFile(id) // Set next installation step if (uri == null) { logcat(LogPriority.ERROR) { "Couldn't locate downloaded APK" } updateInstallStep(id, InstallStep.Error) return } val query = DownloadManager.Query().setFilterById(id) downloadManager.query(query).use { cursor -> if (cursor.moveToFirst()) { val localUri = cursor.getString( cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI), ).removePrefix(FILE_SCHEME) installApk(id, File(localUri).getUriCompat(context)) } } } } companion object { const val APK_MIME = "application/vnd.android.package-archive" const val EXTRA_DOWNLOAD_ID = "AnimeExtensionInstaller.extra.DOWNLOAD_ID" const val FILE_SCHEME = "file://" } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt ================================================ package eu.kanade.tachiyomi.extension.anime.util import android.annotation.SuppressLint import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.os.Build import androidx.core.content.pm.PackageInfoCompat import dalvik.system.PathClassLoader import eu.kanade.domain.extension.anime.interactor.TrustAnimeExtension import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.AnimeSourceFactory import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult import eu.kanade.tachiyomi.util.lang.Hash import eu.kanade.tachiyomi.util.storage.copyAndSetReadOnlyTo import eu.kanade.tachiyomi.util.system.ChildFirstPathClassLoader import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.io.File /** * Class that handles the loading of the extensions installed in the system. */ @SuppressLint("PackageManagerGetSignatures") internal object AnimeExtensionLoader { private val preferences: SourcePreferences by injectLazy() private val trustExtension: TrustAnimeExtension by injectLazy() private val loadNsfwSource by lazy { preferences.showNsfwSource().get() } private const val EXTENSION_FEATURE = "tachiyomi.animeextension" private const val METADATA_SOURCE_CLASS = "tachiyomi.animeextension.class" private const val METADATA_SOURCE_FACTORY = "tachiyomi.animeextension.factory" private const val METADATA_NSFW = "tachiyomi.animeextension.nsfw" private const val METADATA_HAS_README = "tachiyomi.animeextension.hasReadme" private const val METADATA_HAS_CHANGELOG = "tachiyomi.animeextension.hasChangelog" const val LIB_VERSION_MIN = 12 const val LIB_VERSION_MAX = 16 @Suppress("DEPRECATION") private val PACKAGE_FLAGS = PackageManager.GET_CONFIGURATIONS or PackageManager.GET_META_DATA or PackageManager.GET_SIGNATURES or (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) PackageManager.GET_SIGNING_CERTIFICATES else 0) private const val PRIVATE_EXTENSION_EXTENSION = "ext" private fun getPrivateExtensionDir(context: Context) = File(context.filesDir, "exts") fun installPrivateExtensionFile(context: Context, file: File): Boolean { val extension = context.packageManager.getPackageArchiveInfo( file.absolutePath, PACKAGE_FLAGS, ) ?.takeIf { isPackageAnExtension(it) } ?: return false val currentExtension = getAnimeExtensionPackageInfoFromPkgName( context, extension.packageName, ) if (currentExtension != null) { if (PackageInfoCompat.getLongVersionCode(extension) < PackageInfoCompat.getLongVersionCode(currentExtension) ) { logcat(LogPriority.ERROR) { "Installed extension version is higher. Downgrading is not allowed." } return false } val extensionSignatures = getSignatures(extension) if (extensionSignatures.isNullOrEmpty()) { logcat(LogPriority.ERROR) { "Extension to be installed is not signed." } return false } if (!extensionSignatures.containsAll(getSignatures(currentExtension)!!)) { logcat(LogPriority.ERROR) { "Installed extension signature is not matched." } return false } } val target = File( getPrivateExtensionDir(context), "${extension.packageName}.$PRIVATE_EXTENSION_EXTENSION", ) return try { target.delete() file.copyAndSetReadOnlyTo(target, overwrite = true) if (currentExtension != null) { AnimeExtensionInstallReceiver.notifyReplaced(context, extension.packageName) } else { AnimeExtensionInstallReceiver.notifyAdded(context, extension.packageName) } true } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to copy extension file." } target.delete() false } } fun uninstallPrivateExtension(context: Context, pkgName: String) { File(getPrivateExtensionDir(context), "$pkgName.$PRIVATE_EXTENSION_EXTENSION").delete() } /** * Return a list of all the available extensions initialized concurrently. * * @param context The application context. */ fun loadExtensions(context: Context): List { val pkgManager = context.packageManager val installedPkgs = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { pkgManager.getInstalledPackages( PackageManager.PackageInfoFlags.of(PACKAGE_FLAGS.toLong()), ) } else { pkgManager.getInstalledPackages(PACKAGE_FLAGS) } val sharedExtPkgs = installedPkgs .asSequence() .filter { isPackageAnExtension(it) } .map { AnimeExtensionInfo(packageInfo = it, isShared = true) } val privateExtPkgs = getPrivateExtensionDir(context) .listFiles() ?.asSequence() ?.filter { it.isFile && it.extension == PRIVATE_EXTENSION_EXTENSION } ?.mapNotNull { // Just in case, since Android 14+ requires them to be read-only if (it.canWrite()) { it.setReadOnly() } val path = it.absolutePath pkgManager.getPackageArchiveInfo(path, PACKAGE_FLAGS) ?.apply { applicationInfo!!.fixBasePaths(path) } } ?.filter { isPackageAnExtension(it) } ?.map { AnimeExtensionInfo(packageInfo = it, isShared = false) } ?: emptySequence() val extPkgs = (sharedExtPkgs + privateExtPkgs) // Remove duplicates. Shared takes priority than private by default .distinctBy { it.packageInfo.packageName } // Compare version number .mapNotNull { sharedPkg -> val privatePkg = privateExtPkgs .singleOrNull { it.packageInfo.packageName == sharedPkg.packageInfo.packageName } selectExtensionPackage(sharedPkg, privatePkg) } .toList() if (extPkgs.isEmpty()) return emptyList() // Load each extension concurrently and wait for completion return runBlocking { val deferred = extPkgs.map { async { loadExtension(context, it) } } deferred.awaitAll() } } /** * Attempts to load an extension from the given package name. It checks if the extension * contains the required feature flag before trying to load it. */ suspend fun loadExtensionFromPkgName(context: Context, pkgName: String): AnimeLoadResult { val extensionPackage = getAnimeExtensionInfoFromPkgName(context, pkgName) if (extensionPackage == null) { logcat(LogPriority.ERROR) { "Extension package is not found ($pkgName)" } return AnimeLoadResult.Error } return loadExtension(context, extensionPackage) } fun getAnimeExtensionPackageInfoFromPkgName(context: Context, pkgName: String): PackageInfo? { return getAnimeExtensionInfoFromPkgName(context, pkgName)?.packageInfo } private fun getAnimeExtensionInfoFromPkgName(context: Context, pkgName: String): AnimeExtensionInfo? { val privateExtensionFile = File( getPrivateExtensionDir(context), "$pkgName.$PRIVATE_EXTENSION_EXTENSION", ) val privatePkg = if (privateExtensionFile.isFile) { context.packageManager.getPackageArchiveInfo( privateExtensionFile.absolutePath, PACKAGE_FLAGS, ) ?.takeIf { isPackageAnExtension(it) } ?.let { it.applicationInfo!!.fixBasePaths(privateExtensionFile.absolutePath) AnimeExtensionInfo( packageInfo = it, isShared = false, ) } } else { null } val sharedPkg = try { context.packageManager.getPackageInfo(pkgName, PACKAGE_FLAGS) .takeIf { isPackageAnExtension(it) } ?.let { AnimeExtensionInfo( packageInfo = it, isShared = true, ) } } catch (error: PackageManager.NameNotFoundException) { null } return selectExtensionPackage(sharedPkg, privatePkg) } /** * Loads an extension * * @param context The application context. * @param extensionInfo The extension to load. */ private suspend fun loadExtension(context: Context, extensionInfo: AnimeExtensionInfo): AnimeLoadResult { val pkgManager = context.packageManager val pkgInfo = extensionInfo.packageInfo val appInfo = pkgInfo.applicationInfo!! val pkgName = pkgInfo.packageName val extName = pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Aniyomi: ") val versionName = pkgInfo.versionName val versionCode = PackageInfoCompat.getLongVersionCode(pkgInfo) if (versionName.isNullOrEmpty()) { logcat(LogPriority.WARN) { "Missing versionName for extension $extName" } return AnimeLoadResult.Error } // Validate lib version val libVersion = versionName.substringBeforeLast('.').toDoubleOrNull() if (libVersion == null || libVersion < LIB_VERSION_MIN || libVersion > LIB_VERSION_MAX) { logcat(LogPriority.WARN) { "Lib version is $libVersion, while only versions " + "$LIB_VERSION_MIN to $LIB_VERSION_MAX are allowed" } return AnimeLoadResult.Error } val signatures = getSignatures(pkgInfo) if (signatures.isNullOrEmpty()) { logcat(LogPriority.WARN) { "Package $pkgName isn't signed" } return AnimeLoadResult.Error } else if (!trustExtension.isTrusted(pkgInfo, signatures)) { val extension = AnimeExtension.Untrusted( extName, pkgName, versionName, versionCode, libVersion, signatures.last(), ) logcat(LogPriority.WARN, message = { "Extension $pkgName isn't trusted" }) return AnimeLoadResult.Untrusted(extension) } val isNsfw = appInfo.metaData.getInt(METADATA_NSFW) == 1 if (!loadNsfwSource && isNsfw) { logcat(LogPriority.WARN) { "NSFW extension $pkgName not allowed" } return AnimeLoadResult.Error } val classLoader = try { ChildFirstPathClassLoader(appInfo.sourceDir, null, context.classLoader) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Extension load error: $extName ($pkgName)" } return AnimeLoadResult.Error } val sources = appInfo.metaData.getString(METADATA_SOURCE_CLASS)!! .split(";") .map { val sourceClass = it.trim() if (sourceClass.startsWith(".")) { pkgInfo.packageName + sourceClass } else { sourceClass } } .flatMap { try { when (val obj = Class.forName(it, false, classLoader).getDeclaredConstructor().newInstance()) { is AnimeSource -> listOf(obj) is AnimeSourceFactory -> obj.createSources() else -> throw Exception("Unknown source class type: ${obj.javaClass}") } } catch (e: LinkageError) { try { val fallBackClassLoader = PathClassLoader(appInfo.sourceDir, null, context.classLoader) when ( val obj = Class.forName( it, false, fallBackClassLoader, ).getDeclaredConstructor().newInstance() ) { is AnimeSource -> { listOf(obj) } is AnimeSourceFactory -> obj.createSources() else -> throw Exception("Unknown source class type: ${obj.javaClass}") } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Extension load error: $extName ($it)" } return AnimeLoadResult.Error } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Extension load error: $extName ($it)" } return AnimeLoadResult.Error } } val langs = sources.filterIsInstance() .map { it.lang } .toSet() val lang = when (langs.size) { 0 -> "" 1 -> langs.first() else -> "all" } val extension = AnimeExtension.Installed( name = extName, pkgName = pkgName, versionName = versionName, versionCode = versionCode, libVersion = libVersion, lang = lang, isNsfw = isNsfw, sources = sources, pkgFactory = appInfo.metaData.getString(METADATA_SOURCE_FACTORY), icon = appInfo.loadIcon(pkgManager), isShared = extensionInfo.isShared, ) return AnimeLoadResult.Success(extension) } /** * Choose which extension package to use based on version code * * @param shared extension installed to system * @param private extension installed to data directory */ private fun selectExtensionPackage(shared: AnimeExtensionInfo?, private: AnimeExtensionInfo?): AnimeExtensionInfo? { when { private == null && shared != null -> return shared shared == null && private != null -> return private shared == null && private == null -> return null } return if (PackageInfoCompat.getLongVersionCode(shared!!.packageInfo) >= PackageInfoCompat.getLongVersionCode(private!!.packageInfo) ) { shared } else { private } } /** * Returns true if the given package is an extension. * * @param pkgInfo The package info of the application. */ private fun isPackageAnExtension(pkgInfo: PackageInfo): Boolean { return pkgInfo.reqFeatures.orEmpty().any { it.name == EXTENSION_FEATURE } } /** * Returns the signatures of the package or null if it's not signed. * * @param pkgInfo The package info of the application. * @return List SHA256 digest of the signatures */ private fun getSignatures(pkgInfo: PackageInfo): List? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val signingInfo = pkgInfo.signingInfo!! if (signingInfo.hasMultipleSigners()) { signingInfo.apkContentsSigners } else { signingInfo.signingCertificateHistory } } else { @Suppress("DEPRECATION") pkgInfo.signatures } ?.map { Hash.sha256(it.toByteArray()) } ?.toList() } /** * On Android 13+ the ApplicationInfo generated by getPackageArchiveInfo doesn't * have sourceDir which breaks assets loading (used for getting icon here). */ private fun ApplicationInfo.fixBasePaths(apkPath: String) { if (sourceDir == null) { sourceDir = apkPath } if (publicSourceDir == null) { publicSourceDir = apkPath } } private data class AnimeExtensionInfo( val packageInfo: PackageInfo, val isShared: Boolean, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt ================================================ package eu.kanade.tachiyomi.extension.manga import android.content.Context import android.graphics.drawable.Drawable import eu.kanade.domain.extension.manga.interactor.TrustMangaExtension import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.api.MangaExtensionApi import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.model.MangaLoadResult import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionInstallReceiver import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionInstaller import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionLoader import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import logcat.LogPriority import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.manga.model.StubMangaSource import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Locale /** * The manager of extensions installed as another apk which extend the available sources. It handles * the retrieval of remotely available extensions as well as installing, updating and removing them. * To avoid malicious distribution, every extension must be signed and it will only be loaded if its * signature is trusted, otherwise the user will be prompted with a warning to trust it before being * loaded. */ class MangaExtensionManager( private val context: Context, private val preferences: SourcePreferences = Injekt.get(), private val trustExtension: TrustMangaExtension = Injekt.get(), ) { val scope = CoroutineScope(SupervisorJob()) private val _isInitialized = MutableStateFlow(false) val isInitialized: StateFlow = _isInitialized.asStateFlow() /** * API where all the available extensions can be found. */ private val api = MangaExtensionApi() /** * The installer which installs, updates and uninstalls the extensions. */ private val installer by lazy { MangaExtensionInstaller(context) } private val iconMap = mutableMapOf() private val installedExtensionsMapFlow = MutableStateFlow(emptyMap()) val installedExtensionsFlow = installedExtensionsMapFlow.mapExtensions(scope) private val availableExtensionsMapFlow = MutableStateFlow(emptyMap()) val availableExtensionsFlow = availableExtensionsMapFlow.mapExtensions(scope) private val untrustedExtensionsMapFlow = MutableStateFlow(emptyMap()) val untrustedExtensionsFlow = untrustedExtensionsMapFlow.mapExtensions(scope) init { initExtensions() MangaExtensionInstallReceiver(InstallationListener()).register(context) } private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet() fun getExtensionPackage(sourceId: Long): String? { return installedExtensionsFlow.value.find { extension -> extension.sources.any { it.id == sourceId } } ?.pkgName } fun getExtensionPackageAsFlow(sourceId: Long): Flow { return installedExtensionsFlow.map { extensions -> extensions.find { extension -> extension.sources.any { it.id == sourceId } } ?.pkgName } } fun getAppIconForSource(sourceId: Long): Drawable? { val pkgName = installedExtensionsMapFlow.value.values .find { ext -> ext.sources.any { it.id == sourceId } } ?.pkgName ?: return null return iconMap[pkgName] ?: iconMap.getOrPut(pkgName) { MangaExtensionLoader.getMangaExtensionPackageInfoFromPkgName(context, pkgName)!!.applicationInfo!! .loadIcon(context.packageManager) } } private var availableExtensionsSourcesData: Map = emptyMap() private fun setupAvailableExtensionsSourcesDataMap(extensions: List) { if (extensions.isEmpty()) return availableExtensionsSourcesData = extensions .flatMap { ext -> ext.sources.map { it.toStubSource() } } .associateBy { it.id } } fun getSourceData(id: Long) = availableExtensionsSourcesData[id] /** * Loads and registers the installed extensions. */ private fun initExtensions() { val extensions = MangaExtensionLoader.loadMangaExtensions(context) installedExtensionsMapFlow.value = extensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } untrustedExtensionsMapFlow.value = extensions .filterIsInstance() .associate { it.extension.pkgName to it.extension } _isInitialized.value = true } /** * Finds the available extensions in the [api] and updates [availableExtensionsMapFlow]. */ suspend fun findAvailableExtensions() { val extensions: List = try { api.findExtensions() } catch (e: Exception) { logcat(LogPriority.ERROR, e) withUIContext { context.toast(MR.strings.extension_api_error) } emptyList() } enableAdditionalSubLanguages(extensions) availableExtensionsMapFlow.value = extensions.associateBy { it.pkgName } updatedInstalledExtensionsStatuses(extensions) setupAvailableExtensionsSourcesDataMap(extensions) } /** * Enables the additional sub-languages in the app first run. This addresses * the issue where users still need to enable some specific languages even when * the device language is inside that major group. As an example, if a user * has a zh device language, the app will also enable zh-Hans and zh-Hant. * * If the user have already changed the enabledLanguages preference value once, * the new languages will not be added to respect the user enabled choices. */ private fun enableAdditionalSubLanguages(extensions: List) { if (subLanguagesEnabledOnFirstRun || extensions.isEmpty()) { return } // Use the source lang as some aren't present on the extension level. val availableLanguages = extensions .flatMap(MangaExtension.Available::sources) .distinctBy(MangaExtension.Available.MangaSource::lang) .map(MangaExtension.Available.MangaSource::lang) val deviceLanguage = Locale.getDefault().language val defaultLanguages = preferences.enabledLanguages().defaultValue() val languagesToEnable = availableLanguages.filter { it != deviceLanguage && it.startsWith(deviceLanguage) } preferences.enabledLanguages().set(defaultLanguages + languagesToEnable) subLanguagesEnabledOnFirstRun = true } /** * Sets the update field of the installed extensions with the given [availableExtensions]. * * @param availableExtensions The list of extensions given by the [api]. */ private fun updatedInstalledExtensionsStatuses( availableExtensions: List, ) { if (availableExtensions.isEmpty()) { preferences.mangaExtensionUpdatesCount().set(0) return } val installedExtensionsMap = installedExtensionsMapFlow.value.toMutableMap() var changed = false for ((pkgName, extension) in installedExtensionsMap) { val availableExt = availableExtensions.find { it.pkgName == pkgName } if (availableExt == null && !extension.isObsolete) { installedExtensionsMap[pkgName] = extension.copy(isObsolete = true) changed = true } else if (availableExt != null) { val hasUpdate = extension.updateExists(availableExt) if (extension.hasUpdate != hasUpdate) { installedExtensionsMap[pkgName] = extension.copy( hasUpdate = hasUpdate, repoUrl = availableExt.repoUrl, ) } else { installedExtensionsMap[pkgName] = extension.copy( repoUrl = availableExt.repoUrl, ) } changed = true } } if (changed) { installedExtensionsMapFlow.value = installedExtensionsMap } updatePendingUpdatesCount() } /** * Returns a flow of the installation process for the given extension. It will complete * once the extension is installed or throws an error. The process will be canceled if * unsubscribed before its completion. * * @param extension The extension to be installed. */ fun installExtension(extension: MangaExtension.Available): Flow { return installer.downloadAndInstall(api.getApkUrl(extension), extension) } /** * Returns a flow of the installation process for the given extension. It will complete * once the extension is updated or throws an error. The process will be canceled if * unsubscribed before its completion. * * @param extension The extension to be updated. */ fun updateExtension(extension: MangaExtension.Installed): Flow { val availableExt = availableExtensionsMapFlow.value[extension.pkgName] ?: return emptyFlow() return installExtension(availableExt) } fun cancelInstallUpdateExtension(extension: MangaExtension) { installer.cancelInstall(extension.pkgName) } /** * Sets to "installing" status of an extension installation. * * @param downloadId The id of the download. */ fun setInstalling(downloadId: Long) { installer.updateInstallStep(downloadId, InstallStep.Installing) } fun updateInstallStep(downloadId: Long, step: InstallStep) { installer.updateInstallStep(downloadId, step) } /** * Uninstalls the extension that matches the given package name. * * @param extension The extension to uninstall. */ fun uninstallExtension(extension: MangaExtension) { installer.uninstallApk(extension.pkgName) } /** * Adds the given extension to the list of trusted extensions. It also loads in background the * now trusted extensions. * * @param extension the extension to trust */ suspend fun trust(extension: MangaExtension.Untrusted) { untrustedExtensionsMapFlow.value[extension.pkgName] ?: return trustExtension.trust(extension.pkgName, extension.versionCode, extension.signatureHash) untrustedExtensionsMapFlow.value -= extension.pkgName MangaExtensionLoader.loadMangaExtensionFromPkgName(context, extension.pkgName) .let { it as? MangaLoadResult.Success } ?.let { registerNewExtension(it.extension) } } /** * Registers the given extension in this and the source managers. * * @param extension The extension to be registered. */ private fun registerNewExtension(extension: MangaExtension.Installed) { installedExtensionsMapFlow.value += extension } /** * Registers the given updated extension in this and the source managers previously removing * the outdated ones. * * @param extension The extension to be registered. */ private fun registerUpdatedExtension(extension: MangaExtension.Installed) { installedExtensionsMapFlow.value += extension } /** * Unregisters the extension in this and the source managers given its package name. Note this * method is called for every uninstalled application in the system. * * @param pkgName The package name of the uninstalled application. */ private fun unregisterExtension(pkgName: String) { installedExtensionsMapFlow.value -= pkgName untrustedExtensionsMapFlow.value -= pkgName } /** * Listener which receives events of the extensions being installed, updated or removed. */ private inner class InstallationListener : MangaExtensionInstallReceiver.Listener { override fun onExtensionInstalled(extension: MangaExtension.Installed) { registerNewExtension(extension.withUpdateCheck()) updatePendingUpdatesCount() } override fun onExtensionUpdated(extension: MangaExtension.Installed) { registerUpdatedExtension(extension.withUpdateCheck()) updatePendingUpdatesCount() } override fun onExtensionUntrusted(extension: MangaExtension.Untrusted) { installedExtensionsMapFlow.value -= extension.pkgName untrustedExtensionsMapFlow.value += extension updatePendingUpdatesCount() } override fun onPackageUninstalled(pkgName: String) { MangaExtensionLoader.uninstallPrivateExtension(context, pkgName) unregisterExtension(pkgName) updatePendingUpdatesCount() } } /** * Extension method to set the update field of an installed extension. */ private fun MangaExtension.Installed.withUpdateCheck(): MangaExtension.Installed { return if (updateExists()) { copy(hasUpdate = true) } else { this } } private fun MangaExtension.Installed.updateExists( availableExtension: MangaExtension.Available? = null, ): Boolean { val availableExt = availableExtension ?: availableExtensionsMapFlow.value[pkgName] ?: return false return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } private fun updatePendingUpdatesCount() { val pendingUpdateCount = installedExtensionsMapFlow.value.values.count { it.hasUpdate } preferences.mangaExtensionUpdatesCount().set(pendingUpdateCount) if (pendingUpdateCount == 0) { ExtensionUpdateNotifier(context).dismiss() } } private operator fun Map.plus(extension: T) = plus(extension.pkgName to extension) private fun StateFlow>.mapExtensions( scope: CoroutineScope, ): StateFlow> { return map { it.values.toList() }.stateIn(scope, SharingStarted.Lazily, value.values.toList()) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/api/MangaExtensionApi.kt ================================================ package eu.kanade.tachiyomi.extension.manga.api import android.content.Context import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.model.MangaLoadResult import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionLoader import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.parseAs import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import logcat.LogPriority import mihon.domain.extensionrepo.manga.interactor.GetMangaExtensionRepo import mihon.domain.extensionrepo.manga.interactor.UpdateMangaExtensionRepo import mihon.domain.extensionrepo.model.ExtensionRepo import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.time.Instant import kotlin.time.Duration.Companion.days internal class MangaExtensionApi { private val networkService: NetworkHelper by injectLazy() private val preferenceStore: PreferenceStore by injectLazy() private val getExtensionRepo: GetMangaExtensionRepo by injectLazy() private val updateExtensionRepo: UpdateMangaExtensionRepo by injectLazy() private val extensionManager: MangaExtensionManager by injectLazy() private val json: Json by injectLazy() private val lastExtCheck: Preference by lazy { preferenceStore.getLong("last_ext_check", 0) } suspend fun findExtensions(): List { return withIOContext { getExtensionRepo.getAll() .map { async { getExtensions(it) } } .awaitAll() .flatten() } } private suspend fun getExtensions(extRepo: ExtensionRepo): List { val repoBaseUrl = extRepo.baseUrl return try { val response = networkService.client .newCall(GET("$repoBaseUrl/index.min.json")) .awaitSuccess() with(json) { response .parseAs>() .toExtensions(repoBaseUrl) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Failed to get extensions from $repoBaseUrl" } emptyList() } } suspend fun checkForUpdates( context: Context, fromAvailableExtensionList: Boolean = false, ): List? { // Limit checks to once a day at most if (fromAvailableExtensionList && Instant.now().toEpochMilli() < lastExtCheck.get() + 1.days.inWholeMilliseconds ) { return null } // Update extension repo details updateExtensionRepo.awaitAll() val extensions = if (fromAvailableExtensionList) { extensionManager.availableExtensionsFlow.value } else { findExtensions().also { lastExtCheck.set(Instant.now().toEpochMilli()) } } val installedExtensions = MangaExtensionLoader.loadMangaExtensions(context) .filterIsInstance() .map { it.extension } val extensionsWithUpdate = mutableListOf() for (installedExt in installedExtensions) { val pkgName = installedExt.pkgName val availableExt = extensions.find { it.pkgName == pkgName } ?: continue val hasUpdatedVer = availableExt.versionCode > installedExt.versionCode val hasUpdatedLib = availableExt.libVersion > installedExt.libVersion val hasUpdate = hasUpdatedVer || hasUpdatedLib if (hasUpdate) { extensionsWithUpdate.add(installedExt) } } if (extensionsWithUpdate.isNotEmpty()) { ExtensionUpdateNotifier(context).promptUpdates(extensionsWithUpdate.map { it.name }) } return extensionsWithUpdate } private fun List.toExtensions(repoUrl: String): List { return this .filter { val libVersion = it.extractLibVersion() libVersion >= MangaExtensionLoader.LIB_VERSION_MIN && libVersion <= MangaExtensionLoader.LIB_VERSION_MAX } .map { MangaExtension.Available( name = it.name.substringAfter("Tachiyomi: "), pkgName = it.pkg, versionName = it.version, versionCode = it.code, libVersion = it.extractLibVersion(), lang = it.lang, isNsfw = it.nsfw == 1, sources = it.sources?.map(extensionSourceMapper).orEmpty(), apkName = it.apk, iconUrl = "$repoUrl/icon/${it.pkg}.png", repoUrl = repoUrl, ) } } fun getApkUrl(extension: MangaExtension.Available): String { return "${extension.repoUrl}/apk/${extension.apkName}" } private fun ExtensionJsonObject.extractLibVersion(): Double { return version.substringBeforeLast('.').toDouble() } } @Serializable private data class ExtensionJsonObject( val name: String, val pkg: String, val apk: String, val lang: String, val code: Long, val version: String, val nsfw: Int, val sources: List?, ) @Serializable private data class ExtensionSourceJsonObject( val id: Long, val lang: String, val name: String, val baseUrl: String, ) private val extensionSourceMapper: (ExtensionSourceJsonObject) -> MangaExtension.Available.MangaSource = { MangaExtension.Available.MangaSource( id = it.id, lang = it.lang, name = it.name, baseUrl = it.baseUrl, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/InstallerManga.kt ================================================ package eu.kanade.tachiyomi.extension.manga.installer import android.app.Service import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.Uri import androidx.annotation.CallSuper import androidx.localbroadcastmanager.content.LocalBroadcastManager import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import uy.kohesive.injekt.injectLazy import java.util.Collections import java.util.concurrent.atomic.AtomicReference /** * Base implementation class for extension installer. To be used inside a foreground [Service]. */ abstract class InstallerManga(private val service: Service) { private val extensionManager: MangaExtensionManager by injectLazy() private var waitingInstall = AtomicReference(null) private val queue = Collections.synchronizedList(mutableListOf()) private val cancelReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val downloadId = intent.getLongExtra(EXTRA_DOWNLOAD_ID, -1).takeIf { it >= 0 } ?: return cancelQueue(downloadId) } } /** * Installer readiness. If false, queue check will not run. * * @see checkQueue */ abstract var ready: Boolean /** * Add an item to install queue. * * @param downloadId Download ID as known by [MangaExtensionManager] * @param uri Uri of APK to install */ fun addToQueue(downloadId: Long, uri: Uri) { queue.add(Entry(downloadId, uri)) checkQueue() } /** * Proceeds to install the APK of this entry inside this method. Call [continueQueue] * when the install process for this entry is finished to continue the queue. * * @param entry The [Entry] of item to process * @see continueQueue */ @CallSuper open fun processEntry(entry: Entry) { extensionManager.setInstalling(entry.downloadId) } /** * Called before queue continues. Override this to handle when the removed entry is * currently being processed. * * @return true if this entry can be removed from queue. */ open fun cancelEntry(entry: Entry): Boolean { return true } /** * Tells the queue to continue processing the next entry and updates the install step * of the completed entry ([waitingInstall]) to [MangaExtensionManager]. * * @param resultStep new install step for the processed entry. * @see waitingInstall */ fun continueQueue(resultStep: InstallStep) { val completedEntry = waitingInstall.getAndSet(null) if (completedEntry != null) { extensionManager.updateInstallStep(completedEntry.downloadId, resultStep) checkQueue() } } /** * Checks the queue. The provided service will be stopped if the queue is empty. * Will not be run when not ready. * * @see ready */ fun checkQueue() { if (!ready) { return } if (queue.isEmpty()) { service.stopSelf() return } val nextEntry = queue.first() if (waitingInstall.compareAndSet(null, nextEntry)) { queue.removeAt(0) processEntry(nextEntry) } } /** * Call this method when the provided service is destroyed. */ @CallSuper open fun onDestroy() { LocalBroadcastManager.getInstance(service).unregisterReceiver(cancelReceiver) queue.forEach { extensionManager.updateInstallStep(it.downloadId, InstallStep.Error) } queue.clear() waitingInstall.set(null) } protected fun getActiveEntry(): Entry? = waitingInstall.get() /** * Cancels queue for the provided download ID if exists. * * @param downloadId Download ID as known by [MangaExtensionManager] */ private fun cancelQueue(downloadId: Long) { val waitingInstall = this.waitingInstall.get() val toCancel = queue.find { it.downloadId == downloadId } ?: waitingInstall ?: return if (cancelEntry(toCancel)) { queue.remove(toCancel) if (waitingInstall == toCancel) { // Currently processing removed entry, continue queue this.waitingInstall.set(null) checkQueue() } extensionManager.updateInstallStep(downloadId, InstallStep.Idle) } } /** * Install item to queue. * * @param downloadId Download ID as known by [MangaExtensionManager] * @param uri Uri of APK to install */ data class Entry(val downloadId: Long, val uri: Uri) init { val filter = IntentFilter(ACTION_CANCEL_QUEUE) LocalBroadcastManager.getInstance(service).registerReceiver(cancelReceiver, filter) } companion object { private const val ACTION_CANCEL_QUEUE = "Installer.action.CANCEL_QUEUE" private const val EXTRA_DOWNLOAD_ID = "Installer.extra.DOWNLOAD_ID" /** * Attempts to cancel the installation entry for the provided download ID. * * @param downloadId Download ID as known by [MangaExtensionManager] */ fun cancelInstallQueue(context: Context, downloadId: Long) { val intent = Intent(ACTION_CANCEL_QUEUE) intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId) LocalBroadcastManager.getInstance(context).sendBroadcast(intent) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt ================================================ package eu.kanade.tachiyomi.extension.manga.installer import android.app.PendingIntent import android.app.Service import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageInstaller import android.os.Build import androidx.core.content.ContextCompat import androidx.core.content.IntentSanitizer import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.util.lang.use import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.getUriSize import logcat.LogPriority import tachiyomi.core.common.util.system.logcat class PackageInstallerInstallerManga(private val service: Service) : InstallerManga(service) { private val packageInstaller = service.packageManager.packageInstaller private val packageActionReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE)) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { val userAction = intent.getParcelableExtraCompat(Intent.EXTRA_INTENT) ?.run { // Doesn't actually needed as the receiver is actually not exported // But the warnings can't be suppressed without this IntentSanitizer.Builder() .allowAction(this.action!!) .allowExtra(PackageInstaller.EXTRA_SESSION_ID) { id -> id == activeSession?.second } .allowAnyComponent() .allowPackage { // There is no way to check the actual installer name so allow all. true } .build() .sanitizeByFiltering(this) } if (userAction == null) { logcat(LogPriority.ERROR) { "Fatal error for $intent" } continueQueue(InstallStep.Error) return } userAction.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) service.startActivity(userAction) } PackageInstaller.STATUS_FAILURE_ABORTED -> { continueQueue(InstallStep.Idle) } PackageInstaller.STATUS_SUCCESS -> continueQueue(InstallStep.Installed) else -> continueQueue(InstallStep.Error) } } } private var activeSession: Pair? = null // Always ready override var ready = true override fun processEntry(entry: Entry) { super.processEntry(entry) activeSession = null try { val installParams = PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL, ) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { installParams.setRequireUserAction( PackageInstaller.SessionParams.USER_ACTION_NOT_REQUIRED, ) } activeSession = entry to packageInstaller.createSession(installParams) val fileSize = service.getUriSize(entry.uri) ?: throw IllegalStateException() installParams.setSize(fileSize) val inputStream = service.contentResolver.openInputStream(entry.uri) ?: throw IllegalStateException() val session = packageInstaller.openSession(activeSession!!.second) val outputStream = session.openWrite(entry.downloadId.toString(), 0, fileSize) session.use { arrayOf(inputStream, outputStream).use { inputStream.copyTo(outputStream) session.fsync(outputStream) } val intentSender = PendingIntent.getBroadcast( service, activeSession!!.second, Intent(INSTALL_ACTION).setPackage(service.packageName), if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0, ).intentSender session.commit(intentSender) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } activeSession?.let { (_, sessionId) -> packageInstaller.abandonSession(sessionId) } continueQueue(InstallStep.Error) } } override fun cancelEntry(entry: Entry): Boolean { activeSession?.let { (activeEntry, sessionId) -> if (activeEntry == entry) { packageInstaller.abandonSession(sessionId) return false } } return true } override fun onDestroy() { service.unregisterReceiver(packageActionReceiver) super.onDestroy() } init { ContextCompat.registerReceiver( service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED, ) } } private const val INSTALL_ACTION = "PackageInstallerInstaller.INSTALL_ACTION" ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/ShizukuInstallerManga.kt ================================================ package eu.kanade.tachiyomi.extension.manga.installer import android.app.Service import android.content.pm.PackageManager import android.os.Process import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.util.system.getUriSize import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import logcat.LogPriority import rikka.shizuku.Shizuku import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR import java.io.BufferedReader import java.io.InputStream class ShizukuInstallerManga(private val service: Service) : InstallerManga(service) { private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val shizukuDeadListener = Shizuku.OnBinderDeadListener { logcat { "Shizuku was killed prematurely" } service.stopSelf() } private val shizukuPermissionListener = object : Shizuku.OnRequestPermissionResultListener { override fun onRequestPermissionResult(requestCode: Int, grantResult: Int) { if (requestCode == SHIZUKU_PERMISSION_REQUEST_CODE) { if (grantResult == PackageManager.PERMISSION_GRANTED) { ready = true checkQueue() } else { service.stopSelf() } Shizuku.removeRequestPermissionResultListener(this) } } } override var ready = false override fun processEntry(entry: Entry) { super.processEntry(entry) scope.launch { var sessionId: String? = null try { val size = service.getUriSize(entry.uri) ?: throw IllegalStateException() service.contentResolver.openInputStream(entry.uri)!!.use { val userId = Process.myUserHandle().hashCode() val createCommand = "pm install-create --user $userId -r -i ${service.packageName} -S $size" val createResult = exec(createCommand) sessionId = SESSION_ID_REGEX.find(createResult.out)?.value ?: throw RuntimeException("Failed to create install session") val writeResult = exec("pm install-write -S $size $sessionId base -", it) if (writeResult.resultCode != 0) { throw RuntimeException("Failed to write APK to session $sessionId") } val commitResult = exec("pm install-commit $sessionId") if (commitResult.resultCode != 0) { throw RuntimeException("Failed to commit install session $sessionId") } continueQueue(InstallStep.Installed) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } if (sessionId != null) { exec("pm install-abandon $sessionId") } continueQueue(InstallStep.Error) } } } // Don't cancel if entry is already started installing override fun cancelEntry(entry: Entry): Boolean = getActiveEntry() != entry override fun onDestroy() { Shizuku.removeBinderDeadListener(shizukuDeadListener) Shizuku.removeRequestPermissionResultListener(shizukuPermissionListener) scope.cancel() super.onDestroy() } private fun exec(command: String, stdin: InputStream? = null): ShellResult { @Suppress("DEPRECATION") val process = Shizuku.newProcess(arrayOf("sh", "-c", command), null, null) if (stdin != null) { process.outputStream.use { stdin.copyTo(it) } } val output = process.inputStream.bufferedReader().use(BufferedReader::readText) val resultCode = process.waitFor() return ShellResult(resultCode, output) } private data class ShellResult(val resultCode: Int, val out: String) init { Shizuku.addBinderDeadListener(shizukuDeadListener) ready = if (Shizuku.pingBinder()) { if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { true } else { Shizuku.addRequestPermissionResultListener(shizukuPermissionListener) Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) false } } else { logcat(LogPriority.ERROR) { "Shizuku is not ready to use" } service.toast(MR.strings.ext_installer_shizuku_stopped) service.stopSelf() false } } } private const val SHIZUKU_PERMISSION_REQUEST_CODE = 14045 private val SESSION_ID_REGEX = Regex("(?<=\\[).+?(?=])") ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/model/MangaExtension.kt ================================================ package eu.kanade.tachiyomi.extension.manga.model import android.graphics.drawable.Drawable import eu.kanade.tachiyomi.source.MangaSource import tachiyomi.domain.source.manga.model.StubMangaSource sealed class MangaExtension { abstract val name: String abstract val pkgName: String abstract val versionName: String abstract val versionCode: Long abstract val libVersion: Double abstract val lang: String? abstract val isNsfw: Boolean data class Installed( override val name: String, override val pkgName: String, override val versionName: String, override val versionCode: Long, override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, val pkgFactory: String?, val sources: List, val icon: Drawable?, val hasUpdate: Boolean = false, val isObsolete: Boolean = false, val isShared: Boolean, val repoUrl: String? = null, ) : MangaExtension() data class Available( override val name: String, override val pkgName: String, override val versionName: String, override val versionCode: Long, override val libVersion: Double, override val lang: String, override val isNsfw: Boolean, val sources: List, val apkName: String, val iconUrl: String, val repoUrl: String, ) : MangaExtension() { data class MangaSource( val id: Long, val lang: String, val name: String, val baseUrl: String, ) { fun toStubSource(): StubMangaSource { return StubMangaSource( id = this.id, lang = this.lang, name = this.name, ) } } } data class Untrusted( override val name: String, override val pkgName: String, override val versionName: String, override val versionCode: Long, override val libVersion: Double, val signatureHash: String, override val lang: String? = null, override val isNsfw: Boolean = false, ) : MangaExtension() } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/model/MangaLoadResult.kt ================================================ package eu.kanade.tachiyomi.extension.manga.model sealed interface MangaLoadResult { data class Success(val extension: MangaExtension.Installed) : MangaLoadResult data class Untrusted(val extension: MangaExtension.Untrusted) : MangaLoadResult data object Error : MangaLoadResult } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt ================================================ package eu.kanade.tachiyomi.extension.manga.util import android.app.Activity import android.content.Intent import android.os.Bundle import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller import eu.kanade.tachiyomi.util.system.toast import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds /** * Activity used to install extensions, because we can only receive the result of the installation * with [startActivityForResult], which we need to update the UI. */ class MangaExtensionInstallActivity : Activity() { // MIUI package installer bug workaround private var ignoreUntil = 0L private var ignoreResult = false private var hasIgnoredResult = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @Suppress("DEPRECATION") val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE) .setDataAndType(intent.data, intent.type) .putExtra(Intent.EXTRA_RETURN_RESULT, true) .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) if (hasMiuiPackageInstaller) { ignoreResult = true ignoreUntil = System.nanoTime() + 1.seconds.inWholeNanoseconds } try { startActivityForResult(installIntent, INSTALL_REQUEST_CODE) } catch (error: Exception) { // Either install package can't be found (probably bots) or there's a security exception // with the download manager. Nothing we can workaround. toast(error.message) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (ignoreResult && System.nanoTime() < ignoreUntil) { hasIgnoredResult = true return } if (requestCode == INSTALL_REQUEST_CODE) { checkInstallationResult(resultCode) } finish() } override fun onStart() { super.onStart() if (hasIgnoredResult) { checkInstallationResult(RESULT_CANCELED) finish() } } private fun checkInstallationResult(resultCode: Int) { val downloadId = intent.extras!!.getLong(MangaExtensionInstaller.EXTRA_DOWNLOAD_ID) val extensionManager = Injekt.get() val newStep = when (resultCode) { RESULT_OK -> InstallStep.Installed RESULT_CANCELED -> InstallStep.Idle else -> InstallStep.Error } extensionManager.updateInstallStep(downloadId, newStep) } } private const val INSTALL_REQUEST_CODE = 500 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt ================================================ package eu.kanade.tachiyomi.extension.manga.util import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import androidx.core.content.ContextCompat import androidx.core.net.toUri import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.model.MangaLoadResult import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.system.logcat /** * Broadcast receiver that listens for the system's packages installed, updated or removed, and only * notifies the given [listener] when the package is an extension. * * @param listener The listener that should be notified of extension installation events. */ internal class MangaExtensionInstallReceiver(private val listener: Listener) : BroadcastReceiver() { val scope = CoroutineScope(SupervisorJob()) fun register(context: Context) { ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_NOT_EXPORTED) } private val filter = IntentFilter().apply { addAction(Intent.ACTION_PACKAGE_ADDED) addAction(Intent.ACTION_PACKAGE_REPLACED) addAction(Intent.ACTION_PACKAGE_REMOVED) addAction(ACTION_EXTENSION_ADDED) addAction(ACTION_EXTENSION_REPLACED) addAction(ACTION_EXTENSION_REMOVED) addDataScheme("package") } /** * Called when one of the events of the [filter] is received. When the package is an extension, * it's loaded in background and it notifies the [listener] when finished. */ override fun onReceive(context: Context, intent: Intent?) { if (intent == null) return when (intent.action) { Intent.ACTION_PACKAGE_ADDED, ACTION_EXTENSION_ADDED -> { if (isReplacing(intent)) return scope.launch { when (val result = getExtensionFromIntent(context, intent)) { is MangaLoadResult.Success -> listener.onExtensionInstalled(result.extension) is MangaLoadResult.Untrusted -> listener.onExtensionUntrusted(result.extension) else -> {} } } } Intent.ACTION_PACKAGE_REPLACED, ACTION_EXTENSION_REPLACED -> { scope.launch { when (val result = getExtensionFromIntent(context, intent)) { is MangaLoadResult.Success -> listener.onExtensionUpdated(result.extension) is MangaLoadResult.Untrusted -> listener.onExtensionUntrusted(result.extension) else -> {} } } } Intent.ACTION_PACKAGE_REMOVED, ACTION_EXTENSION_REMOVED -> { if (isReplacing(intent)) return val pkgName = getPackageNameFromIntent(intent) if (pkgName != null) { listener.onPackageUninstalled(pkgName) } } } } /** * Returns true if this package is performing an update. * * @param intent The intent that triggered the event. */ private fun isReplacing(intent: Intent): Boolean { return intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) } /** * Returns the extension triggered by the given intent. * * @param context The application context. * @param intent The intent containing the package name of the extension. */ private suspend fun getExtensionFromIntent(context: Context, intent: Intent?): MangaLoadResult { val pkgName = getPackageNameFromIntent(intent) if (pkgName == null) { logcat(LogPriority.WARN) { "Package name not found" } return MangaLoadResult.Error } return MangaExtensionLoader.loadMangaExtensionFromPkgName(context, pkgName) } /** * Returns the package name of the installed, updated or removed application. */ private fun getPackageNameFromIntent(intent: Intent?): String? { return intent?.data?.encodedSchemeSpecificPart ?: return null } /** * Listener that receives extension installation events. */ interface Listener { fun onExtensionInstalled(extension: MangaExtension.Installed) fun onExtensionUpdated(extension: MangaExtension.Installed) fun onExtensionUntrusted(extension: MangaExtension.Untrusted) fun onPackageUninstalled(pkgName: String) } companion object { private const val ACTION_EXTENSION_ADDED = "${BuildConfig.APPLICATION_ID}.ACTION_EXTENSION_ADDED" private const val ACTION_EXTENSION_REPLACED = "${BuildConfig.APPLICATION_ID}.ACTION_EXTENSION_REPLACED" private const val ACTION_EXTENSION_REMOVED = "${BuildConfig.APPLICATION_ID}.ACTION_EXTENSION_REMOVED" fun notifyAdded(context: Context, pkgName: String) { notify(context, pkgName, ACTION_EXTENSION_ADDED) } fun notifyReplaced(context: Context, pkgName: String) { notify(context, pkgName, ACTION_EXTENSION_REPLACED) } fun notifyRemoved(context: Context, pkgName: String) { notify(context, pkgName, ACTION_EXTENSION_REMOVED) } private fun notify(context: Context, pkgName: String, action: String) { Intent(action).apply { data = "package:$pkgName".toUri() `package` = context.packageName context.sendBroadcast(this) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt ================================================ package eu.kanade.tachiyomi.extension.manga.util import android.app.Service import android.content.Context import android.content.Intent import android.net.Uri import android.os.IBinder import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.extension.manga.installer.InstallerManga import eu.kanade.tachiyomi.extension.manga.installer.PackageInstallerInstallerManga import eu.kanade.tachiyomi.extension.manga.installer.ShizukuInstallerManga import eu.kanade.tachiyomi.extension.manga.util.MangaExtensionInstaller.Companion.EXTRA_DOWNLOAD_ID import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import eu.kanade.tachiyomi.util.system.notificationBuilder import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.system.logcat import tachiyomi.i18n.MR class MangaExtensionInstallService : Service() { private var installer: InstallerManga? = null override fun onCreate() { val notification = notificationBuilder(Notifications.CHANNEL_EXTENSIONS_UPDATE) { setSmallIcon(R.drawable.ic_ani) setAutoCancel(false) setOngoing(true) setShowWhen(false) setContentTitle(stringResource(MR.strings.ext_install_service_notif)) setProgress(100, 100, true) }.build() startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val uri = intent?.data val id = intent?.getLongExtra(EXTRA_DOWNLOAD_ID, -1)?.takeIf { it != -1L } val installerUsed = intent?.getSerializableExtraCompat( EXTRA_INSTALLER, ) if (uri == null || id == null || installerUsed == null) { stopSelf() return START_NOT_STICKY } if (installer == null) { installer = when (installerUsed) { BasePreferences.ExtensionInstaller.PACKAGEINSTALLER -> PackageInstallerInstallerManga( this, ) BasePreferences.ExtensionInstaller.SHIZUKU -> ShizukuInstallerManga(this) else -> { logcat(LogPriority.ERROR) { "Not implemented for installer $installerUsed" } stopSelf() return START_NOT_STICKY } } } installer!!.addToQueue(id, uri) return START_NOT_STICKY } override fun onDestroy() { installer?.onDestroy() installer = null } override fun onBind(i: Intent?): IBinder? = null companion object { private const val EXTRA_INSTALLER = "EXTRA_INSTALLER" fun getIntent( context: Context, downloadId: Long, uri: Uri, installer: BasePreferences.ExtensionInstaller, ): Intent { return Intent(context, MangaExtensionInstallService::class.java) .setDataAndType(uri, MangaExtensionInstaller.APK_MIME) .putExtra(EXTRA_DOWNLOAD_ID, downloadId) .putExtra(EXTRA_INSTALLER, installer) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstaller.kt ================================================ package eu.kanade.tachiyomi.extension.manga.util import android.app.DownloadManager import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.Uri import android.os.Environment import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.net.toUri import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.installer.InstallerManga import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.isPackageInstalled import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.transformWhile import logcat.LogPriority import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import kotlin.time.Duration.Companion.seconds /** * The installer which installs, updates and uninstalls the extensions. * * @param context The application context. */ internal class MangaExtensionInstaller(private val context: Context) { /** * The system's download manager */ private val downloadManager = context.getSystemService()!! /** * The broadcast receiver which listens to download completion events. */ private val downloadReceiver = DownloadCompletionReceiver() /** * The currently requested downloads, with the package name (unique id) as key, and the id * returned by the download manager. */ private val activeDownloads = hashMapOf() private val downloadsStateFlows = hashMapOf>() private val extensionInstaller = Injekt.get().extensionInstaller() /** * Adds the given extension to the downloads queue and returns an observable containing its * step in the installation process. * * @param url The url of the apk. * @param extension The extension to install. */ fun downloadAndInstall(url: String, extension: MangaExtension): Flow { val pkgName = extension.pkgName val oldDownload = activeDownloads[pkgName] if (oldDownload != null) { deleteDownload(pkgName) } // Register the receiver after removing (and unregistering) the previous download downloadReceiver.register() val downloadUri = url.toUri() val request = DownloadManager.Request(downloadUri) .setTitle(extension.name) .setMimeType(APK_MIME) .setDestinationInExternalFilesDir( context, Environment.DIRECTORY_DOWNLOADS, downloadUri.lastPathSegment, ) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) val id = downloadManager.enqueue(request) activeDownloads[pkgName] = id val downloadStateFlow = MutableStateFlow(InstallStep.Pending) downloadsStateFlows[id] = downloadStateFlow // Poll download status val pollStatusFlow = downloadStatusFlow(id).mapNotNull { downloadStatus -> // Map to our model when (downloadStatus) { DownloadManager.STATUS_PENDING -> InstallStep.Pending DownloadManager.STATUS_RUNNING -> InstallStep.Downloading else -> null } } return merge(downloadStateFlow, pollStatusFlow).transformWhile { emit(it) // Stop when the application is installed or errors !it.isCompleted() }.onCompletion { // Always notify on main thread withUIContext { // Always remove the download when unsubscribed deleteDownload(pkgName) } } } /** * Returns a flow that polls the given download id for its status every second, as the * manager doesn't have any notification system. It'll stop once the download finishes. * * @param id The id of the download to poll. */ private fun downloadStatusFlow(id: Long): Flow = flow { val query = DownloadManager.Query().setFilterById(id) while (true) { // Get the current download status val downloadStatus = downloadManager.query(query).use { cursor -> if (!cursor.moveToFirst()) return@flow cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS)) } emit(downloadStatus) // Stop polling when the download fails or finishes if (downloadStatus == DownloadManager.STATUS_SUCCESSFUL || downloadStatus == DownloadManager.STATUS_FAILED ) { return@flow } delay(1.seconds) } } // Ignore duplicate results .distinctUntilChanged() /** * Starts an intent to install the extension at the given uri. * * @param uri The uri of the extension to install. */ fun installApk(downloadId: Long, uri: Uri) { when (val installer = extensionInstaller.get()) { BasePreferences.ExtensionInstaller.LEGACY -> { val intent = Intent(context, MangaExtensionInstallActivity::class.java) .setDataAndType(uri, APK_MIME) .putExtra(EXTRA_DOWNLOAD_ID, downloadId) .setFlags( Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION, ) context.startActivity(intent) } BasePreferences.ExtensionInstaller.PRIVATE -> { val extensionManager = Injekt.get() val tempFile = File(context.cacheDir, "temp_$downloadId") if (tempFile.exists() && !tempFile.delete()) { // Unlikely but just in case extensionManager.updateInstallStep(downloadId, InstallStep.Error) return } try { context.contentResolver.openInputStream(uri)?.use { input -> tempFile.outputStream().use { output -> input.copyTo(output) } } if (MangaExtensionLoader.installPrivateExtensionFile(context, tempFile)) { extensionManager.updateInstallStep(downloadId, InstallStep.Installed) } else { extensionManager.updateInstallStep(downloadId, InstallStep.Error) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to read downloaded extension file." } extensionManager.updateInstallStep(downloadId, InstallStep.Error) } tempFile.delete() } else -> { val intent = MangaExtensionInstallService.getIntent(context, downloadId, uri, installer) ContextCompat.startForegroundService(context, intent) } } } /** * Cancels extension install and remove from download manager and installer. */ fun cancelInstall(pkgName: String) { val downloadId = activeDownloads.remove(pkgName) ?: return downloadManager.remove(downloadId) InstallerManga.cancelInstallQueue(context, downloadId) } /** * Starts an intent to uninstall the extension by the given package name. * * @param pkgName The package name of the extension to uninstall */ fun uninstallApk(pkgName: String) { if (context.isPackageInstalled(pkgName)) { @Suppress("DEPRECATION") val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE, "package:$pkgName".toUri()) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context.startActivity(intent) } else { MangaExtensionLoader.uninstallPrivateExtension(context, pkgName) MangaExtensionInstallReceiver.notifyRemoved(context, pkgName) } } /** * Sets the step of the installation of an extension. * * @param downloadId The id of the download. * @param step New install step. */ fun updateInstallStep(downloadId: Long, step: InstallStep) { downloadsStateFlows[downloadId]?.let { it.value = step } } /** * Deletes the download for the given package name. * * @param pkgName The package name of the download to delete. */ private fun deleteDownload(pkgName: String) { val downloadId = activeDownloads.remove(pkgName) if (downloadId != null) { downloadManager.remove(downloadId) downloadsStateFlows.remove(downloadId) } if (activeDownloads.isEmpty()) { downloadReceiver.unregister() } } /** * Receiver that listens to download status events. */ private inner class DownloadCompletionReceiver : BroadcastReceiver() { /** * Whether this receiver is currently registered. */ private var isRegistered = false /** * Registers this receiver if it's not already. */ fun register() { if (isRegistered) return isRegistered = true val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED) } /** * Unregisters this receiver if it's not already. */ fun unregister() { if (!isRegistered) return isRegistered = false context.unregisterReceiver(this) } /** * Called when a download event is received. It looks for the download in the current active * downloads and notifies its installation step. */ override fun onReceive(context: Context, intent: Intent?) { val id = intent?.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) ?: return // Avoid events for downloads we didn't request if (id !in activeDownloads.values) return val uri = downloadManager.getUriForDownloadedFile(id) // Set next installation step if (uri == null) { logcat(LogPriority.ERROR) { "Couldn't locate downloaded APK" } updateInstallStep(id, InstallStep.Error) return } val query = DownloadManager.Query().setFilterById(id) downloadManager.query(query).use { cursor -> if (cursor.moveToFirst()) { val localUri = cursor.getString( cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI), ).removePrefix(FILE_SCHEME) installApk(id, File(localUri).getUriCompat(context)) } } } } companion object { const val APK_MIME = "application/vnd.android.package-archive" const val EXTRA_DOWNLOAD_ID = "ExtensionInstaller.extra.DOWNLOAD_ID" const val FILE_SCHEME = "file://" } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt ================================================ package eu.kanade.tachiyomi.extension.manga.util import android.annotation.SuppressLint import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.os.Build import androidx.core.content.pm.PackageInfoCompat import dalvik.system.PathClassLoader import eu.kanade.domain.extension.manga.interactor.TrustMangaExtension import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.extension.manga.model.MangaLoadResult import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.util.lang.Hash import eu.kanade.tachiyomi.util.storage.copyAndSetReadOnlyTo import eu.kanade.tachiyomi.util.system.ChildFirstPathClassLoader import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.injectLazy import java.io.File /** * Class that handles the loading of the extensions. Supports two kinds of extensions: * * 1. Shared extension: This extension is installed to the system with package * installer, so other variants of Tachiyomi/Aniyomi and its forks can also use this extension. * * 2. Private extension: This extension is put inside private data directory of the * running app, so this extension can only be used by the running app and not shared * with other apps. * * When both kinds of extensions are installed with a same package name, shared * extension will be used unless the version codes are different. In that case the * one with higher version code will be used. */ @SuppressLint("PackageManagerGetSignatures") internal object MangaExtensionLoader { private val preferences: SourcePreferences by injectLazy() private val trustExtension: TrustMangaExtension by injectLazy() private val loadNsfwSource by lazy { preferences.showNsfwSource().get() } private const val EXTENSION_FEATURE = "tachiyomi.extension" private const val METADATA_SOURCE_CLASS = "tachiyomi.extension.class" private const val METADATA_SOURCE_FACTORY = "tachiyomi.extension.factory" private const val METADATA_NSFW = "tachiyomi.extension.nsfw" const val LIB_VERSION_MIN = 1.4 const val LIB_VERSION_MAX = 1.5 @Suppress("DEPRECATION") private val PACKAGE_FLAGS = PackageManager.GET_CONFIGURATIONS or PackageManager.GET_META_DATA or PackageManager.GET_SIGNATURES or (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) PackageManager.GET_SIGNING_CERTIFICATES else 0) private const val PRIVATE_EXTENSION_EXTENSION = "ext" private fun getPrivateExtensionDir(context: Context) = File(context.filesDir, "exts") fun installPrivateExtensionFile(context: Context, file: File): Boolean { val extension = context.packageManager.getPackageArchiveInfo( file.absolutePath, PACKAGE_FLAGS, ) ?.takeIf { isPackageAnExtension(it) } ?: return false val currentExtension = getMangaExtensionPackageInfoFromPkgName( context, extension.packageName, ) if (currentExtension != null) { if (PackageInfoCompat.getLongVersionCode(extension) < PackageInfoCompat.getLongVersionCode(currentExtension) ) { logcat(LogPriority.ERROR) { "Installed extension version is higher. Downgrading is not allowed." } return false } val extensionSignatures = getSignatures(extension) if (extensionSignatures.isNullOrEmpty()) { logcat(LogPriority.ERROR) { "Extension to be installed is not signed." } return false } if (!extensionSignatures.containsAll(getSignatures(currentExtension)!!)) { logcat(LogPriority.ERROR) { "Installed extension signature is not matched." } return false } } val target = File( getPrivateExtensionDir(context), "${extension.packageName}.$PRIVATE_EXTENSION_EXTENSION", ) return try { target.delete() file.copyAndSetReadOnlyTo(target, overwrite = true) if (currentExtension != null) { MangaExtensionInstallReceiver.notifyReplaced(context, extension.packageName) } else { MangaExtensionInstallReceiver.notifyAdded(context, extension.packageName) } true } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to copy extension file." } target.delete() false } } fun uninstallPrivateExtension(context: Context, pkgName: String) { File(getPrivateExtensionDir(context), "$pkgName.$PRIVATE_EXTENSION_EXTENSION").delete() } /** * Return a list of all the available extensions initialized concurrently. * * @param context The application context. */ fun loadMangaExtensions(context: Context): List { val pkgManager = context.packageManager val installedPkgs = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { pkgManager.getInstalledPackages( PackageManager.PackageInfoFlags.of(PACKAGE_FLAGS.toLong()), ) } else { pkgManager.getInstalledPackages(PACKAGE_FLAGS) } val sharedExtPkgs = installedPkgs .asSequence() .filter { isPackageAnExtension(it) } .map { MangaExtensionInfo(packageInfo = it, isShared = true) } val privateExtPkgs = getPrivateExtensionDir(context) .listFiles() ?.asSequence() ?.filter { it.isFile && it.extension == PRIVATE_EXTENSION_EXTENSION } ?.mapNotNull { // Just in case, since Android 14+ requires them to be read-only if (it.canWrite()) { it.setReadOnly() } val path = it.absolutePath pkgManager.getPackageArchiveInfo(path, PACKAGE_FLAGS) ?.apply { applicationInfo!!.fixBasePaths(path) } } ?.filter { isPackageAnExtension(it) } ?.map { MangaExtensionInfo(packageInfo = it, isShared = false) } ?: emptySequence() val extPkgs = (sharedExtPkgs + privateExtPkgs) // Remove duplicates. Shared takes priority than private by default .distinctBy { it.packageInfo.packageName } // Compare version number .mapNotNull { sharedPkg -> val privatePkg = privateExtPkgs .singleOrNull { it.packageInfo.packageName == sharedPkg.packageInfo.packageName } selectExtensionPackage(sharedPkg, privatePkg) } .toList() if (extPkgs.isEmpty()) return emptyList() // Load each extension concurrently and wait for completion return runBlocking { val deferred = extPkgs.map { async { loadMangaExtension(context, it) } } deferred.awaitAll() } } /** * Attempts to load an extension from the given package name. It checks if the extension * contains the required feature flag before trying to load it. */ suspend fun loadMangaExtensionFromPkgName(context: Context, pkgName: String): MangaLoadResult { val extensionPackage = getMangaExtensionInfoFromPkgName(context, pkgName) if (extensionPackage == null) { logcat(LogPriority.ERROR) { "Extension package is not found ($pkgName)" } return MangaLoadResult.Error } return loadMangaExtension(context, extensionPackage) } fun getMangaExtensionPackageInfoFromPkgName(context: Context, pkgName: String): PackageInfo? { return getMangaExtensionInfoFromPkgName(context, pkgName)?.packageInfo } private fun getMangaExtensionInfoFromPkgName(context: Context, pkgName: String): MangaExtensionInfo? { val privateExtensionFile = File( getPrivateExtensionDir(context), "$pkgName.$PRIVATE_EXTENSION_EXTENSION", ) val privatePkg = if (privateExtensionFile.isFile) { context.packageManager.getPackageArchiveInfo( privateExtensionFile.absolutePath, PACKAGE_FLAGS, ) ?.takeIf { isPackageAnExtension(it) } ?.let { it.applicationInfo!!.fixBasePaths(privateExtensionFile.absolutePath) MangaExtensionInfo( packageInfo = it, isShared = false, ) } } else { null } val sharedPkg = try { context.packageManager.getPackageInfo(pkgName, PACKAGE_FLAGS) .takeIf { isPackageAnExtension(it) } ?.let { MangaExtensionInfo( packageInfo = it, isShared = true, ) } } catch (error: PackageManager.NameNotFoundException) { null } return selectExtensionPackage(sharedPkg, privatePkg) } /** * Loads an extension * * @param context The application context. * @param extensionInfo The extension to load. */ private suspend fun loadMangaExtension(context: Context, extensionInfo: MangaExtensionInfo): MangaLoadResult { val pkgManager = context.packageManager val pkgInfo = extensionInfo.packageInfo val appInfo = pkgInfo.applicationInfo!! val pkgName = pkgInfo.packageName val extName = pkgManager.getApplicationLabel(appInfo).toString().substringAfter( "Tachiyomi: ", ) val versionName = pkgInfo.versionName val versionCode = PackageInfoCompat.getLongVersionCode(pkgInfo) if (versionName.isNullOrEmpty()) { logcat(LogPriority.WARN) { "Missing versionName for extension $extName" } return MangaLoadResult.Error } // Validate lib version val libVersion = versionName.substringBeforeLast('.').toDoubleOrNull() if (libVersion == null || libVersion < LIB_VERSION_MIN || libVersion > LIB_VERSION_MAX) { logcat(LogPriority.WARN) { "Lib version is $libVersion, while only versions " + "$LIB_VERSION_MIN to $LIB_VERSION_MAX are allowed" } return MangaLoadResult.Error } val signatures = getSignatures(pkgInfo) if (signatures.isNullOrEmpty()) { logcat(LogPriority.WARN) { "Package $pkgName isn't signed" } return MangaLoadResult.Error } else if (!trustExtension.isTrusted(pkgInfo, signatures)) { val extension = MangaExtension.Untrusted( extName, pkgName, versionName, versionCode, libVersion, signatures.last(), ) logcat(LogPriority.WARN) { "Extension $pkgName isn't trusted" } return MangaLoadResult.Untrusted(extension) } val isNsfw = appInfo.metaData.getInt(METADATA_NSFW) == 1 if (!loadNsfwSource && isNsfw) { logcat(LogPriority.WARN) { "NSFW extension $pkgName not allowed" } return MangaLoadResult.Error } val classLoader = try { ChildFirstPathClassLoader(appInfo.sourceDir, null, context.classLoader) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Extension load error: $extName ($pkgName)" } return MangaLoadResult.Error } val sources = appInfo.metaData.getString(METADATA_SOURCE_CLASS)!! .split(";") .map { val sourceClass = it.trim() if (sourceClass.startsWith(".")) { pkgInfo.packageName + sourceClass } else { sourceClass } } .flatMap { try { when (val obj = Class.forName(it, false, classLoader).getDeclaredConstructor().newInstance()) { is MangaSource -> listOf(obj) is SourceFactory -> obj.createSources() else -> throw Exception("Unknown source class type: ${obj.javaClass}") } } catch (e: LinkageError) { try { val fallBackClassLoader = PathClassLoader(appInfo.sourceDir, null, context.classLoader) when ( val obj = Class.forName( it, false, fallBackClassLoader, ).getDeclaredConstructor().newInstance() ) { is MangaSource -> { listOf(obj) } is SourceFactory -> obj.createSources() else -> throw Exception("Unknown source class type: ${obj.javaClass}") } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Extension load error: $extName ($it)" } return MangaLoadResult.Error } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) { "Extension load error: $extName ($it)" } return MangaLoadResult.Error } } val langs = sources.filterIsInstance() .map { it.lang } .toSet() val lang = when (langs.size) { 0 -> "" 1 -> langs.first() else -> "all" } val extension = MangaExtension.Installed( name = extName, pkgName = pkgName, versionName = versionName, versionCode = versionCode, libVersion = libVersion, lang = lang, isNsfw = isNsfw, sources = sources, pkgFactory = appInfo.metaData.getString(METADATA_SOURCE_FACTORY), icon = appInfo.loadIcon(pkgManager), isShared = extensionInfo.isShared, ) return MangaLoadResult.Success(extension) } /** * Choose which extension package to use based on version code * * @param shared extension installed to system * @param private extension installed to data directory */ private fun selectExtensionPackage(shared: MangaExtensionInfo?, private: MangaExtensionInfo?): MangaExtensionInfo? { when { private == null && shared != null -> return shared shared == null && private != null -> return private shared == null && private == null -> return null } return if (PackageInfoCompat.getLongVersionCode(shared!!.packageInfo) >= PackageInfoCompat.getLongVersionCode(private!!.packageInfo) ) { shared } else { private } } /** * Returns true if the given package is an extension. * * @param pkgInfo The package info of the application. */ private fun isPackageAnExtension(pkgInfo: PackageInfo): Boolean { return pkgInfo.reqFeatures.orEmpty().any { it.name == EXTENSION_FEATURE } } /** * Returns the signatures of the package or null if it's not signed. * * @param pkgInfo The package info of the application. * @return List SHA256 digest of the signatures */ private fun getSignatures(pkgInfo: PackageInfo): List? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val signingInfo = pkgInfo.signingInfo!! if (signingInfo.hasMultipleSigners()) { signingInfo.apkContentsSigners } else { signingInfo.signingCertificateHistory } } else { @Suppress("DEPRECATION") pkgInfo.signatures } ?.map { Hash.sha256(it.toByteArray()) } ?.toList() } /** * On Android 13+ the ApplicationInfo generated by getPackageArchiveInfo doesn't * have sourceDir which breaks assets loading (used for getting icon here). */ private fun ApplicationInfo.fixBasePaths(apkPath: String) { if (sourceDir == null) { sourceDir = apkPath } if (publicSourceDir == null) { publicSourceDir = apkPath } } private data class MangaExtensionInfo( val packageInfo: PackageInfo, val isShared: Boolean, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt ================================================ package eu.kanade.tachiyomi.source.anime import android.content.Context import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.domain.source.anime.repository.AnimeStubSourceRepository import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.source.local.entries.anime.LocalAnimeSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.util.concurrent.ConcurrentHashMap class AndroidAnimeSourceManager( private val context: Context, private val extensionManager: AnimeExtensionManager, private val sourceRepository: AnimeStubSourceRepository, ) : AnimeSourceManager { private val _isInitialized = MutableStateFlow(false) override val isInitialized: StateFlow = _isInitialized.asStateFlow() private val downloadManager: AnimeDownloadManager by injectLazy() private val scope = CoroutineScope(Job() + Dispatchers.IO) private val sourcesMapFlow = MutableStateFlow(ConcurrentHashMap()) private val stubSourcesMap = ConcurrentHashMap() override val catalogueSources: Flow> = sourcesMapFlow.map { it.values.filterIsInstance() } init { scope.launch { extensionManager.installedExtensionsFlow .collectLatest { extensions -> val mutableMap = ConcurrentHashMap( mapOf( LocalAnimeSource.ID to LocalAnimeSource( context, Injekt.get(), Injekt.get(), Injekt.get(), Injekt.get(), Injekt.get(), ), ), ) extensions.forEach { extension -> extension.sources.forEach { mutableMap[it.id] = it registerStubSource(StubAnimeSource.from(it)) } } sourcesMapFlow.value = mutableMap _isInitialized.value = true } } scope.launch { sourceRepository.subscribeAllAnime() .collectLatest { sources -> val mutableMap = stubSourcesMap.toMutableMap() sources.forEach { mutableMap[it.id] = it } } } } override fun get(sourceKey: Long): AnimeSource? { return sourcesMapFlow.value[sourceKey] } override fun getOrStub(sourceKey: Long): AnimeSource { return sourcesMapFlow.value[sourceKey] ?: stubSourcesMap.getOrPut(sourceKey) { runBlocking { createStubSource(sourceKey) } } } override fun getOnlineSources() = sourcesMapFlow.value.values.filterIsInstance() override fun getCatalogueSources() = sourcesMapFlow.value.values.filterIsInstance() override fun getStubSources(): List { val onlineSourceIds = getOnlineSources().map { it.id } return stubSourcesMap.values.filterNot { it.id in onlineSourceIds } } private fun registerStubSource(source: StubAnimeSource) { scope.launch { val dbSource = sourceRepository.getStubAnimeSource(source.id) if (dbSource == source) return@launch sourceRepository.upsertStubAnimeSource(source.id, source.lang, source.name) if (dbSource != null) { downloadManager.renameSource(dbSource, source) } } } private suspend fun createStubSource(id: Long): StubAnimeSource { sourceRepository.getStubAnimeSource(id)?.let { return it } extensionManager.getSourceData(id)?.let { registerStubSource(it) return it } return StubAnimeSource(id = id, lang = "", name = "") } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/source/anime/AnimeSourceExtensions.kt ================================================ package eu.kanade.tachiyomi.source.anime import android.graphics.drawable.Drawable import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.source.local.entries.anime.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get fun AnimeSource.icon(): Drawable? = Injekt.get().getAppIconForSource(this.id) fun AnimeSource.getPreferenceKey(): String = "source_$id" fun AnimeSource.toStubSource(): StubAnimeSource = StubAnimeSource(id = id, lang = lang, name = name) fun AnimeSource.getNameForAnimeInfo(): String { val preferences = Injekt.get() val enabledLanguages = preferences.enabledLanguages().get() .filterNot { it in listOf("all", "other") } val hasOneActiveLanguages = enabledLanguages.size == 1 val isInEnabledLanguages = lang in enabledLanguages return when { // For edge cases where user disables a source they got manga of in their library. hasOneActiveLanguages && !isInEnabledLanguages -> toString() // Hide the language tag when only one language is used. hasOneActiveLanguages && isInEnabledLanguages -> name else -> toString() } } fun AnimeSource.isLocalOrStub(): Boolean = isLocal() || this is StubAnimeSource ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt ================================================ package eu.kanade.tachiyomi.source.manga import android.content.Context import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.online.HttpSource import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import tachiyomi.domain.source.manga.model.StubMangaSource import tachiyomi.domain.source.manga.repository.MangaStubSourceRepository import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.source.local.entries.manga.LocalMangaSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.util.concurrent.ConcurrentHashMap class AndroidMangaSourceManager( private val context: Context, private val extensionManager: MangaExtensionManager, private val sourceRepository: MangaStubSourceRepository, ) : MangaSourceManager { private val _isInitialized = MutableStateFlow(false) override val isInitialized: StateFlow = _isInitialized.asStateFlow() private val downloadManager: MangaDownloadManager by injectLazy() private val scope = CoroutineScope(Job() + Dispatchers.IO) private val sourcesMapFlow = MutableStateFlow(ConcurrentHashMap()) private val stubSourcesMap = ConcurrentHashMap() override val catalogueSources: Flow> = sourcesMapFlow.map { it.values.filterIsInstance() } init { scope.launch { extensionManager.installedExtensionsFlow .collectLatest { extensions -> val mutableMap = ConcurrentHashMap( mapOf( LocalMangaSource.ID to LocalMangaSource( context, Injekt.get(), Injekt.get(), ), ), ) extensions.forEach { extension -> extension.sources.forEach { mutableMap[it.id] = it registerStubSource(StubMangaSource.from(it)) } } sourcesMapFlow.value = mutableMap _isInitialized.value = true } } scope.launch { sourceRepository.subscribeAllManga() .collectLatest { sources -> val mutableMap = stubSourcesMap.toMutableMap() sources.forEach { mutableMap[it.id] = it } } } } override fun get(sourceKey: Long): MangaSource? { return sourcesMapFlow.value[sourceKey] } override fun getOrStub(sourceKey: Long): MangaSource { return sourcesMapFlow.value[sourceKey] ?: stubSourcesMap.getOrPut(sourceKey) { runBlocking { createStubSource(sourceKey) } } } override fun getOnlineSources() = sourcesMapFlow.value.values.filterIsInstance() override fun getCatalogueSources() = sourcesMapFlow.value.values.filterIsInstance() override fun getStubSources(): List { val onlineSourceIds = getOnlineSources().map { it.id } return stubSourcesMap.values.filterNot { it.id in onlineSourceIds } } private fun registerStubSource(source: StubMangaSource) { scope.launch { val dbSource = sourceRepository.getStubMangaSource(source.id) if (dbSource == source) return@launch sourceRepository.upsertStubMangaSource(source.id, source.lang, source.name) if (dbSource != null) { downloadManager.renameSource(dbSource, source) } } } private suspend fun createStubSource(id: Long): StubMangaSource { sourceRepository.getStubMangaSource(id)?.let { return it } extensionManager.getSourceData(id)?.let { registerStubSource(it) return it } return StubMangaSource(id = id, lang = "", name = "") } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/source/manga/MangaSourceExtensions.kt ================================================ package eu.kanade.tachiyomi.source.manga import android.graphics.drawable.Drawable import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.source.MangaSource import tachiyomi.domain.source.manga.model.StubMangaSource import tachiyomi.source.local.entries.manga.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get fun MangaSource.icon(): Drawable? = Injekt.get().getAppIconForSource(this.id) fun MangaSource.getPreferenceKey(): String = "source_$id" fun MangaSource.toStubSource(): StubMangaSource = StubMangaSource(id = id, lang = lang, name = name) fun MangaSource.getNameForMangaInfo(): String { val preferences = Injekt.get() val enabledLanguages = preferences.enabledLanguages().get() .filterNot { it in listOf("all", "other") } val hasOneActiveLanguages = enabledLanguages.size == 1 val isInEnabledLanguages = lang in enabledLanguages return when { // For edge cases where user disables a source they got manga of in their library. hasOneActiveLanguages && !isInEnabledLanguages -> toString() // Hide the language tag when only one language is used. hasOneActiveLanguages && isInEnabledLanguages -> name else -> toString() } } fun MangaSource.isLocalOrStub(): Boolean = isLocal() || this is StubMangaSource ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseActivity.kt ================================================ package eu.kanade.tachiyomi.ui.base.activity import android.content.Context import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegateImpl import eu.kanade.tachiyomi.ui.base.delegate.ThemingDelegate import eu.kanade.tachiyomi.ui.base.delegate.ThemingDelegateImpl import eu.kanade.tachiyomi.util.system.prepareTabletUiContext open class BaseActivity : AppCompatActivity(), SecureActivityDelegate by SecureActivityDelegateImpl(), ThemingDelegate by ThemingDelegateImpl() { override fun attachBaseContext(newBase: Context) { super.attachBaseContext(newBase.prepareTabletUiContext()) } override fun onCreate(savedInstanceState: Bundle?) { applyAppTheme(this) super.onCreate(savedInstanceState) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt ================================================ package eu.kanade.tachiyomi.ui.base.delegate import android.app.Activity import android.content.Intent import android.os.Build import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.ui.security.UnlockActivity import eu.kanade.tachiyomi.util.system.AuthenticatorUtil import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported import eu.kanade.tachiyomi.util.view.setSecureScreen import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy interface SecureActivityDelegate { fun registerSecureActivity(activity: AppCompatActivity) companion object { /** * Set to true if we need the first activity to authenticate. * * Always require unlock if app is killed. */ var requireUnlock = true fun onApplicationStopped() { val preferences = Injekt.get() if (!preferences.useAuthenticator().get()) return if (!AuthenticatorUtil.isAuthenticating) { // Return if app is closed in locked state if (requireUnlock) return // Save app close time if lock is delayed if (preferences.lockAppAfter().get() > 0) { preferences.lastAppClosed().set(System.currentTimeMillis()) } } } /** * Checks if unlock is needed when app comes foreground. */ fun onApplicationStart() { val preferences = Injekt.get() if (!preferences.useAuthenticator().get()) return val lastClosedPref = preferences.lastAppClosed() // `requireUnlock` can be true on process start or if app was closed in locked state if (!AuthenticatorUtil.isAuthenticating && !requireUnlock) { requireUnlock = when (val lockDelay = preferences.lockAppAfter().get()) { -1 -> false // Never 0 -> true // Always else -> lastClosedPref.get() + lockDelay * 60_000 <= System.currentTimeMillis() } } lastClosedPref.delete() } fun unlock() { requireUnlock = false } } } class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObserver { private lateinit var activity: AppCompatActivity private val preferences: BasePreferences by injectLazy() private val securityPreferences: SecurityPreferences by injectLazy() override fun registerSecureActivity(activity: AppCompatActivity) { this.activity = activity activity.lifecycle.addObserver(this) } override fun onCreate(owner: LifecycleOwner) { setSecureScreen() } override fun onResume(owner: LifecycleOwner) { setAppLock() } private fun setSecureScreen() { val secureScreenFlow = securityPreferences.secureScreen().changes() val incognitoModeFlow = preferences.incognitoMode().changes() combine(secureScreenFlow, incognitoModeFlow) { secureScreen, incognitoMode -> secureScreen == SecurityPreferences.SecureScreenMode.ALWAYS || secureScreen == SecurityPreferences.SecureScreenMode.INCOGNITO && incognitoMode } .onEach(activity.window::setSecureScreen) .launchIn(activity.lifecycleScope) } private fun setAppLock() { if (!securityPreferences.useAuthenticator().get()) return if (activity.isAuthenticationSupported()) { if (!SecureActivityDelegate.requireUnlock) return activity.startActivity(Intent(activity, UnlockActivity::class.java)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { activity.overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, 0, 0) } else { @Suppress("DEPRECATION") activity.overridePendingTransition(0, 0) } } else { securityPreferences.useAuthenticator().set(false) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/ThemingDelegate.kt ================================================ package eu.kanade.tachiyomi.ui.base.delegate import android.app.Activity import eu.kanade.domain.ui.UiPreferences import eu.kanade.domain.ui.model.AppTheme import eu.kanade.tachiyomi.R import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get interface ThemingDelegate { fun applyAppTheme(activity: Activity) companion object { fun getThemeResIds(appTheme: AppTheme, isAmoled: Boolean): List { return buildList(2) { add(themeResources.getOrDefault(appTheme, R.style.Theme_Tachiyomi)) if (isAmoled) add(R.style.ThemeOverlay_Tachiyomi_Amoled) } } } } class ThemingDelegateImpl : ThemingDelegate { override fun applyAppTheme(activity: Activity) { val uiPreferences = Injekt.get() ThemingDelegate.getThemeResIds( uiPreferences.appTheme().get(), uiPreferences.themeDarkAmoled().get(), ) .forEach(activity::setTheme) } } private val themeResources: Map = mapOf( AppTheme.MONET to R.style.Theme_Tachiyomi_Monet, AppTheme.COTTONCANDY to R.style.Theme_Tachiyomi_CottonCandy, AppTheme.GREEN_APPLE to R.style.Theme_Tachiyomi_GreenApple, AppTheme.LAVENDER to R.style.Theme_Tachiyomi_Lavender, AppTheme.MIDNIGHT_DUSK to R.style.Theme_Tachiyomi_MidnightDusk, AppTheme.MONOCHROME to R.style.Theme_Tachiyomi_Monochrome, AppTheme.MOCHA to R.style.Theme_Tachiyomi_Mocha, AppTheme.NORD to R.style.Theme_Tachiyomi_Nord, AppTheme.STRAWBERRY_DAIQUIRI to R.style.Theme_Tachiyomi_StrawberryDaiquiri, AppTheme.TAKO to R.style.Theme_Tachiyomi_Tako, AppTheme.TEALTURQUOISE to R.style.Theme_Tachiyomi_TealTurquoise, AppTheme.YINYANG to R.style.Theme_Tachiyomi_YinYang, AppTheme.YOTSUBA to R.style.Theme_Tachiyomi_Yotsuba, AppTheme.CLOUDFLARE to R.style.Theme_Tachiyomi_Cloudflare, AppTheme.SAPPHIRE to R.style.Theme_Tachiyomi_Sapphire, AppTheme.DOOM to R.style.Theme_Tachiyomi_Doom, AppTheme.MATRIX to R.style.Theme_Tachiyomi_Matrix, AppTheme.TIDAL_WAVE to R.style.Theme_Tachiyomi_TidalWave, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.presentation.components.TabbedScreen import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.browse.anime.extension.AnimeExtensionsScreenModel import eu.kanade.tachiyomi.ui.browse.anime.extension.animeExtensionsTab import eu.kanade.tachiyomi.ui.browse.anime.migration.sources.migrateAnimeSourceTab import eu.kanade.tachiyomi.ui.browse.anime.source.animeSourcesTab import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearchScreen import eu.kanade.tachiyomi.ui.browse.manga.extension.MangaExtensionsScreenModel import eu.kanade.tachiyomi.ui.browse.manga.extension.mangaExtensionsTab import eu.kanade.tachiyomi.ui.browse.manga.migration.sources.migrateMangaSourceTab import eu.kanade.tachiyomi.ui.browse.manga.source.mangaSourcesTab import eu.kanade.tachiyomi.ui.main.MainActivity import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource data object BrowseTab : Tab { override val options: TabOptions @Composable get() { val isSelected = LocalTabNavigator.current.current is BrowseTab val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_browse_enter) return TabOptions( index = 3u, title = stringResource(MR.strings.browse), icon = rememberAnimatedVectorPainter(image, isSelected), ) } // TODO: Find a way to let it open Global Anime/Manga Search depending on what Tab(e.g. Anime/Manga Source Tab) is open override suspend fun onReselect(navigator: Navigator) { navigator.push(GlobalAnimeSearchScreen()) } private val switchToTabNumberChannel = Channel(1, BufferOverflow.DROP_OLDEST) fun showExtension() { switchToTabNumberChannel.trySend(3) // Manga extensions: tab no. 3 } fun showAnimeExtension() { switchToTabNumberChannel.trySend(2) // Anime extensions: tab no. 2 } @Composable override fun Content() { val context = LocalContext.current // Hoisted for extensions tab's search bar val mangaExtensionsScreenModel = rememberScreenModel { MangaExtensionsScreenModel() } val mangaExtensionsState by mangaExtensionsScreenModel.state.collectAsState() val animeExtensionsScreenModel = rememberScreenModel { AnimeExtensionsScreenModel() } val animeExtensionsState by animeExtensionsScreenModel.state.collectAsState() val tabs = persistentListOf( animeSourcesTab(), mangaSourcesTab(), animeExtensionsTab(animeExtensionsScreenModel), mangaExtensionsTab(mangaExtensionsScreenModel), migrateAnimeSourceTab(), migrateMangaSourceTab(), ) val state = rememberPagerState { tabs.size } TabbedScreen( titleRes = MR.strings.browse, tabs = tabs, state = state, mangaSearchQuery = mangaExtensionsState.searchQuery, onChangeMangaSearchQuery = mangaExtensionsScreenModel::search, animeSearchQuery = animeExtensionsState.searchQuery, onChangeAnimeSearchQuery = animeExtensionsScreenModel::search, scrollable = true, ) LaunchedEffect(Unit) { switchToTabNumberChannel.receiveAsFlow() .collectLatest { state.scrollToPage(it) } } LaunchedEffect(Unit) { (context as? MainActivity)?.ready = true } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionFilterScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.AnimeExtensionFilterScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen class AnimeExtensionFilterScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { AnimeExtensionFilterScreenModel() } val state by screenModel.state.collectAsState() if (state is AnimeExtensionFilterState.Loading) { LoadingScreen() return } val successState = state as AnimeExtensionFilterState.Success AnimeExtensionFilterScreen( navigateUp = navigator::pop, state = successState, onClickToggle = screenModel::toggle, ) LaunchedEffect(Unit) { screenModel.events.collectLatest { when (it) { AnimeExtensionFilterEvent.FailedFetchingLanguages -> { context.toast(MR.strings.internal_error) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionFilterScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.extension.anime.interactor.GetAnimeExtensionLanguages import eu.kanade.domain.source.interactor.ToggleLanguage import eu.kanade.domain.source.service.SourcePreferences import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeExtensionFilterScreenModel( private val preferences: SourcePreferences = Injekt.get(), private val getExtensionLanguages: GetAnimeExtensionLanguages = Injekt.get(), private val toggleLanguage: ToggleLanguage = Injekt.get(), ) : StateScreenModel(AnimeExtensionFilterState.Loading) { private val _events: Channel = Channel() val events: Flow = _events.receiveAsFlow() init { screenModelScope.launch { combine( getExtensionLanguages.subscribe(), preferences.enabledLanguages().changes(), ) { a, b -> a to b } .catch { throwable -> logcat(LogPriority.ERROR, throwable) _events.send(AnimeExtensionFilterEvent.FailedFetchingLanguages) } .collectLatest { (extensionLanguages, enabledLanguages) -> mutableState.update { AnimeExtensionFilterState.Success( languages = extensionLanguages.toImmutableList(), enabledLanguages = enabledLanguages.toImmutableSet(), ) } } } } fun toggle(language: String) { toggleLanguage.await(language) } } sealed interface AnimeExtensionFilterEvent { data object FailedFetchingLanguages : AnimeExtensionFilterEvent } sealed interface AnimeExtensionFilterState { @Immutable data object Loading : AnimeExtensionFilterState @Immutable data class Success( val languages: ImmutableList, val enabledLanguages: ImmutableSet = persistentSetOf(), ) : AnimeExtensionFilterState { val isEmpty: Boolean get() = languages.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension import android.app.Application import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.extension.anime.interactor.GetAnimeExtensionsByType import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds class AnimeExtensionsScreenModel( preferences: SourcePreferences = Injekt.get(), basePreferences: BasePreferences = Injekt.get(), private val extensionManager: AnimeExtensionManager = Injekt.get(), private val getExtensions: GetAnimeExtensionsByType = Injekt.get(), ) : StateScreenModel(State()) { private val currentDownloads = MutableStateFlow>(hashMapOf()) init { val context = Injekt.get() val extensionMapper: (Map) -> ((AnimeExtension) -> AnimeExtensionUiModel.Item) = { map -> { AnimeExtensionUiModel.Item(it, map[it.pkgName] ?: InstallStep.Idle) } } val queryFilter: (String) -> ((AnimeExtension) -> Boolean) = { query -> filter@{ extension -> if (query.isEmpty()) return@filter true query.split(",").any { _input -> val input = _input.trim() if (input.isEmpty()) return@any false when (extension) { is AnimeExtension.Available -> { extension.sources.any { it.name.contains(input, ignoreCase = true) || it.baseUrl.contains(input, ignoreCase = true) || it.id == input.toLongOrNull() } || extension.name.contains(input, ignoreCase = true) } is AnimeExtension.Installed -> { extension.sources.any { it.name.contains(input, ignoreCase = true) || it.id == input.toLongOrNull() || if (it is AnimeHttpSource) { it.baseUrl.contains( input, ignoreCase = true, ) } else { false } } || extension.name.contains(input, ignoreCase = true) } is AnimeExtension.Untrusted -> extension.name.contains( input, ignoreCase = true, ) } } } } screenModelScope.launchIO { combine( state.map { it.searchQuery }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS), currentDownloads, getExtensions.subscribe(), ) { query, downloads, (_updates, _installed, _available, _untrusted) -> val searchQuery = query ?: "" val itemsGroups: ItemGroups = mutableMapOf() val updates = _updates.filter(queryFilter(searchQuery)).map( extensionMapper(downloads), ) if (updates.isNotEmpty()) { itemsGroups[AnimeExtensionUiModel.Header.Resource(MR.strings.ext_updates_pending)] = updates } val installed = _installed.filter(queryFilter(searchQuery)).map( extensionMapper(downloads), ) val untrusted = _untrusted.filter(queryFilter(searchQuery)).map( extensionMapper(downloads), ) if (installed.isNotEmpty() || untrusted.isNotEmpty()) { itemsGroups[AnimeExtensionUiModel.Header.Resource(MR.strings.ext_installed)] = installed + untrusted } val languagesWithExtensions = _available .filter(queryFilter(searchQuery)) .groupBy { it.lang } .toSortedMap(LocaleHelper.comparator) .map { (lang, exts) -> AnimeExtensionUiModel.Header.Text( LocaleHelper.getSourceDisplayName(lang, context), ) to exts.map(extensionMapper(downloads)) } if (languagesWithExtensions.isNotEmpty()) { itemsGroups.putAll(languagesWithExtensions) } itemsGroups } .collectLatest { mutableState.update { state -> state.copy( isLoading = false, items = it, ) } } } screenModelScope.launchIO { findAvailableExtensions() } preferences.animeExtensionUpdatesCount().changes() .onEach { mutableState.update { state -> state.copy(updates = it) } } .launchIn(screenModelScope) basePreferences.extensionInstaller().changes() .onEach { mutableState.update { state -> state.copy(installer = it) } } .launchIn(screenModelScope) } fun search(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun updateAllExtensions() { screenModelScope.launchIO { state.value.items.values.flatten() .map { it.extension } .filterIsInstance() .filter { it.hasUpdate } .forEach(::updateExtension) } } fun installExtension(extension: AnimeExtension.Available) { screenModelScope.launchIO { extensionManager.installExtension(extension).collectToInstallUpdate(extension) } } fun updateExtension(extension: AnimeExtension.Installed) { screenModelScope.launchIO { extensionManager.updateExtension(extension).collectToInstallUpdate(extension) } } fun cancelInstallUpdateExtension(extension: AnimeExtension) { extensionManager.cancelInstallUpdateExtension(extension) } private fun addDownloadState(extension: AnimeExtension, installStep: InstallStep) { currentDownloads.update { it + Pair(extension.pkgName, installStep) } } private fun removeDownloadState(extension: AnimeExtension) { currentDownloads.update { it - extension.pkgName } } private suspend fun Flow.collectToInstallUpdate(extension: AnimeExtension) = this .onEach { installStep -> addDownloadState(extension, installStep) } .onCompletion { removeDownloadState(extension) } .collect() fun uninstallExtension(extension: AnimeExtension) { extensionManager.uninstallExtension(extension) } fun findAvailableExtensions() { screenModelScope.launchIO { mutableState.update { it.copy(isRefreshing = true) } extensionManager.findAvailableExtensions() // Fake slower refresh so it doesn't seem like it's not doing anything delay(1.seconds) mutableState.update { it.copy(isRefreshing = false) } } } fun trustExtension(extension: AnimeExtension.Untrusted) { screenModelScope.launch { extensionManager.trust(extension) } } @Immutable data class State( val isLoading: Boolean = true, val isRefreshing: Boolean = false, val items: ItemGroups = mutableMapOf(), val updates: Int = 0, val installer: BasePreferences.ExtensionInstaller? = null, val searchQuery: String? = null, ) { val isEmpty = items.isEmpty() } } typealias ItemGroups = MutableMap> object AnimeExtensionUiModel { sealed interface Header { data class Resource(val textRes: StringResource) : Header data class Text(val text: String) : Header } data class Item( val extension: AnimeExtension, val installStep: InstallStep, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.AnimeExtensionScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.presentation.more.settings.screen.browse.AnimeExtensionReposScreen import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.ui.browse.anime.extension.details.AnimeExtensionDetailsScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import eu.kanade.tachiyomi.util.system.isPackageInstalled import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun animeExtensionsTab( extensionsScreenModel: AnimeExtensionsScreenModel, ): TabContent { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val state by extensionsScreenModel.state.collectAsState() var privateExtensionToUninstall by remember { mutableStateOf(null) } return TabContent( titleRes = AYMR.strings.label_anime_extensions, badgeNumber = state.updates.takeIf { it > 0 }, searchEnabled = true, actions = persistentListOf( AppBar.OverflowAction( title = stringResource(MR.strings.action_filter), onClick = { navigator.push( AnimeExtensionFilterScreen(), ) }, ), AppBar.OverflowAction( title = stringResource(MR.strings.label_extension_repos), onClick = { navigator.push(AnimeExtensionReposScreen()) }, ), ), content = { contentPadding, _ -> AnimeExtensionScreen( state = state, contentPadding = contentPadding, searchQuery = state.searchQuery, onLongClickItem = { extension -> when (extension) { is AnimeExtension.Available -> extensionsScreenModel.installExtension( extension, ) else -> { if (context.isPackageInstalled(extension.pkgName)) { extensionsScreenModel.uninstallExtension(extension) } else { privateExtensionToUninstall = extension } } } }, onClickItemCancel = extensionsScreenModel::cancelInstallUpdateExtension, onClickUpdateAll = extensionsScreenModel::updateAllExtensions, onOpenWebView = { extension -> extension.sources.getOrNull(0)?.let { navigator.push( WebViewScreen( url = it.baseUrl, initialTitle = it.name, sourceId = it.id, ), ) } }, onInstallExtension = extensionsScreenModel::installExtension, onOpenExtension = { navigator.push(AnimeExtensionDetailsScreen(it.pkgName)) }, onTrustExtension = { extensionsScreenModel.trustExtension(it) }, onUninstallExtension = { extensionsScreenModel.uninstallExtension(it) }, onUpdateExtension = extensionsScreenModel::updateExtension, onRefresh = extensionsScreenModel::findAvailableExtensions, ) privateExtensionToUninstall?.let { extension -> AnimeExtensionUninstallConfirmation( extensionName = extension.name, onClickConfirm = { extensionsScreenModel.uninstallExtension(extension) }, onDismissRequest = { privateExtensionToUninstall = null }, ) } }, ) } @Composable private fun AnimeExtensionUninstallConfirmation( extensionName: String, onClickConfirm: () -> Unit, onDismissRequest: () -> Unit, ) { AlertDialog( title = { Text(text = stringResource(MR.strings.ext_confirm_remove)) }, text = { Text(text = stringResource(MR.strings.remove_private_extension_message, extensionName)) }, confirmButton = { TextButton( onClick = { onClickConfirm() onDismissRequest() }, ) { Text(text = stringResource(MR.strings.ext_remove)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, onDismissRequest = onDismissRequest, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/details/AnimeExtensionDetailsScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension.details import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.AnimeExtensionDetailsScreen import eu.kanade.presentation.util.Screen import kotlinx.coroutines.flow.collectLatest import tachiyomi.presentation.core.screens.LoadingScreen data class AnimeExtensionDetailsScreen( private val pkgName: String, ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val screenModel = rememberScreenModel { AnimeExtensionDetailsScreenModel( pkgName = pkgName, context = context, ) } val state by screenModel.state.collectAsState() if (state.isLoading) { LoadingScreen() return } val navigator = LocalNavigator.currentOrThrow AnimeExtensionDetailsScreen( navigateUp = navigator::pop, state = state, onClickSourcePreferences = { navigator.push(AnimeSourcePreferencesScreen(it)) }, onClickEnableAll = { screenModel.toggleSources(true) }, onClickDisableAll = { screenModel.toggleSources(false) }, onClickClearCookies = screenModel::clearCookies, onClickUninstall = screenModel::uninstallExtension, onClickSource = screenModel::toggleSource, onClickIncognito = screenModel::toggleIncognito, ) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> if (event is AnimeExtensionDetailsEvent.Uninstalled) { navigator.pop() } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/details/AnimeExtensionDetailsScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension.details import android.content.Context import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.extension.anime.interactor.AnimeExtensionSourceItem import eu.kanade.domain.extension.anime.interactor.GetAnimeExtensionSources import eu.kanade.domain.source.anime.interactor.ToggleAnimeIncognito import eu.kanade.domain.source.anime.interactor.ToggleAnimeSource import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import okhttp3.HttpUrl.Companion.toHttpUrl import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeExtensionDetailsScreenModel( pkgName: String, context: Context, private val network: NetworkHelper = Injekt.get(), private val extensionManager: AnimeExtensionManager = Injekt.get(), private val getExtensionSources: GetAnimeExtensionSources = Injekt.get(), private val toggleSource: ToggleAnimeSource = Injekt.get(), private val toggleIncognito: ToggleAnimeIncognito = Injekt.get(), private val preferences: SourcePreferences = Injekt.get(), ) : StateScreenModel(State()) { private val _events: Channel = Channel() val events: Flow = _events.receiveAsFlow() init { screenModelScope.launch { launch { extensionManager.installedExtensionsFlow .map { it.firstOrNull { extension -> extension.pkgName == pkgName } } .collectLatest { extension -> if (extension == null) { _events.send(AnimeExtensionDetailsEvent.Uninstalled) return@collectLatest } mutableState.update { state -> state.copy(extension = extension) } } } launch { state.collectLatest { state -> if (state.extension == null) return@collectLatest getExtensionSources.subscribe(state.extension) .map { it.sortedWith( compareBy( { !it.enabled }, { item -> item.source.name.takeIf { item.labelAsName } ?: LocaleHelper.getSourceDisplayName( item.source.lang, context, ).lowercase() }, ), ) } .catch { throwable -> logcat(LogPriority.ERROR, throwable) mutableState.update { it.copy(_sources = persistentListOf()) } } .collectLatest { sources -> mutableState.update { it.copy(_sources = sources.toImmutableList()) } } } } launch { preferences.incognitoAnimeExtensions() .changes() .map { pkgName in it } .distinctUntilChanged() .collectLatest { isIncognito -> mutableState.update { it.copy(isIncognito = isIncognito) } } } } } fun clearCookies() { val extension = state.value.extension ?: return val urls = extension.sources .filterIsInstance() .mapNotNull { it.baseUrl.takeUnless { url -> url.isEmpty() } } .distinct() val cleared = urls.sumOf { try { network.cookieJar.remove(it.toHttpUrl()) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to clear cookies for $it" } 0 } } logcat { "Cleared $cleared cookies for: ${urls.joinToString()}" } } fun uninstallExtension() { val extension = state.value.extension ?: return extensionManager.uninstallExtension(extension) } fun toggleSource(sourceId: Long) { toggleSource.await(sourceId) } fun toggleSources(enable: Boolean) { state.value.extension?.sources ?.map { it.id } ?.let { toggleSource.await(it, enable) } } fun toggleIncognito(enable: Boolean) { state.value.extension?.pkgName?.let { packageName -> toggleIncognito.await(packageName, enable) } } @Immutable data class State( val extension: AnimeExtension.Installed? = null, val isIncognito: Boolean = false, private val _sources: ImmutableList? = null, ) { val sources: ImmutableList get() = _sources ?: persistentListOf() val isLoading: Boolean get() = extension == null || _sources == null } } sealed interface AnimeExtensionDetailsEvent { data object Uninstalled : AnimeExtensionDetailsEvent } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/details/AnimeSourcePreferencesScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.extension.details import android.content.Context import android.os.Bundle import android.util.TypedValue import android.view.View import androidx.appcompat.view.ContextThemeWrapper import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.viewinterop.AndroidView import androidx.core.os.bundleOf import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentContainerView import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.preference.DialogPreference import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceScreen import androidx.preference.forEach import androidx.preference.getOnBindEditTextListener import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifAnimeSourcesLoaded import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.sourcePreferences import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore import eu.kanade.tachiyomi.widget.TachiyomiTextInputEditText.Companion.setIncognito import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeSourcePreferencesScreen(val sourceId: Long) : Screen() { @Composable override fun Content() { if (!ifAnimeSourcesLoaded()) { LoadingScreen() return } val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow Scaffold( topBar = { AppBar( title = Injekt.get().getOrStub(sourceId).toString(), navigateUp = navigator::pop, scrollBehavior = it, ) }, ) { contentPadding -> FragmentContainer( fragmentManager = (context as FragmentActivity).supportFragmentManager, modifier = Modifier .fillMaxSize() .padding(contentPadding), ) { add(it, SourcePreferencesFragment.getInstance(sourceId), null) } } } /** * From https://stackoverflow.com/questions/60520145/fragment-container-in-jetpack-compose/70817794#70817794 */ @Composable private fun FragmentContainer( fragmentManager: FragmentManager, modifier: Modifier = Modifier, commit: FragmentTransaction.(containerId: Int) -> Unit, ) { val containerId by rememberSaveable { mutableIntStateOf(View.generateViewId()) } var initialized by rememberSaveable { mutableStateOf(false) } AndroidView( modifier = modifier, factory = { context -> FragmentContainerView(context) .apply { id = containerId } }, update = { view -> if (!initialized) { fragmentManager.commit { commit(view.id) } initialized = true } else { fragmentManager.onContainerAvailable(view) } }, ) } /** Access to package-private method in FragmentManager through reflection */ private fun FragmentManager.onContainerAvailable(view: FragmentContainerView) { val method = FragmentManager::class.java.getDeclaredMethod( "onContainerAvailable", FragmentContainerView::class.java, ) method.isAccessible = true method.invoke(this, view) } } class SourcePreferencesFragment : PreferenceFragmentCompat() { override fun getContext(): Context? { val superCtx = super.getContext() ?: return null val tv = TypedValue() superCtx.theme.resolveAttribute(R.attr.preferenceTheme, tv, true) return ContextThemeWrapper(superCtx, tv.resourceId) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { preferenceScreen = populateScreen() } private fun populateScreen(): PreferenceScreen { val sourceId = requireArguments().getLong(SOURCE_ID) val source = Injekt.get().getOrStub(sourceId) val sourceScreen = preferenceManager.createPreferenceScreen(requireContext()) if (source is ConfigurableAnimeSource) { val dataStore = SharedPreferencesDataStore(source.sourcePreferences()) preferenceManager.preferenceDataStore = dataStore source.setupPreferenceScreen(sourceScreen) sourceScreen.forEach { pref -> pref.isIconSpaceReserved = false pref.isSingleLineTitle = false if (pref is DialogPreference && pref.dialogTitle.isNullOrEmpty()) { pref.dialogTitle = pref.title } // Apply incognito IME for EditTextPreference if (pref is EditTextPreference) { val setListener = pref.getOnBindEditTextListener() pref.setOnBindEditTextListener { setListener?.onBindEditText(it) it.setIncognito(lifecycleScope) } } } } return sourceScreen } companion object { private const val SOURCE_ID = "source_id" fun getInstance(sourceId: Long): SourcePreferencesFragment { return SourcePreferencesFragment().apply { arguments = bundleOf(SOURCE_ID to sourceId) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/AnimeMigrationFlags.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration import dev.icerock.moko.resources.StringResource import eu.kanade.domain.entries.anime.model.hasCustomBackground import eu.kanade.domain.entries.anime.model.hasCustomCover import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.injectLazy data class AnimeMigrationFlag( val flag: Int, val isDefaultSelected: Boolean, val titleId: StringResource, ) { companion object { fun create(flag: Int, defaultSelectionMap: Int, titleId: StringResource): AnimeMigrationFlag { return AnimeMigrationFlag( flag = flag, isDefaultSelected = defaultSelectionMap and flag != 0, titleId = titleId, ) } } } object AnimeMigrationFlags { private const val EPISODES = 0b00001 private const val CATEGORIES = 0b00010 private const val CUSTOM_BACKGROUND = 0b00100 private const val CUSTOM_COVER = 0b01000 private const val DELETE_DOWNLOADED = 0b10000 private val coverCache: AnimeCoverCache by injectLazy() private val backgroundCache: AnimeBackgroundCache by injectLazy() private val downloadCache: AnimeDownloadCache by injectLazy() fun hasEpisodes(value: Int): Boolean { return value and EPISODES != 0 } fun hasCategories(value: Int): Boolean { return value and CATEGORIES != 0 } fun hasCustomCover(value: Int): Boolean { return value and CUSTOM_COVER != 0 } fun hasCustomBackground(value: Int): Boolean { return value and CUSTOM_BACKGROUND != 0 } fun hasDeleteDownloaded(value: Int): Boolean { return value and DELETE_DOWNLOADED != 0 } /** Returns information about applicable flags with default selections. */ fun getFlags(anime: Anime?, defaultSelectedBitMap: Int): List { val flags = mutableListOf() if (anime?.fetchType == FetchType.Episodes) { flags += AnimeMigrationFlag.create(EPISODES, defaultSelectedBitMap, AYMR.strings.episodes) } flags += AnimeMigrationFlag.create(CATEGORIES, defaultSelectedBitMap, MR.strings.categories) if (anime != null) { if (anime.hasCustomCover(coverCache)) { flags += AnimeMigrationFlag.create( CUSTOM_COVER, defaultSelectedBitMap, MR.strings.custom_cover, ) } if (anime.hasCustomBackground(backgroundCache)) { flags += AnimeMigrationFlag.create( CUSTOM_BACKGROUND, defaultSelectedBitMap, AYMR.strings.custom_background, ) } if (downloadCache.getDownloadCount(anime) > 0) { flags += AnimeMigrationFlag.create( DELETE_DOWNLOADED, defaultSelectedBitMap, MR.strings.delete_downloaded, ) } } return flags } /** Returns a bit map of selected flags. */ fun getSelectedFlagsBitMap( selectedFlags: List, flags: List, ): Int { return selectedFlags .zip(flags) .filter { (isSelected, _) -> isSelected } .map { (_, flag) -> flag.flag } .reduceOrNull { acc, mask -> acc or mask } ?: 0 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/MigrateAnimeScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.anime import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.MigrateAnimeScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeSearchScreen import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen data class MigrateAnimeScreen( private val sourceId: Long, ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateAnimeScreenModel(sourceId) } val state by screenModel.state.collectAsState() if (state.isLoading) { LoadingScreen() return } MigrateAnimeScreen( navigateUp = navigator::pop, title = state.source!!.name, state = state, onClickItem = { navigator.push(MigrateAnimeSearchScreen(it.id)) }, onClickCover = { navigator.push(AnimeScreen(it.id)) }, ) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> when (event) { MigrationAnimeEvent.FailedFetchingFavorites -> { context.toast(MR.strings.internal_error) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/MigrateAnimeScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.anime import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.tachiyomi.animesource.AnimeSource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.interactor.GetAnimeFavorites import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateAnimeScreenModel( private val sourceId: Long, private val sourceManager: AnimeSourceManager = Injekt.get(), private val getFavorites: GetAnimeFavorites = Injekt.get(), ) : StateScreenModel(State()) { private val _events: Channel = Channel() val events: Flow = _events.receiveAsFlow() init { screenModelScope.launch { mutableState.update { state -> state.copy(source = sourceManager.getOrStub(sourceId)) } getFavorites.subscribe(sourceId) .catch { logcat(LogPriority.ERROR, it) _events.send(MigrationAnimeEvent.FailedFetchingFavorites) mutableState.update { state -> state.copy(titleList = persistentListOf()) } } .map { anime -> anime .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.title }) .toImmutableList() } .collectLatest { list -> mutableState.update { it.copy(titleList = list) } } } } @Immutable data class State( val source: AnimeSource? = null, private val titleList: ImmutableList? = null, ) { val titles: ImmutableList get() = titleList ?: persistentListOf() val isLoading: Boolean get() = source == null || titleList == null val isEmpty: Boolean get() = titles.isEmpty() } } sealed interface MigrationAnimeEvent { data object FailedFetchingFavorites : MigrationAnimeEvent } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/season/MigrateSeasonSelectScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifAnimeSourcesLoaded import eu.kanade.presentation.browse.anime.BrowseAnimeSourceContent import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialog import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialogScreenModel import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.anime.LocalAnimeSource data class MigrateSeasonSelectScreen( private val oldAnime: Anime, private val anime: Anime, ) : Screen() { @Composable override fun Content() { if (!ifAnimeSourcesLoaded()) { LoadingScreen() return } val uriHandler = LocalUriHandler.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateSeasonSelectScreenModel(anime) } val state by screenModel.state.collectAsState() val snackbarHostState = remember { SnackbarHostState() } Scaffold( topBar = { scrollBehavior -> AppBar( title = anime.title, navigateUp = navigator::pop, scrollBehavior = scrollBehavior, ) }, ) { paddingValues -> val openMigrateDialog: (Anime) -> Unit = { screenModel.setDialog(MigrateSeasonSelectScreenModel.Dialog.Migrate(newAnime = it, oldAnime = oldAnime)) } BrowseAnimeSourceContent( source = screenModel.source, animeList = screenModel.seasonPagerFlowFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), displayMode = screenModel.displayMode, snackbarHostState = snackbarHostState, contentPadding = paddingValues, onWebViewClick = { val source = screenModel.source as? AnimeHttpSource ?: return@BrowseAnimeSourceContent navigator.push( WebViewScreen( url = source.baseUrl, initialTitle = source.name, sourceId = source.id, ), ) }, onHelpClick = { uriHandler.openUri(Constants.URL_HELP) }, onLocalAnimeSourceHelpClick = { uriHandler.openUri(LocalAnimeSource.HELP_URL) }, onAnimeClick = openMigrateDialog, onAnimeLongClick = { navigator.push(AnimeScreen(it.id, true)) }, ) } val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is MigrateSeasonSelectScreenModel.Dialog.Migrate -> { MigrateAnimeDialog( oldAnime = dialog.oldAnime, newAnime = dialog.newAnime, screenModel = rememberScreenModel { MigrateAnimeDialogScreenModel() }, onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(AnimeScreen(dialog.newAnime.id)) }, onClickSeasons = { navigator.push(MigrateSeasonSelectScreen(oldAnime, dialog.newAnime)) }, onPopScreen = { onDismissRequest() }, ) } else -> {} } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/season/MigrateSeasonSelectScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season import android.content.res.Configuration import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.runtime.Immutable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.unit.dp import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingSource import androidx.paging.PagingState import androidx.paging.cachedIn import androidx.paging.filter import androidx.paging.map import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.asState import eu.kanade.domain.entries.anime.model.toDomainAnime import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.animesource.model.SAnime import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.interactor.NetworkToLocalAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateSeasonSelectScreenModel( private val anime: Anime, sourceManager: AnimeSourceManager = Injekt.get(), sourcePreferences: SourcePreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val getAnime: GetAnime = Injekt.get(), private val networkToLocalAnime: NetworkToLocalAnime = Injekt.get(), ) : StateScreenModel(State()) { var displayMode by sourcePreferences.sourceDisplayMode().asState(screenModelScope) val source = sourceManager.getOrStub(anime.source) fun getColumnsPreference(orientation: Int): GridCells { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE val columns = if (isLandscape) { libraryPreferences.animeLandscapeColumns() } else { libraryPreferences.animePortraitColumns() }.get() return if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns) } private val hideInLibraryItems = sourcePreferences.hideInAnimeLibraryItems().get() val seasonPagerFlowFlow = flow { emit(anime) } .map { anime -> Pager( config = PagingConfig(pageSize = 25), pagingSourceFactory = { SeasonListPagingSource { source.getSeasonList(anime.toSAnime()) } }, ).flow.map { pagingData -> pagingData.map { networkToLocalAnime.await(it.toDomainAnime(anime.source)) .let { localAnime -> getAnime.subscribe(localAnime.url, localAnime.source) } .filterNotNull() .stateIn(ioCoroutineScope) } .filter { !hideInLibraryItems || !it.value.favorite } } .cachedIn(ioCoroutineScope) } .stateIn(ioCoroutineScope, SharingStarted.Lazily, emptyFlow()) private class SeasonListPagingSource( private val loadSeasonList: suspend () -> List, ) : PagingSource() { override suspend fun load(params: LoadParams): LoadResult { return try { val seasonList = loadSeasonList() LoadResult.Page( data = seasonList, prevKey = null, nextKey = null, ) } catch (e: Exception) { LoadResult.Error(e) } } override fun getRefreshKey(state: PagingState): Int? { return null } } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } sealed interface Dialog { data class Migrate(val newAnime: Anime, val oldAnime: Anime) : Dialog } @Immutable data class State( val dialog: Dialog? = null, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/AnimeMigrateSearchScreenDialogScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.search import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeMigrateSearchScreenDialogScreenModel( val animeId: Long, getAnime: GetAnime = Injekt.get(), ) : StateScreenModel(State()) { init { screenModelScope.launch { val anime = getAnime.await(animeId)!! mutableState.update { it.copy(anime = anime) } } } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } @Immutable data class State( val anime: Anime? = null, val dialog: Dialog? = null, ) sealed interface Dialog { data class Migrate(val anime: Anime) : Dialog } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/AnimeSourceSearchScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.search import androidx.compose.animation.AnimatedVisibility import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifAnimeSourcesLoaded import eu.kanade.presentation.browse.anime.BrowseAnimeSourceContent import eu.kanade.presentation.components.SearchToolbar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season.MigrateSeasonSelectScreen import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreenModel import eu.kanade.tachiyomi.ui.browse.anime.source.browse.SourceFilterAnimeDialog import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.coroutines.launch import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.anime.LocalAnimeSource data class AnimeSourceSearchScreen( private val oldAnime: Anime, private val sourceId: Long, private val query: String?, ) : Screen() { @Composable override fun Content() { if (!ifAnimeSourcesLoaded()) { LoadingScreen() return } val uriHandler = LocalUriHandler.current val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val screenModel = rememberScreenModel { BrowseAnimeSourceScreenModel(sourceId, query) } val state by screenModel.state.collectAsState() val snackbarHostState = remember { SnackbarHostState() } Scaffold( topBar = { scrollBehavior -> SearchToolbar( searchQuery = state.toolbarQuery ?: "", onChangeSearchQuery = screenModel::setToolbarQuery, onClickCloseSearch = navigator::pop, onSearch = screenModel::search, scrollBehavior = scrollBehavior, ) }, floatingActionButton = { AnimatedVisibility(visible = state.filters.isNotEmpty()) { ExtendedFloatingActionButton( text = { Text(text = stringResource(MR.strings.action_filter)) }, icon = { Icon(Icons.Outlined.FilterList, contentDescription = "") }, onClick = screenModel::openFilterSheet, ) } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> val openMigrateDialog: (Anime) -> Unit = { screenModel.setDialog(BrowseAnimeSourceScreenModel.Dialog.Migrate(newAnime = it, oldAnime = oldAnime)) } BrowseAnimeSourceContent( source = screenModel.source, animeList = screenModel.animePagerFlowFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), displayMode = screenModel.displayMode, snackbarHostState = snackbarHostState, contentPadding = paddingValues, onWebViewClick = { val source = screenModel.source as? AnimeHttpSource ?: return@BrowseAnimeSourceContent navigator.push( WebViewScreen( url = source.baseUrl, initialTitle = source.name, sourceId = source.id, ), ) }, onHelpClick = { uriHandler.openUri(Constants.URL_HELP) }, onLocalAnimeSourceHelpClick = { uriHandler.openUri(LocalAnimeSource.HELP_URL) }, onAnimeClick = openMigrateDialog, onAnimeLongClick = { navigator.push(AnimeScreen(it.id, true)) }, ) } val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is BrowseAnimeSourceScreenModel.Dialog.Filter -> { SourceFilterAnimeDialog( onDismissRequest = onDismissRequest, filters = state.filters, onReset = screenModel::resetFilters, onFilter = { screenModel.search(filters = state.filters) }, onUpdate = screenModel::setFilters, ) } is BrowseAnimeSourceScreenModel.Dialog.Migrate -> { MigrateAnimeDialog( oldAnime = oldAnime, newAnime = dialog.newAnime, screenModel = rememberScreenModel { MigrateAnimeDialogScreenModel() }, onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(AnimeScreen(dialog.newAnime.id)) }, onClickSeasons = { navigator.push(MigrateSeasonSelectScreen(oldAnime, dialog.newAnime)) }, onPopScreen = { scope.launch { navigator.popUntilRoot() HomeScreen.openTab(HomeScreen.Tab.Browse()) navigator.push(AnimeScreen(dialog.newAnime.id)) } }, ) } else -> {} } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeDialog.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.search import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.ErrorOutline import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import cafe.adriel.voyager.core.model.StateScreenModel import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.anime.model.hasCustomBackground import eu.kanade.domain.entries.anime.model.hasCustomCover import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.domain.items.episode.interactor.SyncEpisodesWithSource import eu.kanade.presentation.components.IndicatorSize import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.ui.browse.anime.migration.AnimeMigrationFlags import kotlinx.coroutines.flow.update import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.anime.interactor.SetAnimeCategories import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeUpdate import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.toEpisodeUpdate import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant @Composable internal fun MigrateAnimeDialog( oldAnime: Anime, newAnime: Anime, screenModel: MigrateAnimeDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onClickSeasons: () -> Unit, onPopScreen: () -> Unit, ) { val scope = rememberCoroutineScope() val state by screenModel.state.collectAsState() val flags = remember { AnimeMigrationFlags.getFlags(oldAnime, screenModel.migrateFlags.get()) } val selectedFlags = remember { flags.map { it.isDefaultSelected }.toMutableStateList() } val canMigrate = remember { oldAnime.fetchType == newAnime.fetchType } if (state.isMigrating) { LoadingScreen( modifier = Modifier .background(MaterialTheme.colorScheme.background.copy(alpha = 0.7f)), ) } else { AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(MR.strings.migration_dialog_what_to_include)) }, text = { Column( modifier = Modifier.verticalScroll(rememberScrollState()), ) { if (canMigrate) { flags.forEachIndexed { index, flag -> LabeledCheckbox( label = stringResource(flag.titleId), checked = selectedFlags[index], onCheckedChange = { selectedFlags[index] = it }, ) } } else { val message = if (oldAnime.fetchType == FetchType.Seasons) { AYMR.strings.label_cant_migrate_season } else { AYMR.strings.label_cant_migrate_episode } Row( horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Outlined.ErrorOutline, contentDescription = null, modifier = Modifier.size(IndicatorSize), tint = MaterialTheme.colorScheme.error, ) Text( text = stringResource(message), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.error, ) } } } }, confirmButton = { FlowRow( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { TextButton( onClick = { onDismissRequest() onClickTitle() }, ) { Text(text = stringResource(AYMR.strings.action_show_anime)) } if (newAnime.fetchType != FetchType.Episodes) { TextButton( onClick = { onDismissRequest() onClickSeasons() }, ) { Text(text = stringResource(AYMR.strings.label_show_seasons)) } } Spacer(modifier = Modifier.weight(1f)) if (canMigrate) { TextButton( onClick = { scope.launchIO { screenModel.migrateAnime( oldAnime, newAnime, false, AnimeMigrationFlags.getSelectedFlagsBitMap(selectedFlags, flags), ) withUIContext { onPopScreen() } } }, ) { Text(text = stringResource(MR.strings.copy)) } TextButton( onClick = { scope.launchIO { screenModel.migrateAnime( oldAnime, newAnime, true, AnimeMigrationFlags.getSelectedFlagsBitMap(selectedFlags, flags), ) withUIContext { onPopScreen() } } }, ) { Text(text = stringResource(MR.strings.migrate)) } } } }, ) } } internal class MigrateAnimeDialogScreenModel( private val sourceManager: AnimeSourceManager = Injekt.get(), private val downloadManager: AnimeDownloadManager = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), private val getEpisodesByAnimeId: GetEpisodesByAnimeId = Injekt.get(), private val syncEpisodesWithSource: SyncEpisodesWithSource = Injekt.get(), private val updateEpisode: UpdateEpisode = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val setAnimeCategories: SetAnimeCategories = Injekt.get(), private val getTracks: GetAnimeTracks = Injekt.get(), private val insertTrack: InsertAnimeTrack = Injekt.get(), private val coverCache: AnimeCoverCache = Injekt.get(), private val backgroundCache: AnimeBackgroundCache = Injekt.get(), private val preferenceStore: PreferenceStore = Injekt.get(), ) : StateScreenModel(State()) { val migrateFlags: Preference by lazy { preferenceStore.getInt("migrate_flags", Int.MAX_VALUE) } private val enhancedServices by lazy { Injekt.get().trackers.filterIsInstance() } suspend fun migrateAnime( oldAnime: Anime, newAnime: Anime, replace: Boolean, flags: Int, ) { migrateFlags.set(flags) val source = sourceManager.get(newAnime.source) ?: return val prevSource = sourceManager.get(oldAnime.source) mutableState.update { it.copy(isMigrating = true) } try { val episodes = source.getEpisodeList(newAnime.toSAnime()) migrateAnimeInternal( oldSource = prevSource, newSource = source, oldAnime = oldAnime, newAnime = newAnime, sourceEpisodes = episodes, replace = replace, flags = flags, ) } catch (_: Throwable) { // Explicitly stop if an error occurred; the dialog normally gets popped at the end // anyway mutableState.update { it.copy(isMigrating = false) } } } private suspend fun migrateAnimeInternal( oldSource: AnimeSource?, newSource: AnimeSource, oldAnime: Anime, newAnime: Anime, sourceEpisodes: List, replace: Boolean, flags: Int, ) { val migrateEpisodes = AnimeMigrationFlags.hasEpisodes(flags) val migrateCategories = AnimeMigrationFlags.hasCategories(flags) val migrateCustomCover = AnimeMigrationFlags.hasCustomCover(flags) val migrateCustomBackground = AnimeMigrationFlags.hasCustomBackground(flags) val deleteDownloaded = AnimeMigrationFlags.hasDeleteDownloaded(flags) try { syncEpisodesWithSource.await(sourceEpisodes, newAnime, newSource) } catch (_: Exception) { // Worst case, chapters won't be synced } // Update chapters read, bookmark and dateFetch if (migrateEpisodes) { val prevAnimeEpisodes = getEpisodesByAnimeId.await(oldAnime.id) val animeEpisodes = getEpisodesByAnimeId.await(newAnime.id) val maxEpisodeSeen = prevAnimeEpisodes .filter { it.seen } .maxOfOrNull { it.episodeNumber } val updatedAnimeEpisodes = animeEpisodes.map { animeEpisode -> var updatedEpisode = animeEpisode if (updatedEpisode.isRecognizedNumber) { val prevEpisode = prevAnimeEpisodes .find { it.isRecognizedNumber && it.episodeNumber == updatedEpisode.episodeNumber } if (prevEpisode != null) { updatedEpisode = updatedEpisode.copy( dateFetch = prevEpisode.dateFetch, bookmark = prevEpisode.bookmark, ) } if (maxEpisodeSeen != null && updatedEpisode.episodeNumber <= maxEpisodeSeen) { updatedEpisode = updatedEpisode.copy(seen = true) } } updatedEpisode } val episodeUpdates = updatedAnimeEpisodes.map { it.toEpisodeUpdate() } updateEpisode.awaitAll(episodeUpdates) } // Update categories if (migrateCategories) { val categoryIds = getCategories.await(oldAnime.id).map { it.id } setAnimeCategories.await(newAnime.id, categoryIds) } // Update track getTracks.await(oldAnime.id).mapNotNull { track -> val updatedTrack = track.copy(animeId = newAnime.id) val service = enhancedServices .firstOrNull { it.isTrackFrom(updatedTrack, oldAnime, oldSource) } if (service != null) { service.migrateTrack(updatedTrack, newAnime, newSource) } else { updatedTrack } } .takeIf { it.isNotEmpty() } ?.let { insertTrack.awaitAll(it) } // Delete downloaded if (deleteDownloaded) { if (oldSource != null) { downloadManager.deleteAnime(oldAnime, oldSource) } } if (replace) { updateAnime.awaitUpdateFavorite(oldAnime.id, favorite = false) } // Update custom cover (recheck if custom cover exists) if (migrateCustomCover && oldAnime.hasCustomCover()) { coverCache.setCustomCoverToCache( newAnime, coverCache.getCustomCoverFile(oldAnime.id).inputStream(), ) } // Update custom background (recheck if custom background exists) if (migrateCustomBackground && oldAnime.hasCustomBackground()) { backgroundCache.setCustomBackgroundToCache( newAnime, backgroundCache.getCustomBackgroundFile(oldAnime.id).inputStream(), ) } updateAnime.await( AnimeUpdate( id = newAnime.id, favorite = true, episodeFlags = oldAnime.episodeFlags, viewerFlags = oldAnime.viewerFlags, dateAdded = if (replace) oldAnime.dateAdded else Instant.now().toEpochMilli(), ), ) } @Immutable data class State( val isMigrating: Boolean = false, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeSearchScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.search import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.MigrateAnimeSearchScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season.MigrateSeasonSelectScreen import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen class MigrateAnimeSearchScreen(private val animeId: Long) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateAnimeSearchScreenModel(animeId = animeId) } val state by screenModel.state.collectAsState() val dialogScreenModel = rememberScreenModel { AnimeMigrateSearchScreenDialogScreenModel( animeId = animeId, ) } val dialogState by dialogScreenModel.state.collectAsState() MigrateAnimeSearchScreen( state = state, fromSourceId = dialogState.anime?.source, navigateUp = navigator::pop, onChangeSearchQuery = screenModel::updateSearchQuery, onSearch = { screenModel.search() }, getAnime = { screenModel.getAnime(it) }, onChangeSearchFilter = screenModel::setSourceFilter, onToggleResults = screenModel::toggleFilterResults, onClickSource = { navigator.push( AnimeSourceSearchScreen(dialogState.anime!!, it.id, state.searchQuery), ) }, onClickItem = { dialogScreenModel.setDialog( (AnimeMigrateSearchScreenDialogScreenModel.Dialog.Migrate(it)), ) }, onLongClickItem = { navigator.push(AnimeScreen(it.id, true)) }, ) when (val dialog = dialogState.dialog) { is AnimeMigrateSearchScreenDialogScreenModel.Dialog.Migrate -> { MigrateAnimeDialog( oldAnime = dialogState.anime!!, newAnime = dialog.anime, screenModel = rememberScreenModel { MigrateAnimeDialogScreenModel() }, onDismissRequest = { dialogScreenModel.setDialog(null) }, onClickTitle = { navigator.push(AnimeScreen(dialog.anime.id, true)) }, onClickSeasons = { navigator.push(MigrateSeasonSelectScreen(dialogState.anime!!, dialog.anime)) }, onPopScreen = { if (navigator.lastItem is AnimeScreen) { val lastItem = navigator.lastItem navigator.popUntil { navigator.items.contains(lastItem) } navigator.push(AnimeScreen(dialog.anime.id)) } else { navigator.replace(AnimeScreen(dialog.anime.id)) } }, ) } else -> {} } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeSearchScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.search import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSearchScreenModel import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.AnimeSourceFilter import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.entries.anime.interactor.GetAnime import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateAnimeSearchScreenModel( val animeId: Long, initialExtensionFilter: String = "", getAnime: GetAnime = Injekt.get(), ) : AnimeSearchScreenModel() { init { extensionFilter = initialExtensionFilter screenModelScope.launch { val anime = getAnime.await(animeId)!! mutableState.update { it.copy( fromSourceId = anime.source, searchQuery = anime.title, ) } search() } } override fun getEnabledSources(): List { return super.getEnabledSources() .filter { state.value.sourceFilter != AnimeSourceFilter.PinnedOnly || "${it.id}" in pinnedSources } .sortedWith( compareBy( { it.id != state.value.fromSourceId }, { "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" }, ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/sources/MigrateAnimeSourceScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.sources import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.source.anime.interactor.GetAnimeSourcesWithFavoriteCount import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.domain.source.service.SourcePreferences import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import logcat.LogPriority import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.anime.model.AnimeSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateAnimeSourceScreenModel( preferences: SourcePreferences = Injekt.get(), private val getSourcesWithFavoriteCount: GetAnimeSourcesWithFavoriteCount = Injekt.get(), private val setMigrateSorting: SetMigrateSorting = Injekt.get(), ) : StateScreenModel(State()) { private val _channel = Channel(Int.MAX_VALUE) val channel = _channel.receiveAsFlow() init { screenModelScope.launchIO { getSourcesWithFavoriteCount.subscribe() .catch { logcat(LogPriority.ERROR, it) _channel.send(Event.FailedFetchingSourcesWithCount) } .collectLatest { sources -> mutableState.update { it.copy( isLoading = false, items = sources.toImmutableList(), ) } } } preferences.migrationSortingDirection().changes() .onEach { mutableState.update { state -> state.copy(sortingDirection = it) } } .launchIn(screenModelScope) preferences.migrationSortingMode().changes() .onEach { mutableState.update { state -> state.copy(sortingMode = it) } } .launchIn(screenModelScope) } fun toggleSortingMode() { with(state.value) { val newMode = when (sortingMode) { SetMigrateSorting.Mode.ALPHABETICAL -> SetMigrateSorting.Mode.TOTAL SetMigrateSorting.Mode.TOTAL -> SetMigrateSorting.Mode.ALPHABETICAL } setMigrateSorting.await(newMode, sortingDirection) } } fun toggleSortingDirection() { with(state.value) { val newDirection = when (sortingDirection) { SetMigrateSorting.Direction.ASCENDING -> SetMigrateSorting.Direction.DESCENDING SetMigrateSorting.Direction.DESCENDING -> SetMigrateSorting.Direction.ASCENDING } setMigrateSorting.await(sortingMode, newDirection) } } @Immutable data class State( val isLoading: Boolean = true, val items: ImmutableList> = persistentListOf(), val sortingMode: SetMigrateSorting.Mode = SetMigrateSorting.Mode.ALPHABETICAL, val sortingDirection: SetMigrateSorting.Direction = SetMigrateSorting.Direction.ASCENDING, ) { val isEmpty = items.isEmpty() } sealed interface Event { data object FailedFetchingSourcesWithCount : Event } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/sources/MigrateAnimeSourceTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.migration.sources import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.MigrateAnimeSourceScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.MigrateAnimeScreen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun Screen.migrateAnimeSourceTab(): TabContent { val uriHandler = LocalUriHandler.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateAnimeSourceScreenModel() } val state by screenModel.state.collectAsState() return TabContent( titleRes = AYMR.strings.label_migration_anime, actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.migration_help_guide), icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = { uriHandler.openUri("https://aniyomi.org/help/guides/source-migration/") }, ), ), content = { contentPadding, _ -> MigrateAnimeSourceScreen( state = state, contentPadding = contentPadding, onClickItem = { source -> navigator.push(MigrateAnimeScreen(source.id)) }, onToggleSortingDirection = screenModel::toggleSortingDirection, onToggleSortingMode = screenModel::toggleSortingMode, ) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/AnimeSourcesFilterScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.AnimeSourcesFilterScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.toast import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen class AnimeSourcesFilterScreen : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { AnimeSourcesFilterScreenModel() } val state by screenModel.state.collectAsState() if (state is AnimeSourcesFilterScreenModel.State.Loading) { LoadingScreen() return } if (state is AnimeSourcesFilterScreenModel.State.Error) { val context = LocalContext.current LaunchedEffect(Unit) { context.toast(MR.strings.internal_error) navigator.pop() } return } val successState = state as AnimeSourcesFilterScreenModel.State.Success AnimeSourcesFilterScreen( navigateUp = navigator::pop, state = successState, onClickLanguage = screenModel::toggleLanguage, onClickSource = screenModel::toggleSource, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/AnimeSourcesFilterScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.source.anime.interactor.GetLanguagesWithAnimeSources import eu.kanade.domain.source.anime.interactor.ToggleAnimeSource import eu.kanade.domain.source.interactor.ToggleLanguage import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.source.anime.model.AnimeSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.SortedMap class AnimeSourcesFilterScreenModel( private val preferences: SourcePreferences = Injekt.get(), private val getLanguagesWithSources: GetLanguagesWithAnimeSources = Injekt.get(), private val toggleSource: ToggleAnimeSource = Injekt.get(), private val toggleLanguage: ToggleLanguage = Injekt.get(), ) : StateScreenModel(State.Loading) { init { screenModelScope.launch { combine( getLanguagesWithSources.subscribe(), preferences.enabledLanguages().changes(), preferences.disabledAnimeSources().changes(), ) { a, b, c -> Triple(a, b, c) } .catch { throwable -> mutableState.update { State.Error( throwable = throwable, ) } } .collectLatest { (languagesWithSources, enabledLanguages, disabledSources) -> mutableState.update { State.Success( items = languagesWithSources, enabledLanguages = enabledLanguages, disabledSources = disabledSources, ) } } } } fun toggleSource(source: AnimeSource) { toggleSource.await(source) } fun toggleLanguage(language: String) { toggleLanguage.await(language) } sealed interface State { @Immutable data object Loading : State @Immutable data class Error( val throwable: Throwable, ) : State @Immutable data class Success( val items: SortedMap>, val enabledLanguages: Set, val disabledSources: Set, ) : State { val isEmpty: Boolean get() = items.isEmpty() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/AnimeSourcesScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.anime.interactor.GetEnabledAnimeSources import eu.kanade.domain.source.anime.interactor.ToggleAnimeSource import eu.kanade.domain.source.anime.interactor.ToggleAnimeSourcePin import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.browse.anime.AnimeSourceUiModel import eu.kanade.tachiyomi.util.system.LAST_USED_KEY import eu.kanade.tachiyomi.util.system.PINNED_KEY import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import logcat.LogPriority import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.anime.model.AnimeSource import tachiyomi.domain.source.anime.model.Pin import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.TreeMap class AnimeSourcesScreenModel( private val preferences: BasePreferences = Injekt.get(), private val sourcePreferences: SourcePreferences = Injekt.get(), private val getEnabledAnimeSources: GetEnabledAnimeSources = Injekt.get(), private val toggleSource: ToggleAnimeSource = Injekt.get(), private val toggleSourcePin: ToggleAnimeSourcePin = Injekt.get(), ) : StateScreenModel(State()) { private val _events = Channel(Int.MAX_VALUE) val events = _events.receiveAsFlow() init { screenModelScope.launchIO { getEnabledAnimeSources.subscribe() .catch { logcat(LogPriority.ERROR, it) _events.send(Event.FailedFetchingSources) } .collectLatest(::collectLatestAnimeSources) } } private fun collectLatestAnimeSources(sources: List) { mutableState.update { state -> val map = TreeMap> { d1, d2 -> // Sources without a lang defined will be placed at the end when { d1 == LAST_USED_KEY && d2 != LAST_USED_KEY -> -1 d2 == LAST_USED_KEY && d1 != LAST_USED_KEY -> 1 d1 == PINNED_KEY && d2 != PINNED_KEY -> -1 d2 == PINNED_KEY && d1 != PINNED_KEY -> 1 d1 == "" && d2 != "" -> 1 d2 == "" && d1 != "" -> -1 else -> d1.compareTo(d2) } } val byLang = sources.groupByTo(map) { when { it.isUsedLast -> LAST_USED_KEY Pin.Actual in it.pin -> PINNED_KEY else -> it.lang } } state.copy( isLoading = false, items = byLang .flatMap { listOf( AnimeSourceUiModel.Header(it.key), *it.value.map { source -> AnimeSourceUiModel.Item(source) }.toTypedArray(), ) } .toImmutableList(), ) } } fun toggleSource(source: AnimeSource) { toggleSource.await(source) } fun togglePin(source: AnimeSource) { toggleSourcePin.await(source) } fun showSourceDialog(source: AnimeSource) { mutableState.update { it.copy(dialog = Dialog(source)) } } fun closeDialog() { mutableState.update { it.copy(dialog = null) } } sealed interface Event { data object FailedFetchingSources : Event } data class Dialog(val source: AnimeSource) @Immutable data class State( val dialog: Dialog? = null, val isLoading: Boolean = true, val items: ImmutableList = persistentListOf(), ) { val isEmpty = items.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/AnimeSourcesTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.TravelExplore import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.anime.AnimeSourceOptionsDialog import eu.kanade.presentation.browse.anime.AnimeSourcesScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreen import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearchScreen import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun Screen.animeSourcesTab(): TabContent { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { AnimeSourcesScreenModel() } val state by screenModel.state.collectAsState() return TabContent( titleRes = AYMR.strings.label_anime_sources, actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_global_search), icon = Icons.Outlined.TravelExplore, onClick = { navigator.push(GlobalAnimeSearchScreen()) }, ), AppBar.Action( title = stringResource(MR.strings.action_filter), icon = Icons.Outlined.FilterList, onClick = { navigator.push(AnimeSourcesFilterScreen()) }, ), ), content = { contentPadding, snackbarHostState -> AnimeSourcesScreen( state = state, contentPadding = contentPadding, onClickItem = { source, listing -> navigator.push(BrowseAnimeSourceScreen(source.id, listing.query)) }, onClickPin = screenModel::togglePin, onLongClickItem = screenModel::showSourceDialog, ) state.dialog?.let { dialog -> val source = dialog.source AnimeSourceOptionsDialog( source = source, onClickPin = { screenModel.togglePin(source) screenModel.closeDialog() }, onClickDisable = { screenModel.toggleSource(source) screenModel.closeDialog() }, onDismiss = screenModel::closeDialog, ) } val internalErrString = stringResource(MR.strings.internal_error) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> when (event) { AnimeSourcesScreenModel.Event.FailedFetchingSources -> { launch { snackbarHostState.showSnackbar(internalErrString) } } } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/browse/BrowseAnimeSourceScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source.browse import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Favorite import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifAnimeSourcesLoaded import eu.kanade.presentation.browse.RemoveEntryDialog import eu.kanade.presentation.browse.anime.BrowseAnimeSourceContent import eu.kanade.presentation.browse.anime.MissingSourceScreen import eu.kanade.presentation.browse.anime.components.BrowseAnimeSourceToolbar import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.entries.anime.DuplicateAnimeDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.ui.browse.anime.extension.details.AnimeSourcePreferencesScreen import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season.MigrateSeasonSelectScreen import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialog import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialogScreenModel import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreenModel.Listing import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.source.anime.model.StubAnimeSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.anime.LocalAnimeSource data class BrowseAnimeSourceScreen( val sourceId: Long, private val listingQuery: String?, ) : Screen(), AssistContentScreen { private var assistUrl: String? = null override fun onProvideAssistUrl() = assistUrl @Composable override fun Content() { if (!ifAnimeSourcesLoaded()) { LoadingScreen() return } val screenModel = rememberScreenModel { BrowseAnimeSourceScreenModel(sourceId, listingQuery) } val state by screenModel.state.collectAsState() val navigator = LocalNavigator.currentOrThrow val navigateUp: () -> Unit = { when { !state.isUserQuery && state.toolbarQuery != null -> screenModel.setToolbarQuery( null, ) else -> navigator.pop() } } if (screenModel.source is StubAnimeSource) { MissingSourceScreen( source = screenModel.source, navigateUp = navigateUp, ) return } val scope = rememberCoroutineScope() val haptic = LocalHapticFeedback.current val uriHandler = LocalUriHandler.current val snackbarHostState = remember { SnackbarHostState() } val onHelpClick = { uriHandler.openUri(LocalAnimeSource.HELP_URL) } val onWebViewClick = f@{ val source = screenModel.source as? AnimeHttpSource ?: return@f navigator.push( WebViewScreen( url = source.baseUrl, initialTitle = source.name, sourceId = source.id, ), ) } LaunchedEffect(screenModel.source) { assistUrl = (screenModel.source as? AnimeHttpSource)?.baseUrl } var topBarHeight by remember { mutableIntStateOf(0) } Scaffold( topBar = { Column( modifier = Modifier .background(MaterialTheme.colorScheme.surface) .onSizeChanged { topBarHeight = it.height }, ) { BrowseAnimeSourceToolbar( searchQuery = state.toolbarQuery, onSearchQueryChange = screenModel::setToolbarQuery, source = screenModel.source, displayMode = screenModel.displayMode, onDisplayModeChange = { screenModel.displayMode = it }, navigateUp = navigateUp, onWebViewClick = onWebViewClick, onHelpClick = onHelpClick, onSettingsClick = { navigator.push(AnimeSourcePreferencesScreen(sourceId)) }, onSearch = screenModel::search, ) Row( modifier = Modifier .horizontalScroll(rememberScrollState()) .padding(horizontal = MaterialTheme.padding.small), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { FilterChip( selected = state.listing == Listing.Popular, onClick = { screenModel.resetFilters() screenModel.setListing(Listing.Popular) }, leadingIcon = { Icon( imageVector = Icons.Outlined.Favorite, contentDescription = null, modifier = Modifier .size(FilterChipDefaults.IconSize), ) }, label = { Text(text = stringResource(MR.strings.popular)) }, ) if ((screenModel.source as AnimeCatalogueSource).supportsLatest) { FilterChip( selected = state.listing == Listing.Latest, onClick = { screenModel.resetFilters() screenModel.setListing(Listing.Latest) }, leadingIcon = { Icon( imageVector = Icons.Outlined.NewReleases, contentDescription = null, modifier = Modifier .size(FilterChipDefaults.IconSize), ) }, label = { Text(text = stringResource(MR.strings.latest)) }, ) } if (state.filters.isNotEmpty()) { FilterChip( selected = state.listing is Listing.Search, onClick = screenModel::openFilterSheet, leadingIcon = { Icon( imageVector = Icons.Outlined.FilterList, contentDescription = null, modifier = Modifier .size(FilterChipDefaults.IconSize), ) }, label = { Text(text = stringResource(MR.strings.action_filter)) }, ) } } HorizontalDivider() } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> BrowseAnimeSourceContent( source = screenModel.source, animeList = screenModel.animePagerFlowFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), entries = screenModel.getColumnsPreferenceForCurrentOrientation(LocalConfiguration.current.orientation), topBarHeight = topBarHeight, displayMode = screenModel.displayMode, snackbarHostState = snackbarHostState, contentPadding = paddingValues, onWebViewClick = onWebViewClick, onHelpClick = { uriHandler.openUri(Constants.URL_HELP) }, onLocalAnimeSourceHelpClick = onHelpClick, onAnimeClick = { navigator.push((AnimeScreen(it.id, true))) }, onAnimeLongClick = { anime -> scope.launchIO { val duplicateAnime = screenModel.getDuplicateAnimelibAnime(anime) when { anime.favorite -> screenModel.setDialog( BrowseAnimeSourceScreenModel.Dialog.RemoveAnime(anime), ) duplicateAnime != null -> screenModel.setDialog( BrowseAnimeSourceScreenModel.Dialog.AddDuplicateAnime( anime, duplicateAnime, ), ) else -> screenModel.addFavorite(anime) } haptic.performHapticFeedback(HapticFeedbackType.LongPress) } }, ) } val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is BrowseAnimeSourceScreenModel.Dialog.Filter -> { SourceFilterAnimeDialog( onDismissRequest = onDismissRequest, filters = state.filters, onReset = screenModel::resetFilters, onFilter = { screenModel.search(filters = state.filters) }, onUpdate = screenModel::setFilters, ) } is BrowseAnimeSourceScreenModel.Dialog.AddDuplicateAnime -> { DuplicateAnimeDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.addFavorite(dialog.anime) }, onOpenAnime = { navigator.push(AnimeScreen(dialog.duplicate.id)) }, onMigrate = { screenModel.setDialog( BrowseAnimeSourceScreenModel.Dialog.Migrate(dialog.anime, dialog.duplicate), ) }, ) } is BrowseAnimeSourceScreenModel.Dialog.Migrate -> { MigrateAnimeDialog( oldAnime = dialog.oldAnime, newAnime = dialog.newAnime, screenModel = MigrateAnimeDialogScreenModel(), onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(AnimeScreen(dialog.oldAnime.id)) }, onClickSeasons = { navigator.push(MigrateSeasonSelectScreen(dialog.oldAnime, dialog.newAnime)) }, onPopScreen = { onDismissRequest() }, ) } is BrowseAnimeSourceScreenModel.Dialog.RemoveAnime -> { RemoveEntryDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.changeAnimeFavorite(dialog.anime) }, entryToRemove = dialog.anime.title, ) } is BrowseAnimeSourceScreenModel.Dialog.ChangeAnimeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { navigator.push(CategoriesTab) }, onConfirm = { include, _ -> screenModel.changeAnimeFavorite(dialog.anime) screenModel.moveAnimeToCategories(dialog.anime, include) }, ) } else -> {} } LaunchedEffect(Unit) { queryEvent.receiveAsFlow() .collectLatest { when (it) { is SearchType.Genre -> screenModel.searchGenre(it.txt) is SearchType.Text -> screenModel.search(it.txt) } } } } suspend fun search(query: String) = queryEvent.send(SearchType.Text(query)) suspend fun searchGenre(name: String) = queryEvent.send(SearchType.Genre(name)) companion object { private val queryEvent = Channel() } sealed class SearchType(val txt: String) { class Text(txt: String) : SearchType(txt) class Genre(txt: String) : SearchType(txt) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/browse/BrowseAnimeSourceScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source.browse import android.content.res.Configuration import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.runtime.Immutable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.unit.dp import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.cachedIn import androidx.paging.filter import androidx.paging.map import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.asState import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.anime.model.toDomainAnime import eu.kanade.domain.source.anime.interactor.GetAnimeIncognitoState import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.anime.interactor.AddAnimeTracks import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.util.removeBackgrounds import eu.kanade.tachiyomi.util.removeCovers import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.mapAsCheckboxState import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.anime.interactor.SetAnimeCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.interactor.GetDuplicateLibraryAnime import tachiyomi.domain.entries.anime.interactor.NetworkToLocalAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.toAnimeUpdate import tachiyomi.domain.items.episode.interactor.SetAnimeDefaultEpisodeFlags import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.interactor.GetRemoteAnime import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import eu.kanade.tachiyomi.animesource.model.AnimeFilter as AnimeSourceModelFilter class BrowseAnimeSourceScreenModel( private val sourceId: Long, listingQuery: String?, sourceManager: AnimeSourceManager = Injekt.get(), sourcePreferences: SourcePreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val coverCache: AnimeCoverCache = Injekt.get(), private val backgroundCache: AnimeBackgroundCache = Injekt.get(), private val getRemoteAnime: GetRemoteAnime = Injekt.get(), private val getDuplicateAnimelibAnime: GetDuplicateLibraryAnime = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val setAnimeCategories: SetAnimeCategories = Injekt.get(), private val setAnimeDefaultEpisodeFlags: SetAnimeDefaultEpisodeFlags = Injekt.get(), private val getAnime: GetAnime = Injekt.get(), private val networkToLocalAnime: NetworkToLocalAnime = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), private val addTracks: AddAnimeTracks = Injekt.get(), private val getIncognitoState: GetAnimeIncognitoState = Injekt.get(), ) : StateScreenModel(State(Listing.valueOf(listingQuery))) { var displayMode by sourcePreferences.sourceDisplayMode().asState(screenModelScope) val source = sourceManager.getOrStub(sourceId) init { if (source is AnimeCatalogueSource) { mutableState.update { var query: String? = null var listing = it.listing if (listing is Listing.Search) { query = listing.query listing = Listing.Search(query, source.getFilterList()) } it.copy( listing = listing, filters = source.getFilterList(), toolbarQuery = query, ) } } if (!getIncognitoState.await(source.id)) { sourcePreferences.lastUsedAnimeSource().set(source.id) } } /** * Flow of Pager flow tied to [State.listing] */ private val hideInLibraryItems = sourcePreferences.hideInAnimeLibraryItems().get() val animePagerFlowFlow = state.map { it.listing } .distinctUntilChanged() .map { listing -> Pager(PagingConfig(pageSize = 25)) { getRemoteAnime.subscribe(sourceId, listing.query ?: "", listing.filters) }.flow.map { pagingData -> pagingData.map { networkToLocalAnime.await(it.toDomainAnime(sourceId)) .let { localAnime -> getAnime.subscribe(localAnime.url, localAnime.source) } .filterNotNull() .stateIn(ioCoroutineScope) } .filter { !hideInLibraryItems || !it.value.favorite } } .cachedIn(ioCoroutineScope) } .stateIn(ioCoroutineScope, SharingStarted.Lazily, emptyFlow()) fun getColumnsPreference(orientation: Int): GridCells { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE val columns = if (isLandscape) { libraryPreferences.animeLandscapeColumns() } else { libraryPreferences.animePortraitColumns() }.get() return if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns) } // returns the number from the size slider fun getColumnsPreferenceForCurrentOrientation(orientation: Int): Int { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE return if (isLandscape) { libraryPreferences.animeLandscapeColumns() } else { libraryPreferences.animePortraitColumns() }.get() } fun resetFilters() { if (source !is AnimeCatalogueSource) return mutableState.update { it.copy(filters = source.getFilterList()) } } fun setListing(listing: Listing) { mutableState.update { it.copy(listing = listing, toolbarQuery = null) } } fun setFilters(filters: AnimeFilterList) { if (source !is AnimeCatalogueSource) return mutableState.update { it.copy( filters = filters, ) } } fun search(query: String? = null, filters: AnimeFilterList? = null) { if (source !is AnimeCatalogueSource) return val input = state.value.listing as? Listing.Search ?: Listing.Search(query = null, filters = source.getFilterList()) mutableState.update { it.copy( listing = input.copy( query = query ?: input.query, filters = filters ?: input.filters, ), toolbarQuery = query ?: input.query, ) } } fun searchGenre(genreName: String) { if (source !is AnimeCatalogueSource) return val defaultFilters = source.getFilterList() var genreExists = false filter@ for (sourceFilter in defaultFilters) { if (sourceFilter is AnimeSourceModelFilter.Group<*>) { for (filter in sourceFilter.state) { if (filter is AnimeSourceModelFilter<*> && filter.name.equals(genreName, true)) { when (filter) { is AnimeSourceModelFilter.TriState -> filter.state = 1 is AnimeSourceModelFilter.CheckBox -> filter.state = true else -> {} } genreExists = true break@filter } } } else if (sourceFilter is AnimeSourceModelFilter.Select<*>) { val index = sourceFilter.values.filterIsInstance() .indexOfFirst { it.equals(genreName, true) } if (index != -1) { sourceFilter.state = index genreExists = true break } } } mutableState.update { val listing = if (genreExists) { Listing.Search(query = null, filters = defaultFilters) } else { Listing.Search(query = genreName, filters = defaultFilters) } it.copy( filters = defaultFilters, listing = listing, toolbarQuery = listing.query, ) } } /** * Adds or removes an anime from the library. * * @param anime the anime to update. */ fun changeAnimeFavorite(anime: Anime) { screenModelScope.launch { var new = anime.copy( favorite = !anime.favorite, dateAdded = when (anime.favorite) { true -> 0 false -> Instant.now().toEpochMilli() }, ) if (!new.favorite) { new = new.removeCovers(coverCache) new = new.removeBackgrounds(backgroundCache) } else { setAnimeDefaultEpisodeFlags.await(anime) addTracks.bindEnhancedTrackers(anime, source) } updateAnime.await(new.toAnimeUpdate()) } } fun addFavorite(anime: Anime) { screenModelScope.launch { val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultAnimeCategory().get() val defaultCategory = categories.find { it.id == defaultCategoryId.toLong() } when { // Default category set defaultCategory != null -> { moveAnimeToCategories(anime, defaultCategory) changeAnimeFavorite(anime) } // Automatic 'Default' or no categories defaultCategoryId == 0 || categories.isEmpty() -> { moveAnimeToCategories(anime) changeAnimeFavorite(anime) } // Choose a category else -> { val preselectedIds = getCategories.await(anime.id).map { it.id } setDialog( Dialog.ChangeAnimeCategory( anime, categories.mapAsCheckboxState { it.id in preselectedIds }.toImmutableList(), ), ) } } } } /** * Get user categories. * * @return List of categories, not including the default category */ suspend fun getCategories(): List { return getCategories.subscribe() .firstOrNull() ?.filterNot { it.isSystemCategory } .orEmpty() } suspend fun getDuplicateAnimelibAnime(anime: Anime): Anime? { return getDuplicateAnimelibAnime.await(anime).getOrNull(0) } private fun moveAnimeToCategories(anime: Anime, vararg categories: Category) { moveAnimeToCategories(anime, categories.filter { it.id != 0L }.map { it.id }) } fun moveAnimeToCategories(anime: Anime, categoryIds: List) { screenModelScope.launchIO { setAnimeCategories.await( animeId = anime.id, categoryIds = categoryIds.toList(), ) } } fun openFilterSheet() { setDialog(Dialog.Filter) } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } fun setToolbarQuery(query: String?) { mutableState.update { it.copy(toolbarQuery = query) } } sealed class Listing(open val query: String?, open val filters: AnimeFilterList) { data object Popular : Listing( query = GetRemoteAnime.QUERY_POPULAR, filters = AnimeFilterList(), ) data object Latest : Listing( query = GetRemoteAnime.QUERY_LATEST, filters = AnimeFilterList(), ) data class Search(override val query: String?, override val filters: AnimeFilterList) : Listing( query = query, filters = filters, ) companion object { fun valueOf(query: String?): Listing { return when (query) { GetRemoteAnime.QUERY_POPULAR -> Popular GetRemoteAnime.QUERY_LATEST -> Latest else -> Search(query = query, filters = AnimeFilterList()) // filters are filled in later } } } } sealed interface Dialog { data object Filter : Dialog data class RemoveAnime(val anime: Anime) : Dialog data class AddDuplicateAnime(val anime: Anime, val duplicate: Anime) : Dialog data class ChangeAnimeCategory( val anime: Anime, val initialSelection: ImmutableList>, ) : Dialog data class Migrate(val newAnime: Anime, val oldAnime: Anime) : Dialog } @Immutable data class State( val listing: Listing, val filters: AnimeFilterList = AnimeFilterList(), val toolbarQuery: String? = null, val dialog: Dialog? = null, ) { val isUserQuery get() = listing is Listing.Search && !listing.query.isNullOrEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/browse/SourceFilterAnimeDialog.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source.browse import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.tachiyomi.animesource.model.AnimeFilter import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import tachiyomi.core.common.preference.TriState import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CollapsibleBox import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.SelectItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TextItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.i18n.stringResource @Composable fun SourceFilterAnimeDialog( onDismissRequest: () -> Unit, filters: AnimeFilterList, onReset: () -> Unit, onFilter: () -> Unit, onUpdate: (AnimeFilterList) -> Unit, ) { val updateFilters = { onUpdate(filters) } AdaptiveSheet(onDismissRequest = onDismissRequest) { LazyColumn { stickyHeader { Row( modifier = Modifier .background(MaterialTheme.colorScheme.background) .padding(8.dp), ) { TextButton(onClick = onReset) { Text( text = stringResource(MR.strings.action_reset), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), ) } Spacer(modifier = Modifier.weight(1f)) Button(onClick = { onFilter() onDismissRequest() }) { Text(stringResource(MR.strings.action_filter)) } } HorizontalDivider() } items(filters) { FilterItem(it, updateFilters) } } } } @Composable private fun FilterItem(filter: AnimeFilter<*>, onUpdate: () -> Unit) { when (filter) { is AnimeFilter.Header -> { HeadingItem(filter.name) } is AnimeFilter.Separator -> { HorizontalDivider() } is AnimeFilter.CheckBox -> { CheckboxItem( label = filter.name, checked = filter.state, ) { filter.state = !filter.state onUpdate() } } is AnimeFilter.TriState -> { TriStateItem( label = filter.name, state = filter.state.toTriStateFilter(), ) { filter.state = filter.state.toTriStateFilter().next().toTriStateInt() onUpdate() } } is AnimeFilter.Text -> { TextItem( label = filter.name, value = filter.state, ) { filter.state = it onUpdate() } } is AnimeFilter.Select<*> -> { SelectItem( label = filter.name, options = filter.values, selectedIndex = filter.state, onSelect = { filter.state = it onUpdate() }, ) } is AnimeFilter.Sort -> { CollapsibleBox( heading = filter.name, ) { Column { filter.values.mapIndexed { index, item -> SortItem( label = item, sortDescending = filter.state?.ascending?.not() ?.takeIf { index == filter.state?.index }, ) { val ascending = if (index == filter.state?.index) { !filter.state!!.ascending } else { filter.state!!.ascending } filter.state = AnimeFilter.Sort.Selection( index = index, ascending = ascending, ) onUpdate() } } } } } is AnimeFilter.Group<*> -> { CollapsibleBox( heading = filter.name, ) { Column { filter.state .filterIsInstance>() .map { FilterItem(filter = it, onUpdate = onUpdate) } } } } } } private fun Int.toTriStateFilter(): TriState { return when (this) { AnimeFilter.TriState.STATE_IGNORE -> TriState.DISABLED AnimeFilter.TriState.STATE_INCLUDE -> TriState.ENABLED_IS AnimeFilter.TriState.STATE_EXCLUDE -> TriState.ENABLED_NOT else -> throw IllegalStateException("Unknown TriState state: $this") } } private fun TriState.toTriStateInt(): Int { return when (this) { TriState.DISABLED -> AnimeFilter.TriState.STATE_IGNORE TriState.ENABLED_IS -> AnimeFilter.TriState.STATE_INCLUDE TriState.ENABLED_NOT -> AnimeFilter.TriState.STATE_EXCLUDE } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/globalsearch/AnimeSearchScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.produceState import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.entries.anime.model.toDomainAnime import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toPersistentMap import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import tachiyomi.core.common.preference.toggle import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.interactor.NetworkToLocalAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.Executors abstract class AnimeSearchScreenModel( initialState: State = State(), sourcePreferences: SourcePreferences = Injekt.get(), private val sourceManager: AnimeSourceManager = Injekt.get(), private val extensionManager: AnimeExtensionManager = Injekt.get(), private val networkToLocalAnime: NetworkToLocalAnime = Injekt.get(), private val getAnime: GetAnime = Injekt.get(), private val preferences: SourcePreferences = Injekt.get(), ) : StateScreenModel(initialState) { private val coroutineDispatcher = Executors.newFixedThreadPool(5).asCoroutineDispatcher() private var searchJob: Job? = null private val enabledLanguages = sourcePreferences.enabledLanguages().get() private val disabledSources = sourcePreferences.disabledAnimeSources().get() protected val pinnedSources = sourcePreferences.pinnedAnimeSources().get() private var lastQuery: String? = null private var lastSourceFilter: AnimeSourceFilter? = null protected var extensionFilter: String? = null private val sortComparator = { map: Map -> compareBy( { (map[it] as? AnimeSearchItemResult.Success)?.isEmpty ?: true }, { "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" }, ) } init { screenModelScope.launch { preferences.globalSearchFilterState().changes().collectLatest { state -> mutableState.update { it.copy(onlyShowHasResults = state) } } } } @Composable fun getAnime(initialAnime: Anime): androidx.compose.runtime.State { return produceState(initialValue = initialAnime) { getAnime.subscribe(initialAnime.url, initialAnime.source) .filterNotNull() .collectLatest { anime -> value = anime } } } open fun getEnabledSources(): List { return sourceManager.getCatalogueSources() .filter { it.lang in enabledLanguages && "${it.id}" !in disabledSources } .sortedWith( compareBy( { "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" }, ), ) } private fun getSelectedSources(): List { val enabledSources = getEnabledSources() val filter = extensionFilter if (filter.isNullOrEmpty()) { return enabledSources } return extensionManager.installedExtensionsFlow.value .filter { it.pkgName == filter } .flatMap { it.sources } .filterIsInstance() .filter { it in enabledSources } } fun updateSearchQuery(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun setSourceFilter(filter: AnimeSourceFilter) { mutableState.update { it.copy(sourceFilter = filter) } search() } fun toggleFilterResults() { preferences.globalSearchFilterState().toggle() } fun search() { val query = state.value.searchQuery val sourceFilter = state.value.sourceFilter if (query.isNullOrBlank()) return val sameQuery = this.lastQuery == query if (sameQuery && this.lastSourceFilter == sourceFilter) return this.lastQuery = query this.lastSourceFilter = sourceFilter val sources = getSelectedSources() // Reuse previous results if possible if (sameQuery) { val existingResults = state.value.items updateItems( sources .associateWith { existingResults[it] ?: AnimeSearchItemResult.Loading } .toPersistentMap(), ) } else { updateItems( sources .associateWith { AnimeSearchItemResult.Loading } .toPersistentMap(), ) } searchJob = ioCoroutineScope.launch { sources.map { source -> async { if (state.value.items[source] !is AnimeSearchItemResult.Loading) { return@async } try { val page = withContext(coroutineDispatcher) { source.getSearchAnime(1, query, source.getFilterList()) } val titles = page.animes.map { networkToLocalAnime.await(it.toDomainAnime(source.id)) } if (isActive) { updateItem(source, AnimeSearchItemResult.Success(titles)) } } catch (e: Exception) { if (isActive) { updateItem(source, AnimeSearchItemResult.Error(e)) } } } } .awaitAll() } } private fun updateItems(items: PersistentMap) { mutableState.update { it.copy( items = items .toSortedMap(sortComparator(items)) .toPersistentMap(), ) } } private fun updateItem(source: AnimeCatalogueSource, result: AnimeSearchItemResult) { val newItems = state.value.items.mutate { it[source] = result } updateItems(newItems) } @Immutable data class State( val fromSourceId: Long? = null, val searchQuery: String? = null, val sourceFilter: AnimeSourceFilter = AnimeSourceFilter.PinnedOnly, val onlyShowHasResults: Boolean = false, val items: PersistentMap = persistentMapOf(), ) { val progress: Int = items.count { it.value !is AnimeSearchItemResult.Loading } val total: Int = items.size val filteredItems = items.filter { (_, result) -> result.isVisible(onlyShowHasResults) } } } enum class AnimeSourceFilter { All, PinnedOnly, } sealed interface AnimeSearchItemResult { data object Loading : AnimeSearchItemResult data class Error( val throwable: Throwable, ) : AnimeSearchItemResult data class Success( val result: List, ) : AnimeSearchItemResult { val isEmpty: Boolean get() = result.isEmpty() } fun isVisible(onlyShowHasResults: Boolean): Boolean { return !onlyShowHasResults || (this is Success && !this.isEmpty) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/globalsearch/GlobalAnimeSearchScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifAnimeSourcesLoaded import eu.kanade.presentation.browse.anime.GlobalAnimeSearchScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreen import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import tachiyomi.presentation.core.screens.LoadingScreen class GlobalAnimeSearchScreen( val searchQuery: String = "", private val extensionFilter: String? = null, ) : Screen() { @Composable override fun Content() { if (!ifAnimeSourcesLoaded()) { LoadingScreen() return } val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { GlobalAnimeSearchScreenModel( initialQuery = searchQuery, initialExtensionFilter = extensionFilter, ) } val state by screenModel.state.collectAsState() var showSingleLoadingScreen by remember { mutableStateOf( searchQuery.isNotEmpty() && !extensionFilter.isNullOrEmpty() && state.total == 1, ) } if (showSingleLoadingScreen) { LoadingScreen() LaunchedEffect(state.items) { when (val result = state.items.values.singleOrNull()) { AnimeSearchItemResult.Loading -> return@LaunchedEffect is AnimeSearchItemResult.Success -> { val anime = result.result.singleOrNull() if (anime != null) { navigator.replace(AnimeScreen(anime.id, true)) } else { // Backoff to result screen showSingleLoadingScreen = false } } else -> showSingleLoadingScreen = false } } } else { GlobalAnimeSearchScreen( state = state, navigateUp = navigator::pop, onChangeSearchQuery = screenModel::updateSearchQuery, onSearch = { screenModel.search() }, getAnime = { screenModel.getAnime(it) }, onChangeSearchFilter = screenModel::setSourceFilter, onToggleResults = screenModel::toggleFilterResults, onClickSource = { navigator.push(BrowseAnimeSourceScreen(it.id, state.searchQuery)) }, onClickItem = { navigator.push(AnimeScreen(it.id, true)) }, onLongClickItem = { navigator.push(AnimeScreen(it.id, true)) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/globalsearch/GlobalAnimeSearchScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource class GlobalAnimeSearchScreenModel( initialQuery: String = "", initialExtensionFilter: String? = null, ) : AnimeSearchScreenModel( State( searchQuery = initialQuery, ), ) { init { extensionFilter = initialExtensionFilter if (initialQuery.isNotBlank() || !initialExtensionFilter.isNullOrBlank()) { if (extensionFilter != null) { // we're going to use custom extension filter instead setSourceFilter(AnimeSourceFilter.All) } search() } } override fun getEnabledSources(): List { return super.getEnabledSources() .filter { state.value.sourceFilter != AnimeSourceFilter.PinnedOnly || "${it.id}" in pinnedSources } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionFilterScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MangaExtensionFilterScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen class MangaExtensionFilterScreen : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MangaExtensionFilterScreenModel() } val state by screenModel.state.collectAsState() if (state is MangaExtensionFilterState.Loading) { LoadingScreen() return } val successState = state as MangaExtensionFilterState.Success MangaExtensionFilterScreen( navigateUp = navigator::pop, state = successState, onClickToggle = screenModel::toggle, ) LaunchedEffect(Unit) { screenModel.events.collectLatest { when (it) { MangaExtensionFilterEvent.FailedFetchingLanguages -> { context.toast(MR.strings.internal_error) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionFilterScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.extension.manga.interactor.GetMangaExtensionLanguages import eu.kanade.domain.source.interactor.ToggleLanguage import eu.kanade.domain.source.service.SourcePreferences import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaExtensionFilterScreenModel( private val preferences: SourcePreferences = Injekt.get(), private val getExtensionLanguages: GetMangaExtensionLanguages = Injekt.get(), private val toggleLanguage: ToggleLanguage = Injekt.get(), ) : StateScreenModel(MangaExtensionFilterState.Loading) { private val _events: Channel = Channel() val events: Flow = _events.receiveAsFlow() init { screenModelScope.launch { combine( getExtensionLanguages.subscribe(), preferences.enabledLanguages().changes(), ) { a, b -> a to b } .catch { throwable -> logcat(LogPriority.ERROR, throwable) _events.send(MangaExtensionFilterEvent.FailedFetchingLanguages) } .collectLatest { (extensionLanguages, enabledLanguages) -> mutableState.update { MangaExtensionFilterState.Success( languages = extensionLanguages.toImmutableList(), enabledLanguages = enabledLanguages.toImmutableSet(), ) } } } } fun toggle(language: String) { toggleLanguage.await(language) } } sealed interface MangaExtensionFilterEvent { data object FailedFetchingLanguages : MangaExtensionFilterEvent } sealed interface MangaExtensionFilterState { @Immutable data object Loading : MangaExtensionFilterState @Immutable data class Success( val languages: ImmutableList, val enabledLanguages: ImmutableSet = persistentSetOf(), ) : MangaExtensionFilterState { val isEmpty: Boolean get() = languages.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionsScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension import android.app.Application import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.extension.manga.interactor.GetMangaExtensionsByType import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds class MangaExtensionsScreenModel( preferences: SourcePreferences = Injekt.get(), basePreferences: BasePreferences = Injekt.get(), private val extensionManager: MangaExtensionManager = Injekt.get(), private val getExtensions: GetMangaExtensionsByType = Injekt.get(), ) : StateScreenModel(State()) { private val currentDownloads = MutableStateFlow>(hashMapOf()) init { val context = Injekt.get() val extensionMapper: (Map) -> ((MangaExtension) -> MangaExtensionUiModel.Item) = { map -> { MangaExtensionUiModel.Item(it, map[it.pkgName] ?: InstallStep.Idle) } } val queryFilter: (String) -> ((MangaExtension) -> Boolean) = { query -> filter@{ extension -> if (query.isEmpty()) return@filter true query.split(",").any { _input -> val input = _input.trim() if (input.isEmpty()) return@any false when (extension) { is MangaExtension.Available -> { extension.sources.any { it.name.contains(input, ignoreCase = true) || it.baseUrl.contains(input, ignoreCase = true) || it.id == input.toLongOrNull() } || extension.name.contains(input, ignoreCase = true) } is MangaExtension.Installed -> { extension.sources.any { it.name.contains(input, ignoreCase = true) || it.id == input.toLongOrNull() || if (it is HttpSource) { it.baseUrl.contains( input, ignoreCase = true, ) } else { false } } || extension.name.contains(input, ignoreCase = true) } is MangaExtension.Untrusted -> extension.name.contains( input, ignoreCase = true, ) } } } } screenModelScope.launchIO { combine( state.map { it.searchQuery }.distinctUntilChanged().debounce(SEARCH_DEBOUNCE_MILLIS), currentDownloads, getExtensions.subscribe(), ) { query, downloads, (_updates, _installed, _available, _untrusted) -> val searchQuery = query ?: "" val itemsGroups: ItemGroups = mutableMapOf() val updates = _updates.filter(queryFilter(searchQuery)).map( extensionMapper(downloads), ) if (updates.isNotEmpty()) { itemsGroups[MangaExtensionUiModel.Header.Resource(MR.strings.ext_updates_pending)] = updates } val installed = _installed.filter(queryFilter(searchQuery)).map( extensionMapper(downloads), ) val untrusted = _untrusted.filter(queryFilter(searchQuery)).map( extensionMapper(downloads), ) if (installed.isNotEmpty() || untrusted.isNotEmpty()) { itemsGroups[MangaExtensionUiModel.Header.Resource(MR.strings.ext_installed)] = installed + untrusted } val languagesWithExtensions = _available .filter(queryFilter(searchQuery)) .groupBy { it.lang } .toSortedMap(LocaleHelper.comparator) .map { (lang, exts) -> MangaExtensionUiModel.Header.Text( LocaleHelper.getSourceDisplayName(lang, context), ) to exts.map(extensionMapper(downloads)) } if (languagesWithExtensions.isNotEmpty()) { itemsGroups.putAll(languagesWithExtensions) } itemsGroups } .collectLatest { mutableState.update { state -> state.copy( isLoading = false, items = it, ) } } } screenModelScope.launchIO { findAvailableExtensions() } preferences.mangaExtensionUpdatesCount().changes() .onEach { mutableState.update { state -> state.copy(updates = it) } } .launchIn(screenModelScope) basePreferences.extensionInstaller().changes() .onEach { mutableState.update { state -> state.copy(installer = it) } } .launchIn(screenModelScope) } fun search(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun updateAllExtensions() { screenModelScope.launchIO { state.value.items.values.flatten() .map { it.extension } .filterIsInstance() .filter { it.hasUpdate } .forEach(::updateExtension) } } fun installExtension(extension: MangaExtension.Available) { screenModelScope.launchIO { extensionManager.installExtension(extension).collectToInstallUpdate(extension) } } fun updateExtension(extension: MangaExtension.Installed) { screenModelScope.launchIO { extensionManager.updateExtension(extension).collectToInstallUpdate(extension) } } fun cancelInstallUpdateExtension(extension: MangaExtension) { extensionManager.cancelInstallUpdateExtension(extension) } private fun addDownloadState(extension: MangaExtension, installStep: InstallStep) { currentDownloads.update { it + Pair(extension.pkgName, installStep) } } private fun removeDownloadState(extension: MangaExtension) { currentDownloads.update { it - extension.pkgName } } private suspend fun Flow.collectToInstallUpdate(extension: MangaExtension) = this .onEach { installStep -> addDownloadState(extension, installStep) } .onCompletion { removeDownloadState(extension) } .collect() fun uninstallExtension(extension: MangaExtension) { extensionManager.uninstallExtension(extension) } fun findAvailableExtensions() { screenModelScope.launchIO { mutableState.update { it.copy(isRefreshing = true) } extensionManager.findAvailableExtensions() // Fake slower refresh so it doesn't seem like it's not doing anything delay(1.seconds) mutableState.update { it.copy(isRefreshing = false) } } } fun trustExtension(extension: MangaExtension.Untrusted) { screenModelScope.launch { extensionManager.trust(extension) } } @Immutable data class State( val isLoading: Boolean = true, val isRefreshing: Boolean = false, val items: ItemGroups = mutableMapOf(), val updates: Int = 0, val installer: BasePreferences.ExtensionInstaller? = null, val searchQuery: String? = null, ) { val isEmpty = items.isEmpty() } } typealias ItemGroups = MutableMap> object MangaExtensionUiModel { sealed interface Header { data class Resource(val textRes: StringResource) : Header data class Text(val text: String) : Header } data class Item( val extension: MangaExtension, val installStep: InstallStep, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/MangaExtensionsTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MangaExtensionScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.presentation.more.settings.screen.browse.MangaExtensionReposScreen import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.ui.browse.manga.extension.details.MangaExtensionDetailsScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import eu.kanade.tachiyomi.util.system.isPackageInstalled import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun mangaExtensionsTab( extensionsScreenModel: MangaExtensionsScreenModel, ): TabContent { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val state by extensionsScreenModel.state.collectAsState() var privateExtensionToUninstall by remember { mutableStateOf(null) } return TabContent( titleRes = AYMR.strings.label_manga_extensions, badgeNumber = state.updates.takeIf { it > 0 }, searchEnabled = true, actions = persistentListOf( AppBar.OverflowAction( title = stringResource(MR.strings.action_filter), onClick = { navigator.push(MangaExtensionFilterScreen()) }, ), AppBar.OverflowAction( title = stringResource(MR.strings.label_extension_repos), onClick = { navigator.push(MangaExtensionReposScreen()) }, ), ), content = { contentPadding, _ -> MangaExtensionScreen( state = state, contentPadding = contentPadding, searchQuery = state.searchQuery, onLongClickItem = { extension -> when (extension) { is MangaExtension.Available -> extensionsScreenModel.installExtension( extension, ) else -> { if (context.isPackageInstalled(extension.pkgName)) { extensionsScreenModel.uninstallExtension(extension) } else { privateExtensionToUninstall = extension } } } }, onClickItemCancel = extensionsScreenModel::cancelInstallUpdateExtension, onClickUpdateAll = extensionsScreenModel::updateAllExtensions, onOpenWebView = { extension -> extension.sources.getOrNull(0)?.let { navigator.push( WebViewScreen( url = it.baseUrl, initialTitle = it.name, sourceId = it.id, ), ) } }, onInstallExtension = extensionsScreenModel::installExtension, onOpenExtension = { navigator.push(MangaExtensionDetailsScreen(it.pkgName)) }, onTrustExtension = { extensionsScreenModel.trustExtension(it) }, onUninstallExtension = { extensionsScreenModel.uninstallExtension(it) }, onUpdateExtension = extensionsScreenModel::updateExtension, onRefresh = extensionsScreenModel::findAvailableExtensions, ) privateExtensionToUninstall?.let { extension -> MangaExtensionUninstallConfirmation( extensionName = extension.name, onClickConfirm = { extensionsScreenModel.uninstallExtension(extension) }, onDismissRequest = { privateExtensionToUninstall = null }, ) } }, ) } @Composable private fun MangaExtensionUninstallConfirmation( extensionName: String, onClickConfirm: () -> Unit, onDismissRequest: () -> Unit, ) { AlertDialog( title = { Text(text = stringResource(MR.strings.ext_confirm_remove)) }, text = { Text(text = stringResource(MR.strings.remove_private_extension_message, extensionName)) }, confirmButton = { TextButton( onClick = { onClickConfirm() onDismissRequest() }, ) { Text(text = stringResource(MR.strings.ext_remove)) } }, dismissButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_cancel)) } }, onDismissRequest = onDismissRequest, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/details/MangaExtensionDetailsScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension.details import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MangaExtensionDetailsScreen import eu.kanade.presentation.util.Screen import kotlinx.coroutines.flow.collectLatest import tachiyomi.presentation.core.screens.LoadingScreen data class MangaExtensionDetailsScreen( private val pkgName: String, ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val screenModel = rememberScreenModel { MangaExtensionDetailsScreenModel( pkgName = pkgName, context = context, ) } val state by screenModel.state.collectAsState() if (state.isLoading) { LoadingScreen() return } val navigator = LocalNavigator.currentOrThrow MangaExtensionDetailsScreen( navigateUp = navigator::pop, state = state, onClickSourcePreferences = { navigator.push(MangaSourcePreferencesScreen(it)) }, onClickEnableAll = { screenModel.toggleSources(true) }, onClickDisableAll = { screenModel.toggleSources(false) }, onClickClearCookies = screenModel::clearCookies, onClickUninstall = screenModel::uninstallExtension, onClickSource = screenModel::toggleSource, onClickIncognito = screenModel::toggleIncognito, ) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> if (event is MangaExtensionDetailsEvent.Uninstalled) { navigator.pop() } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/details/MangaExtensionDetailsScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension.details import android.content.Context import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.extension.manga.interactor.GetExtensionSources import eu.kanade.domain.extension.manga.interactor.MangaExtensionSourceItem import eu.kanade.domain.source.manga.interactor.ToggleMangaIncognito import eu.kanade.domain.source.manga.interactor.ToggleMangaSource import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.system.LocaleHelper import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import okhttp3.HttpUrl.Companion.toHttpUrl import tachiyomi.core.common.util.system.logcat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaExtensionDetailsScreenModel( pkgName: String, context: Context, private val network: NetworkHelper = Injekt.get(), private val extensionManager: MangaExtensionManager = Injekt.get(), private val getExtensionSources: GetExtensionSources = Injekt.get(), private val toggleSource: ToggleMangaSource = Injekt.get(), private val toggleIncognito: ToggleMangaIncognito = Injekt.get(), private val preferences: SourcePreferences = Injekt.get(), ) : StateScreenModel(State()) { private val _events: Channel = Channel() val events: Flow = _events.receiveAsFlow() init { screenModelScope.launch { launch { extensionManager.installedExtensionsFlow .map { it.firstOrNull { extension -> extension.pkgName == pkgName } } .collectLatest { extension -> if (extension == null) { _events.send(MangaExtensionDetailsEvent.Uninstalled) return@collectLatest } mutableState.update { state -> state.copy(extension = extension) } } } launch { state.collectLatest { state -> if (state.extension == null) return@collectLatest getExtensionSources.subscribe(state.extension) .map { it.sortedWith( compareBy( { !it.enabled }, { item -> item.source.name.takeIf { item.labelAsName } ?: LocaleHelper.getSourceDisplayName( item.source.lang, context, ).lowercase() }, ), ) } .catch { throwable -> logcat(LogPriority.ERROR, throwable) mutableState.update { it.copy(_sources = persistentListOf()) } } .collectLatest { sources -> mutableState.update { it.copy(_sources = sources.toImmutableList()) } } } } launch { preferences.incognitoMangaExtensions() .changes() .map { pkgName in it } .distinctUntilChanged() .collectLatest { isIncognito -> mutableState.update { it.copy(isIncognito = isIncognito) } } } } } fun clearCookies() { val extension = state.value.extension ?: return val urls = extension.sources .filterIsInstance() .mapNotNull { it.baseUrl.takeUnless { url -> url.isEmpty() } } .distinct() val cleared = urls.sumOf { try { network.cookieJar.remove(it.toHttpUrl()) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to clear cookies for $it" } 0 } } logcat { "Cleared $cleared cookies for: ${urls.joinToString()}" } } fun uninstallExtension() { val extension = state.value.extension ?: return extensionManager.uninstallExtension(extension) } fun toggleSource(sourceId: Long) { toggleSource.await(sourceId) } fun toggleSources(enable: Boolean) { state.value.extension?.sources ?.map { it.id } ?.let { toggleSource.await(it, enable) } } fun toggleIncognito(enable: Boolean) { state.value.extension?.pkgName?.let { packageName -> toggleIncognito.await(packageName, enable) } } @Immutable data class State( val extension: MangaExtension.Installed? = null, val isIncognito: Boolean = false, private val _sources: ImmutableList? = null, ) { val sources: ImmutableList get() = _sources ?: persistentListOf() val isLoading: Boolean get() = extension == null || _sources == null } } sealed interface MangaExtensionDetailsEvent { data object Uninstalled : MangaExtensionDetailsEvent } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/extension/details/MangaSourcePreferencesScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.extension.details import android.content.Context import android.os.Bundle import android.util.TypedValue import android.view.View import androidx.appcompat.view.ContextThemeWrapper import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.viewinterop.AndroidView import androidx.core.os.bundleOf import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentContainerView import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.preference.DialogPreference import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceScreen import androidx.preference.forEach import androidx.preference.getOnBindEditTextListener import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifMangaSourcesLoaded import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.sourcePreferences import eu.kanade.tachiyomi.widget.TachiyomiTextInputEditText.Companion.setIncognito import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaSourcePreferencesScreen(val sourceId: Long) : Screen() { @Composable override fun Content() { if (!ifMangaSourcesLoaded()) { LoadingScreen() return } val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow Scaffold( topBar = { AppBar( title = Injekt.get().getOrStub(sourceId).toString(), navigateUp = navigator::pop, scrollBehavior = it, ) }, ) { contentPadding -> FragmentContainer( fragmentManager = (context as FragmentActivity).supportFragmentManager, modifier = Modifier .fillMaxSize() .padding(contentPadding), ) { add(it, MangaSourcePreferencesFragment.getInstance(sourceId), null) } } } /** * From https://stackoverflow.com/questions/60520145/fragment-container-in-jetpack-compose/70817794#70817794 */ @Composable private fun FragmentContainer( fragmentManager: FragmentManager, modifier: Modifier = Modifier, commit: FragmentTransaction.(containerId: Int) -> Unit, ) { val containerId by rememberSaveable { mutableIntStateOf(View.generateViewId()) } var initialized by rememberSaveable { mutableStateOf(false) } AndroidView( modifier = modifier, factory = { context -> FragmentContainerView(context) .apply { id = containerId } }, update = { view -> if (!initialized) { fragmentManager.commit { commit(view.id) } initialized = true } else { fragmentManager.onContainerAvailable(view) } }, ) } /** Access to package-private method in FragmentManager through reflection */ private fun FragmentManager.onContainerAvailable(view: FragmentContainerView) { val method = FragmentManager::class.java.getDeclaredMethod( "onContainerAvailable", FragmentContainerView::class.java, ) method.isAccessible = true method.invoke(this, view) } } class MangaSourcePreferencesFragment : PreferenceFragmentCompat() { override fun getContext(): Context? { val superCtx = super.getContext() ?: return null val tv = TypedValue() superCtx.theme.resolveAttribute(R.attr.preferenceTheme, tv, true) return ContextThemeWrapper(superCtx, tv.resourceId) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { preferenceScreen = populateScreen() } private fun populateScreen(): PreferenceScreen { val sourceId = requireArguments().getLong(SOURCE_ID) val source = Injekt.get().getOrStub(sourceId) val sourceScreen = preferenceManager.createPreferenceScreen(requireContext()) if (source is ConfigurableSource) { val dataStore = SharedPreferencesDataStore(source.sourcePreferences()) preferenceManager.preferenceDataStore = dataStore source.setupPreferenceScreen(sourceScreen) sourceScreen.forEach { pref -> pref.isIconSpaceReserved = false pref.isSingleLineTitle = false if (pref is DialogPreference && pref.dialogTitle.isNullOrEmpty()) { pref.dialogTitle = pref.title } // Apply incognito IME for EditTextPreference if (pref is EditTextPreference) { val setListener = pref.getOnBindEditTextListener() pref.setOnBindEditTextListener { setListener?.onBindEditText(it) it.setIncognito(lifecycleScope) } } } } return sourceScreen } companion object { private const val SOURCE_ID = "source_id" fun getInstance(sourceId: Long): MangaSourcePreferencesFragment { val fragment = MangaSourcePreferencesFragment() fragment.arguments = bundleOf(SOURCE_ID to sourceId) return fragment } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/MangaMigrationFlags.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration import dev.icerock.moko.resources.StringResource import eu.kanade.domain.entries.manga.model.hasCustomCover import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy data class MangaMigrationFlag( val flag: Int, val isDefaultSelected: Boolean, val titleId: StringResource, ) { companion object { fun create(flag: Int, defaultSelectionMap: Int, titleId: StringResource): MangaMigrationFlag { return MangaMigrationFlag( flag = flag, isDefaultSelected = defaultSelectionMap and flag != 0, titleId = titleId, ) } } } object MangaMigrationFlags { private const val CHAPTERS = 0b00001 private const val CATEGORIES = 0b00010 private const val CUSTOM_COVER = 0b01000 private const val DELETE_DOWNLOADED = 0b10000 private val coverCache: MangaCoverCache by injectLazy() private val downloadCache: MangaDownloadCache by injectLazy() fun hasChapters(value: Int): Boolean { return value and CHAPTERS != 0 } fun hasCategories(value: Int): Boolean { return value and CATEGORIES != 0 } fun hasCustomCover(value: Int): Boolean { return value and CUSTOM_COVER != 0 } fun hasDeleteDownloaded(value: Int): Boolean { return value and DELETE_DOWNLOADED != 0 } /** Returns information about applicable flags with default selections. */ fun getFlags(manga: Manga?, defaultSelectedBitMap: Int): List { val flags = mutableListOf() flags += MangaMigrationFlag.create(CHAPTERS, defaultSelectedBitMap, MR.strings.chapters) flags += MangaMigrationFlag.create(CATEGORIES, defaultSelectedBitMap, MR.strings.categories) if (manga != null) { if (manga.hasCustomCover(coverCache)) { flags += MangaMigrationFlag.create( CUSTOM_COVER, defaultSelectedBitMap, MR.strings.custom_cover, ) } if (downloadCache.getDownloadCount(manga) > 0) { flags += MangaMigrationFlag.create( DELETE_DOWNLOADED, defaultSelectedBitMap, MR.strings.delete_downloaded, ) } } return flags } /** Returns a bit map of selected flags. */ fun getSelectedFlagsBitMap( selectedFlags: List, flags: List, ): Int { return selectedFlags .zip(flags) .filter { (isSelected, _) -> isSelected } .map { (_, flag) -> flag.flag } .reduceOrNull { acc, mask -> acc or mask } ?: 0 } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/manga/MigrateMangaScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.manga import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MigrateMangaScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaSearchScreen import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.collectLatest import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen data class MigrateMangaScreen( private val sourceId: Long, ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateMangaScreenModel(sourceId) } val state by screenModel.state.collectAsState() if (state.isLoading) { LoadingScreen() return } MigrateMangaScreen( navigateUp = navigator::pop, title = state.source!!.name, state = state, onClickItem = { navigator.push(MigrateMangaSearchScreen(it.id)) }, onClickCover = { navigator.push(MangaScreen(it.id)) }, ) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> when (event) { MigrationMangaEvent.FailedFetchingFavorites -> { context.toast(MR.strings.internal_error) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/manga/MigrateMangaScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.manga import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.tachiyomi.source.MangaSource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.interactor.GetMangaFavorites import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateMangaScreenModel( private val sourceId: Long, private val sourceManager: MangaSourceManager = Injekt.get(), private val getFavorites: GetMangaFavorites = Injekt.get(), ) : StateScreenModel(State()) { private val _events: Channel = Channel() val events: Flow = _events.receiveAsFlow() init { screenModelScope.launch { mutableState.update { state -> state.copy(source = sourceManager.getOrStub(sourceId)) } getFavorites.subscribe(sourceId) .catch { logcat(LogPriority.ERROR, it) _events.send(MigrationMangaEvent.FailedFetchingFavorites) mutableState.update { state -> state.copy(titleList = persistentListOf()) } } .map { manga -> manga .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.title }) .toImmutableList() } .collectLatest { list -> mutableState.update { it.copy(titleList = list) } } } } @Immutable data class State( val source: MangaSource? = null, private val titleList: ImmutableList? = null, ) { val titles: ImmutableList get() = titleList ?: persistentListOf() val isLoading: Boolean get() = source == null || titleList == null val isEmpty: Boolean get() = titles.isEmpty() } } sealed interface MigrationMangaEvent { data object FailedFetchingFavorites : MigrationMangaEvent } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MangaMigrateSearchScreenDialogScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.search import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.model.Manga import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaMigrateSearchScreenDialogScreenModel( val mangaId: Long, getManga: GetManga = Injekt.get(), ) : StateScreenModel(State()) { init { screenModelScope.launch { val manga = getManga.await(mangaId)!! mutableState.update { it.copy(manga = manga) } } } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } @Immutable data class State( val manga: Manga? = null, val dialog: Dialog? = null, ) sealed interface Dialog { data class Migrate(val manga: Manga) : Dialog } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MangaSourceSearchScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.search import androidx.compose.animation.AnimatedVisibility import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material3.Icon import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifMangaSourcesLoaded import eu.kanade.presentation.browse.manga.BrowseSourceContent import eu.kanade.presentation.components.SearchToolbar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreenModel import eu.kanade.tachiyomi.ui.browse.manga.source.browse.SourceFilterMangaDialog import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.coroutines.launch import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.ExtendedFloatingActionButton import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.manga.LocalMangaSource data class MangaSourceSearchScreen( private val oldManga: Manga, private val sourceId: Long, private val query: String?, ) : Screen() { @Composable override fun Content() { if (!ifMangaSourcesLoaded()) { LoadingScreen() return } val uriHandler = LocalUriHandler.current val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val screenModel = rememberScreenModel { BrowseMangaSourceScreenModel(sourceId, query) } val state by screenModel.state.collectAsState() val snackbarHostState = remember { SnackbarHostState() } Scaffold( topBar = { scrollBehavior -> SearchToolbar( searchQuery = state.toolbarQuery ?: "", onChangeSearchQuery = screenModel::setToolbarQuery, onClickCloseSearch = navigator::pop, onSearch = screenModel::search, scrollBehavior = scrollBehavior, ) }, floatingActionButton = { AnimatedVisibility(visible = state.filters.isNotEmpty()) { ExtendedFloatingActionButton( text = { Text(text = stringResource(MR.strings.action_filter)) }, icon = { Icon(Icons.Outlined.FilterList, contentDescription = "") }, onClick = screenModel::openFilterSheet, ) } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> val openMigrateDialog: (Manga) -> Unit = { screenModel.setDialog(BrowseMangaSourceScreenModel.Dialog.Migrate(newManga = it, oldManga = oldManga)) } BrowseSourceContent( source = screenModel.source, mangaList = screenModel.mangaPagerFlowFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), displayMode = screenModel.displayMode, snackbarHostState = snackbarHostState, contentPadding = paddingValues, onWebViewClick = { val source = screenModel.source as? HttpSource ?: return@BrowseSourceContent navigator.push( WebViewScreen( url = source.baseUrl, initialTitle = source.name, sourceId = source.id, ), ) }, onHelpClick = { uriHandler.openUri(Constants.URL_HELP) }, onLocalSourceHelpClick = { uriHandler.openUri(LocalMangaSource.HELP_URL) }, onMangaClick = openMigrateDialog, onMangaLongClick = { navigator.push(MangaScreen(it.id, true)) }, ) } val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is BrowseMangaSourceScreenModel.Dialog.Filter -> { SourceFilterMangaDialog( onDismissRequest = onDismissRequest, filters = state.filters, onReset = screenModel::resetFilters, onFilter = { screenModel.search(filters = state.filters) }, onUpdate = screenModel::setFilters, ) } is BrowseMangaSourceScreenModel.Dialog.Migrate -> { MigrateMangaDialog( oldManga = oldManga, newManga = dialog.newManga, screenModel = rememberScreenModel { MigrateMangaDialogScreenModel() }, onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(MangaScreen(dialog.newManga.id)) }, onPopScreen = { scope.launch { navigator.popUntilRoot() HomeScreen.openTab(HomeScreen.Tab.Browse()) navigator.push(MangaScreen(dialog.newManga.id)) } }, ) } else -> {} } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MigrateMangaDialog.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.search import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.Modifier import cafe.adriel.voyager.core.model.StateScreenModel import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.entries.manga.model.hasCustomCover import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.domain.items.chapter.interactor.SyncChaptersWithSource import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.ui.browse.manga.migration.MangaMigrationFlags import kotlinx.coroutines.flow.update import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.SetMangaCategories import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaUpdate import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.items.chapter.interactor.UpdateChapter import tachiyomi.domain.items.chapter.model.toChapterUpdate import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.domain.track.manga.interactor.InsertMangaTrack import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant @Composable internal fun MigrateMangaDialog( oldManga: Manga, newManga: Manga, screenModel: MigrateMangaDialogScreenModel, onDismissRequest: () -> Unit, onClickTitle: () -> Unit, onPopScreen: () -> Unit, ) { val scope = rememberCoroutineScope() val state by screenModel.state.collectAsState() val flags = remember { MangaMigrationFlags.getFlags(oldManga, screenModel.migrateFlags.get()) } val selectedFlags = remember { flags.map { it.isDefaultSelected }.toMutableStateList() } if (state.isMigrating) { LoadingScreen( modifier = Modifier .background(MaterialTheme.colorScheme.background.copy(alpha = 0.7f)), ) } else { AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = stringResource(MR.strings.migration_dialog_what_to_include)) }, text = { Column( modifier = Modifier.verticalScroll(rememberScrollState()), ) { flags.forEachIndexed { index, flag -> LabeledCheckbox( label = stringResource(flag.titleId), checked = selectedFlags[index], onCheckedChange = { selectedFlags[index] = it }, ) } } }, confirmButton = { FlowRow( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { TextButton( onClick = { onDismissRequest() onClickTitle() }, ) { Text(text = stringResource(AYMR.strings.action_show_manga)) } Spacer(modifier = Modifier.weight(1f)) TextButton( onClick = { scope.launchIO { screenModel.migrateManga( oldManga, newManga, false, MangaMigrationFlags.getSelectedFlagsBitMap(selectedFlags, flags), ) withUIContext { onPopScreen() } } }, ) { Text(text = stringResource(MR.strings.copy)) } TextButton( onClick = { scope.launchIO { screenModel.migrateManga( oldManga, newManga, true, MangaMigrationFlags.getSelectedFlagsBitMap(selectedFlags, flags), ) withUIContext { onPopScreen() } } }, ) { Text(text = stringResource(MR.strings.migrate)) } } }, ) } } internal class MigrateMangaDialogScreenModel( private val sourceManager: MangaSourceManager = Injekt.get(), private val downloadManager: MangaDownloadManager = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(), private val getTracks: GetMangaTracks = Injekt.get(), private val insertTrack: InsertMangaTrack = Injekt.get(), private val coverCache: MangaCoverCache = Injekt.get(), private val preferenceStore: PreferenceStore = Injekt.get(), ) : StateScreenModel(State()) { val migrateFlags: Preference by lazy { preferenceStore.getInt("migrate_flags", Int.MAX_VALUE) } private val enhancedServices by lazy { Injekt.get().trackers.filterIsInstance() } suspend fun migrateManga( oldManga: Manga, newManga: Manga, replace: Boolean, flags: Int, ) { migrateFlags.set(flags) val source = sourceManager.get(newManga.source) ?: return val prevSource = sourceManager.get(oldManga.source) mutableState.update { it.copy(isMigrating = true) } try { val chapters = source.getChapterList(newManga.toSManga()) migrateMangaInternal( oldSource = prevSource, newSource = source, oldManga = oldManga, newManga = newManga, sourceChapters = chapters, replace = replace, flags = flags, ) } catch (_: Throwable) { // Explicitly stop if an error occurred; the dialog normally gets popped at the end // anyway mutableState.update { it.copy(isMigrating = false) } } } private suspend fun migrateMangaInternal( oldSource: MangaSource?, newSource: MangaSource, oldManga: Manga, newManga: Manga, sourceChapters: List, replace: Boolean, flags: Int, ) { val migrateChapters = MangaMigrationFlags.hasChapters(flags) val migrateCategories = MangaMigrationFlags.hasCategories(flags) val migrateCustomCover = MangaMigrationFlags.hasCustomCover(flags) val deleteDownloaded = MangaMigrationFlags.hasDeleteDownloaded(flags) try { syncChaptersWithSource.await(sourceChapters, newManga, newSource) } catch (_: Exception) { // Worst case, chapters won't be synced } // Update chapters read, bookmark and dateFetch if (migrateChapters) { val prevMangaChapters = getChaptersByMangaId.await(oldManga.id) val mangaChapters = getChaptersByMangaId.await(newManga.id) val maxChapterRead = prevMangaChapters .filter { it.read } .maxOfOrNull { it.chapterNumber } val updatedMangaChapters = mangaChapters.map { mangaChapter -> var updatedChapter = mangaChapter if (updatedChapter.isRecognizedNumber) { val prevChapter = prevMangaChapters .find { it.isRecognizedNumber && it.chapterNumber == updatedChapter.chapterNumber } if (prevChapter != null) { updatedChapter = updatedChapter.copy( dateFetch = prevChapter.dateFetch, bookmark = prevChapter.bookmark, ) } if (maxChapterRead != null && updatedChapter.chapterNumber <= maxChapterRead) { updatedChapter = updatedChapter.copy(read = true) } } updatedChapter } val chapterUpdates = updatedMangaChapters.map { it.toChapterUpdate() } updateChapter.awaitAll(chapterUpdates) } // Update categories if (migrateCategories) { val categoryIds = getCategories.await(oldManga.id).map { it.id } setMangaCategories.await(newManga.id, categoryIds) } // Update track getTracks.await(oldManga.id).mapNotNull { track -> val updatedTrack = track.copy(mangaId = newManga.id) val service = enhancedServices .firstOrNull { it.isTrackFrom(updatedTrack, oldManga, oldSource) } if (service != null) { service.migrateTrack(updatedTrack, newManga, newSource) } else { updatedTrack } } .takeIf { it.isNotEmpty() } ?.let { insertTrack.awaitAll(it) } // Delete downloaded if (deleteDownloaded) { if (oldSource != null) { downloadManager.deleteManga(oldManga, oldSource) } } if (replace) { updateManga.awaitUpdateFavorite(oldManga.id, favorite = false) } // Update custom cover (recheck if custom cover exists) if (migrateCustomCover && oldManga.hasCustomCover()) { coverCache.setCustomCoverToCache( newManga, coverCache.getCustomCoverFile(oldManga.id).inputStream(), ) } updateManga.await( MangaUpdate( id = newManga.id, favorite = true, chapterFlags = oldManga.chapterFlags, viewerFlags = oldManga.viewerFlags, dateAdded = if (replace) oldManga.dateAdded else Instant.now().toEpochMilli(), ), ) } @Immutable data class State( val isMigrating: Boolean = false, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MigrateMangaSearchScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.search import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MigrateMangaSearchScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen class MigrateMangaSearchScreen(private val mangaId: Long) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateMangaSearchScreenModel(mangaId = mangaId) } val state by screenModel.state.collectAsState() val dialogScreenModel = rememberScreenModel { MangaMigrateSearchScreenDialogScreenModel( mangaId = mangaId, ) } val dialogState by dialogScreenModel.state.collectAsState() MigrateMangaSearchScreen( state = state, fromSourceId = dialogState.manga?.source, navigateUp = navigator::pop, onChangeSearchQuery = screenModel::updateSearchQuery, onSearch = { screenModel.search() }, getManga = { screenModel.getManga(it) }, onChangeSearchFilter = screenModel::setSourceFilter, onToggleResults = screenModel::toggleFilterResults, onClickSource = { navigator.push( MangaSourceSearchScreen(dialogState.manga!!, it.id, state.searchQuery), ) }, onClickItem = { dialogScreenModel.setDialog( MangaMigrateSearchScreenDialogScreenModel.Dialog.Migrate(it), ) }, onLongClickItem = { navigator.push(MangaScreen(it.id, true)) }, ) when (val dialog = dialogState.dialog) { is MangaMigrateSearchScreenDialogScreenModel.Dialog.Migrate -> { MigrateMangaDialog( oldManga = dialogState.manga!!, newManga = dialog.manga, screenModel = rememberScreenModel { MigrateMangaDialogScreenModel() }, onDismissRequest = { dialogScreenModel.setDialog(null) }, onClickTitle = { navigator.push(MangaScreen(dialog.manga.id, true)) }, onPopScreen = { if (navigator.lastItem is MangaScreen) { val lastItem = navigator.lastItem navigator.popUntil { navigator.items.contains(lastItem) } navigator.push(MangaScreen(dialog.manga.id)) } else { navigator.replace(MangaScreen(dialog.manga.id)) } }, ) } else -> {} } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MigrateMangaSearchScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.search import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSearchScreenModel import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.MangaSourceFilter import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.entries.manga.interactor.GetManga import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateMangaSearchScreenModel( val mangaId: Long, initialExtensionFilter: String = "", getManga: GetManga = Injekt.get(), ) : MangaSearchScreenModel() { init { extensionFilter = initialExtensionFilter screenModelScope.launch { val manga = getManga.await(mangaId)!! mutableState.update { it.copy( fromSourceId = manga.source, searchQuery = manga.title, ) } search() } } override fun getEnabledSources(): List { return super.getEnabledSources() .filter { state.value.sourceFilter != MangaSourceFilter.PinnedOnly || "${it.id}" in pinnedSources } .sortedWith( compareBy( { it.id != state.value.fromSourceId }, { "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" }, ), ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/sources/MigrateMangaSourceScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.sources import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.domain.source.manga.interactor.GetMangaSourcesWithFavoriteCount import eu.kanade.domain.source.service.SourcePreferences import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import logcat.LogPriority import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.manga.model.Source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MigrateMangaSourceScreenModel( preferences: SourcePreferences = Injekt.get(), private val getSourcesWithFavoriteCount: GetMangaSourcesWithFavoriteCount = Injekt.get(), private val setMigrateSorting: SetMigrateSorting = Injekt.get(), ) : StateScreenModel(State()) { private val _channel = Channel(Int.MAX_VALUE) val channel = _channel.receiveAsFlow() init { screenModelScope.launchIO { getSourcesWithFavoriteCount.subscribe() .catch { logcat(LogPriority.ERROR, it) _channel.send(Event.FailedFetchingSourcesWithCount) } .collectLatest { sources -> mutableState.update { it.copy( isLoading = false, items = sources.toImmutableList(), ) } } } preferences.migrationSortingDirection().changes() .onEach { mutableState.update { state -> state.copy(sortingDirection = it) } } .launchIn(screenModelScope) preferences.migrationSortingMode().changes() .onEach { mutableState.update { state -> state.copy(sortingMode = it) } } .launchIn(screenModelScope) } fun toggleSortingMode() { with(state.value) { val newMode = when (sortingMode) { SetMigrateSorting.Mode.ALPHABETICAL -> SetMigrateSorting.Mode.TOTAL SetMigrateSorting.Mode.TOTAL -> SetMigrateSorting.Mode.ALPHABETICAL } setMigrateSorting.await(newMode, sortingDirection) } } fun toggleSortingDirection() { with(state.value) { val newDirection = when (sortingDirection) { SetMigrateSorting.Direction.ASCENDING -> SetMigrateSorting.Direction.DESCENDING SetMigrateSorting.Direction.DESCENDING -> SetMigrateSorting.Direction.ASCENDING } setMigrateSorting.await(sortingMode, newDirection) } } @Immutable data class State( val isLoading: Boolean = true, val items: ImmutableList> = persistentListOf(), val sortingMode: SetMigrateSorting.Mode = SetMigrateSorting.Mode.ALPHABETICAL, val sortingDirection: SetMigrateSorting.Direction = SetMigrateSorting.Direction.ASCENDING, ) { val isEmpty = items.isEmpty() } sealed interface Event { data object FailedFetchingSourcesWithCount : Event } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/sources/MigrateMangaSourceTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.migration.sources import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MigrateMangaSourceScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.tachiyomi.ui.browse.manga.migration.manga.MigrateMangaScreen import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource @Composable fun Screen.migrateMangaSourceTab(): TabContent { val uriHandler = LocalUriHandler.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MigrateMangaSourceScreenModel() } val state by screenModel.state.collectAsState() return TabContent( titleRes = MR.strings.label_migration, actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.migration_help_guide), icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = { uriHandler.openUri("https://aniyomi.org/help/guides/source-migration/") }, ), ), content = { contentPadding, _ -> MigrateMangaSourceScreen( state = state, contentPadding = contentPadding, onClickItem = { source -> navigator.push(MigrateMangaScreen(source.id)) }, onToggleSortingDirection = screenModel::toggleSortingDirection, onToggleSortingMode = screenModel::toggleSortingMode, ) }, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/MangaSourcesFilterScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MangaSourcesFilterScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.util.system.toast import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen class MangaSourcesFilterScreen : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MangaSourcesFilterScreenModel() } val state by screenModel.state.collectAsState() if (state is MangaSourcesFilterScreenModel.State.Loading) { LoadingScreen() return } if (state is MangaSourcesFilterScreenModel.State.Error) { val context = LocalContext.current LaunchedEffect(Unit) { context.toast(MR.strings.internal_error) navigator.pop() } return } val successState = state as MangaSourcesFilterScreenModel.State.Success MangaSourcesFilterScreen( navigateUp = navigator::pop, state = successState, onClickLanguage = screenModel::toggleLanguage, onClickSource = screenModel::toggleSource, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/MangaSourcesFilterScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.source.interactor.ToggleLanguage import eu.kanade.domain.source.manga.interactor.GetLanguagesWithMangaSources import eu.kanade.domain.source.manga.interactor.ToggleMangaSource import eu.kanade.domain.source.service.SourcePreferences import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.source.manga.model.Source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.SortedMap class MangaSourcesFilterScreenModel( private val preferences: SourcePreferences = Injekt.get(), private val getLanguagesWithSources: GetLanguagesWithMangaSources = Injekt.get(), private val toggleSource: ToggleMangaSource = Injekt.get(), private val toggleLanguage: ToggleLanguage = Injekt.get(), ) : StateScreenModel(State.Loading) { init { screenModelScope.launch { combine( getLanguagesWithSources.subscribe(), preferences.enabledLanguages().changes(), preferences.disabledMangaSources().changes(), ) { a, b, c -> Triple(a, b, c) } .catch { throwable -> mutableState.update { State.Error( throwable = throwable, ) } } .collectLatest { (languagesWithSources, enabledLanguages, disabledSources) -> mutableState.update { State.Success( items = languagesWithSources, enabledLanguages = enabledLanguages, disabledSources = disabledSources, ) } } } } fun toggleSource(source: Source) { toggleSource.await(source) } fun toggleLanguage(language: String) { toggleLanguage.await(language) } sealed interface State { @Immutable data object Loading : State @Immutable data class Error( val throwable: Throwable, ) : State @Immutable data class Success( val items: SortedMap>, val enabledLanguages: Set, val disabledSources: Set, ) : State { val isEmpty: Boolean get() = items.isEmpty() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/MangaSourcesScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.manga.interactor.GetEnabledMangaSources import eu.kanade.domain.source.manga.interactor.ToggleExcludeFromMangaDataSaver import eu.kanade.domain.source.manga.interactor.ToggleMangaSource import eu.kanade.domain.source.manga.interactor.ToggleMangaSourcePin import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences.DataSaver import eu.kanade.presentation.browse.manga.MangaSourceUiModel import eu.kanade.tachiyomi.util.system.LAST_USED_KEY import eu.kanade.tachiyomi.util.system.PINNED_KEY import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import logcat.LogPriority import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.source.manga.model.Pin import tachiyomi.domain.source.manga.model.Source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.TreeMap class MangaSourcesScreenModel( private val preferences: BasePreferences = Injekt.get(), private val sourcePreferences: SourcePreferences = Injekt.get(), private val getEnabledSources: GetEnabledMangaSources = Injekt.get(), private val toggleSource: ToggleMangaSource = Injekt.get(), private val toggleSourcePin: ToggleMangaSourcePin = Injekt.get(), // SY --> private val toggleExcludeFromMangaDataSaver: ToggleExcludeFromMangaDataSaver = Injekt.get(), // SY <-- ) : StateScreenModel(State()) { private val _events = Channel(Int.MAX_VALUE) val events = _events.receiveAsFlow() init { screenModelScope.launchIO { getEnabledSources.subscribe() .catch { logcat(LogPriority.ERROR, it) _events.send(Event.FailedFetchingSources) } .collectLatest(::collectLatestSources) } // SY --> sourcePreferences.dataSaver().changes() .onEach { mutableState.update { it.copy( dataSaverEnabled = sourcePreferences.dataSaver().get() != DataSaver.NONE, ) } } .launchIn(screenModelScope) // SY <-- } private fun collectLatestSources(sources: List) { mutableState.update { state -> val map = TreeMap> { d1, d2 -> // Sources without a lang defined will be placed at the end when { d1 == LAST_USED_KEY && d2 != LAST_USED_KEY -> -1 d2 == LAST_USED_KEY && d1 != LAST_USED_KEY -> 1 d1 == PINNED_KEY && d2 != PINNED_KEY -> -1 d2 == PINNED_KEY && d1 != PINNED_KEY -> 1 d1 == "" && d2 != "" -> 1 d2 == "" && d1 != "" -> -1 else -> d1.compareTo(d2) } } val byLang = sources.groupByTo(map) { when { it.isUsedLast -> LAST_USED_KEY Pin.Actual in it.pin -> PINNED_KEY else -> it.lang } } state.copy( isLoading = false, items = byLang .flatMap { listOf( MangaSourceUiModel.Header(it.key), *it.value.map { source -> MangaSourceUiModel.Item(source) }.toTypedArray(), ) } .toImmutableList(), ) } } fun toggleSource(source: Source) { toggleSource.await(source) } fun togglePin(source: Source) { toggleSourcePin.await(source) } // SY --> fun toggleExcludeFromMangaDataSaver(source: Source) { toggleExcludeFromMangaDataSaver.await(source) } // SY <-- fun showSourceDialog(source: Source) { mutableState.update { it.copy(dialog = Dialog(source)) } } fun closeDialog() { mutableState.update { it.copy(dialog = null) } } sealed interface Event { data object FailedFetchingSources : Event } data class Dialog(val source: Source) @Immutable data class State( val dialog: Dialog? = null, val isLoading: Boolean = true, val items: ImmutableList = persistentListOf(), // SY --> val dataSaverEnabled: Boolean = false, // SY <-- ) { val isEmpty = items.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/MangaSourcesTab.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.TravelExplore import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.browse.manga.MangaSourceOptionsDialog import eu.kanade.presentation.browse.manga.MangaSourcesScreen import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreen import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource @Composable fun Screen.mangaSourcesTab(): TabContent { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MangaSourcesScreenModel() } val state by screenModel.state.collectAsState() return TabContent( titleRes = AYMR.strings.label_manga_sources, actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_global_search), icon = Icons.Outlined.TravelExplore, onClick = { navigator.push(GlobalMangaSearchScreen()) }, ), AppBar.Action( title = stringResource(MR.strings.action_filter), icon = Icons.Outlined.FilterList, onClick = { navigator.push(MangaSourcesFilterScreen()) }, ), ), content = { contentPadding, snackbarHostState -> MangaSourcesScreen( state = state, contentPadding = contentPadding, onClickItem = { source, listing -> navigator.push(BrowseMangaSourceScreen(source.id, listing.query)) }, onClickPin = screenModel::togglePin, onLongClickItem = screenModel::showSourceDialog, ) state.dialog?.let { dialog -> val source = dialog.source MangaSourceOptionsDialog( source = source, onClickPin = { screenModel.togglePin(source) screenModel.closeDialog() }, onClickDisable = { screenModel.toggleSource(source) screenModel.closeDialog() }, onClickToggleDataSaver = { screenModel.toggleExcludeFromMangaDataSaver(source) screenModel.closeDialog() }.takeIf { state.dataSaverEnabled }, onDismiss = screenModel::closeDialog, ) } val internalErrString = stringResource(MR.strings.internal_error) LaunchedEffect(Unit) { screenModel.events.collectLatest { event -> when (event) { MangaSourcesScreenModel.Event.FailedFetchingSources -> { launch { snackbarHostState.showSnackbar(internalErrString) } } } } } }, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/browse/BrowseMangaSourceScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source.browse import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Favorite import androidx.compose.material.icons.outlined.FilterList import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifMangaSourcesLoaded import eu.kanade.presentation.browse.RemoveEntryDialog import eu.kanade.presentation.browse.manga.BrowseSourceContent import eu.kanade.presentation.browse.manga.MissingSourceScreen import eu.kanade.presentation.browse.manga.components.BrowseMangaSourceToolbar import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.entries.manga.DuplicateMangaDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.browse.manga.extension.details.MangaSourcePreferencesScreen import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaDialog import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaDialogScreenModel import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreenModel.Listing import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.source.manga.model.StubMangaSource import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.manga.LocalMangaSource data class BrowseMangaSourceScreen( val sourceId: Long, private val listingQuery: String?, ) : Screen(), AssistContentScreen { private var assistUrl: String? = null override fun onProvideAssistUrl() = assistUrl @Composable override fun Content() { if (!ifMangaSourcesLoaded()) { LoadingScreen() return } val screenModel = rememberScreenModel { BrowseMangaSourceScreenModel(sourceId, listingQuery) } val state by screenModel.state.collectAsState() val navigator = LocalNavigator.currentOrThrow val navigateUp: () -> Unit = { when { !state.isUserQuery && state.toolbarQuery != null -> screenModel.setToolbarQuery( null, ) else -> navigator.pop() } } if (screenModel.source is StubMangaSource) { MissingSourceScreen( source = screenModel.source, navigateUp = navigateUp, ) return } val scope = rememberCoroutineScope() val haptic = LocalHapticFeedback.current val uriHandler = LocalUriHandler.current val snackbarHostState = remember { SnackbarHostState() } val onHelpClick = { uriHandler.openUri(LocalMangaSource.HELP_URL) } val onWebViewClick = f@{ val source = screenModel.source as? HttpSource ?: return@f navigator.push( WebViewScreen( url = source.baseUrl, initialTitle = source.name, sourceId = source.id, ), ) } LaunchedEffect(screenModel.source) { assistUrl = (screenModel.source as? HttpSource)?.baseUrl } var topBarHeight by remember { mutableIntStateOf(0) } Scaffold( topBar = { Column( modifier = Modifier .background(MaterialTheme.colorScheme.surface) .onSizeChanged { topBarHeight = it.height }, ) { BrowseMangaSourceToolbar( searchQuery = state.toolbarQuery, onSearchQueryChange = screenModel::setToolbarQuery, source = screenModel.source, displayMode = screenModel.displayMode, onDisplayModeChange = { screenModel.displayMode = it }, navigateUp = navigateUp, onWebViewClick = onWebViewClick, onHelpClick = onHelpClick, onSettingsClick = { navigator.push(MangaSourcePreferencesScreen(sourceId)) }, onSearch = screenModel::search, ) Row( modifier = Modifier .horizontalScroll(rememberScrollState()) .padding(horizontal = MaterialTheme.padding.small), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { FilterChip( selected = state.listing == Listing.Popular, onClick = { screenModel.resetFilters() screenModel.setListing(Listing.Popular) }, leadingIcon = { Icon( imageVector = Icons.Outlined.Favorite, contentDescription = null, modifier = Modifier .size(FilterChipDefaults.IconSize), ) }, label = { Text(text = stringResource(MR.strings.popular)) }, ) if ((screenModel.source as CatalogueSource).supportsLatest) { FilterChip( selected = state.listing == Listing.Latest, onClick = { screenModel.resetFilters() screenModel.setListing(Listing.Latest) }, leadingIcon = { Icon( imageVector = Icons.Outlined.NewReleases, contentDescription = null, modifier = Modifier .size(FilterChipDefaults.IconSize), ) }, label = { Text(text = stringResource(MR.strings.latest)) }, ) } if (state.filters.isNotEmpty()) { FilterChip( selected = state.listing is Listing.Search, onClick = screenModel::openFilterSheet, leadingIcon = { Icon( imageVector = Icons.Outlined.FilterList, contentDescription = null, modifier = Modifier .size(FilterChipDefaults.IconSize), ) }, label = { Text(text = stringResource(MR.strings.action_filter)) }, ) } } HorizontalDivider() } }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> BrowseSourceContent( source = screenModel.source, mangaList = screenModel.mangaPagerFlowFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), entries = screenModel.getColumnsPreferenceForCurrentOrientation(LocalConfiguration.current.orientation), topBarHeight = topBarHeight, displayMode = screenModel.displayMode, snackbarHostState = snackbarHostState, contentPadding = paddingValues, onWebViewClick = onWebViewClick, onHelpClick = { uriHandler.openUri(Constants.URL_HELP) }, onLocalSourceHelpClick = onHelpClick, onMangaClick = { navigator.push((MangaScreen(it.id, true))) }, onMangaLongClick = { manga -> scope.launchIO { val duplicateManga = screenModel.getDuplicateLibraryManga(manga) when { manga.favorite -> screenModel.setDialog( BrowseMangaSourceScreenModel.Dialog.RemoveManga(manga), ) duplicateManga != null -> screenModel.setDialog( BrowseMangaSourceScreenModel.Dialog.AddDuplicateManga( manga, duplicateManga, ), ) else -> screenModel.addFavorite(manga) } haptic.performHapticFeedback(HapticFeedbackType.LongPress) } }, ) } val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is BrowseMangaSourceScreenModel.Dialog.Filter -> { SourceFilterMangaDialog( onDismissRequest = onDismissRequest, filters = state.filters, onReset = screenModel::resetFilters, onFilter = { screenModel.search(filters = state.filters) }, onUpdate = screenModel::setFilters, ) } is BrowseMangaSourceScreenModel.Dialog.AddDuplicateManga -> { DuplicateMangaDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.addFavorite(dialog.manga) }, onOpenManga = { navigator.push(MangaScreen(dialog.duplicate.id)) }, onMigrate = { screenModel.setDialog( BrowseMangaSourceScreenModel.Dialog.Migrate(dialog.manga, dialog.duplicate), ) }, ) } is BrowseMangaSourceScreenModel.Dialog.Migrate -> { MigrateMangaDialog( oldManga = dialog.oldManga, newManga = dialog.newManga, screenModel = MigrateMangaDialogScreenModel(), onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(MangaScreen(dialog.oldManga.id)) }, onPopScreen = { onDismissRequest() }, ) } is BrowseMangaSourceScreenModel.Dialog.RemoveManga -> { RemoveEntryDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.changeMangaFavorite(dialog.manga) }, entryToRemove = dialog.manga.title, ) } is BrowseMangaSourceScreenModel.Dialog.ChangeMangaCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { navigator.push(CategoriesTab) CategoriesTab.showMangaCategory() }, onConfirm = { include, _ -> screenModel.changeMangaFavorite(dialog.manga) screenModel.moveMangaToCategories(dialog.manga, include) }, ) } else -> {} } LaunchedEffect(Unit) { queryEvent.receiveAsFlow() .collectLatest { when (it) { is SearchType.Genre -> screenModel.searchGenre(it.txt) is SearchType.Text -> screenModel.search(it.txt) } } } } suspend fun search(query: String) = queryEvent.send(SearchType.Text(query)) suspend fun searchGenre(name: String) = queryEvent.send(SearchType.Genre(name)) companion object { private val queryEvent = Channel() } sealed class SearchType(val txt: String) { class Text(txt: String) : SearchType(txt) class Genre(txt: String) : SearchType(txt) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/browse/BrowseMangaSourceScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source.browse import android.content.res.Configuration import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.runtime.Immutable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.unit.dp import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.cachedIn import androidx.paging.filter import androidx.paging.map import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.asState import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.entries.manga.model.toDomainManga import eu.kanade.domain.source.manga.interactor.GetMangaIncognitoState import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.track.manga.interactor.AddMangaTracks import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.util.removeCovers import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.mapAsCheckboxState import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.manga.interactor.GetDuplicateLibraryManga import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.interactor.NetworkToLocalManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.toMangaUpdate import tachiyomi.domain.items.chapter.interactor.SetMangaDefaultChapterFlags import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.manga.interactor.GetRemoteManga import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import eu.kanade.tachiyomi.source.model.Filter as SourceModelFilter class BrowseMangaSourceScreenModel( private val sourceId: Long, listingQuery: String?, sourceManager: MangaSourceManager = Injekt.get(), sourcePreferences: SourcePreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val coverCache: MangaCoverCache = Injekt.get(), private val getRemoteManga: GetRemoteManga = Injekt.get(), private val getDuplicateLibraryManga: GetDuplicateLibraryManga = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(), private val setMangaDefaultChapterFlags: SetMangaDefaultChapterFlags = Injekt.get(), private val getManga: GetManga = Injekt.get(), private val networkToLocalManga: NetworkToLocalManga = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), private val addTracks: AddMangaTracks = Injekt.get(), private val getIncognitoState: GetMangaIncognitoState = Injekt.get(), ) : StateScreenModel(State(Listing.valueOf(listingQuery))) { var displayMode by sourcePreferences.sourceDisplayMode().asState(screenModelScope) val source = sourceManager.getOrStub(sourceId) init { if (source is CatalogueSource) { mutableState.update { var query: String? = null var listing = it.listing if (listing is Listing.Search) { query = listing.query listing = Listing.Search(query, source.getFilterList()) } it.copy( listing = listing, filters = source.getFilterList(), toolbarQuery = query, ) } } if (!getIncognitoState.await(source.id)) { sourcePreferences.lastUsedMangaSource().set(source.id) } } /** * Flow of Pager flow tied to [State.listing] */ private val hideInLibraryItems = sourcePreferences.hideInMangaLibraryItems().get() val mangaPagerFlowFlow = state.map { it.listing } .distinctUntilChanged() .map { listing -> Pager(PagingConfig(pageSize = 25)) { getRemoteManga.subscribe(sourceId, listing.query ?: "", listing.filters) }.flow.map { pagingData -> pagingData.map { networkToLocalManga.await(it.toDomainManga(sourceId)) .let { localManga -> getManga.subscribe(localManga.url, localManga.source) } .filterNotNull() .stateIn(ioCoroutineScope) } .filter { !hideInLibraryItems || !it.value.favorite } } .cachedIn(ioCoroutineScope) } .stateIn(ioCoroutineScope, SharingStarted.Lazily, emptyFlow()) fun getColumnsPreference(orientation: Int): GridCells { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE val columns = if (isLandscape) { libraryPreferences.mangaLandscapeColumns() } else { libraryPreferences.mangaPortraitColumns() }.get() return if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns) } // returns the number from the size slider fun getColumnsPreferenceForCurrentOrientation(orientation: Int): Int { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE return if (isLandscape) { libraryPreferences.mangaLandscapeColumns() } else { libraryPreferences.mangaPortraitColumns() }.get() } fun resetFilters() { if (source !is CatalogueSource) return mutableState.update { it.copy(filters = source.getFilterList()) } } fun setListing(listing: Listing) { mutableState.update { it.copy(listing = listing, toolbarQuery = null) } } fun setFilters(filters: FilterList) { if (source !is CatalogueSource) return mutableState.update { it.copy( filters = filters, ) } } fun search(query: String? = null, filters: FilterList? = null) { if (source !is CatalogueSource) return val input = state.value.listing as? Listing.Search ?: Listing.Search(query = null, filters = source.getFilterList()) mutableState.update { it.copy( listing = input.copy( query = query ?: input.query, filters = filters ?: input.filters, ), toolbarQuery = query ?: input.query, ) } } fun searchGenre(genreName: String) { if (source !is CatalogueSource) return val defaultFilters = source.getFilterList() var genreExists = false filter@ for (sourceFilter in defaultFilters) { if (sourceFilter is SourceModelFilter.Group<*>) { for (filter in sourceFilter.state) { if (filter is SourceModelFilter<*> && filter.name.equals(genreName, true)) { when (filter) { is SourceModelFilter.TriState -> filter.state = 1 is SourceModelFilter.CheckBox -> filter.state = true else -> {} } genreExists = true break@filter } } } else if (sourceFilter is SourceModelFilter.Select<*>) { val index = sourceFilter.values.filterIsInstance() .indexOfFirst { it.equals(genreName, true) } if (index != -1) { sourceFilter.state = index genreExists = true break } } } mutableState.update { val listing = if (genreExists) { Listing.Search(query = null, filters = defaultFilters) } else { Listing.Search(query = genreName, filters = defaultFilters) } it.copy( filters = defaultFilters, listing = listing, toolbarQuery = listing.query, ) } } /** * Adds or removes a manga from the library. * * @param manga the manga to update. */ fun changeMangaFavorite(manga: Manga) { screenModelScope.launch { var new = manga.copy( favorite = !manga.favorite, dateAdded = when (manga.favorite) { true -> 0 false -> Instant.now().toEpochMilli() }, ) if (!new.favorite) { new = new.removeCovers(coverCache) } else { setMangaDefaultChapterFlags.await(manga) addTracks.bindEnhancedTrackers(manga, source) } updateManga.await(new.toMangaUpdate()) } } fun addFavorite(manga: Manga) { screenModelScope.launch { val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultMangaCategory().get() val defaultCategory = categories.find { it.id == defaultCategoryId.toLong() } when { // Default category set defaultCategory != null -> { moveMangaToCategories(manga, defaultCategory) changeMangaFavorite(manga) } // Automatic 'Default' or no categories defaultCategoryId == 0 || categories.isEmpty() -> { moveMangaToCategories(manga) changeMangaFavorite(manga) } // Choose a category else -> { val preselectedIds = getCategories.await(manga.id).map { it.id } setDialog( Dialog.ChangeMangaCategory( manga, categories.mapAsCheckboxState { it.id in preselectedIds }.toImmutableList(), ), ) } } } } /** * Get user categories. * * @return List of categories, not including the default category */ suspend fun getCategories(): List { return getCategories.subscribe() .firstOrNull() ?.filterNot { it.isSystemCategory } .orEmpty() } suspend fun getDuplicateLibraryManga(manga: Manga): Manga? { return getDuplicateLibraryManga.await(manga).getOrNull(0) } private fun moveMangaToCategories(manga: Manga, vararg categories: Category) { moveMangaToCategories(manga, categories.filter { it.id != 0L }.map { it.id }) } fun moveMangaToCategories(manga: Manga, categoryIds: List) { screenModelScope.launchIO { setMangaCategories.await( mangaId = manga.id, categoryIds = categoryIds.toList(), ) } } fun openFilterSheet() { setDialog(Dialog.Filter) } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } fun setToolbarQuery(query: String?) { mutableState.update { it.copy(toolbarQuery = query) } } sealed class Listing(open val query: String?, open val filters: FilterList) { data object Popular : Listing(query = GetRemoteManga.QUERY_POPULAR, filters = FilterList()) data object Latest : Listing(query = GetRemoteManga.QUERY_LATEST, filters = FilterList()) data class Search(override val query: String?, override val filters: FilterList) : Listing( query = query, filters = filters, ) companion object { fun valueOf(query: String?): Listing { return when (query) { GetRemoteManga.QUERY_POPULAR -> Popular GetRemoteManga.QUERY_LATEST -> Latest else -> Search(query = query, filters = FilterList()) // filters are filled in later } } } } sealed interface Dialog { data object Filter : Dialog data class RemoveManga(val manga: Manga) : Dialog data class AddDuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog data class ChangeMangaCategory( val manga: Manga, val initialSelection: ImmutableList>, ) : Dialog data class Migrate(val newManga: Manga, val oldManga: Manga) : Dialog } @Immutable data class State( val listing: Listing, val filters: FilterList = FilterList(), val toolbarQuery: String? = null, val dialog: Dialog? = null, ) { val isUserQuery get() = listing is Listing.Search && !listing.query.isNullOrEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/browse/SourceFilterMangaDialog.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source.browse import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AdaptiveSheet import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import tachiyomi.core.common.preference.TriState import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.CheckboxItem import tachiyomi.presentation.core.components.CollapsibleBox import tachiyomi.presentation.core.components.HeadingItem import tachiyomi.presentation.core.components.SelectItem import tachiyomi.presentation.core.components.SortItem import tachiyomi.presentation.core.components.TextItem import tachiyomi.presentation.core.components.TriStateItem import tachiyomi.presentation.core.components.material.Button import tachiyomi.presentation.core.i18n.stringResource @Composable fun SourceFilterMangaDialog( onDismissRequest: () -> Unit, filters: FilterList, onReset: () -> Unit, onFilter: () -> Unit, onUpdate: (FilterList) -> Unit, ) { val updateFilters = { onUpdate(filters) } AdaptiveSheet(onDismissRequest = onDismissRequest) { LazyColumn { stickyHeader { Row( modifier = Modifier .background(MaterialTheme.colorScheme.background) .padding(8.dp), ) { TextButton(onClick = onReset) { Text( text = stringResource(MR.strings.action_reset), style = LocalTextStyle.current.copy( color = MaterialTheme.colorScheme.primary, ), ) } Spacer(modifier = Modifier.weight(1f)) Button(onClick = { onFilter() onDismissRequest() }) { Text(stringResource(MR.strings.action_filter)) } } HorizontalDivider() } items(filters) { FilterItem(it, updateFilters) } } } } @Composable private fun FilterItem(filter: Filter<*>, onUpdate: () -> Unit) { when (filter) { is Filter.Header -> { HeadingItem(filter.name) } is Filter.Separator -> { HorizontalDivider() } is Filter.CheckBox -> { CheckboxItem( label = filter.name, checked = filter.state, ) { filter.state = !filter.state onUpdate() } } is Filter.TriState -> { TriStateItem( label = filter.name, state = filter.state.toTriStateFilter(), ) { filter.state = filter.state.toTriStateFilter().next().toTriStateInt() onUpdate() } } is Filter.Text -> { TextItem( label = filter.name, value = filter.state, ) { filter.state = it onUpdate() } } is Filter.Select<*> -> { SelectItem( label = filter.name, options = filter.values, selectedIndex = filter.state, onSelect = { filter.state = it onUpdate() }, ) } is Filter.Sort -> { CollapsibleBox( heading = filter.name, ) { Column { filter.values.mapIndexed { index, item -> SortItem( label = item, sortDescending = filter.state?.ascending?.not() ?.takeIf { index == filter.state?.index }, ) { val ascending = if (index == filter.state?.index) { !filter.state!!.ascending } else { filter.state!!.ascending } filter.state = Filter.Sort.Selection( index = index, ascending = ascending, ) onUpdate() } } } } } is Filter.Group<*> -> { CollapsibleBox( heading = filter.name, ) { Column { filter.state .filterIsInstance>() .map { FilterItem(filter = it, onUpdate = onUpdate) } } } } } } private fun Int.toTriStateFilter(): TriState { return when (this) { Filter.TriState.STATE_IGNORE -> TriState.DISABLED Filter.TriState.STATE_INCLUDE -> TriState.ENABLED_IS Filter.TriState.STATE_EXCLUDE -> TriState.ENABLED_NOT else -> throw IllegalStateException("Unknown TriState state: $this") } } private fun TriState.toTriStateInt(): Int { return when (this) { TriState.DISABLED -> Filter.TriState.STATE_IGNORE TriState.ENABLED_IS -> Filter.TriState.STATE_INCLUDE TriState.ENABLED_NOT -> Filter.TriState.STATE_EXCLUDE } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/globalsearch/GlobalMangaSearchScreen.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifMangaSourcesLoaded import eu.kanade.presentation.browse.manga.GlobalMangaSearchScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreen import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import tachiyomi.presentation.core.screens.LoadingScreen class GlobalMangaSearchScreen( val searchQuery: String = "", private val extensionFilter: String? = null, ) : Screen() { @Composable override fun Content() { if (!ifMangaSourcesLoaded()) { LoadingScreen() return } val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { GlobalMangaSearchScreenModel( initialQuery = searchQuery, initialExtensionFilter = extensionFilter, ) } val state by screenModel.state.collectAsState() var showSingleLoadingScreen by remember { mutableStateOf( searchQuery.isNotEmpty() && !extensionFilter.isNullOrEmpty() && state.total == 1, ) } if (showSingleLoadingScreen) { LoadingScreen() LaunchedEffect(state.items) { when (val result = state.items.values.singleOrNull()) { MangaSearchItemResult.Loading -> return@LaunchedEffect is MangaSearchItemResult.Success -> { val manga = result.result.singleOrNull() if (manga != null) { navigator.replace(MangaScreen(manga.id, true)) } else { // Backoff to result screen showSingleLoadingScreen = false } } else -> showSingleLoadingScreen = false } } } else { GlobalMangaSearchScreen( state = state, navigateUp = navigator::pop, onChangeSearchQuery = screenModel::updateSearchQuery, onSearch = { screenModel.search() }, getManga = { screenModel.getManga(it) }, onChangeSearchFilter = screenModel::setSourceFilter, onToggleResults = screenModel::toggleFilterResults, onClickSource = { navigator.push(BrowseMangaSourceScreen(it.id, state.searchQuery)) }, onClickItem = { navigator.push(MangaScreen(it.id, true)) }, onLongClickItem = { navigator.push(MangaScreen(it.id, true)) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/globalsearch/GlobalMangaSearchScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch import eu.kanade.tachiyomi.source.CatalogueSource class GlobalMangaSearchScreenModel( initialQuery: String = "", initialExtensionFilter: String? = null, ) : MangaSearchScreenModel( State( searchQuery = initialQuery, ), ) { init { extensionFilter = initialExtensionFilter if (initialQuery.isNotBlank() || !initialExtensionFilter.isNullOrBlank()) { if (extensionFilter != null) { // we're going to use custom extension filter instead setSourceFilter(MangaSourceFilter.All) } search() } } override fun getEnabledSources(): List { return super.getEnabledSources() .filter { state.value.sourceFilter != MangaSourceFilter.PinnedOnly || "${it.id}" in pinnedSources } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/source/globalsearch/MangaSearchScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.produceState import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.entries.manga.model.toDomainManga import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.presentation.util.ioCoroutineScope import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.source.CatalogueSource import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toPersistentMap import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import tachiyomi.core.common.preference.toggle import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.interactor.NetworkToLocalManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.concurrent.Executors abstract class MangaSearchScreenModel( initialState: State = State(), sourcePreferences: SourcePreferences = Injekt.get(), private val sourceManager: MangaSourceManager = Injekt.get(), private val extensionManager: MangaExtensionManager = Injekt.get(), private val networkToLocalManga: NetworkToLocalManga = Injekt.get(), private val getManga: GetManga = Injekt.get(), private val preferences: SourcePreferences = Injekt.get(), ) : StateScreenModel(initialState) { private val coroutineDispatcher = Executors.newFixedThreadPool(5).asCoroutineDispatcher() private var searchJob: Job? = null private val enabledLanguages = sourcePreferences.enabledLanguages().get() private val disabledSources = sourcePreferences.disabledMangaSources().get() protected val pinnedSources = sourcePreferences.pinnedMangaSources().get() private var lastQuery: String? = null private var lastSourceFilter: MangaSourceFilter? = null protected var extensionFilter: String? = null private val sortComparator = { map: Map -> compareBy( { (map[it] as? MangaSearchItemResult.Success)?.isEmpty ?: true }, { "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" }, ) } init { screenModelScope.launch { preferences.globalSearchFilterState().changes().collectLatest { state -> mutableState.update { it.copy(onlyShowHasResults = state) } } } } @Composable fun getManga(initialManga: Manga): androidx.compose.runtime.State { return produceState(initialValue = initialManga) { getManga.subscribe(initialManga.url, initialManga.source) .filterNotNull() .collectLatest { manga -> value = manga } } } open fun getEnabledSources(): List { return sourceManager.getCatalogueSources() .filter { it.lang in enabledLanguages && "${it.id}" !in disabledSources } .sortedWith( compareBy( { "${it.id}" !in pinnedSources }, { "${it.name.lowercase()} (${it.lang})" }, ), ) } private fun getSelectedSources(): List { val enabledSources = getEnabledSources() val filter = extensionFilter if (filter.isNullOrEmpty()) { return enabledSources } return extensionManager.installedExtensionsFlow.value .filter { it.pkgName == filter } .flatMap { it.sources } .filterIsInstance() .filter { it in enabledSources } } fun updateSearchQuery(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun setSourceFilter(filter: MangaSourceFilter) { mutableState.update { it.copy(sourceFilter = filter) } search() } fun toggleFilterResults() { preferences.globalSearchFilterState().toggle() } fun search() { val query = state.value.searchQuery val sourceFilter = state.value.sourceFilter if (query.isNullOrBlank()) return val sameQuery = this.lastQuery == query if (sameQuery && this.lastSourceFilter == sourceFilter) return this.lastQuery = query this.lastSourceFilter = sourceFilter searchJob?.cancel() val sources = getSelectedSources() // Reuse previous results if possible if (sameQuery) { val existingResults = state.value.items updateItems( sources .associateWith { existingResults[it] ?: MangaSearchItemResult.Loading } .toPersistentMap(), ) } else { updateItems( sources .associateWith { MangaSearchItemResult.Loading } .toPersistentMap(), ) } searchJob = ioCoroutineScope.launch { sources.map { source -> async { if (state.value.items[source] !is MangaSearchItemResult.Loading) { return@async } try { val page = withContext(coroutineDispatcher) { source.getSearchManga(1, query, source.getFilterList()) } val titles = page.mangas.map { networkToLocalManga.await(it.toDomainManga(source.id)) } if (isActive) { updateItem(source, MangaSearchItemResult.Success(titles)) } } catch (e: Exception) { if (isActive) { updateItem(source, MangaSearchItemResult.Error(e)) } } } } .awaitAll() } } private fun updateItems(items: PersistentMap) { mutableState.update { it.copy( items = items .toSortedMap(sortComparator(items)) .toPersistentMap(), ) } } private fun updateItem(source: CatalogueSource, result: MangaSearchItemResult) { val newItems = state.value.items.mutate { it[source] = result } updateItems(newItems) } @Immutable data class State( val fromSourceId: Long? = null, val searchQuery: String? = null, val sourceFilter: MangaSourceFilter = MangaSourceFilter.PinnedOnly, val onlyShowHasResults: Boolean = false, val items: PersistentMap = persistentMapOf(), ) { val progress: Int = items.count { it.value !is MangaSearchItemResult.Loading } val total: Int = items.size val filteredItems = items.filter { (_, result) -> result.isVisible(onlyShowHasResults) } } } enum class MangaSourceFilter { All, PinnedOnly, } sealed interface MangaSearchItemResult { data object Loading : MangaSearchItemResult data class Error( val throwable: Throwable, ) : MangaSearchItemResult data class Success( val result: List, ) : MangaSearchItemResult { val isEmpty: Boolean get() = result.isEmpty() } fun isVisible(onlyShowHasResults: Boolean): Boolean { return !onlyShowHasResults || (this is Success && !this.isEmpty) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoriesTab.kt ================================================ package eu.kanade.tachiyomi.ui.category import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.presentation.components.TabbedScreen import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.category.anime.AnimeCategoryEvent import eu.kanade.tachiyomi.ui.category.anime.AnimeCategoryScreenModel import eu.kanade.tachiyomi.ui.category.anime.animeCategoryTab import eu.kanade.tachiyomi.ui.category.manga.MangaCategoryEvent import eu.kanade.tachiyomi.ui.category.manga.MangaCategoryScreenModel import eu.kanade.tachiyomi.ui.category.manga.mangaCategoryTab import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource data object CategoriesTab : Tab { override val options: TabOptions @Composable get() { val isSelected = LocalTabNavigator.current.current.key == key val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_updates_enter) return TabOptions( index = 7u, title = stringResource(AYMR.strings.general_categories), icon = rememberAnimatedVectorPainter(image, isSelected), ) } private val switchToMangaCategoryTabChannel = Channel(1, BufferOverflow.DROP_OLDEST) fun showMangaCategory() { switchToMangaCategoryTabChannel.trySend(Unit) } @Composable override fun Content() { val context = LocalContext.current val animeCategoryScreenModel = rememberScreenModel { AnimeCategoryScreenModel() } val mangaCategoryScreenModel = rememberScreenModel { MangaCategoryScreenModel() } val tabs = persistentListOf( animeCategoryTab(), mangaCategoryTab(), ) val state = rememberPagerState { tabs.size } TabbedScreen( titleRes = AYMR.strings.general_categories, tabs = tabs, state = state, ) LaunchedEffect(Unit) { switchToMangaCategoryTabChannel.receiveAsFlow() .collectLatest { state.scrollToPage(1) } } LaunchedEffect(Unit) { (context as? MainActivity)?.ready = true } LaunchedEffect(Unit) { mangaCategoryScreenModel.events.collectLatest { event -> if (event is MangaCategoryEvent.LocalizedMessage) { context.toast(event.stringRes) } } animeCategoryScreenModel.events.collectLatest { event -> if (event is AnimeCategoryEvent.LocalizedMessage) { context.toast(event.stringRes) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/category/anime/AnimeCategoryScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.category.anime import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.category.anime.interactor.CreateAnimeCategoryWithName import tachiyomi.domain.category.anime.interactor.DeleteAnimeCategory import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.anime.interactor.GetVisibleAnimeCategories import tachiyomi.domain.category.anime.interactor.HideAnimeCategory import tachiyomi.domain.category.anime.interactor.RenameAnimeCategory import tachiyomi.domain.category.anime.interactor.ReorderAnimeCategory import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeCategoryScreenModel( private val getAllCategories: GetAnimeCategories = Injekt.get(), private val getVisibleCategories: GetVisibleAnimeCategories = Injekt.get(), private val createCategoryWithName: CreateAnimeCategoryWithName = Injekt.get(), private val hideCategory: HideAnimeCategory = Injekt.get(), private val deleteCategory: DeleteAnimeCategory = Injekt.get(), private val reorderCategory: ReorderAnimeCategory = Injekt.get(), private val renameCategory: RenameAnimeCategory = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), ) : StateScreenModel(AnimeCategoryScreenState.Loading) { private val _events: Channel = Channel() val events = _events.receiveAsFlow() init { screenModelScope.launch { val allCategories = if (libraryPreferences.hideHiddenCategoriesSettings().get()) { getVisibleCategories.subscribe() } else { getAllCategories.subscribe() } allCategories.collectLatest { categories -> mutableState.update { AnimeCategoryScreenState.Success( categories = categories .filterNot(Category::isSystemCategory) .toImmutableList(), ) } } } } fun createCategory(name: String) { screenModelScope.launch { when (createCategoryWithName.await(name)) { is CreateAnimeCategoryWithName.Result.InternalError -> _events.send( AnimeCategoryEvent.InternalError, ) else -> {} } } } fun hideCategory(category: Category) { screenModelScope.launch { when (hideCategory.await(category)) { is HideAnimeCategory.Result.InternalError -> _events.send( AnimeCategoryEvent.InternalError, ) else -> {} } } } fun deleteCategory(categoryId: Long) { screenModelScope.launch { when (deleteCategory.await(categoryId = categoryId)) { is DeleteAnimeCategory.Result.InternalError -> _events.send( AnimeCategoryEvent.InternalError, ) else -> {} } } } fun changeOrder(category: Category, newIndex: Int) { screenModelScope.launch { when (reorderCategory.await(category, newIndex)) { is ReorderAnimeCategory.Result.InternalError -> _events.send( AnimeCategoryEvent.InternalError, ) else -> {} } } } fun renameCategory(category: Category, name: String) { screenModelScope.launch { when (renameCategory.await(category, name)) { is RenameAnimeCategory.Result.InternalError -> _events.send( AnimeCategoryEvent.InternalError, ) else -> {} } } } fun showDialog(dialog: AnimeCategoryDialog) { mutableState.update { when (it) { AnimeCategoryScreenState.Loading -> it is AnimeCategoryScreenState.Success -> it.copy(dialog = dialog) } } } fun dismissDialog() { mutableState.update { when (it) { AnimeCategoryScreenState.Loading -> it is AnimeCategoryScreenState.Success -> it.copy(dialog = null) } } } } sealed interface AnimeCategoryDialog { data object Create : AnimeCategoryDialog data class Rename(val category: Category) : AnimeCategoryDialog data class Delete(val category: Category) : AnimeCategoryDialog } sealed interface AnimeCategoryEvent { sealed class LocalizedMessage(val stringRes: StringResource) : AnimeCategoryEvent data object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed interface AnimeCategoryScreenState { @Immutable data object Loading : AnimeCategoryScreenState @Immutable data class Success( val categories: ImmutableList, val dialog: AnimeCategoryDialog? = null, ) : AnimeCategoryScreenState { val isEmpty: Boolean get() = categories.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/category/anime/AnimeCategoryTab.kt ================================================ package eu.kanade.tachiyomi.ui.category.anime import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.AnimeCategoryScreen import eu.kanade.presentation.category.components.CategoryCreateDialog import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.category.components.CategoryRenameDialog import eu.kanade.presentation.components.TabContent import kotlinx.collections.immutable.toImmutableList import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.screens.LoadingScreen @Composable fun Screen.animeCategoryTab(): TabContent { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { AnimeCategoryScreenModel() } val state by screenModel.state.collectAsState() return TabContent( titleRes = AYMR.strings.label_anime, searchEnabled = false, content = { contentPadding, _ -> if (state is AnimeCategoryScreenState.Loading) { LoadingScreen() } else { val successState = state as AnimeCategoryScreenState.Success AnimeCategoryScreen( state = successState, onClickCreate = { screenModel.showDialog(AnimeCategoryDialog.Create) }, onClickRename = { screenModel.showDialog(AnimeCategoryDialog.Rename(it)) }, onClickHide = screenModel::hideCategory, onClickDelete = { screenModel.showDialog(AnimeCategoryDialog.Delete(it)) }, onChangeOrder = screenModel::changeOrder, ) when (val dialog = successState.dialog) { null -> {} AnimeCategoryDialog.Create -> { CategoryCreateDialog( onDismissRequest = screenModel::dismissDialog, onCreate = screenModel::createCategory, categories = successState.categories.fastMap { it.name }.toImmutableList(), ) } is AnimeCategoryDialog.Rename -> { CategoryRenameDialog( onDismissRequest = screenModel::dismissDialog, onRename = { screenModel.renameCategory(dialog.category, it) }, categories = successState.categories.fastMap { it.name }.toImmutableList(), category = dialog.category.name, ) } is AnimeCategoryDialog.Delete -> { CategoryDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteCategory(dialog.category.id) }, category = dialog.category.name, ) } } } }, navigateUp = navigator::pop, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/category/manga/MangaCategoryScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.category.manga import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import dev.icerock.moko.resources.StringResource import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import tachiyomi.domain.category.manga.interactor.CreateMangaCategoryWithName import tachiyomi.domain.category.manga.interactor.DeleteMangaCategory import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.GetVisibleMangaCategories import tachiyomi.domain.category.manga.interactor.HideMangaCategory import tachiyomi.domain.category.manga.interactor.RenameMangaCategory import tachiyomi.domain.category.manga.interactor.ReorderMangaCategory import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaCategoryScreenModel( private val getAllCategories: GetMangaCategories = Injekt.get(), private val getVisibleCategories: GetVisibleMangaCategories = Injekt.get(), private val createCategoryWithName: CreateMangaCategoryWithName = Injekt.get(), private val hideCategory: HideMangaCategory = Injekt.get(), private val deleteCategory: DeleteMangaCategory = Injekt.get(), private val reorderCategory: ReorderMangaCategory = Injekt.get(), private val renameCategory: RenameMangaCategory = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), ) : StateScreenModel(MangaCategoryScreenState.Loading) { private val _events: Channel = Channel() val events = _events.receiveAsFlow() init { screenModelScope.launch { val allCategories = if (libraryPreferences.hideHiddenCategoriesSettings().get()) { getVisibleCategories.subscribe() } else { getAllCategories.subscribe() } allCategories.collectLatest { categories -> mutableState.update { MangaCategoryScreenState.Success( categories = categories .filterNot(Category::isSystemCategory) .toImmutableList(), ) } } } } fun createCategory(name: String) { screenModelScope.launch { when (createCategoryWithName.await(name)) { is CreateMangaCategoryWithName.Result.InternalError -> _events.send( MangaCategoryEvent.InternalError, ) else -> {} } } } fun hideCategory(category: Category) { screenModelScope.launch { when (hideCategory.await(category)) { is HideMangaCategory.Result.InternalError -> _events.send( MangaCategoryEvent.InternalError, ) else -> {} } } } fun deleteCategory(categoryId: Long) { screenModelScope.launch { when (deleteCategory.await(categoryId = categoryId)) { is DeleteMangaCategory.Result.InternalError -> _events.send( MangaCategoryEvent.InternalError, ) else -> {} } } } fun changeOrder(category: Category, newIndex: Int) { screenModelScope.launch { when (reorderCategory.await(category, newIndex)) { is ReorderMangaCategory.Result.InternalError -> _events.send( MangaCategoryEvent.InternalError, ) else -> {} } } } fun renameCategory(category: Category, name: String) { screenModelScope.launch { when (renameCategory.await(category, name)) { is RenameMangaCategory.Result.InternalError -> _events.send( MangaCategoryEvent.InternalError, ) else -> {} } } } fun showDialog(dialog: MangaCategoryDialog) { mutableState.update { when (it) { MangaCategoryScreenState.Loading -> it is MangaCategoryScreenState.Success -> it.copy(dialog = dialog) } } } fun dismissDialog() { mutableState.update { when (it) { MangaCategoryScreenState.Loading -> it is MangaCategoryScreenState.Success -> it.copy(dialog = null) } } } } sealed interface MangaCategoryDialog { data object Create : MangaCategoryDialog data class Rename(val category: Category) : MangaCategoryDialog data class Delete(val category: Category) : MangaCategoryDialog } sealed interface MangaCategoryEvent { sealed class LocalizedMessage(val stringRes: StringResource) : MangaCategoryEvent data object InternalError : LocalizedMessage(MR.strings.internal_error) } sealed interface MangaCategoryScreenState { @Immutable data object Loading : MangaCategoryScreenState @Immutable data class Success( val categories: ImmutableList, val dialog: MangaCategoryDialog? = null, ) : MangaCategoryScreenState { val isEmpty: Boolean get() = categories.isEmpty() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/category/manga/MangaCategoryTab.kt ================================================ package eu.kanade.tachiyomi.ui.category.manga import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.util.fastMap import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.MangaCategoryScreen import eu.kanade.presentation.category.components.CategoryCreateDialog import eu.kanade.presentation.category.components.CategoryDeleteDialog import eu.kanade.presentation.category.components.CategoryRenameDialog import eu.kanade.presentation.components.TabContent import kotlinx.collections.immutable.toImmutableList import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.screens.LoadingScreen @Composable fun Screen.mangaCategoryTab(): TabContent { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MangaCategoryScreenModel() } val state by screenModel.state.collectAsState() return TabContent( titleRes = AYMR.strings.label_manga, searchEnabled = false, content = { contentPadding, _ -> if (state is MangaCategoryScreenState.Loading) { LoadingScreen() } else { val successState = state as MangaCategoryScreenState.Success MangaCategoryScreen( state = successState, onClickCreate = { screenModel.showDialog(MangaCategoryDialog.Create) }, onClickRename = { screenModel.showDialog(MangaCategoryDialog.Rename(it)) }, onClickHide = screenModel::hideCategory, onClickDelete = { screenModel.showDialog(MangaCategoryDialog.Delete(it)) }, onChangeOrder = screenModel::changeOrder, ) when (val dialog = successState.dialog) { null -> {} MangaCategoryDialog.Create -> { CategoryCreateDialog( onDismissRequest = screenModel::dismissDialog, onCreate = screenModel::createCategory, categories = successState.categories.fastMap { it.name }.toImmutableList(), ) } is MangaCategoryDialog.Rename -> { CategoryRenameDialog( onDismissRequest = screenModel::dismissDialog, onRename = { screenModel.renameCategory(dialog.category, it) }, categories = successState.categories.fastMap { it.name }.toImmutableList(), category = dialog.category.name, ) } is MangaCategoryDialog.Delete -> { CategoryDeleteDialog( onDismissRequest = screenModel::dismissDialog, onDelete = { screenModel.deleteCategory(dialog.category.id) }, category = dialog.category.name, ) } } } }, navigateUp = navigator::pop, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/DeepLinkScreenType.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink enum class DeepLinkScreenType { ANIME, MANGA, } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/anime/DeepLinkAnimeActivity.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink.anime import android.app.Activity import android.content.Intent import android.os.Bundle import eu.kanade.tachiyomi.ui.deeplink.DeepLinkScreenType import eu.kanade.tachiyomi.ui.main.MainActivity class DeepLinkAnimeActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) intent.apply { flags = flags or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK putExtra(MainActivity.INTENT_SEARCH_TYPE, DeepLinkScreenType.ANIME.toString()) setClass(applicationContext, MainActivity::class.java) } startActivity(intent) finish() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/anime/DeepLinkAnimeScreen.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink.anime import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearchScreen import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.player.PlayerActivity import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class DeepLinkAnimeScreen( val query: String = "", ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { DeepLinkAnimeScreenModel(query = query) } val state by screenModel.state.collectAsState() Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.action_search_hint), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> when (state) { is DeepLinkAnimeScreenModel.State.Loading -> { LoadingScreen(Modifier.padding(contentPadding)) } is DeepLinkAnimeScreenModel.State.NoResults -> { navigator.replace(GlobalAnimeSearchScreen(query)) } is DeepLinkAnimeScreenModel.State.Result -> { val resultState = state as DeepLinkAnimeScreenModel.State.Result if (resultState.episodeId == null) { navigator.replace( AnimeScreen( resultState.anime.id, true, ), ) } else { navigator.pop() PlayerActivity.newIntent( context, resultState.anime.id, resultState.episodeId, ).also(context::startActivity) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/anime/DeepLinkAnimeScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink.anime import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.entries.anime.model.toDomainAnime import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.domain.items.episode.interactor.SyncEpisodesWithSource import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode import eu.kanade.tachiyomi.animesource.online.ResolvableAnimeSource import eu.kanade.tachiyomi.animesource.online.UriType import kotlinx.coroutines.flow.update import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.entries.anime.interactor.GetAnimeByUrlAndSourceId import tachiyomi.domain.entries.anime.interactor.NetworkToLocalAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.interactor.GetEpisodeByUrlAndAnimeId import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class DeepLinkAnimeScreenModel( query: String = "", private val sourceManager: AnimeSourceManager = Injekt.get(), private val networkToLocalAnime: NetworkToLocalAnime = Injekt.get(), private val getEpisodeByUrlAndAnimeId: GetEpisodeByUrlAndAnimeId = Injekt.get(), private val getAnimeByUrlAndSourceId: GetAnimeByUrlAndSourceId = Injekt.get(), private val syncEpisodesWithSource: SyncEpisodesWithSource = Injekt.get(), ) : StateScreenModel(State.Loading) { init { screenModelScope.launchIO { val source = sourceManager.getCatalogueSources() .filterIsInstance() .firstOrNull { it.getUriType(query) != UriType.Unknown } val anime = source?.getAnime(query)?.let { getAnimeFromSAnime(it, source.id) } val episode = if (source?.getUriType(query) == UriType.Episode && anime != null) { source.getEpisode(query)?.let { getEpisodeFromSEpisode(it, anime, source) } } else { null } mutableState.update { if (anime == null) { State.NoResults } else { if (episode == null) { State.Result(anime) } else { State.Result(anime, episode.id) } } } } } private suspend fun getEpisodeFromSEpisode(sEpisode: SEpisode, anime: Anime, source: AnimeSource): Episode? { val localEpisode = getEpisodeByUrlAndAnimeId.await(sEpisode.url, anime.id) return if (localEpisode == null) { val sourceEpisodes = source.getEpisodeList(anime.toSAnime()) val newEpisodes = syncEpisodesWithSource.await(sourceEpisodes, anime, source, false) newEpisodes.find { it.url == sEpisode.url } } else { localEpisode } } private suspend fun getAnimeFromSAnime(sAnime: SAnime, sourceId: Long): Anime { return getAnimeByUrlAndSourceId.await(sAnime.url, sourceId) ?: networkToLocalAnime.await(sAnime.toDomainAnime(sourceId)) } sealed interface State { @Immutable data object Loading : State @Immutable data object NoResults : State @Immutable data class Result(val anime: Anime, val episodeId: Long? = null) : State } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/manga/DeepLinkMangaActivity.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink.manga import android.app.Activity import android.content.Intent import android.os.Bundle import eu.kanade.tachiyomi.ui.deeplink.DeepLinkScreenType import eu.kanade.tachiyomi.ui.main.MainActivity class DeepLinkMangaActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) intent.apply { flags = flags or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK putExtra(MainActivity.INTENT_SEARCH_TYPE, DeepLinkScreenType.MANGA.toString()) setClass(applicationContext, MainActivity::class.java) } startActivity(intent) finish() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/manga/DeepLinkMangaScreen.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink.manga import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.reader.ReaderActivity import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class DeepLinkMangaScreen( val query: String = "", ) : Screen() { @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { DeepLinkMangaScreenModel(query = query) } val state by screenModel.state.collectAsState() Scaffold( topBar = { scrollBehavior -> AppBar( title = stringResource(MR.strings.action_search_hint), navigateUp = navigator::pop, scrollBehavior = scrollBehavior, ) }, ) { contentPadding -> when (state) { is DeepLinkMangaScreenModel.State.Loading -> { LoadingScreen(Modifier.padding(contentPadding)) } is DeepLinkMangaScreenModel.State.NoResults -> { navigator.replace(GlobalMangaSearchScreen(query)) } is DeepLinkMangaScreenModel.State.Result -> { val resultState = state as DeepLinkMangaScreenModel.State.Result if (resultState.chapterId == null) { navigator.replace( MangaScreen( resultState.manga.id, true, ), ) } else { navigator.pop() ReaderActivity.newIntent( context, resultState.manga.id, resultState.chapterId, ).also(context::startActivity) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/manga/DeepLinkMangaScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.deeplink.manga import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.entries.manga.model.toDomainManga import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.domain.items.chapter.interactor.SyncChaptersWithSource import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ResolvableSource import eu.kanade.tachiyomi.source.online.UriType import kotlinx.coroutines.flow.update import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.entries.manga.interactor.GetMangaByUrlAndSourceId import tachiyomi.domain.entries.manga.interactor.NetworkToLocalManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.interactor.GetChapterByUrlAndMangaId import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class DeepLinkMangaScreenModel( query: String = "", private val sourceManager: MangaSourceManager = Injekt.get(), private val networkToLocalManga: NetworkToLocalManga = Injekt.get(), private val getChapterByUrlAndMangaId: GetChapterByUrlAndMangaId = Injekt.get(), private val getMangaByUrlAndSourceId: GetMangaByUrlAndSourceId = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), ) : StateScreenModel(State.Loading) { init { screenModelScope.launchIO { val source = sourceManager.getCatalogueSources() .filterIsInstance() .firstOrNull { it.getUriType(query) != UriType.Unknown } val manga = source?.getManga(query)?.let { getMangaFromSManga(it, source.id) } val chapter = if (source?.getUriType(query) == UriType.Chapter && manga != null) { source.getChapter(query)?.let { getChapterFromSChapter(it, manga, source) } } else { null } mutableState.update { if (manga == null) { State.NoResults } else { if (chapter == null) { State.Result(manga) } else { State.Result(manga, chapter.id) } } } } } private suspend fun getChapterFromSChapter(sChapter: SChapter, manga: Manga, source: MangaSource): Chapter? { val localChapter = getChapterByUrlAndMangaId.await(sChapter.url, manga.id) return if (localChapter == null) { val sourceChapters = source.getChapterList(manga.toSManga()) val newChapters = syncChaptersWithSource.await(sourceChapters, manga, source, false) newChapters.find { it.url == sChapter.url } } else { localChapter } } private suspend fun getMangaFromSManga(sManga: SManga, sourceId: Long): Manga { return getMangaByUrlAndSourceId.await(sManga.url, sourceId) ?: networkToLocalManga.await(sManga.toDomainManga(sourceId)) } sealed interface State { @Immutable data object Loading : State @Immutable data object NoResults : State @Immutable data class Result(val manga: Manga, val chapterId: Long? = null) : State } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadsTab.kt ================================================ package eu.kanade.tachiyomi.ui.download import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Sort import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.outlined.Pause import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Tab import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.zIndex import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.NestedMenuItem import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.download.anime.AnimeDownloadHeaderItem import eu.kanade.tachiyomi.ui.download.anime.AnimeDownloadQueueScreenModel import eu.kanade.tachiyomi.ui.download.anime.animeDownloadTab import eu.kanade.tachiyomi.ui.download.manga.MangaDownloadHeaderItem import eu.kanade.tachiyomi.ui.download.manga.MangaDownloadQueueScreenModel import eu.kanade.tachiyomi.ui.download.manga.mangaDownloadTab import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.Pill import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.components.material.TabText import tachiyomi.presentation.core.i18n.stringResource data object DownloadsTab : Tab { override val options: TabOptions @Composable get() { val isSelected = LocalTabNavigator.current.current.key == key val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_history_enter) return TabOptions( index = 6u, title = stringResource(MR.strings.label_download_queue), icon = rememberAnimatedVectorPainter(image, isSelected), ) } @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val animeScreenModel = rememberScreenModel { AnimeDownloadQueueScreenModel() } val mangaScreenModel = rememberScreenModel { MangaDownloadQueueScreenModel() } val animeDownloadList by animeScreenModel.state.collectAsState() val mangaDownloadList by mangaScreenModel.state.collectAsState() val animeDownloadCount by remember { derivedStateOf { animeDownloadList.sumOf { it.subItems.size } } } val mangaDownloadCount by remember { derivedStateOf { mangaDownloadList.sumOf { it.subItems.size } } } val state = rememberPagerState { 2 } val snackbarHostState = remember { SnackbarHostState() } val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) var fabExpanded by remember { mutableStateOf(true) } val nestedScrollConnection = remember { // All this lines just for fab state :/ object : NestedScrollConnection { override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { fabExpanded = available.y >= 0 return scrollBehavior.nestedScrollConnection.onPreScroll(available, source) } override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset { return scrollBehavior.nestedScrollConnection.onPostScroll(consumed, available, source) } override suspend fun onPreFling(available: Velocity): Velocity { return scrollBehavior.nestedScrollConnection.onPreFling(available) } override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { return scrollBehavior.nestedScrollConnection.onPostFling(consumed, available) } } } Scaffold( topBar = { AppBar( titleContent = { Row(verticalAlignment = Alignment.CenterVertically) { Text( text = stringResource(MR.strings.label_download_queue), maxLines = 1, modifier = Modifier.weight(1f, false), overflow = TextOverflow.Ellipsis, ) if (animeDownloadCount > 0) { val pillAlpha = if (isSystemInDarkTheme()) 0.12f else 0.08f Pill( text = "$animeDownloadCount", modifier = Modifier.padding(start = 4.dp), color = MaterialTheme.colorScheme.onBackground .copy(alpha = pillAlpha), fontSize = 14.sp, ) } } }, navigateUp = navigator::pop, actions = { when (state.currentPage) { 0 -> AnimeActions(animeScreenModel, animeDownloadList) 1 -> MangaActions(mangaScreenModel, mangaDownloadList) } }, scrollBehavior = scrollBehavior, ) }, floatingActionButton = { AnimatedVisibility( visible = when (state.currentPage) { 0 -> animeDownloadList.isNotEmpty() 1 -> mangaDownloadList.isNotEmpty() else -> false }, enter = fadeIn(), exit = fadeOut(), ) { val animeIsRunning by animeScreenModel.isDownloaderRunning.collectAsState() val mangaIsRunning by mangaScreenModel.isDownloaderRunning.collectAsState() ExtendedFloatingActionButton( text = { val id = when (state.currentPage) { 0 -> if (animeIsRunning) { AYMR.strings.action_stop } else { AYMR.strings.action_continue } 1 -> if (mangaIsRunning) { MR.strings.action_pause } else { MR.strings.action_resume } else -> MR.strings.action_pause } Text(text = stringResource(id)) }, icon = { val icon = when (state.currentPage) { 0 -> if (animeIsRunning) { Icons.Outlined.Pause } else { Icons.Filled.PlayArrow } 1 -> if (mangaIsRunning) { Icons.Outlined.Pause } else { Icons.Filled.PlayArrow } else -> Icons.Filled.PlayArrow } Icon(imageVector = icon, contentDescription = null) }, onClick = { when (state.currentPage) { 0 -> if (animeIsRunning) { animeScreenModel.pauseDownloads() } else { animeScreenModel.startDownloads() } 1 -> if (mangaIsRunning) { mangaScreenModel.pauseDownloads() } else { mangaScreenModel.startDownloads() } } }, expanded = fabExpanded, ) } }, ) { contentPadding -> Column( modifier = Modifier.padding( top = contentPadding.calculateTopPadding(), start = contentPadding.calculateStartPadding(LocalLayoutDirection.current), end = contentPadding.calculateEndPadding(LocalLayoutDirection.current), ), ) { PrimaryTabRow( selectedTabIndex = state.currentPage, modifier = Modifier.zIndex(1f), ) { listOf( Tab( selected = state.currentPage == 0, onClick = { scope.launch { state.animateScrollToPage(0) } }, text = { TabText( text = stringResource(AYMR.strings.label_anime), badgeCount = animeDownloadCount, ) }, unselectedContentColor = MaterialTheme.colorScheme.onSurface, ), Tab( selected = state.currentPage == 1, onClick = { scope.launch { state.animateScrollToPage(1) } }, text = { TabText( text = stringResource(AYMR.strings.manga), badgeCount = mangaDownloadCount, ) }, unselectedContentColor = MaterialTheme.colorScheme.onSurface, ), ) } HorizontalPager( modifier = Modifier.fillMaxSize(), state = state, verticalAlignment = Alignment.Top, pageNestedScrollConnection = nestedScrollConnection, ) { page -> when (page) { 0 -> animeDownloadTab( nestedScrollConnection, ).content( PaddingValues(bottom = contentPadding.calculateBottomPadding()), snackbarHostState, ) 1 -> mangaDownloadTab( nestedScrollConnection, ).content( PaddingValues(bottom = contentPadding.calculateBottomPadding()), snackbarHostState, ) } } } } } @Composable private fun AnimeActions( animeScreenModel: AnimeDownloadQueueScreenModel, animeDownloadList: List, ) { if (animeDownloadList.isNotEmpty()) { var sortExpanded by remember { mutableStateOf(false) } val onDismissRequest = { sortExpanded = false } DropdownMenu( expanded = sortExpanded, onDismissRequest = onDismissRequest, ) { NestedMenuItem( text = { Text(text = stringResource(MR.strings.action_order_by_upload_date)) }, children = { closeMenu -> DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_newest)) }, onClick = { animeScreenModel.reorderQueue( { it.download.episode.dateUpload }, true, ) closeMenu() }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_oldest)) }, onClick = { animeScreenModel.reorderQueue( { it.download.episode.dateUpload }, false, ) closeMenu() }, ) }, ) NestedMenuItem( text = { Text( text = stringResource(AYMR.strings.action_order_by_episode_number), ) }, children = { closeMenu -> DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_asc)) }, onClick = { animeScreenModel.reorderQueue( { it.download.episode.episodeNumber }, false, ) closeMenu() }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_desc)) }, onClick = { animeScreenModel.reorderQueue( { it.download.episode.episodeNumber }, true, ) closeMenu() }, ) }, ) } AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_sort), icon = Icons.AutoMirrored.Outlined.Sort, onClick = { sortExpanded = true }, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_cancel_all), onClick = { animeScreenModel.clearQueue() }, ), ), ) } } @Composable private fun MangaActions( mangaScreenModel: MangaDownloadQueueScreenModel, mangaDownloadList: List, ) { if (mangaDownloadList.isNotEmpty()) { var sortExpanded by remember { mutableStateOf(false) } val onDismissRequest = { sortExpanded = false } DropdownMenu( expanded = sortExpanded, onDismissRequest = onDismissRequest, ) { NestedMenuItem( text = { Text(text = stringResource(MR.strings.action_order_by_upload_date)) }, children = { closeMenu -> DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_newest)) }, onClick = { mangaScreenModel.reorderQueue( { it.download.chapter.dateUpload }, true, ) closeMenu() }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_oldest)) }, onClick = { mangaScreenModel.reorderQueue( { it.download.chapter.dateUpload }, false, ) closeMenu() }, ) }, ) NestedMenuItem( text = { Text( text = stringResource(MR.strings.action_order_by_chapter_number), ) }, children = { closeMenu -> DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_asc)) }, onClick = { mangaScreenModel.reorderQueue( { it.download.chapter.chapterNumber }, false, ) closeMenu() }, ) DropdownMenuItem( text = { Text(text = stringResource(MR.strings.action_desc)) }, onClick = { mangaScreenModel.reorderQueue( { it.download.chapter.chapterNumber }, true, ) closeMenu() }, ) }, ) } AppBarActions( persistentListOf( AppBar.Action( title = stringResource(MR.strings.action_sort), icon = Icons.AutoMirrored.Outlined.Sort, onClick = { sortExpanded = true }, ), AppBar.OverflowAction( title = stringResource(MR.strings.action_cancel_all), onClick = { mangaScreenModel.clearQueue() }, ), ), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadAdapter.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.view.MenuItem import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem /** * Adapter storing a list of downloads. * * @param downloadItemListener Listener called when an item of the list is released. */ class AnimeDownloadAdapter(val downloadItemListener: DownloadItemListener) : FlexibleAdapter>( null, downloadItemListener, true, ) { override fun shouldMove(fromPosition: Int, toPosition: Int): Boolean { // Don't let sub-items changing group return getHeaderOf(getItem(fromPosition)) == getHeaderOf(getItem(toPosition)) } interface DownloadItemListener { fun onItemReleased(position: Int) fun onMenuItemClick(position: Int, menuItem: MenuItem) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadHeaderHolder.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.annotation.SuppressLint import android.view.View import androidx.recyclerview.widget.ItemTouchHelper import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.viewholders.ExpandableViewHolder import eu.kanade.tachiyomi.databinding.DownloadHeaderBinding class AnimeDownloadHeaderHolder(view: View, adapter: FlexibleAdapter<*>) : ExpandableViewHolder( view, adapter, ) { private val binding = DownloadHeaderBinding.bind(view) @SuppressLint("SetTextI18n") fun bind(item: AnimeDownloadHeaderItem) { setDragHandleView(binding.reorder) binding.title.text = "${item.name} (${item.size})" } override fun onActionStateChanged(position: Int, actionState: Int) { super.onActionStateChanged(position, actionState) if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { binding.container.isDragged = true mAdapter.collapseAll() } } override fun onItemReleased(position: Int) { super.onItemReleased(position) binding.container.isDragged = false mAdapter.expandAll() (mAdapter as AnimeDownloadAdapter).downloadItemListener.onItemReleased(position) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadHeaderItem.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.view.View import androidx.recyclerview.widget.RecyclerView import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R data class AnimeDownloadHeaderItem( val id: Long, val name: String, val size: Int, ) : AbstractExpandableHeaderItem() { override fun getLayoutRes(): Int { return R.layout.download_header } override fun createViewHolder( view: View, adapter: FlexibleAdapter>, ): AnimeDownloadHeaderHolder { return AnimeDownloadHeaderHolder(view, adapter) } override fun bindViewHolder( adapter: FlexibleAdapter>, holder: AnimeDownloadHeaderHolder, position: Int, payloads: List?, ) { holder.bind(this) } override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as AnimeDownloadHeaderItem if (id != other.id) return false if (name != other.name) return false if (size != other.size) return false if (subItemsCount != other.subItemsCount) return false if (subItems !== other.subItems) return false return true } override fun hashCode(): Int { var result = id.hashCode() result = 31 * result + name.hashCode() result = 31 * result + size result = 31 * result + subItems.hashCode() return result } init { isHidden = false isExpanded = true isSelectable = false } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadHolder.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.view.View import androidx.recyclerview.widget.ItemTouchHelper import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.databinding.DownloadItemBinding import eu.kanade.tachiyomi.util.view.popupMenu import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR /** * Class used to hold the data of a download. * All the elements from the layout file "download_item" are available in this class. * * @param view the inflated view for this holder. * @constructor creates a new download holder. */ class AnimeDownloadHolder(private val view: View, val adapter: AnimeDownloadAdapter) : FlexibleViewHolder(view, adapter) { private val binding = DownloadItemBinding.bind(view) init { setDragHandleView(binding.reorder) binding.menu.setOnClickListener { it.post { showPopupMenu(it) } } } private lateinit var download: AnimeDownload /** * Binds this holder with the given category. * * @param download the download to bind. */ fun bind(download: AnimeDownload) { this.download = download // Update the chapter name. binding.chapterTitle.text = download.episode.name // Update the manga title binding.mangaFullTitle.text = download.anime.title // Update the progress bar and the number of downloaded pages val video = download.video if (video == null) { binding.downloadProgress.progress = 0 binding.downloadProgress.max = 1 binding.downloadProgressText.text = "" } else { binding.downloadProgress.max = 100 notifyProgress() notifyDownloadedPages() } } /** * Updates the progress bar of the download. */ fun notifyProgress() { if (binding.downloadProgress.max == 1) { binding.downloadProgress.max = 100 } if (download.progress == 0) { binding.downloadProgress.isIndeterminate = true } else { binding.downloadProgress.isIndeterminate = false binding.downloadProgress.setProgressCompat(download.progress, true) } } /** * Updates the text field of the number of downloaded pages. */ fun notifyDownloadedPages() { binding.downloadProgressText.text = if (download.progress == 0) { view.context.stringResource(MR.strings.update_check_notification_download_in_progress) } else { view.context.stringResource(AYMR.strings.episode_download_progress, download.progress) } } override fun onItemReleased(position: Int) { super.onItemReleased(position) adapter.downloadItemListener.onItemReleased(position) binding.container.isDragged = false } override fun onActionStateChanged(position: Int, actionState: Int) { super.onActionStateChanged(position, actionState) if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { binding.container.isDragged = true } } private fun showPopupMenu(view: View) { view.popupMenu( menuRes = R.menu.download_single, initMenu = { findItem(R.id.move_to_top).isVisible = bindingAdapterPosition > 1 findItem(R.id.move_to_bottom).isVisible = bindingAdapterPosition != adapter.itemCount - 1 }, onMenuItemClick = { adapter.downloadItemListener.onMenuItemClick(bindingAdapterPosition, this) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadItem.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.view.View import androidx.recyclerview.widget.RecyclerView import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractSectionableItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload class AnimeDownloadItem( val download: AnimeDownload, header: AnimeDownloadHeaderItem, ) : AbstractSectionableItem(header) { override fun getLayoutRes(): Int { return R.layout.download_item } /** * Returns a new view holder for this item. * * @param view The view of this item. * @param adapter The adapter of this item. */ override fun createViewHolder( view: View, adapter: FlexibleAdapter>, ): AnimeDownloadHolder { return AnimeDownloadHolder(view, adapter as AnimeDownloadAdapter) } /** * Binds the given view holder with this item. * * @param adapter The adapter of this item. * @param holder The holder to bind. * @param position The position of this item in the adapter. * @param payloads List of partial changes. */ override fun bindViewHolder( adapter: FlexibleAdapter>, holder: AnimeDownloadHolder, position: Int, payloads: MutableList, ) { holder.bind(download) } /** * Returns true if this item is draggable. */ override fun isDraggable(): Boolean { return true } override fun equals(other: Any?): Boolean { if (this === other) return true if (other is AnimeDownloadItem) { return download.episode.id == other.download.episode.id } return false } override fun hashCode(): Int { return download.episode.id.toInt() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadQueueScreen.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.view.LayoutInflater import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.viewinterop.AndroidView import androidx.core.view.ViewCompat import androidx.core.view.updatePadding import androidx.recyclerview.widget.LinearLayoutManager import eu.kanade.tachiyomi.databinding.DownloadListBinding import kotlinx.coroutines.CoroutineScope import tachiyomi.core.common.util.lang.launchUI import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen import kotlin.math.roundToInt @Composable fun AnimeDownloadQueueScreen( contentPadding: PaddingValues, scope: CoroutineScope, screenModel: AnimeDownloadQueueScreenModel, downloadList: List, nestedScrollConnection: NestedScrollConnection, ) { Scaffold { if (downloadList.isEmpty()) { EmptyScreen( stringRes = MR.strings.information_no_downloads, modifier = Modifier.padding(contentPadding), ) return@Scaffold } val density = LocalDensity.current val layoutDirection = LocalLayoutDirection.current val left = with(density) { contentPadding.calculateLeftPadding(layoutDirection).toPx().roundToInt() } val top = with(density) { contentPadding.calculateTopPadding().toPx().roundToInt() } val right = with(density) { contentPadding.calculateRightPadding(layoutDirection).toPx().roundToInt() } val bottom = with(density) { contentPadding.calculateBottomPadding().toPx().roundToInt() } Box(modifier = Modifier.nestedScroll(nestedScrollConnection)) { AndroidView( modifier = Modifier.fillMaxWidth(), factory = { context -> screenModel.controllerBinding = DownloadListBinding.inflate( LayoutInflater.from(context), ) screenModel.adapter = AnimeDownloadAdapter(screenModel.listener) screenModel.controllerBinding.root.adapter = screenModel.adapter screenModel.adapter?.isHandleDragEnabled = true screenModel.controllerBinding.root.layoutManager = LinearLayoutManager( context, ) ViewCompat.setNestedScrollingEnabled(screenModel.controllerBinding.root, true) scope.launchUI { screenModel.getDownloadStatusFlow() .collect(screenModel::onStatusChange) } scope.launchUI { screenModel.getDownloadProgressFlow() .collect(screenModel::onUpdateDownloadedPages) } screenModel.controllerBinding.root }, update = { screenModel.controllerBinding.root .updatePadding( left = left, top = top, right = right, bottom = bottom, ) screenModel.adapter?.updateDataSet(downloadList) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadQueueScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import android.view.MenuItem import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.databinding.DownloadListBinding import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeDownloadQueueScreenModel( private val downloadManager: AnimeDownloadManager = Injekt.get(), ) : ScreenModel { private val _state = MutableStateFlow(emptyList()) val state = _state.asStateFlow() lateinit var controllerBinding: DownloadListBinding /** * Adapter containing the active downloads. */ var adapter: AnimeDownloadAdapter? = null /** * Map of jobs for active downloads. */ private val progressJobs = mutableMapOf() val listener = object : AnimeDownloadAdapter.DownloadItemListener { /** * Called when an item is released from a drag. * * @param position The position of the released item. */ override fun onItemReleased(position: Int) { val adapter = adapter ?: return val downloads = adapter.headerItems.flatMap { header -> adapter.getSectionItems(header).map { item -> (item as AnimeDownloadItem).download } } reorder(downloads) } /** * Called when the menu item of a download is pressed * * @param position The position of the item * @param menuItem The menu Item pressed */ override fun onMenuItemClick(position: Int, menuItem: MenuItem) { val item = adapter?.getItem(position) ?: return if (item is AnimeDownloadItem) { when (menuItem.itemId) { R.id.move_to_top, R.id.move_to_bottom -> { val headerItems = adapter?.headerItems ?: return val newAnimeDownloads = mutableListOf() headerItems.forEach { headerItem -> headerItem as AnimeDownloadHeaderItem if (headerItem == item.header) { headerItem.removeSubItem(item) if (menuItem.itemId == R.id.move_to_top) { headerItem.addSubItem(0, item) } else { headerItem.addSubItem(item) } } newAnimeDownloads.addAll(headerItem.subItems.map { it.download }) } reorder(newAnimeDownloads) } R.id.move_to_top_series, R.id.move_to_bottom_series -> { val (selectedSeries, otherSeries) = adapter?.currentItems ?.filterIsInstance() ?.map(AnimeDownloadItem::download) ?.partition { item.download.anime.id == it.anime.id } ?: Pair(emptyList(), emptyList()) if (menuItem.itemId == R.id.move_to_top_series) { reorder(selectedSeries + otherSeries) } else { reorder(otherSeries + selectedSeries) } } R.id.cancel_download -> { cancel(listOf(item.download)) } R.id.cancel_series -> { val allAnimeDownloadsForSeries = adapter?.currentItems ?.filterIsInstance() ?.filter { item.download.anime.id == it.download.anime.id } ?.map(AnimeDownloadItem::download) if (!allAnimeDownloadsForSeries.isNullOrEmpty()) { cancel(allAnimeDownloadsForSeries) } } } } } } init { screenModelScope.launch { downloadManager.queueState .map { downloads -> downloads .groupBy { it.source } .map { entry -> AnimeDownloadHeaderItem(entry.key.id, entry.key.name, entry.value.size).apply { addSubItems(0, entry.value.map { AnimeDownloadItem(it, this) }) } } } .collect { newList -> _state.update { newList } } } } override fun onDispose() { for (job in progressJobs.values) { job.cancel() } progressJobs.clear() adapter = null } val isDownloaderRunning = downloadManager.isDownloaderRunning .stateIn(screenModelScope, SharingStarted.WhileSubscribed(5000), false) fun getDownloadStatusFlow() = downloadManager.statusFlow() fun getDownloadProgressFlow() = downloadManager.progressFlow() fun startDownloads() { downloadManager.startDownloads() } fun pauseDownloads() { downloadManager.pauseDownloads() } fun clearQueue() { downloadManager.clearQueue() } fun reorder(downloads: List) { downloadManager.reorderQueue(downloads) } fun cancel(downloads: List) { downloadManager.cancelQueuedDownloads(downloads) } fun > reorderQueue( selector: (AnimeDownloadItem) -> R, reverse: Boolean = false, ) { val adapter = adapter ?: return val newAnimeDownloads = mutableListOf() adapter.headerItems.forEach { headerItem -> headerItem as AnimeDownloadHeaderItem headerItem.subItems = headerItem.subItems.sortedBy(selector).toMutableList().apply { if (reverse) { reverse() } } newAnimeDownloads.addAll(headerItem.subItems.map { it.download }) } reorder(newAnimeDownloads) } /** * Called when the status of a download changes. * * @param download the download whose status has changed. */ fun onStatusChange(download: AnimeDownload) { when (download.status) { AnimeDownload.State.DOWNLOADING -> { // Initial update of the downloaded pages onUpdateProgress(download) onUpdateDownloadedPages(download) } AnimeDownload.State.DOWNLOADED -> { cancelProgressJob(download) onUpdateProgress(download) onUpdateDownloadedPages(download) } AnimeDownload.State.ERROR -> cancelProgressJob(download) else -> { /* unused */ } } } /** * Unsubscribes the given download from the progress subscriptions. * * @param download the download to unsubscribe. */ private fun cancelProgressJob(download: AnimeDownload) { progressJobs.remove(download)?.cancel() } /** * Called when the progress of a download changes. * * @param download the download whose progress has changed. */ private fun onUpdateProgress(download: AnimeDownload) { getHolder(download)?.notifyProgress() getHolder(download)?.notifyDownloadedPages() } /** * Called when a page of a download is downloaded. * * @param download the download whose page has been downloaded. */ fun onUpdateDownloadedPages(download: AnimeDownload) { getHolder(download)?.notifyDownloadedPages() getHolder(download)?.notifyProgress() } /** * Returns the holder for the given download. * * @param download the download to find. * @return the holder of the download or null if it's not bound. */ private fun getHolder(download: AnimeDownload): AnimeDownloadHolder? { return controllerBinding.root.findViewHolderForItemId(download.episode.id) as? AnimeDownloadHolder } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/anime/AnimeDownloadQueueTab.kt ================================================ package eu.kanade.tachiyomi.ui.download.anime import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.TabContent import tachiyomi.i18n.aniyomi.AYMR @Composable fun Screen.animeDownloadTab( nestedScrollConnection: NestedScrollConnection, ): TabContent { val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val screenModel = rememberScreenModel { AnimeDownloadQueueScreenModel() } val downloadList by screenModel.state.collectAsState() val downloadCount by remember { derivedStateOf { downloadList.sumOf { it.subItems.size } } } return TabContent( titleRes = AYMR.strings.label_anime, searchEnabled = false, content = { contentPadding, _ -> AnimeDownloadQueueScreen( contentPadding = contentPadding, scope = scope, screenModel = screenModel, downloadList = downloadList, nestedScrollConnection = nestedScrollConnection, ) }, numberTitle = downloadCount, navigateUp = navigator::pop, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadAdapter.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.view.MenuItem import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem /** * Adapter storing a list of downloads. * * @param downloadItemListener Listener called when an item of the list is released. */ class MangaDownloadAdapter(val downloadItemListener: DownloadItemListener) : FlexibleAdapter>( null, downloadItemListener, true, ) { override fun shouldMove(fromPosition: Int, toPosition: Int): Boolean { // Don't let sub-items changing group return getHeaderOf(getItem(fromPosition)) == getHeaderOf(getItem(toPosition)) } interface DownloadItemListener { fun onItemReleased(position: Int) fun onMenuItemClick(position: Int, menuItem: MenuItem) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadHeaderHolder.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.annotation.SuppressLint import android.view.View import androidx.recyclerview.widget.ItemTouchHelper import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.viewholders.ExpandableViewHolder import eu.kanade.tachiyomi.databinding.DownloadHeaderBinding class MangaDownloadHeaderHolder(view: View, adapter: FlexibleAdapter<*>) : ExpandableViewHolder( view, adapter, ) { private val binding = DownloadHeaderBinding.bind(view) @SuppressLint("SetTextI18n") fun bind(item: MangaDownloadHeaderItem) { setDragHandleView(binding.reorder) binding.title.text = "${item.name} (${item.size})" } override fun onActionStateChanged(position: Int, actionState: Int) { super.onActionStateChanged(position, actionState) if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { binding.container.isDragged = true mAdapter.collapseAll() } } override fun onItemReleased(position: Int) { super.onItemReleased(position) binding.container.isDragged = false mAdapter.expandAll() (mAdapter as MangaDownloadAdapter).downloadItemListener.onItemReleased(position) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadHeaderItem.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.view.View import androidx.recyclerview.widget.RecyclerView import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R data class MangaDownloadHeaderItem( val id: Long, val name: String, val size: Int, ) : AbstractExpandableHeaderItem() { override fun getLayoutRes(): Int { return R.layout.download_header } override fun createViewHolder( view: View, adapter: FlexibleAdapter>, ): MangaDownloadHeaderHolder { return MangaDownloadHeaderHolder(view, adapter) } override fun bindViewHolder( adapter: FlexibleAdapter>, holder: MangaDownloadHeaderHolder, position: Int, payloads: List?, ) { holder.bind(this) } override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as MangaDownloadHeaderItem if (id != other.id) return false if (name != other.name) return false if (size != other.size) return false if (subItemsCount != other.subItemsCount) return false if (subItems !== other.subItems) return false return true } override fun hashCode(): Int { var result = id.hashCode() result = 31 * result + name.hashCode() result = 31 * result + size result = 31 * result + subItems.hashCode() return result } init { isHidden = false isExpanded = true isSelectable = false } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadHolder.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.view.View import androidx.recyclerview.widget.ItemTouchHelper import eu.davidea.viewholders.FlexibleViewHolder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.databinding.DownloadItemBinding import eu.kanade.tachiyomi.util.view.popupMenu /** * Class used to hold the data of a download. * All the elements from the layout file "download_item" are available in this class. * * @param view the inflated view for this holder. * @constructor creates a new download holder. */ class MangaDownloadHolder(private val view: View, val adapter: MangaDownloadAdapter) : FlexibleViewHolder(view, adapter) { private val binding = DownloadItemBinding.bind(view) init { setDragHandleView(binding.reorder) binding.menu.setOnClickListener { it.post { showPopupMenu(it) } } } private lateinit var download: MangaDownload /** * Binds this holder with the given category. * * @param category The category to bind. */ fun bind(download: MangaDownload) { this.download = download // Update the chapter name. binding.chapterTitle.text = download.chapter.name // Update the manga title binding.mangaFullTitle.text = download.manga.title // Update the progress bar and the number of downloaded pages val pages = download.pages if (pages == null) { binding.downloadProgress.progress = 0 binding.downloadProgress.max = 1 binding.downloadProgressText.text = "" } else { binding.downloadProgress.max = pages.size * 100 notifyProgress() notifyDownloadedPages() } } /** * Updates the progress bar of the download. */ fun notifyProgress() { val pages = download.pages ?: return if (binding.downloadProgress.max == 1) { binding.downloadProgress.max = pages.size * 100 } binding.downloadProgress.setProgressCompat(download.totalProgress, true) } /** * Updates the text field of the number of downloaded pages. */ fun notifyDownloadedPages() { val pages = download.pages ?: return binding.downloadProgressText.text = "${download.downloadedImages}/${pages.size}" } override fun onItemReleased(position: Int) { super.onItemReleased(position) adapter.downloadItemListener.onItemReleased(position) binding.container.isDragged = false } override fun onActionStateChanged(position: Int, actionState: Int) { super.onActionStateChanged(position, actionState) if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { binding.container.isDragged = true } } private fun showPopupMenu(view: View) { view.popupMenu( menuRes = R.menu.download_single, initMenu = { findItem(R.id.move_to_top).isVisible = bindingAdapterPosition > 1 findItem(R.id.move_to_bottom).isVisible = bindingAdapterPosition != adapter.itemCount - 1 }, onMenuItemClick = { adapter.downloadItemListener.onMenuItemClick(bindingAdapterPosition, this) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadItem.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.view.View import androidx.recyclerview.widget.RecyclerView import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractSectionableItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload class MangaDownloadItem( val download: MangaDownload, header: MangaDownloadHeaderItem, ) : AbstractSectionableItem(header) { override fun getLayoutRes(): Int { return R.layout.download_item } /** * Returns a new view holder for this item. * * @param view The view of this item. * @param adapter The adapter of this item. */ override fun createViewHolder( view: View, adapter: FlexibleAdapter>, ): MangaDownloadHolder { return MangaDownloadHolder(view, adapter as MangaDownloadAdapter) } /** * Binds the given view holder with this item. * * @param adapter The adapter of this item. * @param holder The holder to bind. * @param position The position of this item in the adapter. * @param payloads List of partial changes. */ override fun bindViewHolder( adapter: FlexibleAdapter>, holder: MangaDownloadHolder, position: Int, payloads: MutableList, ) { holder.bind(download) } /** * Returns true if this item is draggable. */ override fun isDraggable(): Boolean { return true } override fun equals(other: Any?): Boolean { if (this === other) return true if (other is MangaDownloadItem) { return download.chapter.id == other.download.chapter.id } return false } override fun hashCode(): Int { return download.chapter.id.toInt() } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadQueueScreen.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.view.LayoutInflater import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.viewinterop.AndroidView import androidx.core.view.ViewCompat import androidx.core.view.updatePadding import androidx.recyclerview.widget.LinearLayoutManager import eu.kanade.tachiyomi.databinding.DownloadListBinding import kotlinx.coroutines.CoroutineScope import tachiyomi.core.common.util.lang.launchUI import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.EmptyScreen import kotlin.math.roundToInt @Composable fun DownloadQueueScreen( contentPadding: PaddingValues, scope: CoroutineScope, screenModel: MangaDownloadQueueScreenModel, downloadList: List, nestedScrollConnection: NestedScrollConnection, ) { Scaffold { if (downloadList.isEmpty()) { EmptyScreen( stringRes = MR.strings.information_no_downloads, modifier = Modifier.padding(contentPadding), ) return@Scaffold } val density = LocalDensity.current val layoutDirection = LocalLayoutDirection.current val left = with(density) { contentPadding.calculateLeftPadding(layoutDirection).toPx().roundToInt() } val top = with(density) { contentPadding.calculateTopPadding().toPx().roundToInt() } val right = with(density) { contentPadding.calculateRightPadding(layoutDirection).toPx().roundToInt() } val bottom = with(density) { contentPadding.calculateBottomPadding().toPx().roundToInt() } Box(modifier = Modifier.nestedScroll(nestedScrollConnection)) { AndroidView( modifier = Modifier.fillMaxWidth(), factory = { context -> screenModel.controllerBinding = DownloadListBinding.inflate( LayoutInflater.from(context), ) screenModel.adapter = MangaDownloadAdapter(screenModel.listener) screenModel.controllerBinding.root.adapter = screenModel.adapter screenModel.adapter?.isHandleDragEnabled = true screenModel.controllerBinding.root.layoutManager = LinearLayoutManager( context, ) ViewCompat.setNestedScrollingEnabled(screenModel.controllerBinding.root, true) scope.launchUI { screenModel.getDownloadStatusFlow() .collect(screenModel::onStatusChange) } scope.launchUI { screenModel.getDownloadProgressFlow() .collect(screenModel::onUpdateDownloadedPages) } screenModel.controllerBinding.root }, update = { screenModel.controllerBinding.root .updatePadding( left = left, top = top, right = right, bottom = bottom, ) screenModel.adapter?.updateDataSet(downloadList) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadQueueScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import android.view.MenuItem import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.databinding.DownloadListBinding import eu.kanade.tachiyomi.source.model.Page import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaDownloadQueueScreenModel( private val downloadManager: MangaDownloadManager = Injekt.get(), ) : ScreenModel { private val _state = MutableStateFlow(emptyList()) val state = _state.asStateFlow() lateinit var controllerBinding: DownloadListBinding /** * Adapter containing the active downloads. */ var adapter: MangaDownloadAdapter? = null /** * Map of jobs for active downloads. */ private val progressJobs = mutableMapOf() val listener = object : MangaDownloadAdapter.DownloadItemListener { /** * Called when an item is released from a drag. * * @param position The position of the released item. */ override fun onItemReleased(position: Int) { val adapter = adapter ?: return val downloads = adapter.headerItems.flatMap { header -> adapter.getSectionItems(header).map { item -> (item as MangaDownloadItem).download } } reorder(downloads) } /** * Called when the menu item of a download is pressed * * @param position The position of the item * @param menuItem The menu Item pressed */ override fun onMenuItemClick(position: Int, menuItem: MenuItem) { val item = adapter?.getItem(position) ?: return if (item is MangaDownloadItem) { when (menuItem.itemId) { R.id.move_to_top, R.id.move_to_bottom -> { val headerItems = adapter?.headerItems ?: return val newDownloads = mutableListOf() headerItems.forEach { headerItem -> headerItem as MangaDownloadHeaderItem if (headerItem == item.header) { headerItem.removeSubItem(item) if (menuItem.itemId == R.id.move_to_top) { headerItem.addSubItem(0, item) } else { headerItem.addSubItem(item) } } newDownloads.addAll(headerItem.subItems.map { it.download }) } reorder(newDownloads) } R.id.move_to_top_series, R.id.move_to_bottom_series -> { val (selectedSeries, otherSeries) = adapter?.currentItems ?.filterIsInstance() ?.map(MangaDownloadItem::download) ?.partition { item.download.manga.id == it.manga.id } ?: Pair(emptyList(), emptyList()) if (menuItem.itemId == R.id.move_to_top_series) { reorder(selectedSeries + otherSeries) } else { reorder(otherSeries + selectedSeries) } } R.id.cancel_download -> { cancel(listOf(item.download)) } R.id.cancel_series -> { val allDownloadsForSeries = adapter?.currentItems ?.filterIsInstance() ?.filter { item.download.manga.id == it.download.manga.id } ?.map(MangaDownloadItem::download) if (!allDownloadsForSeries.isNullOrEmpty()) { cancel(allDownloadsForSeries) } } } } } } init { screenModelScope.launch { downloadManager.queueState .map { downloads -> downloads .groupBy { it.source } .map { entry -> MangaDownloadHeaderItem(entry.key.id, entry.key.name, entry.value.size).apply { addSubItems(0, entry.value.map { MangaDownloadItem(it, this) }) } } } .collect { newList -> _state.update { newList } } } } override fun onDispose() { for (job in progressJobs.values) { job.cancel() } progressJobs.clear() adapter = null } val isDownloaderRunning = downloadManager.isDownloaderRunning .stateIn(screenModelScope, SharingStarted.WhileSubscribed(5000), false) fun getDownloadStatusFlow() = downloadManager.statusFlow() fun getDownloadProgressFlow() = downloadManager.progressFlow() fun startDownloads() { downloadManager.startDownloads() } fun pauseDownloads() { downloadManager.pauseDownloads() } fun clearQueue() { downloadManager.clearQueue() } fun reorder(downloads: List) { downloadManager.reorderQueue(downloads) } fun cancel(downloads: List) { downloadManager.cancelQueuedDownloads(downloads) } fun > reorderQueue( selector: (MangaDownloadItem) -> R, reverse: Boolean = false, ) { val adapter = adapter ?: return val newDownloads = mutableListOf() adapter.headerItems.forEach { headerItem -> headerItem as MangaDownloadHeaderItem headerItem.subItems = headerItem.subItems.sortedBy(selector).toMutableList().apply { if (reverse) { reverse() } } newDownloads.addAll(headerItem.subItems.map { it.download }) } reorder(newDownloads) } /** * Called when the status of a download changes. * * @param download the download whose status has changed. */ fun onStatusChange(download: MangaDownload) { when (download.status) { MangaDownload.State.DOWNLOADING -> { launchProgressJob(download) // Initial update of the downloaded pages onUpdateDownloadedPages(download) } MangaDownload.State.DOWNLOADED -> { cancelProgressJob(download) onUpdateProgress(download) onUpdateDownloadedPages(download) } MangaDownload.State.ERROR -> cancelProgressJob(download) else -> { /* unused */ } } } /** * Observe the progress of a download and notify the view. * * @param download the download to observe its progress. */ private fun launchProgressJob(download: MangaDownload) { val job = screenModelScope.launch { while (download.pages == null) { delay(50) } val progressFlows = download.pages!!.map(Page::progressFlow) combine(progressFlows, Array::sum) .distinctUntilChanged() .debounce(50) .collectLatest { onUpdateProgress(download) } } // Avoid leaking jobs progressJobs.remove(download)?.cancel() progressJobs[download] = job } /** * Unsubscribes the given download from the progress subscriptions. * * @param download the download to unsubscribe. */ private fun cancelProgressJob(download: MangaDownload) { progressJobs.remove(download)?.cancel() } /** * Called when the progress of a download changes. * * @param download the download whose progress has changed. */ private fun onUpdateProgress(download: MangaDownload) { getHolder(download)?.notifyProgress() } /** * Called when a page of a download is downloaded. * * @param download the download whose page has been downloaded. */ fun onUpdateDownloadedPages(download: MangaDownload) { getHolder(download)?.notifyDownloadedPages() } /** * Returns the holder for the given download. * * @param download the download to find. * @return the holder of the download or null if it's not bound. */ private fun getHolder(download: MangaDownload): MangaDownloadHolder? { return controllerBinding.root.findViewHolderForItemId(download.chapter.id) as? MangaDownloadHolder } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/download/manga/MangaDownloadQueueTab.kt ================================================ package eu.kanade.tachiyomi.ui.download.manga import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.components.TabContent import tachiyomi.i18n.aniyomi.AYMR @Composable fun Screen.mangaDownloadTab( nestedScrollConnection: NestedScrollConnection, ): TabContent { val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val screenModel = rememberScreenModel { MangaDownloadQueueScreenModel() } val downloadList by screenModel.state.collectAsState() val downloadCount by remember { derivedStateOf { downloadList.sumOf { it.subItems.size } } } return TabContent( titleRes = AYMR.strings.label_manga, searchEnabled = false, content = { contentPadding, _ -> DownloadQueueScreen( contentPadding = contentPadding, scope = scope, screenModel = screenModel, downloadList = downloadList, nestedScrollConnection = nestedScrollConnection, ) }, numberTitle = downloadCount, navigateUp = navigator::pop, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeImageScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.entries.anime import android.content.Context import android.net.Uri import androidx.compose.foundation.pager.PagerState import androidx.compose.material3.SnackbarHostState import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import coil3.asDrawable import coil3.imageLoader import coil3.request.ImageRequest import coil3.size.Size import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.saver.Image import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.saver.Location import eu.kanade.tachiyomi.util.editBackground import eu.kanade.tachiyomi.util.editCover import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.toShareIntent import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeImageScreenModel( private val animeId: Long, private val getAnime: GetAnime = Injekt.get(), private val imageSaver: ImageSaver = Injekt.get(), private val coverCache: AnimeCoverCache = Injekt.get(), private val backgroundCache: AnimeBackgroundCache = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), val snackbarHostState: SnackbarHostState = SnackbarHostState(), val pagerState: PagerState = PagerState(pageCount = { 2 }), ) : StateScreenModel(null) { private val isCover: Boolean get() = pagerState.currentPage != 1 init { screenModelScope.launchIO { getAnime.subscribe(animeId) .collect { newAnime -> mutableState.update { newAnime } } } } fun saveImage(context: Context) { val savedStringResource = if (isCover) { MR.strings.cover_saved } else { AYMR.strings.background_saved } val errorSavingStringResource = if (isCover) { MR.strings.error_saving_cover } else { AYMR.strings.error_saving_background } screenModelScope.launch { try { saveImageInternal(context, temp = false) snackbarHostState.showSnackbar( context.stringResource(savedStringResource), withDismissAction = true, ) } catch (e: Throwable) { logcat(LogPriority.ERROR, e) snackbarHostState.showSnackbar( context.stringResource(errorSavingStringResource), withDismissAction = true, ) } } } fun shareImage(context: Context) { val errorSharingStringResource = if (isCover) { MR.strings.error_sharing_cover } else { AYMR.strings.error_sharing_background } screenModelScope.launch { try { val uri = saveImageInternal(context, temp = true) ?: return@launch withUIContext { context.startActivity(uri.toShareIntent(context)) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) snackbarHostState.showSnackbar( context.stringResource(errorSharingStringResource), withDismissAction = true, ) } } } /** * Save anime image Bitmap to picture or temporary share directory. * * @param context The context for building and executing the ImageRequest * @return the uri to saved file */ private suspend fun saveImageInternal(context: Context, temp: Boolean): Uri? { val anime = state.value ?: return null val req = ImageRequest.Builder(context) .data(anime) .size(Size.ORIGINAL) .build() return withIOContext { val result = context.imageLoader.execute(req).image?.asDrawable(context.resources) // TODO: Handle animated image val bitmap = result?.getBitmapOrNull() ?: return@withIOContext null imageSaver.save( Image.Cover( bitmap = bitmap, name = if (isCover) "cover" else "background", location = if (temp) Location.Cache else Location.Pictures(anime.title), ), ) } } /** * Update image with local file. * * @param context Context. * @param data uri of the image resource. */ fun editImage(context: Context, data: Uri) { val anime = state.value ?: return screenModelScope.launchIO { context.contentResolver.openInputStream(data)?.use { try { if (isCover) { anime.editCover(Injekt.get(), it, updateAnime, coverCache) } else { anime.editBackground(Injekt.get(), it, updateAnime, backgroundCache) } notifyImageUpdated(context) } catch (e: Exception) { notifyFailedImageUpdate(context, e) } } } } fun deleteCustomImage(context: Context) { val animeId = state.value?.id ?: return screenModelScope.launchIO { try { if (isCover) { coverCache.deleteCustomCover(animeId) updateAnime.awaitUpdateCoverLastModified(animeId) } else { backgroundCache.deleteCustomBackground(animeId) updateAnime.awaitUpdateBackgroundLastModified(animeId) } notifyImageUpdated(context) } catch (e: Exception) { notifyFailedImageUpdate(context, e) } } } private fun notifyImageUpdated(context: Context) { val updatedStringResource = if (isCover) { MR.strings.cover_updated } else { AYMR.strings.background_updated } screenModelScope.launch { snackbarHostState.showSnackbar( context.stringResource(updatedStringResource), withDismissAction = true, ) } } private fun notifyFailedImageUpdate(context: Context, e: Throwable) { val updateFailedStringResource = if (isCover) { MR.strings.notification_cover_update_failed } else { AYMR.strings.notification_background_update_failed } screenModelScope.launch { snackbarHostState.showSnackbar( context.stringResource(updateFailedStringResource), withDismissAction = true, ) logcat(LogPriority.ERROR, e) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeScreen.kt ================================================ package eu.kanade.tachiyomi.ui.entries.anime import android.content.Context import android.content.Intent import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback import androidx.core.net.toUri import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifAnimeSourcesLoaded import eu.kanade.domain.entries.anime.model.hasCustomBackground import eu.kanade.domain.entries.anime.model.hasCustomCover import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.components.NavigatorAdaptiveSheet import eu.kanade.presentation.entries.EditCoverAction import eu.kanade.presentation.entries.anime.AnimeScreen import eu.kanade.presentation.entries.anime.DuplicateAnimeDialog import eu.kanade.presentation.entries.anime.EpisodeOptionsDialogScreen import eu.kanade.presentation.entries.anime.EpisodeSettingsDialog import eu.kanade.presentation.entries.anime.SeasonSettingsDialog import eu.kanade.presentation.entries.anime.components.AnimeImagesDialog import eu.kanade.presentation.entries.components.DeleteItemsDialog import eu.kanade.presentation.entries.components.SetIntervalDialog import eu.kanade.presentation.more.settings.screen.player.PlayerSettingsGesturesScreen.SkipIntroLengthDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.formatEpisodeNumber import eu.kanade.presentation.util.isTabletUi import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.source.anime.isLocalOrStub import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season.MigrateSeasonSelectScreen import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialog import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialogScreenModel import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeSearchScreen import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreen import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearchScreen import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.anime.track.AnimeTrackInfoDialogHomeScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryTab import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.setting.SettingsScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class AnimeScreen( private val animeId: Long, val fromSource: Boolean = false, ) : Screen(), AssistContentScreen { private var assistUrl: String? = null override fun onProvideAssistUrl() = assistUrl @Composable override fun Content() { if (!ifAnimeSourcesLoaded()) { LoadingScreen() return } val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val haptic = LocalHapticFeedback.current val scope = rememberCoroutineScope() val lifecycleOwner = LocalLifecycleOwner.current val screenModel = rememberScreenModel { AnimeScreenModel(context, lifecycleOwner.lifecycle, animeId, fromSource) } val state by screenModel.state.collectAsStateWithLifecycle() if (state is AnimeScreenModel.State.Loading) { LoadingScreen() return } val successState = state as AnimeScreenModel.State.Success val isAnimeHttpSource = remember { successState.source is AnimeHttpSource } LaunchedEffect(successState.anime, screenModel.source) { if (isAnimeHttpSource) { try { withIOContext { assistUrl = getAnimeUrl(screenModel.anime, screenModel.source) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to get anime URL" } } } } AnimeScreen( state = successState, snackbarHostState = screenModel.snackbarHostState, nextUpdate = successState.anime.expectedNextUpdate, isTabletUi = isTabletUi(), episodeSwipeStartAction = screenModel.episodeSwipeStartAction, episodeSwipeEndAction = screenModel.episodeSwipeEndAction, showNextEpisodeAirTime = screenModel.showNextEpisodeAirTime, alwaysUseExternalPlayer = screenModel.alwaysUseExternalPlayer, navigateUp = navigator::pop, onEpisodeClicked = { episode, alt -> scope.launchIO { val extPlayer = screenModel.alwaysUseExternalPlayer != alt openEpisode(context, episode, extPlayer) } }, onDownloadEpisode = screenModel::runEpisodeDownloadActions.takeIf { !successState.source.isLocalOrStub() && successState.anime.fetchType == FetchType.Episodes }, onAddToLibraryClicked = { screenModel.toggleFavorite() haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, onWebViewClicked = { openAnimeInWebView( navigator, screenModel.anime, screenModel.source, ) }.takeIf { isAnimeHttpSource }, onWebViewLongClicked = { copyAnimeUrl( context, screenModel.anime, screenModel.source, ) }.takeIf { isAnimeHttpSource }, onTrackingClicked = { if (!successState.hasLoggedInTrackers) { navigator.push(SettingsScreen(SettingsScreen.Destination.Tracking)) } else { screenModel.showTrackDialog() } }.takeIf { successState.anime.fetchType == FetchType.Episodes }, onTagSearch = { scope.launch { performGenreSearch(navigator, it, screenModel.source!!) } }, onFilterButtonClicked = screenModel::showSettingsDialog, onRefresh = screenModel::fetchAllFromSource, onContinueWatching = { scope.launchIO { val extPlayer = screenModel.alwaysUseExternalPlayer continueWatching(context, screenModel.getNextUnseenEpisode(), extPlayer) } }, onSearch = { query, global -> scope.launch { performSearch(navigator, query, global) } }, onCoverClicked = screenModel::showImagesDialog, onShareClicked = { shareAnime( context, screenModel.anime, screenModel.source, ) }.takeIf { isAnimeHttpSource }, onDownloadActionClicked = screenModel::runDownloadAction.takeIf { !successState.source.isLocalOrStub() && successState.anime.fetchType == FetchType.Episodes }, onEditCategoryClicked = screenModel::showChangeCategoryDialog.takeIf { successState.anime.favorite }, onEditFetchIntervalClicked = screenModel::showSetAnimeFetchIntervalDialog.takeIf { successState.anime.favorite }, onMigrateClicked = { navigator.push(MigrateAnimeSearchScreen(successState.anime.id)) }.takeIf { successState.anime.favorite }, changeAnimeSkipIntro = screenModel::showAnimeSkipIntroDialog .takeIf { successState.anime.favorite && successState.anime.fetchType == FetchType.Episodes }, onMultiBookmarkClicked = screenModel::bookmarkEpisodes, onMultiFillermarkClicked = screenModel::fillermarkEpisodes, onMultiMarkAsSeenClicked = screenModel::markEpisodesSeen, onMarkPreviousAsSeenClicked = screenModel::markPreviousEpisodeSeen, onMultiDeleteClicked = screenModel::showDeleteEpisodeDialog, onEpisodeSwipe = screenModel::episodeSwipe, onEpisodeSelected = screenModel::toggleSelection, onAllEpisodeSelected = screenModel::toggleAllSelection, onInvertSelection = screenModel::invertSelection, onSeasonClicked = { navigator.push(AnimeScreen(it.id)) }, onContinueWatchingClicked = { scope.launchIO { val episode = screenModel.getNextUnseenEpisode(it.anime) episode?.let { ep -> openEpisode(context, ep, screenModel.alwaysUseExternalPlayer) } } }, ) val onDismissRequest = { screenModel.dismissDialog() if (screenModel.autoOpenTrack && screenModel.isFromChangeCategory) { screenModel.isFromChangeCategory = false screenModel.showTrackDialog() } } when (val dialog = successState.dialog) { null -> {} is AnimeScreenModel.Dialog.ChangeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { navigator.push(CategoriesTab) }, onConfirm = { include, _ -> screenModel.moveAnimeToCategoriesAndAddToLibrary(dialog.anime, include) }, ) } is AnimeScreenModel.Dialog.DeleteEpisodes -> { DeleteItemsDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.toggleAllSelection(false) screenModel.deleteEpisodes(dialog.episodes) }, isManga = false, ) } is AnimeScreenModel.Dialog.DuplicateAnime -> { DuplicateAnimeDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.toggleFavorite(onRemoved = {}, checkDuplicate = false) }, onOpenAnime = { navigator.push(AnimeScreen(dialog.duplicate.id)) }, onMigrate = { screenModel.showMigrateDialog(dialog.duplicate) }, ) } is AnimeScreenModel.Dialog.Migrate -> { MigrateAnimeDialog( oldAnime = dialog.oldAnime, newAnime = dialog.newAnime, screenModel = MigrateAnimeDialogScreenModel(), onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(AnimeScreen(dialog.oldAnime.id)) }, onClickSeasons = { navigator.push(MigrateSeasonSelectScreen(dialog.oldAnime, dialog.newAnime)) }, onPopScreen = { navigator.replace(AnimeScreen(dialog.newAnime.id)) }, ) } AnimeScreenModel.Dialog.EpisodeSettingsSheet -> EpisodeSettingsDialog( onDismissRequest = onDismissRequest, anime = successState.anime, onDownloadFilterChanged = screenModel::setDownloadedFilter, onUnseenFilterChanged = screenModel::setUnseenFilter, onBookmarkedFilterChanged = screenModel::setBookmarkedFilter, onFillermarkedFilterChanged = screenModel::setFillermarkedFilter, onSortModeChanged = screenModel::setSorting, onDisplayModeChanged = screenModel::setDisplayMode, onShowPreviewsEnabled = screenModel::showEpisodePreviews, onShowSummariesEnabled = screenModel::showEpisodeSummaries, onSetAsDefault = screenModel::setCurrentSettingsAsDefault, ) AnimeScreenModel.Dialog.SeasonSettingsSheet -> SeasonSettingsDialog( onDismissRequest = onDismissRequest, anime = successState.anime, onDownloadFilterChanged = screenModel::setSeasonDownloadedFilter, onUnseenFilterChanged = screenModel::setSeasonUnseenFilter, onStartedFilterChanged = screenModel::setSeasonStartedFilter, onCompletedFilterChanged = screenModel::setSeasonCompletedFilter, onBookmarkedFilterChanged = screenModel::setSeasonBookmarkedFilter, onFillermarkedFilterChanged = screenModel::setSeasonFillermarkedFilter, onSortModeChanged = screenModel::setSeasonSorting, onDisplayGridModeChanged = screenModel::setSeasonDisplayGridMode, onDisplayGridSizeChanged = screenModel::setSeasonDisplayGridSize, onOverlayDownloadedChanged = screenModel::setSeasonDownloadOverlay, onOverlayUnseenChanged = screenModel::setSeasonUnseenOverlay, onOverlayLocalChanged = screenModel::setSeasonLocalOverlay, onOverlayLangChanged = screenModel::setSeasonLangOverlay, onOverlayContinueChanged = screenModel::setSeasonContinueOverlay, onDisplayModeChanged = screenModel::setSeasonDisplayMode, onSetAsDefault = screenModel::setSeasonCurrentSettingsAsDefault, ) AnimeScreenModel.Dialog.TrackSheet -> { NavigatorAdaptiveSheet( screen = AnimeTrackInfoDialogHomeScreen( animeId = successState.anime.id, animeTitle = successState.anime.title, sourceId = successState.source.id, ), enableSwipeDismiss = { it.lastItem is AnimeTrackInfoDialogHomeScreen }, onDismissRequest = onDismissRequest, ) } AnimeScreenModel.Dialog.FullImages -> { val sm = rememberScreenModel { AnimeImageScreenModel(successState.anime.id) } val anime by sm.state.collectAsState() if (anime != null) { val getContent = rememberLauncherForActivityResult( ActivityResultContracts.GetContent(), ) { if (it == null) return@rememberLauncherForActivityResult sm.editImage(context, it) } AnimeImagesDialog( anime = anime!!, snackbarHostState = sm.snackbarHostState, pagerState = sm.pagerState, isCustomCover = remember(anime) { anime!!.hasCustomCover() }, isCustomBackground = remember(anime) { anime!!.hasCustomBackground() }, onShareClick = { sm.shareImage(context) }, onSaveClick = { sm.saveImage(context) }, onEditClick = { when (it) { EditCoverAction.EDIT -> getContent.launch("image/*") EditCoverAction.DELETE -> sm.deleteCustomImage(context) } }, onDismissRequest = onDismissRequest, ) } else { LoadingScreen(Modifier.systemBarsPadding()) } } is AnimeScreenModel.Dialog.SetAnimeFetchInterval -> { SetIntervalDialog( interval = dialog.anime.fetchInterval, nextUpdate = dialog.anime.expectedNextUpdate, onDismissRequest = onDismissRequest, isManga = false, onValueChanged = { interval: Int -> screenModel.setFetchInterval(dialog.anime, interval) } .takeIf { screenModel.isUpdateIntervalEnabled }, ) } AnimeScreenModel.Dialog.ChangeAnimeSkipIntro -> { fun updateSkipIntroLength(newLength: Long) { scope.launchIO { screenModel.setAnimeViewerFlags.awaitSetSkipIntroLength(animeId, newLength) } } SkipIntroLengthDialog( initialSkipIntroLength = if (!successState.anime.skipIntroDisable && successState.anime.skipIntroLength == 0 ) { screenModel.gesturePreferences.defaultIntroLength().get() } else { successState.anime.skipIntroLength }, onDismissRequest = onDismissRequest, onValueChanged = { updateSkipIntroLength(it.toLong()) onDismissRequest() }, ) } is AnimeScreenModel.Dialog.ShowQualities -> { EpisodeOptionsDialogScreen.onDismissDialog = onDismissRequest val episodeTitle = if (dialog.anime.displayMode == Anime.EPISODE_DISPLAY_NUMBER) { stringResource( AYMR.strings.display_mode_episode, formatEpisodeNumber(dialog.episode.episodeNumber), ) } else { dialog.episode.name } NavigatorAdaptiveSheet( screen = EpisodeOptionsDialogScreen( useExternalDownloader = screenModel.useExternalDownloader, episodeTitle = episodeTitle, episodeId = dialog.episode.id, animeId = dialog.anime.id, sourceId = dialog.source.id, ), onDismissRequest = onDismissRequest, ) } } } private suspend fun continueWatching( context: Context, unseenEpisode: Episode?, useExternalPlayer: Boolean, ) { if (unseenEpisode != null) openEpisode(context, unseenEpisode, useExternalPlayer) } private suspend fun openEpisode(context: Context, episode: Episode, useExternalPlayer: Boolean) { withIOContext { MainActivity.startPlayerActivity( context, episode.animeId, episode.id, useExternalPlayer, ) } } private fun getAnimeUrl(anime_: Anime?, source_: AnimeSource?): String? { val anime = anime_ ?: return null val source = source_ as? AnimeHttpSource ?: return null return try { source.getAnimeUrl(anime.toSAnime()) } catch (e: Exception) { null } } private fun openAnimeInWebView(navigator: Navigator, anime_: Anime?, source_: AnimeSource?) { getAnimeUrl(anime_, source_)?.let { url -> navigator.push( WebViewScreen( url = url, initialTitle = anime_?.title, sourceId = source_?.id, ), ) } } private fun shareAnime(context: Context, anime_: Anime?, source_: AnimeSource?) { try { getAnimeUrl(anime_, source_)?.let { url -> val intent = url.toUri().toShareIntent(context, type = "text/plain") context.startActivity( Intent.createChooser( intent, context.stringResource(MR.strings.action_share), ), ) } } catch (e: Exception) { context.toast(e.message) } } /** * Perform a search using the provided query. * * @param query the search query to the parent controller */ private suspend fun performSearch(navigator: Navigator, query: String, global: Boolean) { if (global) { navigator.push(GlobalAnimeSearchScreen(query)) return } if (navigator.size < 2) { return } when (val previousController = navigator.items[navigator.size - 2]) { is HomeScreen -> { navigator.pop() AnimeLibraryTab.search(query) } is BrowseAnimeSourceScreen -> { navigator.pop() previousController.search(query) } } } /** * Performs a genre search using the provided genre name. * * @param genreName the search genre to the parent controller */ private suspend fun performGenreSearch( navigator: Navigator, genreName: String, source: AnimeSource, ) { if (navigator.size < 2) { return } val previousController = navigator.items[navigator.size - 2] if (previousController is BrowseAnimeSourceScreen && source is AnimeHttpSource) { navigator.pop() previousController.searchGenre(genreName) } else { performSearch(navigator, genreName, global = false) } } /** * Copy Anime URL to Clipboard */ private fun copyAnimeUrl(context: Context, anime_: Anime?, source_: AnimeSource?) { val anime = anime_ ?: return val source = source_ as? AnimeHttpSource ?: return val url = source.getAnimeUrl(anime.toSAnime()) context.copyToClipboard(url, url) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.entries.anime import android.content.Context import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult import androidx.compose.runtime.Immutable import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import aniyomi.domain.anime.SeasonAnime import aniyomi.domain.anime.SeasonDisplayMode import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.util.addOrRemove import eu.kanade.core.util.insertSeparators import eu.kanade.domain.entries.anime.interactor.SetAnimeViewerFlags import eu.kanade.domain.entries.anime.interactor.SyncSeasonsWithSource import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.entries.anime.model.downloadedFilter import eu.kanade.domain.entries.anime.model.seasonDownloadedFilter import eu.kanade.domain.entries.anime.model.toSAnime import eu.kanade.domain.items.episode.interactor.SetSeenStatus import eu.kanade.domain.items.episode.interactor.SyncEpisodesWithSource import eu.kanade.domain.track.anime.interactor.AddAnimeTracks import eu.kanade.domain.track.anime.interactor.RefreshAnimeTracks import eu.kanade.domain.track.anime.interactor.TrackEpisode import eu.kanade.domain.track.model.AutoTrackState import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.presentation.entries.DownloadAction import eu.kanade.presentation.entries.anime.components.EpisodeDownloadAction import eu.kanade.presentation.util.formattedMessage import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.UnmeteredSource import eu.kanade.tachiyomi.animesource.model.FetchType import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.ui.entries.anime.track.AnimeTrackItem import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.util.AniChartApi import eu.kanade.tachiyomi.util.episode.getNextUnseen import eu.kanade.tachiyomi.util.removeCovers import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import logcat.LogPriority import mihon.domain.items.episode.interactor.FilterEpisodesForDownload import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.preference.mapAsCheckboxState import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.anime.interactor.SetAnimeCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.interactor.GetAnimeWithEpisodesAndSeasons import tachiyomi.domain.entries.anime.interactor.GetDuplicateLibraryAnime import tachiyomi.domain.entries.anime.interactor.SetAnimeEpisodeFlags import tachiyomi.domain.entries.anime.interactor.SetAnimeSeasonFlags import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.NoSeasonsException import tachiyomi.domain.entries.anime.repository.AnimeRepository import tachiyomi.domain.entries.applyFilter import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.SetAnimeDefaultEpisodeFlags import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.model.EpisodeUpdate import tachiyomi.domain.items.episode.model.NoEpisodesException import tachiyomi.domain.items.episode.service.calculateEpisodeGap import tachiyomi.domain.items.episode.service.getEpisodeSort import tachiyomi.domain.items.season.interactor.SetAnimeDefaultSeasonFlags import tachiyomi.domain.items.season.service.getSeasonSortComparator import tachiyomi.domain.items.season.service.seasonSortAlphabetically import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.source.local.entries.anime.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.util.Calendar import kotlin.math.floor class AnimeScreenModel( private val context: Context, private val lifecycle: Lifecycle, private val animeId: Long, private val isFromSource: Boolean, private val downloadPreferences: DownloadPreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val trackPreferences: TrackPreferences = Injekt.get(), internal val playerPreferences: PlayerPreferences = Injekt.get(), internal val gesturePreferences: GesturePreferences = Injekt.get(), private val trackerManager: TrackerManager = Injekt.get(), private val trackEpisode: TrackEpisode = Injekt.get(), private val sourceManager: AnimeSourceManager = Injekt.get(), private val downloadManager: AnimeDownloadManager = Injekt.get(), private val downloadCache: AnimeDownloadCache = Injekt.get(), private val getAnimeAndEpisodesAndSeasons: GetAnimeWithEpisodesAndSeasons = Injekt.get(), private val getDuplicateLibraryAnime: GetDuplicateLibraryAnime = Injekt.get(), private val setAnimeEpisodeFlags: SetAnimeEpisodeFlags = Injekt.get(), private val setAnimeDefaultEpisodeFlags: SetAnimeDefaultEpisodeFlags = Injekt.get(), private val setAnimeSeasonFlags: SetAnimeSeasonFlags = Injekt.get(), private val setAnimeDefaultSeasonFlags: SetAnimeDefaultSeasonFlags = Injekt.get(), private val setSeenStatus: SetSeenStatus = Injekt.get(), private val updateEpisode: UpdateEpisode = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), private val syncEpisodesWithSource: SyncEpisodesWithSource = Injekt.get(), private val syncSeasonsWithSource: SyncSeasonsWithSource = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val getTracks: GetAnimeTracks = Injekt.get(), private val addTracks: AddAnimeTracks = Injekt.get(), private val setAnimeCategories: SetAnimeCategories = Injekt.get(), private val animeRepository: AnimeRepository = Injekt.get(), private val getEpisodesByAnimeId: GetEpisodesByAnimeId = Injekt.get(), private val filterEpisodesForDownload: FilterEpisodesForDownload = Injekt.get(), internal val setAnimeViewerFlags: SetAnimeViewerFlags = Injekt.get(), val snackbarHostState: SnackbarHostState = SnackbarHostState(), ) : StateScreenModel(State.Loading) { private val successState: State.Success? get() = state.value as? State.Success val anime: Anime? get() = successState?.anime val source: AnimeSource? get() = successState?.source private val isFavorited: Boolean get() = anime?.favorite ?: false private val processedEpisodes: List? get() = successState?.processedEpisodes val episodeSwipeStartAction = libraryPreferences.swipeEpisodeEndAction().get() val episodeSwipeEndAction = libraryPreferences.swipeEpisodeStartAction().get() var autoTrackState = trackPreferences.autoUpdateTrackOnMarkRead().get() val showNextEpisodeAirTime = trackPreferences.showNextEpisodeAiringTime().get() val alwaysUseExternalPlayer = playerPreferences.alwaysUseExternalPlayer().get() val useExternalDownloader = downloadPreferences.useExternalDownloader().get() val isUpdateIntervalEnabled = LibraryPreferences.ENTRY_OUTSIDE_RELEASE_PERIOD in libraryPreferences.autoUpdateItemRestrictions().get() private val selectedPositions: Array = arrayOf(-1, -1) // first and last selected index in list private val selectedEpisodeIds: HashSet = HashSet() internal var isFromChangeCategory: Boolean = false internal val autoOpenTrack: Boolean get() = successState?.hasLoggedInTrackers == true && trackPreferences.trackOnAddingToLibrary().get() /** * Helper function to update the UI state only if it's currently in success state */ private inline fun updateSuccessState(func: (State.Success) -> State.Success) { mutableState.update { when (it) { State.Loading -> it is State.Success -> func(it) } } } init { screenModelScope.launchIO { combine( getAnimeAndEpisodesAndSeasons.subscribe(animeId).distinctUntilChanged(), downloadCache.changes, downloadManager.queueState, ) { animeAndEpisodesAndSeasons, _, _ -> animeAndEpisodesAndSeasons } .flowWithLifecycle(lifecycle) .collectLatest { (anime, episodes, seasons) -> updateSuccessState { it.copy( anime = anime, episodes = episodes.toEpisodeListItems(anime), seasons = seasons.toAnimeSeasonItems(), ) } } } observeDownloads() screenModelScope.launchIO { val anime = getAnimeAndEpisodesAndSeasons.awaitAnime(animeId) val source = sourceManager.getOrStub(anime.source) val episodes = if (anime.fetchType == FetchType.Seasons) { emptyList() } else { getAnimeAndEpisodesAndSeasons.awaitEpisodes(animeId) .toEpisodeListItems(anime) } val seasons = if (anime.fetchType == FetchType.Episodes) { emptyList() } else { getAnimeAndEpisodesAndSeasons.awaitSeasons(animeId) .toAnimeSeasonItems() } if (!anime.favorite) { setAnimeDefaultEpisodeFlags.await(anime) setAnimeDefaultSeasonFlags.await(anime) } val needRefreshInfo = !anime.initialized val needRefreshEpisode = episodes.isEmpty() && anime.fetchType == FetchType.Episodes val needRefreshSeason = seasons.isEmpty() && anime.fetchType == FetchType.Seasons // Show what we have earlier mutableState.update { State.Success( anime = anime, source = source, isFromSource = isFromSource, episodes = episodes, seasons = seasons, isRefreshingData = needRefreshInfo || needRefreshEpisode || needRefreshSeason, dialog = null, ) } // Start observe tracking since it only needs animeId observeTrackers() // Fetch info-episodes when needed if (screenModelScope.isActive) { val fetchFromSourceTasks = listOf( async { if (needRefreshInfo) fetchAnimeFromSource() }, async { if (needRefreshEpisode || needRefreshSeason) fetchEpisodesAndSeasonsFromSource() }, ) fetchFromSourceTasks.awaitAll() } // Initial loading finished updateSuccessState { it.copy(isRefreshingData = false) } } } fun fetchAllFromSource(manualFetch: Boolean = true) { screenModelScope.launch { updateSuccessState { it.copy(isRefreshingData = true) } val fetchFromSourceTasks = listOf( async { fetchAnimeFromSource(manualFetch) }, async { fetchEpisodesAndSeasonsFromSource(manualFetch) }, ) fetchFromSourceTasks.awaitAll() updateSuccessState { it.copy(isRefreshingData = false) } successState?.let { updateAiringTime(it.anime, it.trackItems, manualFetch) } } } // Anime info - start /** * Fetch anime information from source. */ private suspend fun fetchAnimeFromSource(manualFetch: Boolean = false) { val state = successState ?: return try { withIOContext { val networkAnime = state.source.getAnimeDetails(state.anime.toSAnime()) updateAnime.awaitUpdateFromSource(state.anime, networkAnime, manualFetch) } } catch (e: Throwable) { // Ignore early hints "errors" that aren't handled by OkHttp if (e is HttpException && e.code == 103) return logcat(LogPriority.ERROR, e) screenModelScope.launch { snackbarHostState.showSnackbar(message = with(context) { e.formattedMessage }) } } } fun toggleFavorite() { toggleFavorite( onRemoved = { screenModelScope.launch { if (!hasDownloads()) return@launch val result = snackbarHostState.showSnackbar( message = context.stringResource(AYMR.strings.delete_downloads_for_anime), actionLabel = context.stringResource(MR.strings.action_delete), withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed) { deleteDownloads() } } }, ) } /** * Update favorite status of anime, (removes / adds) anime (to / from) library. */ fun toggleFavorite( onRemoved: () -> Unit, checkDuplicate: Boolean = true, ) { val state = successState ?: return screenModelScope.launchIO { val anime = state.anime if (isFavorited) { // Remove from library if (updateAnime.awaitUpdateFavorite(anime.id, false)) { // Remove covers and update last modified in db if (anime.removeCovers() != anime) { updateAnime.awaitUpdateCoverLastModified(anime.id) } withUIContext { onRemoved() } } } else { // Add to library // First, check if duplicate exists if callback is provided if (checkDuplicate) { val duplicate = getDuplicateLibraryAnime.await(anime).getOrNull(0) if (duplicate != null) { updateSuccessState { it.copy( dialog = Dialog.DuplicateAnime(anime, duplicate), ) } return@launchIO } } // Now check if user previously set categories, when available val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultAnimeCategory().get().toLong() val defaultCategory = categories.find { it.id == defaultCategoryId } when { // Default category set defaultCategory != null -> { val result = updateAnime.awaitUpdateFavorite(anime.id, true) if (!result) return@launchIO moveAnimeToCategory(defaultCategory) } // Automatic 'Default' or no categories defaultCategoryId == 0L || categories.isEmpty() -> { val result = updateAnime.awaitUpdateFavorite(anime.id, true) if (!result) return@launchIO moveAnimeToCategory(null) } // Choose a category else -> { isFromChangeCategory = true showChangeCategoryDialog() } } // Finally match with enhanced tracking when available addTracks.bindEnhancedTrackers(anime, state.source) if (autoOpenTrack) { showTrackDialog() } } } } fun showChangeCategoryDialog() { val anime = successState?.anime ?: return screenModelScope.launch { val categories = getCategories() val selection = getAnimeCategoryIds(anime) updateSuccessState { successState -> successState.copy( dialog = Dialog.ChangeCategory( anime = anime, initialSelection = categories.mapAsCheckboxState { it.id in selection }.toImmutableList(), ), ) } } } fun showSetAnimeFetchIntervalDialog() { val anime = successState?.anime ?: return updateSuccessState { it.copy(dialog = Dialog.SetAnimeFetchInterval(anime)) } } fun setFetchInterval(anime: Anime, interval: Int) { screenModelScope.launchIO { if ( updateAnime.awaitUpdateFetchInterval( // Custom intervals are negative anime.copy(fetchInterval = -interval), ) ) { val updatedAnime = animeRepository.getAnimeById(anime.id) updateSuccessState { it.copy(anime = updatedAnime) } } } } /** * Returns true if the anime has any downloads. */ private fun hasDownloads(): Boolean { val anime = successState?.anime ?: return false return downloadManager.getDownloadCount(anime) > 0 } /** * Deletes all the downloads for the anime. */ private fun deleteDownloads() { val state = successState ?: return downloadManager.deleteAnime(state.anime, state.source) } /** * Get user categories. * * @return List of categories, not including the default category */ suspend fun getCategories(): List { return getCategories.await().filterNot { it.isSystemCategory } } /** * Gets the category id's the anime is in, if the anime is not in a category, returns the default id. * * @param anime the anime to get categories from. * @return Array of category ids the anime is in, if none returns default id */ private suspend fun getAnimeCategoryIds(anime: Anime): List { return getCategories.await(anime.id) .map { it.id } } fun moveAnimeToCategoriesAndAddToLibrary(anime: Anime, categories: List) { moveAnimeToCategory(categories) if (anime.favorite) return screenModelScope.launchIO { updateAnime.awaitUpdateFavorite(anime.id, true) } } /** * Move the given anime to categories. * * @param categories the selected categories. */ private fun moveAnimeToCategories(categories: List) { val categoryIds = categories.map { it.id } moveAnimeToCategory(categoryIds) } private fun moveAnimeToCategory(categoryIds: List) { screenModelScope.launchIO { setAnimeCategories.await(animeId, categoryIds) } } /** * Move the given anime to the category. * * @param category the selected category, or null for default category. */ private fun moveAnimeToCategory(category: Category?) { moveAnimeToCategories(listOfNotNull(category)) } // Anime info - end // Episodes list - start private fun observeDownloads() { screenModelScope.launchIO { downloadManager.statusFlow() .filter { it.anime.id == successState?.anime?.id } .catch { error -> logcat(LogPriority.ERROR, error) } .flowWithLifecycle(lifecycle) .collect { withUIContext { updateDownloadState(it) } } } screenModelScope.launchIO { downloadManager.progressFlow() .filter { it.anime.id == successState?.anime?.id } .catch { error -> logcat(LogPriority.ERROR, error) } .flowWithLifecycle(lifecycle) .collect { withUIContext { updateDownloadState(it) } } } } private fun updateDownloadState(download: AnimeDownload) { updateSuccessState { successState -> val modifiedIndex = successState.episodes.indexOfFirst { it.id == download.episode.id } if (modifiedIndex < 0) return@updateSuccessState successState val newEpisodes = successState.episodes.toMutableList().apply { val item = removeAt(modifiedIndex) .copy(downloadState = download.status, downloadProgress = download.progress) add(modifiedIndex, item) } successState.copy(episodes = newEpisodes) } } private fun List.toEpisodeListItems(anime: Anime): List { val isLocal = anime.isLocal() return map { episode -> val activeDownload = if (isLocal) { null } else { downloadManager.getQueuedDownloadOrNull(episode.id) } val downloaded = if (isLocal) { true } else { downloadManager.isEpisodeDownloaded( episode.name, episode.scanlator, anime.title, anime.source, ) } val downloadState = when { activeDownload != null -> activeDownload.status downloaded -> AnimeDownload.State.DOWNLOADED else -> AnimeDownload.State.NOT_DOWNLOADED } EpisodeList.Item( episode = episode, downloadState = downloadState, downloadProgress = activeDownload?.progress ?: 0, selected = episode.id in selectedEpisodeIds, ) } } private fun List.toAnimeSeasonItems(): List { return map { seasonAnime -> AnimeSeasonItem( seasonAnime = seasonAnime, downloadCount = downloadManager.getDownloadCount(seasonAnime.anime).toLong(), unseenCount = seasonAnime.unseenCount, isLocal = seasonAnime.anime.isLocal(), sourceLanguage = sourceManager.getOrStub(seasonAnime.anime.source).lang, showContinueOverlay = false, ) } } private suspend fun fetchEpisodesFromSource(manualFetch: Boolean = false) { val state = successState ?: return try { withIOContext { updateEpisodesFromSource(state.anime, state.source, manualFetch) } } catch (e: Throwable) { val message = if (e is NoEpisodesException) { context.stringResource(AYMR.strings.no_episodes_error) } else { logcat(LogPriority.ERROR, e) with(context) { e.formattedMessage } } screenModelScope.launch { snackbarHostState.showSnackbar(message = message) } val newAnime = animeRepository.getAnimeById(animeId) updateSuccessState { it.copy(anime = newAnime, isRefreshingData = false) } } } private suspend fun updateEpisodesFromSource( anime: Anime, source: AnimeSource, manualFetch: Boolean = false, ) { val episodes = source.getEpisodeList(anime.toSAnime()) val newEpisodes = syncEpisodesWithSource.await( episodes, anime, source, manualFetch, ) if (manualFetch) { downloadNewEpisodes(newEpisodes) } } private suspend fun fetchSeasonsFromSource(manualFetch: Boolean = false) { val state = successState ?: return try { withIOContext { val seasons = state.source.getSeasonList(state.anime.toSAnime()) val newSeasons = syncSeasonsWithSource.await( seasons, state.anime, state.source, ) if (libraryPreferences.updateSeasonOnRefresh().get()) { fetchEpisodesFromSeasons(newSeasons, manualFetch) } } } catch (e: Throwable) { val message = if (e is NoSeasonsException) { context.stringResource(AYMR.strings.no_seasons_error) } else { logcat(LogPriority.ERROR, e) with(context) { e.formattedMessage } } screenModelScope.launch { snackbarHostState.showSnackbar(message = message) } val newAnime = animeRepository.getAnimeById(animeId) updateSuccessState { it.copy(anime = newAnime, isRefreshingData = false) } } } /** * Requests an updated list of episodes and seasons from the source. */ private suspend fun fetchEpisodesAndSeasonsFromSource(manualFetch: Boolean = false) { val state = successState ?: return when (state.anime.fetchType) { FetchType.Seasons -> fetchSeasonsFromSource(manualFetch) FetchType.Episodes -> fetchEpisodesFromSource(manualFetch) } } /** * Fetch episodes from all seasons of an anime. */ private suspend fun CoroutineScope.fetchEpisodesFromSeasons(seasons: List, manualFetch: Boolean) { val state = successState ?: return val fetch: suspend (Anime) -> Unit = { s -> // Only fetch seasons with `Episodes` fetch type and only for non completed, unless they // haven't been fetched at all. if (s.fetchType === FetchType.Episodes && (s.lastUpdate == 0L || s.status.toInt() != SAnime.COMPLETED)) { try { updateEpisodesFromSource(s, state.source, manualFetch) } catch (e: Throwable) { logcat(LogPriority.ERROR, e) } } } if (state.source is UnmeteredSource) { seasons.map { s -> async(Dispatchers.IO) { fetch(s) } }.awaitAll() } else { seasons.forEach { s -> ensureActive() fetch(s) } } } /** * @throws IllegalStateException if the swipe action is [LibraryPreferences.EpisodeSwipeAction.Disabled] */ fun episodeSwipe(episodeItem: EpisodeList.Item, swipeAction: LibraryPreferences.EpisodeSwipeAction) { screenModelScope.launch { executeEpisodeSwipeAction(episodeItem, swipeAction) } } /** * @throws IllegalStateException if the swipe action is [LibraryPreferences.EpisodeSwipeAction.Disabled] */ private fun executeEpisodeSwipeAction( episodeItem: EpisodeList.Item, swipeAction: LibraryPreferences.EpisodeSwipeAction, ) { val episode = episodeItem.episode when (swipeAction) { LibraryPreferences.EpisodeSwipeAction.ToggleSeen -> { markEpisodesSeen(listOf(episode), !episode.seen) } LibraryPreferences.EpisodeSwipeAction.ToggleBookmark -> { bookmarkEpisodes(listOf(episode), !episode.bookmark) } LibraryPreferences.EpisodeSwipeAction.ToggleFillermark -> { fillermarkEpisodes(listOf(episode), !episode.fillermark) } LibraryPreferences.EpisodeSwipeAction.Download -> { val downloadAction: EpisodeDownloadAction = when (episodeItem.downloadState) { AnimeDownload.State.ERROR, AnimeDownload.State.NOT_DOWNLOADED, -> EpisodeDownloadAction.START_NOW AnimeDownload.State.QUEUE, AnimeDownload.State.DOWNLOADING, -> EpisodeDownloadAction.CANCEL AnimeDownload.State.DOWNLOADED -> EpisodeDownloadAction.DELETE } runEpisodeDownloadActions( items = listOf(episodeItem), action = downloadAction, ) } LibraryPreferences.EpisodeSwipeAction.Disabled -> throw IllegalStateException() } } suspend fun getNextUnseenEpisode(anime: Anime): Episode? { return getEpisodesByAnimeId.await(anime.id).getNextUnseen(anime, downloadManager) } /** * Returns the next unseen episode or null if everything is seen. */ fun getNextUnseenEpisode(): Episode? { val successState = successState ?: return null return successState.episodes.getNextUnseen(successState.anime) } private fun getUnseenEpisodes(): List { return successState?.processedEpisodes ?.filter { (episode, dlStatus) -> !episode.seen && dlStatus == AnimeDownload.State.NOT_DOWNLOADED } ?.map { it.episode } ?.toList() ?: emptyList() } private fun getUnseenEpisodesSorted(): List { val anime = successState?.anime ?: return emptyList() val episodes = getUnseenEpisodes().sortedWith(getEpisodeSort(anime)) return if (anime.sortDescending()) episodes.reversed() else episodes } private fun startDownload( episodes: List, startNow: Boolean, video: Video? = null, ) { val successState = successState ?: return screenModelScope.launchNonCancellable { if (startNow) { val episodeId = episodes.singleOrNull()?.id ?: return@launchNonCancellable downloadManager.startDownloadNow(episodeId) } else { downloadEpisodes(episodes, false, video) } if (!isFavorited && !successState.hasPromptedToAddBefore) { updateSuccessState { state -> state.copy(hasPromptedToAddBefore = true) } val result = snackbarHostState.showSnackbar( message = context.stringResource(AYMR.strings.snack_add_to_anime_library), actionLabel = context.stringResource(MR.strings.action_add), withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed && !isFavorited) { toggleFavorite() } } } } fun runEpisodeDownloadActions( items: List, action: EpisodeDownloadAction, ) { when (action) { EpisodeDownloadAction.START -> { startDownload(items.map { it.episode }, false) if (items.any { it.downloadState == AnimeDownload.State.ERROR }) { downloadManager.startDownloads() } } EpisodeDownloadAction.START_NOW -> { val episode = items.singleOrNull()?.episode ?: return startDownload(listOf(episode), true) } EpisodeDownloadAction.CANCEL -> { val episodeId = items.singleOrNull()?.id ?: return cancelDownload(episodeId) } EpisodeDownloadAction.DELETE -> { deleteEpisodes(items.map { it.episode }) } EpisodeDownloadAction.SHOW_QUALITIES -> { val episode = items.singleOrNull()?.episode ?: return showQualitiesDialog(episode) } } } fun runDownloadAction(action: DownloadAction) { val episodesToDownload = when (action) { DownloadAction.NEXT_1_ITEM -> getUnseenEpisodesSorted().take(1) DownloadAction.NEXT_5_ITEMS -> getUnseenEpisodesSorted().take(5) DownloadAction.NEXT_10_ITEMS -> getUnseenEpisodesSorted().take(10) DownloadAction.NEXT_25_ITEMS -> getUnseenEpisodesSorted().take(25) DownloadAction.UNVIEWED_ITEMS -> getUnseenEpisodes() } if (episodesToDownload.isNotEmpty()) { startDownload(episodesToDownload, false) } } private fun cancelDownload(episodeId: Long) { val activeDownload = downloadManager.getQueuedDownloadOrNull(episodeId) ?: return downloadManager.cancelQueuedDownloads(listOf(activeDownload)) updateDownloadState(activeDownload.apply { status = AnimeDownload.State.NOT_DOWNLOADED }) } fun markPreviousEpisodeSeen(pointer: Episode) { val anime = successState?.anime ?: return val episodes = processedEpisodes.orEmpty().map { it.episode }.toList() val prevEpisodes = if (anime.sortDescending()) episodes.asReversed() else episodes val pointerPos = prevEpisodes.indexOf(pointer) if (pointerPos != -1) markEpisodesSeen(prevEpisodes.take(pointerPos), true) } /** * Mark the selected episode list as seen/unseen. * @param episodes the list of selected episodes. * @param seen whether to mark episodes as seen or unseen. */ fun markEpisodesSeen(episodes: List, seen: Boolean) { toggleAllSelection(false) if (episodes.isEmpty()) return screenModelScope.launchIO { setSeenStatus.await( seen = seen, episodes = episodes.toTypedArray(), ) if (!seen || successState?.hasLoggedInTrackers == false || autoTrackState == AutoTrackState.NEVER) { return@launchIO } refreshTrackers() val tracks = getTracks.await(animeId) val maxEpisodeNumber = episodes.maxOf { it.episodeNumber } val shouldPromptTrackingUpdate = tracks.any { track -> maxEpisodeNumber > track.lastEpisodeSeen } if (!shouldPromptTrackingUpdate) return@launchIO if (autoTrackState == AutoTrackState.ALWAYS) { trackEpisode.await(context, animeId, maxEpisodeNumber) withUIContext { context.toast( context.stringResource(AYMR.strings.trackers_updated_summary_anime, maxEpisodeNumber.toInt()), ) } return@launchIO } val result = snackbarHostState.showSnackbar( message = context.stringResource(AYMR.strings.confirm_tracker_update_anime, maxEpisodeNumber.toInt()), actionLabel = context.stringResource(MR.strings.action_ok), duration = SnackbarDuration.Short, withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed) { trackEpisode.await(context, animeId, maxEpisodeNumber) } } } private suspend fun refreshTrackers( refreshTracks: RefreshAnimeTracks = Injekt.get(), ) { refreshTracks.await(animeId) .filter { it.first != null } .forEach { (track, e) -> logcat(LogPriority.ERROR, e) { "Failed to refresh track data animeId=$animeId for service ${track!!.id}" } withUIContext { context.toast( context.stringResource( MR.strings.track_error, track!!.name, e.message ?: "", ), ) } } } /** * Downloads the given list of episodes with the manager. * @param episodes the list of episodes to download. */ private fun downloadEpisodes( episodes: List, alt: Boolean = false, video: Video? = null, ) { val anime = successState?.anime ?: return downloadManager.downloadEpisodes(anime, episodes, true, alt, video) toggleAllSelection(false) } /** * Bookmarks the given list of episodes. * @param episodes the list of episodes to bookmark. */ fun bookmarkEpisodes(episodes: List, bookmarked: Boolean) { screenModelScope.launchIO { episodes .filterNot { it.bookmark == bookmarked } .map { EpisodeUpdate(id = it.id, bookmark = bookmarked) } .let { updateEpisode.awaitAll(it) } } toggleAllSelection(false) } /** * Fillermarks the given list of episodes. * @param episodes the list of episodes to fillermark. */ fun fillermarkEpisodes(episodes: List, fillermarked: Boolean) { screenModelScope.launchIO { episodes .filterNot { it.fillermark == fillermarked } .map { EpisodeUpdate(id = it.id, fillermark = fillermarked) } .let { updateEpisode.awaitAll(it) } } toggleAllSelection(false) } /** * Deletes the given list of episode. * * @param episodes the list of episodes to delete. */ fun deleteEpisodes(episodes: List) { screenModelScope.launchNonCancellable { try { successState?.let { state -> downloadManager.deleteEpisodes( episodes, state.anime, state.source, ) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) } } } private fun downloadNewEpisodes(episodes: List) { screenModelScope.launchNonCancellable { val anime = successState?.anime ?: return@launchNonCancellable val episodesToDownload = filterEpisodesForDownload.await(anime, episodes) if (episodesToDownload.isNotEmpty()) { downloadEpisodes(episodesToDownload) } } } /** * Sets the seen filter and requests an UI update. * @param state whether to display only unseen episodes or all episodes. */ fun setUnseenFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.EPISODE_SHOW_UNSEEN TriState.ENABLED_NOT -> Anime.EPISODE_SHOW_SEEN } screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitSetUnseenFilter(anime, flag) } } /** * Sets the download filter and requests an UI update. * @param state whether to display only downloaded episodes or all episodes. */ fun setDownloadedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.EPISODE_SHOW_DOWNLOADED TriState.ENABLED_NOT -> Anime.EPISODE_SHOW_NOT_DOWNLOADED } screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitSetDownloadedFilter(anime, flag) } } /** * Sets the bookmark filter and requests an UI update. * @param state whether to display only bookmarked episodes or all episodes. */ fun setBookmarkedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.EPISODE_SHOW_BOOKMARKED TriState.ENABLED_NOT -> Anime.EPISODE_SHOW_NOT_BOOKMARKED } screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitSetBookmarkFilter(anime, flag) } } /** * Sets the fillermark filter and requests an UI update. * @param state whether to display only fillermarked episodes or all episodes. */ fun setFillermarkedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.EPISODE_SHOW_FILLERMARKED TriState.ENABLED_NOT -> Anime.EPISODE_SHOW_NOT_FILLERMARKED } screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitSetFillermarkFilter(anime, flag) } } /** * Sets the active display mode. * @param mode the mode to set. */ fun setDisplayMode(mode: Long) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitSetDisplayMode(anime, mode) } } /** * Sets the sorting method and requests an UI update. * @param sort the sorting mode. */ fun setSorting(sort: Long) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitSetSortingModeOrFlipOrder(anime, sort) } } /** * Sets whether previews are to be shown or not. * @param flag to show previews. */ fun showEpisodePreviews(flag: Long) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitShowEpisodePreviews(anime, flag) } } /** * Sets whether summaries are to be shown or not. * @param flag to show summaries. */ fun showEpisodeSummaries(flag: Long) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeEpisodeFlags.awaitShowEpisodeSummaries(anime, flag) } } fun setCurrentSettingsAsDefault(applyToExisting: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { libraryPreferences.setEpisodeSettingsDefault(anime) if (applyToExisting) { setAnimeDefaultEpisodeFlags.awaitAll() } snackbarHostState.showSnackbar( message = context.stringResource(AYMR.strings.episode_settings_updated), ) } } /** * Sets the season download filter and requests an UI update. * @param state whether to display only downloaded seasons or all seasons. */ fun setSeasonDownloadedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.SEASON_SHOW_DOWNLOADED TriState.ENABLED_NOT -> Anime.SEASON_SHOW_NOT_DOWNLOADED } screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetDownloadedFilter(anime, flag) } } /** * Sets the season seen filter and requests an UI update. * @param state whether to display only unseen seasons or all seasons. */ fun setSeasonUnseenFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.SEASON_SHOW_UNSEEN TriState.ENABLED_NOT -> Anime.SEASON_SHOW_SEEN } screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetUnseenFilter(anime, flag) } } /** * Sets the season started filter and requests an UI update. * @param state whether to display only started seasons or all seasons. */ fun setSeasonStartedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.SEASON_SHOW_STARTED TriState.ENABLED_NOT -> Anime.SEASON_SHOW_NOT_STARTED } screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetStartedFilter(anime, flag) } } /** * Sets the season bookmarked filter and requests an UI update. * @param state whether to display only bookmarked seasons or all seasons. */ fun setSeasonBookmarkedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.SEASON_SHOW_BOOKMARKED TriState.ENABLED_NOT -> Anime.SEASON_SHOW_NOT_BOOKMARKED } screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetBookmarkedFilter(anime, flag) } } /** * Sets the season fillermarked filter and requests an UI update. * @param state whether to display only fillermarked seasons or all seasons. */ fun setSeasonFillermarkedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.SEASON_SHOW_FILLERMARKED TriState.ENABLED_NOT -> Anime.SEASON_SHOW_NOT_FILLERMARKED } screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetFillermarkedFilter(anime, flag) } } /** * Sets the season completed filter and requests an UI update. * @param state whether to display only completed seasons or all seasons. */ fun setSeasonCompletedFilter(state: TriState) { val anime = successState?.anime ?: return val flag = when (state) { TriState.DISABLED -> Anime.SHOW_ALL TriState.ENABLED_IS -> Anime.SEASON_SHOW_COMPLETED TriState.ENABLED_NOT -> Anime.SEASON_SHOW_NOT_COMPLETED } screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetCompletedFilter(anime, flag) } } /** * Sets the season sorting method and requests an UI update. * @param sort the sorting mode. */ fun setSeasonSorting(sort: Long) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetSortingModeOrFlipOrder(anime, sort) } } /** * Sets the season grid display method and requests an UI update. * @param mode the display mode. */ fun setSeasonDisplayGridMode(mode: SeasonDisplayMode) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetGridMode(anime, mode) } } /** * Sets the season grid size and requests an UI update. * @param size the size. */ fun setSeasonDisplayGridSize(size: Int) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetGridSize(anime, size) } } /** * Sets the season download overlay and requests an UI update. * @param visible the visibility. */ fun setSeasonDownloadOverlay(visible: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetDownloadedOverlay(anime, visible) } } /** * Sets the season unseen overlay and requests an UI update. * @param visible the visibility. */ fun setSeasonUnseenOverlay(visible: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetUnseenOverlay(anime, visible) } } /** * Sets the season local overlay and requests an UI update. * @param visible the visibility. */ fun setSeasonLocalOverlay(visible: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetLocalOverlay(anime, visible) } } /** * Sets the season lang overlay and requests an UI update. * @param visible the visibility. */ fun setSeasonLangOverlay(visible: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetLangOverlay(anime, visible) } } /** * Sets the season continue overlay and requests an UI update. * @param visible the visibility. */ fun setSeasonContinueOverlay(visible: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetContinueOverlay(anime, visible) } } /** * Sets the active season display mode. * @param mode the mode to set. */ fun setSeasonDisplayMode(mode: Long) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { setAnimeSeasonFlags.awaitSetDisplayMode(anime, mode) } } fun setSeasonCurrentSettingsAsDefault(applyToExisting: Boolean) { val anime = successState?.anime ?: return screenModelScope.launchNonCancellable { libraryPreferences.setSeasonSettingsDefault(anime) if (applyToExisting) { setAnimeDefaultSeasonFlags.awaitAll() } snackbarHostState.showSnackbar( message = context.stringResource(AYMR.strings.season_settings_updated), ) } } fun toggleSelection( item: EpisodeList.Item, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) { updateSuccessState { successState -> val newEpisodes = successState.processedEpisodes.toMutableList().apply { val selectedIndex = successState.processedEpisodes.indexOfFirst { it.id == item.episode.id } if (selectedIndex < 0) return@apply val selectedItem = get(selectedIndex) if ((selectedItem.selected && selected) || (!selectedItem.selected && !selected)) return@apply val firstSelection = none { it.selected } set(selectedIndex, selectedItem.copy(selected = selected)) selectedEpisodeIds.addOrRemove(item.id, selected) if (selected && userSelected && fromLongPress) { if (firstSelection) { selectedPositions[0] = selectedIndex selectedPositions[1] = selectedIndex } else { // Try to select the items in-between when possible val range: IntRange if (selectedIndex < selectedPositions[0]) { range = selectedIndex + 1.. selectedPositions[1]) { range = (selectedPositions[1] + 1).. selectedPositions[1]) { selectedPositions[1] = selectedIndex } } } } successState.copy(episodes = newEpisodes) } } fun toggleAllSelection(selected: Boolean) { updateSuccessState { successState -> val newEpisodes = successState.episodes.map { selectedEpisodeIds.addOrRemove(it.id, selected) it.copy(selected = selected) } selectedPositions[0] = -1 selectedPositions[1] = -1 successState.copy(episodes = newEpisodes) } } fun invertSelection() { updateSuccessState { successState -> val newEpisodes = successState.episodes.map { selectedEpisodeIds.addOrRemove(it.id, !it.selected) it.copy(selected = !it.selected) } selectedPositions[0] = -1 selectedPositions[1] = -1 successState.copy(episodes = newEpisodes) } } // Episodes list - end // Track sheet - start private fun observeTrackers() { val anime = successState?.anime ?: return screenModelScope.launchIO { combine( getTracks.subscribe(anime.id).catch { logcat(LogPriority.ERROR, it) }, trackerManager.loggedInTrackersFlow(), ) { animeTracks, loggedInTrackers -> // Show only if the service supports this manga's source val supportedTrackers = loggedInTrackers.filter { (it as? EnhancedAnimeTracker)?.accept(source!!) ?: true } val supportedTrackerIds = supportedTrackers.map { it.id }.toHashSet() val supportedTrackerTracks = animeTracks.filter { it.trackerId in supportedTrackerIds } supportedTrackerTracks.size to supportedTrackers.isNotEmpty() } .flowWithLifecycle(lifecycle) .distinctUntilChanged() .collectLatest { (trackingCount, hasLoggedInTrackers) -> updateSuccessState { it.copy( trackingCount = trackingCount, hasLoggedInTrackers = hasLoggedInTrackers, ) } } } screenModelScope.launchIO { combine( getTracks.subscribe(anime.id).catch { logcat(LogPriority.ERROR, it) }, trackerManager.loggedInTrackersFlow(), ) { animeTracks, loggedInTrackers -> loggedInTrackers .map { service -> AnimeTrackItem(animeTracks.find { it.trackerId == service.id }, service) } } .distinctUntilChanged() .collectLatest { trackItems -> updateAiringTime(anime, trackItems, manualFetch = false) } } } private suspend fun updateAiringTime( anime: Anime, trackItems: List, manualFetch: Boolean, ) { val airingEpisodeData = AniChartApi().loadAiringTime(anime, trackItems, manualFetch) setAnimeViewerFlags.awaitSetNextEpisodeAiring(anime.id, airingEpisodeData) updateSuccessState { it.copy(nextAiringEpisode = airingEpisodeData) } } // Track sheet - end sealed interface Dialog { data class ChangeCategory( val anime: Anime, val initialSelection: ImmutableList>, ) : Dialog data class DeleteEpisodes(val episodes: List) : Dialog data class DuplicateAnime(val anime: Anime, val duplicate: Anime) : Dialog data class Migrate(val newAnime: Anime, val oldAnime: Anime) : Dialog data class SetAnimeFetchInterval(val anime: Anime) : Dialog data class ShowQualities(val episode: Episode, val anime: Anime, val source: AnimeSource) : Dialog data object ChangeAnimeSkipIntro : Dialog data object EpisodeSettingsSheet : Dialog data object SeasonSettingsSheet : Dialog data object TrackSheet : Dialog data object FullImages : Dialog } fun dismissDialog() { updateSuccessState { it.copy(dialog = null) } } fun showDeleteEpisodeDialog(episodes: List) { updateSuccessState { it.copy(dialog = Dialog.DeleteEpisodes(episodes)) } } fun showSettingsDialog() { updateSuccessState { when (it.anime.fetchType) { FetchType.Seasons -> it.copy(dialog = Dialog.SeasonSettingsSheet) FetchType.Episodes -> it.copy(dialog = Dialog.EpisodeSettingsSheet) } } } fun showTrackDialog() { updateSuccessState { it.copy(dialog = Dialog.TrackSheet) } } fun showImagesDialog() { updateSuccessState { it.copy(dialog = Dialog.FullImages) } } fun showMigrateDialog(duplicate: Anime) { val anime = successState?.anime ?: return updateSuccessState { it.copy(dialog = Dialog.Migrate(newAnime = anime, oldAnime = duplicate)) } } fun showAnimeSkipIntroDialog() { updateSuccessState { it.copy(dialog = Dialog.ChangeAnimeSkipIntro) } } private fun showQualitiesDialog(episode: Episode) { updateSuccessState { it.copy(dialog = Dialog.ShowQualities(episode, it.anime, it.source)) } } sealed interface State { @Immutable data object Loading : State @Immutable data class Success( val anime: Anime, val source: AnimeSource, val isFromSource: Boolean, val episodes: List, val seasons: List, val trackingCount: Int = 0, val hasLoggedInTrackers: Boolean = false, val isRefreshingData: Boolean = false, val dialog: Dialog? = null, val hasPromptedToAddBefore: Boolean = false, val trackItems: List = emptyList(), val nextAiringEpisode: Pair = Pair( anime.nextEpisodeToAir, anime.nextEpisodeAiringAt, ), ) : State { val processedSeasons by lazy { seasons.applySeasonFilters(anime).toList() } val processedEpisodes by lazy { episodes.applyFilters(anime).toList() } val episodeListItems by lazy { processedEpisodes.insertSeparators { before, after -> val (lowerEpisode, higherEpisode) = if (anime.sortDescending()) { after to before } else { before to after } if (higherEpisode == null) return@insertSeparators null if (lowerEpisode == null) { floor(higherEpisode.episode.episodeNumber) .toInt() .minus(1) .coerceAtLeast(0) } else { calculateEpisodeGap(higherEpisode.episode, lowerEpisode.episode) } .takeIf { it > 0 } ?.let { missingCount -> EpisodeList.MissingCount( id = "${lowerEpisode?.id}-${higherEpisode.id}", count = missingCount, ) } } } val trackingAvailable: Boolean get() = trackItems.isNotEmpty() val airingEpisodeNumber: Double get() = nextAiringEpisode.first.toDouble() val airingTime: Long get() = nextAiringEpisode.second.times(1000L).minus( Calendar.getInstance().timeInMillis, ) val showPreviews: Boolean get() = anime.showPreviews() val showSummaries: Boolean get() = anime.showSummaries() /** * Applies the view filters to the list of episodes obtained from the database. * @return an observable of the list of episodes filtered and sorted. */ private fun List.applyFilters(anime: Anime): Sequence { val isLocalAnime = anime.isLocal() val unseenFilter = anime.unseenFilter val downloadedFilter = anime.downloadedFilter val bookmarkedFilter = anime.bookmarkedFilter val fillermarkedFilter = anime.fillermarkedFilter return asSequence() .filter { (episode) -> applyFilter(unseenFilter) { !episode.seen } } .filter { (episode) -> applyFilter(bookmarkedFilter) { episode.bookmark } } .filter { (episode) -> applyFilter(fillermarkedFilter) { episode.fillermark } } .filter { applyFilter(downloadedFilter) { it.isDownloaded || isLocalAnime } } .sortedWith { (episode1), (episode2) -> getEpisodeSort(anime).invoke( episode1, episode2, ) } } private fun List.applySeasonFilters(anime: Anime): Sequence { val unseenFilter = anime.seasonUnseenFilter val downloadedFilter = anime.seasonDownloadedFilter val startedFilter = anime.seasonStartedFilter val completedFilter = anime.seasonCompletedFilter val bookmarkedFilter = anime.seasonBookmarkedFilter val fillermarkedFilter = anime.seasonFillermarkedFilter val comparator = getSeasonSortComparator(anime) .let { if (anime.seasonSortDescending()) it.reversed() else it } .thenComparator(seasonSortAlphabetically) return asSequence() .filter { (season) -> applyFilter(unseenFilter) { !season.seen } } .filter { (season) -> applyFilter(startedFilter) { season.hasStarted } } .filter { (season) -> applyFilter(completedFilter) { season.anime.status.toInt() == SAnime.COMPLETED } } .filter { (season) -> applyFilter(bookmarkedFilter) { season.hasBookmarks } } .filter { (season) -> applyFilter(fillermarkedFilter) { season.hasFillermarks } } .filter { applyFilter(downloadedFilter) { it.downloadCount > 0 || it.seasonAnime.anime.isLocal() } } .sortedWith(compareBy(comparator) { it.seasonAnime }) .map { val itemAnime = it.seasonAnime.anime AnimeSeasonItem( seasonAnime = it.seasonAnime, downloadCount = if (anime.seasonDownloadedOverlay) it.downloadCount else -1L, unseenCount = if (anime.seasonUnseenOverlay) it.unseenCount else -1L, isLocal = anime.seasonLocalOverlay && it.isLocal, sourceLanguage = if (anime.seasonLangOverlay) it.sourceLanguage else "", showContinueOverlay = anime.seasonContinueOverlay && it.unseenCount > 0 && itemAnime.fetchType == FetchType.Episodes, ) } } } } } @Immutable sealed class EpisodeList { @Immutable data class MissingCount( val id: String, val count: Int, ) : EpisodeList() @Immutable data class Item( val episode: Episode, val downloadState: AnimeDownload.State, val downloadProgress: Int, val selected: Boolean = false, ) : EpisodeList() { val id = episode.id val isDownloaded = downloadState == AnimeDownload.State.DOWNLOADED } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeSeasonItem.kt ================================================ package eu.kanade.tachiyomi.ui.entries.anime import aniyomi.domain.anime.SeasonAnime data class AnimeSeasonItem( val seasonAnime: SeasonAnime, val downloadCount: Long = -1L, val unseenCount: Long = -1L, val isLocal: Boolean = false, val sourceLanguage: String = "", val showContinueOverlay: Boolean = false, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/track/AnimeTrackInfoDialog.kt ================================================ package eu.kanade.tachiyomi.ui.entries.anime.track import android.app.Application import android.content.Context import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SelectableDates import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.anime.interactor.RefreshAnimeTracks import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.track.TrackDateSelector import eu.kanade.presentation.track.TrackItemSelector import eu.kanade.presentation.track.TrackScoreSelector import eu.kanade.presentation.track.TrackStatusSelector import eu.kanade.presentation.track.anime.AnimeTrackInfoDialogHome import eu.kanade.presentation.track.anime.AnimeTrackerSearch import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.DeletableAnimeTracker import eu.kanade.tachiyomi.data.track.EnhancedAnimeTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.track.anime.interactor.DeleteAnimeTrack import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.model.AnimeTrack import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.AlertDialogContent import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDate import java.time.ZoneId import java.time.ZoneOffset import tachiyomi.domain.track.anime.model.AnimeTrack as DbAnimeTrack data class AnimeTrackInfoDialogHomeScreen( private val animeId: Long, private val animeTitle: String, private val sourceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val screenModel = rememberScreenModel { Model(animeId, sourceId) } val dateFormat = remember { UiPreferences.dateFormat( Injekt.get().dateFormat().get(), ) } val state by screenModel.state.collectAsState() AnimeTrackInfoDialogHome( trackItems = state.trackItems, dateFormat = dateFormat, onStatusClick = { navigator.push( TrackStatusSelectorScreen( track = it.track!!, serviceId = it.tracker.id, ), ) }, onEpisodeClick = { navigator.push( TrackEpisodeSelectorScreen( track = it.track!!, serviceId = it.tracker.id, ), ) }, onScoreClick = { navigator.push( TrackScoreSelectorScreen( track = it.track!!, serviceId = it.tracker.id, ), ) }, onStartDateEdit = { navigator.push( TrackDateSelectorScreen( track = it.track!!, serviceId = it.tracker.id, start = true, ), ) }, onEndDateEdit = { navigator.push( TrackDateSelectorScreen( track = it.track!!, serviceId = it.tracker.id, start = false, ), ) }, onNewSearch = { if (it.tracker is EnhancedAnimeTracker) { screenModel.registerEnhancedTracking(it) } else { navigator.push( TrackServiceSearchScreen( animeId = animeId, initialQuery = it.track?.title ?: animeTitle, currentUrl = it.track?.remoteUrl, serviceId = it.tracker.id, ), ) } }, onOpenInBrowser = { openTrackerInBrowser(context, it) }, onRemoved = { navigator.push( TrackerAnimeRemoveScreen( animeId = animeId, track = it.track!!, serviceId = it.tracker.id, ), ) }, onCopyLink = { context.copyTrackerLink(it) }, onTogglePrivate = screenModel::togglePrivate, ) } /** * Opens registered tracker url in browser */ private fun openTrackerInBrowser(context: Context, trackItem: AnimeTrackItem) { val url = trackItem.track?.remoteUrl ?: return if (url.isNotBlank()) { context.openInBrowser(url) } } private fun Context.copyTrackerLink(trackItem: AnimeTrackItem) { val url = trackItem.track?.remoteUrl ?: return if (url.isNotBlank()) { copyToClipboard(url, url) } } private class Model( private val animeId: Long, private val sourceId: Long, private val getTracks: GetAnimeTracks = Injekt.get(), ) : StateScreenModel(State()) { init { screenModelScope.launch { refreshTrackers() } screenModelScope.launch { getTracks.subscribe(animeId) .catch { logcat(LogPriority.ERROR, it) } .distinctUntilChanged() .map { it.mapToTrackItem() } .collectLatest { trackItems -> mutableState.update { it.copy( trackItems = trackItems, ) } } } } fun registerEnhancedTracking(item: AnimeTrackItem) { item.tracker as EnhancedAnimeTracker screenModelScope.launchNonCancellable { val anime = Injekt.get().await(animeId) ?: return@launchNonCancellable try { val matchResult = item.tracker.match(anime) ?: throw Exception() item.tracker.animeService.register(matchResult, animeId) } catch (e: Exception) { withUIContext { Injekt.get().toast(MR.strings.error_no_match) } } } } private suspend fun refreshTrackers() { val refreshTracks = Injekt.get() val context = Injekt.get() refreshTracks.await(animeId) .filter { it.first != null } .forEach { (track, e) -> logcat(LogPriority.ERROR, e) { "Failed to refresh track data mangaId=$animeId for service ${track!!.id}" } withUIContext { context.toast( context.stringResource( MR.strings.track_error, track!!.name, e.message ?: "", ), ) } } } fun togglePrivate(item: AnimeTrackItem) { screenModelScope.launchNonCancellable { (item.tracker as? AnimeTracker)?.setRemotePrivate(item.track!!.toDbTrack(), !item.track.private) } } private fun List.mapToTrackItem(): List { val loggedInTrackers = Injekt.get().loggedInTrackers().filter { it is AnimeTracker } val source = Injekt.get().getOrStub(sourceId) return loggedInTrackers // Map to TrackItem .map { service -> AnimeTrackItem(find { it.trackerId == service.id }, service) } // Show only if the service supports this anime's source .filter { (it.tracker as? EnhancedAnimeTracker)?.accept(source) ?: true } } @Immutable data class State( val trackItems: List = emptyList(), ) } } private data class TrackStatusSelectorScreen( private val track: DbAnimeTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() TrackStatusSelector( selection = state.selection, onSelectionChange = screenModel::setSelection, selections = remember { screenModel.getSelections() }, onConfirm = { screenModel.setStatus() navigator.pop() }, onDismissRequest = navigator::pop, ) } private class Model( private val track: DbAnimeTrack, private val tracker: Tracker, ) : StateScreenModel(State(track.status)) { fun getSelections(): Map { return tracker.animeService.getStatusListAnime().associateWith { (tracker as? AnimeTracker)?.getStatusForAnime(it) } } fun setSelection(selection: Long) { mutableState.update { it.copy(selection = selection) } } fun setStatus() { screenModelScope.launchNonCancellable { tracker.animeService.setRemoteAnimeStatus(track.toDbTrack(), state.value.selection) } } @Immutable data class State( val selection: Long, ) } } private data class TrackEpisodeSelectorScreen( private val track: DbAnimeTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() TrackItemSelector( selection = state.selection, onSelectionChange = screenModel::setSelection, range = remember { screenModel.getRange() }, onConfirm = { screenModel.setEpisode() navigator.pop() }, onDismissRequest = navigator::pop, isManga = false, ) } private class Model( private val track: DbAnimeTrack, private val tracker: Tracker, ) : StateScreenModel(State(track.lastEpisodeSeen.toInt())) { fun getRange(): Iterable { val endRange = if (track.totalEpisodes > 0) { track.totalEpisodes } else { 10000 } return 0..endRange.toInt() } fun setSelection(selection: Int) { mutableState.update { it.copy(selection = selection) } } fun setEpisode() { screenModelScope.launchNonCancellable { tracker.animeService.setRemoteLastEpisodeSeen( track.toDbTrack(), state.value.selection, ) } } @Immutable data class State( val selection: Int, ) } } private data class TrackScoreSelectorScreen( private val track: DbAnimeTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() TrackScoreSelector( selection = state.selection, onSelectionChange = screenModel::setSelection, selections = remember { screenModel.getSelections() }, onConfirm = { screenModel.setScore() navigator.pop() }, onDismissRequest = navigator::pop, ) } private class Model( private val track: DbAnimeTrack, private val tracker: Tracker, ) : StateScreenModel(State(tracker.animeService.displayScore(track))) { fun getSelections(): ImmutableList { return tracker.animeService.getScoreList() } fun setSelection(selection: String) { mutableState.update { it.copy(selection = selection) } } fun setScore() { screenModelScope.launchNonCancellable { tracker.animeService.setRemoteScore(track.toDbTrack(), state.value.selection) } } @Immutable data class State( val selection: String, ) } } private data class TrackDateSelectorScreen( private val track: DbAnimeTrack, private val serviceId: Long, private val start: Boolean, ) : Screen() { @Transient private val selectableDates = object : SelectableDates { override fun isSelectableDate(utcTimeMillis: Long): Boolean { val dateToCheck = Instant.ofEpochMilli(utcTimeMillis) .atZone(ZoneOffset.systemDefault()) .toLocalDate() if (dateToCheck > LocalDate.now()) { // Disallow future dates return false } return if (start && track.finishDate > 0) { // Disallow start date to be set later than finish date val dateFinished = Instant.ofEpochMilli(track.finishDate) .atZone(ZoneId.systemDefault()) .toLocalDate() dateToCheck <= dateFinished } else if (!start && track.startDate > 0) { // Disallow end date to be set earlier than start date val dateStarted = Instant.ofEpochMilli(track.startDate) .atZone(ZoneId.systemDefault()) .toLocalDate() dateToCheck >= dateStarted } else { // Nothing set before true } } override fun isSelectableYear(year: Int): Boolean { if (year > LocalDate.now().year) { // Disallow future dates return false } return if (start && track.finishDate > 0) { // Disallow start date to be set later than finish date val dateFinished = Instant.ofEpochMilli(track.finishDate) .atZone(ZoneId.systemDefault()) .toLocalDate() .year year <= dateFinished } else if (!start && track.startDate > 0) { // Disallow end date to be set earlier than start date val dateStarted = Instant.ofEpochMilli(track.startDate) .atZone(ZoneId.systemDefault()) .toLocalDate() .year year >= dateStarted } else { // Nothing set before true } } } @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, start = start, ) } val canRemove = if (start) { track.startDate > 0 } else { track.finishDate > 0 } TrackDateSelector( title = if (start) { stringResource(MR.strings.track_started_reading_date) } else { stringResource(MR.strings.track_finished_reading_date) }, initialSelectedDateMillis = screenModel.initialSelection, selectableDates = selectableDates, onConfirm = { screenModel.setDate(it) navigator.pop() }, onRemove = { screenModel.confirmRemoveDate(navigator) }.takeIf { canRemove }, onDismissRequest = navigator::pop, ) } private class Model( private val track: DbAnimeTrack, private val tracker: Tracker, private val start: Boolean, ) : ScreenModel { // In UTC val initialSelection: Long get() { val millis = (if (start) track.startDate else track.finishDate) .takeIf { it != 0L } ?: Instant.now().toEpochMilli() return millis.convertEpochMillisZone(ZoneOffset.systemDefault(), ZoneOffset.UTC) } // In UTC fun setDate(millis: Long) { // Convert to local time val localMillis = millis.convertEpochMillisZone(ZoneOffset.UTC, ZoneOffset.systemDefault()) screenModelScope.launchNonCancellable { if (start) { tracker.animeService.setRemoteStartDate(track.toDbTrack(), localMillis) } else { tracker.animeService.setRemoteFinishDate(track.toDbTrack(), localMillis) } } } fun confirmRemoveDate(navigator: Navigator) { navigator.push(TrackDateRemoverScreen(track, tracker.id, start)) } } } private data class TrackDateRemoverScreen( private val track: DbAnimeTrack, private val serviceId: Long, private val start: Boolean, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, start = start, ) } AlertDialogContent( modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars), icon = { Icon( imageVector = Icons.Default.Delete, contentDescription = null, ) }, title = { Text( text = stringResource(MR.strings.track_remove_date_conf_title), textAlign = TextAlign.Center, ) }, text = { val serviceName = screenModel.getName() Text( text = if (start) { stringResource(MR.strings.track_remove_start_date_conf_text, serviceName) } else { stringResource(MR.strings.track_remove_finish_date_conf_text, serviceName) }, ) }, buttons = { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy( MaterialTheme.padding.small, Alignment.End, ), ) { TextButton(onClick = navigator::pop) { Text(text = stringResource(MR.strings.action_cancel)) } FilledTonalButton( onClick = { screenModel.removeDate() navigator.popUntil { it is AnimeTrackInfoDialogHomeScreen } }, colors = ButtonDefaults.filledTonalButtonColors( containerColor = MaterialTheme.colorScheme.errorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer, ), ) { Text(text = stringResource(MR.strings.action_remove)) } } }, ) } private class Model( private val track: DbAnimeTrack, private val tracker: Tracker, private val start: Boolean, ) : ScreenModel { fun getName() = tracker.name fun removeDate() { screenModelScope.launchNonCancellable { if (start) { tracker.animeService.setRemoteStartDate(track.toDbTrack(), 0) } else { tracker.animeService.setRemoteFinishDate(track.toDbTrack(), 0) } } } } } data class TrackServiceSearchScreen( private val animeId: Long, private val initialQuery: String, private val currentUrl: String?, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( animeId = animeId, currentUrl = currentUrl, initialQuery = initialQuery, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() val textFieldState = rememberTextFieldState(initialQuery) AnimeTrackerSearch( state = textFieldState, onDispatchQuery = { screenModel.trackingSearch(textFieldState.text.toString()) }, queryResult = state.queryResult, selected = state.selected, onSelectedChange = screenModel::updateSelection, onConfirmSelection = f@{ private: Boolean -> val selected = state.selected ?: return@f selected.private = private screenModel.registerTracking(selected) navigator.pop() }, onDismissRequest = navigator::pop, supportsPrivateTracking = screenModel.supportsPrivateTracking, ) } private class Model( private val animeId: Long, private val currentUrl: String? = null, initialQuery: String, private val tracker: Tracker, ) : StateScreenModel(State()) { val supportsPrivateTracking = tracker.supportsPrivateTracking init { // Run search on first launch if (initialQuery.isNotBlank()) { trackingSearch(initialQuery) } } fun trackingSearch(query: String) { screenModelScope.launch { // To show loading state mutableState.update { it.copy(queryResult = null, selected = null) } val result = withIOContext { try { val results = tracker.animeService.searchAnime(query) Result.success(results) } catch (e: Throwable) { Result.failure(e) } } mutableState.update { oldState -> oldState.copy( queryResult = result, selected = result.getOrNull()?.find { it.tracking_url == currentUrl }, ) } } } fun registerTracking(item: AnimeTrackSearch) { screenModelScope.launchNonCancellable { tracker.animeService.register(item, animeId) } } fun updateSelection(selected: AnimeTrackSearch) { mutableState.update { it.copy(selected = selected) } } @Immutable data class State( val queryResult: Result>? = null, val selected: AnimeTrackSearch? = null, ) } } private data class TrackerAnimeRemoveScreen( private val animeId: Long, private val track: AnimeTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( animeId = animeId, track = track, tracker = Injekt.get().get(serviceId)!!, ) } val serviceName = screenModel.getName() var removeRemoteTrack by remember { mutableStateOf(false) } AlertDialogContent( modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars), icon = { Icon( imageVector = Icons.Default.Delete, contentDescription = null, ) }, title = { Text( text = stringResource(MR.strings.track_delete_title, serviceName), textAlign = TextAlign.Center, ) }, text = { Column( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Text( text = stringResource(MR.strings.track_delete_text, serviceName), ) if (screenModel.isDeletable()) { LabeledCheckbox( label = stringResource(MR.strings.track_delete_remote_text, serviceName), checked = removeRemoteTrack, onCheckedChange = { removeRemoteTrack = it }, ) } } }, buttons = { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy( MaterialTheme.padding.small, Alignment.End, ), ) { TextButton(onClick = navigator::pop) { Text(text = stringResource(MR.strings.action_cancel)) } FilledTonalButton( onClick = { screenModel.unregisterTracking(serviceId) if (removeRemoteTrack) screenModel.deleteAnimeFromService() navigator.pop() }, colors = ButtonDefaults.filledTonalButtonColors( containerColor = MaterialTheme.colorScheme.errorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer, ), ) { Text(text = stringResource(MR.strings.action_ok)) } } }, ) } private class Model( private val animeId: Long, private val track: AnimeTrack, private val tracker: Tracker, private val deleteTrack: DeleteAnimeTrack = Injekt.get(), ) : ScreenModel { fun getName() = tracker.name fun isDeletable() = tracker is DeletableAnimeTracker fun deleteAnimeFromService() { screenModelScope.launchNonCancellable { try { (tracker as DeletableAnimeTracker).delete(track) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to delete anime entry from service" } } } } fun unregisterTracking(serviceId: Long) { screenModelScope.launchNonCancellable { deleteTrack.await(animeId, serviceId) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/track/AnimeTrackItem.kt ================================================ package eu.kanade.tachiyomi.ui.entries.anime.track import eu.kanade.tachiyomi.data.track.Tracker import tachiyomi.domain.track.anime.model.AnimeTrack data class AnimeTrackItem(val track: AnimeTrack?, val tracker: Tracker) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/MangaCoverScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.entries.manga import android.content.Context import android.net.Uri import androidx.compose.material3.SnackbarHostState import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import coil3.asDrawable import coil3.imageLoader import coil3.request.ImageRequest import coil3.size.Size import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.saver.Image import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.saver.Location import eu.kanade.tachiyomi.util.editCover import eu.kanade.tachiyomi.util.system.getBitmapOrNull import eu.kanade.tachiyomi.util.system.toShareIntent import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.i18n.MR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaCoverScreenModel( private val mangaId: Long, private val getManga: GetManga = Injekt.get(), private val imageSaver: ImageSaver = Injekt.get(), private val coverCache: MangaCoverCache = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), val snackbarHostState: SnackbarHostState = SnackbarHostState(), ) : StateScreenModel(null) { init { screenModelScope.launchIO { getManga.subscribe(mangaId) .collect { newManga -> mutableState.update { newManga } } } } fun saveCover(context: Context) { screenModelScope.launch { try { saveCoverInternal(context, temp = false) snackbarHostState.showSnackbar( context.stringResource(MR.strings.cover_saved), withDismissAction = true, ) } catch (e: Throwable) { logcat(LogPriority.ERROR, e) snackbarHostState.showSnackbar( context.stringResource(MR.strings.error_saving_cover), withDismissAction = true, ) } } } fun shareCover(context: Context) { screenModelScope.launch { try { val uri = saveCoverInternal(context, temp = true) ?: return@launch withUIContext { context.startActivity(uri.toShareIntent(context)) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) snackbarHostState.showSnackbar( context.stringResource(MR.strings.error_sharing_cover), withDismissAction = true, ) } } } /** * Save manga cover Bitmap to picture or temporary share directory. * * @param context The context for building and executing the ImageRequest * @return the uri to saved file */ private suspend fun saveCoverInternal(context: Context, temp: Boolean): Uri? { val manga = state.value ?: return null val req = ImageRequest.Builder(context) .data(manga) .size(Size.ORIGINAL) .build() return withIOContext { val result = context.imageLoader.execute(req).image?.asDrawable(context.resources) // TODO: Handle animated cover val bitmap = result?.getBitmapOrNull() ?: return@withIOContext null imageSaver.save( Image.Cover( bitmap = bitmap, name = manga.title, location = if (temp) Location.Cache else Location.Pictures.create(), ), ) } } /** * Update cover with local file. * * @param context Context. * @param data uri of the cover resource. */ fun editCover(context: Context, data: Uri) { val manga = state.value ?: return screenModelScope.launchIO { context.contentResolver.openInputStream(data)?.use { try { manga.editCover(Injekt.get(), it, updateManga, coverCache) notifyCoverUpdated(context) } catch (e: Exception) { notifyFailedCoverUpdate(context, e) } } } } fun deleteCustomCover(context: Context) { val mangaId = state.value?.id ?: return screenModelScope.launchIO { try { coverCache.deleteCustomCover(mangaId) updateManga.awaitUpdateCoverLastModified(mangaId) notifyCoverUpdated(context) } catch (e: Exception) { notifyFailedCoverUpdate(context, e) } } } private fun notifyCoverUpdated(context: Context) { screenModelScope.launch { snackbarHostState.showSnackbar( context.stringResource(MR.strings.cover_updated), withDismissAction = true, ) } } private fun notifyFailedCoverUpdate(context: Context, e: Throwable) { screenModelScope.launch { snackbarHostState.showSnackbar( context.stringResource(MR.strings.notification_cover_update_failed), withDismissAction = true, ) logcat(LogPriority.ERROR, e) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/MangaScreen.kt ================================================ package eu.kanade.tachiyomi.ui.entries.manga import android.content.Context import android.content.Intent import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback import androidx.core.net.toUri import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.core.util.ifMangaSourcesLoaded import eu.kanade.domain.entries.manga.model.hasCustomCover import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.components.NavigatorAdaptiveSheet import eu.kanade.presentation.entries.EditCoverAction import eu.kanade.presentation.entries.components.DeleteItemsDialog import eu.kanade.presentation.entries.components.SetIntervalDialog import eu.kanade.presentation.entries.manga.ChapterSettingsDialog import eu.kanade.presentation.entries.manga.DuplicateMangaDialog import eu.kanade.presentation.entries.manga.MangaScreen import eu.kanade.presentation.entries.manga.components.MangaCoverDialog import eu.kanade.presentation.entries.manga.components.ScanlatorFilterDialog import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.isTabletUi import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.source.manga.isLocalOrStub import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaDialog import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaDialogScreenModel import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaSearchScreen import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreen import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.manga.track.MangaTrackInfoDialogHomeScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryTab import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.setting.SettingsScreen import eu.kanade.tachiyomi.ui.webview.WebViewScreen import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.i18n.MR import tachiyomi.presentation.core.screens.LoadingScreen class MangaScreen( private val mangaId: Long, val fromSource: Boolean = false, ) : Screen(), AssistContentScreen { private var assistUrl: String? = null override fun onProvideAssistUrl() = assistUrl @Composable override fun Content() { if (!ifMangaSourcesLoaded()) { LoadingScreen() return } val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val haptic = LocalHapticFeedback.current val scope = rememberCoroutineScope() val lifecycleOwner = LocalLifecycleOwner.current val screenModel = rememberScreenModel { MangaScreenModel(context, lifecycleOwner.lifecycle, mangaId, fromSource) } val state by screenModel.state.collectAsStateWithLifecycle() if (state is MangaScreenModel.State.Loading) { LoadingScreen() return } val successState = state as MangaScreenModel.State.Success val isHttpSource = remember { successState.source is HttpSource } LaunchedEffect(successState.manga, screenModel.source) { if (isHttpSource) { try { withIOContext { assistUrl = getMangaUrl(screenModel.manga, screenModel.source) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to get manga URL" } } } } MangaScreen( state = successState, snackbarHostState = screenModel.snackbarHostState, nextUpdate = successState.manga.expectedNextUpdate, isTabletUi = isTabletUi(), chapterSwipeStartAction = screenModel.chapterSwipeStartAction, chapterSwipeEndAction = screenModel.chapterSwipeEndAction, navigateUp = navigator::pop, onChapterClicked = { openChapter(context, it) }, onDownloadChapter = screenModel::runChapterDownloadActions.takeIf { !successState.source.isLocalOrStub() }, onAddToLibraryClicked = { screenModel.toggleFavorite() haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, onWebViewClicked = { openMangaInWebView( navigator, screenModel.manga, screenModel.source, ) }.takeIf { isHttpSource }, onWebViewLongClicked = { copyMangaUrl( context, screenModel.manga, screenModel.source, ) }.takeIf { isHttpSource }, onTrackingClicked = { if (!successState.hasLoggedInTrackers) { navigator.push(SettingsScreen(SettingsScreen.Destination.Tracking)) } else { screenModel.showTrackDialog() } }, onTagSearch = { scope.launch { performGenreSearch(navigator, it, screenModel.source!!) } }, onFilterButtonClicked = screenModel::showSettingsDialog, onRefresh = screenModel::fetchAllFromSource, onContinueReading = { continueReading(context, screenModel.getNextUnreadChapter()) }, onSearch = { query, global -> scope.launch { performSearch(navigator, query, global) } }, onCoverClicked = screenModel::showCoverDialog, onShareClicked = { shareManga(context, screenModel.manga, screenModel.source) }.takeIf { isHttpSource }, onDownloadActionClicked = screenModel::runDownloadAction.takeIf { !successState.source.isLocalOrStub() }, onEditCategoryClicked = screenModel::showChangeCategoryDialog.takeIf { successState.manga.favorite }, onEditFetchIntervalClicked = screenModel::showSetMangaFetchIntervalDialog.takeIf { successState.manga.favorite }, onMigrateClicked = { navigator.push(MigrateMangaSearchScreen(successState.manga.id)) }.takeIf { successState.manga.favorite }, onMultiBookmarkClicked = screenModel::bookmarkChapters, onMultiMarkAsReadClicked = screenModel::markChaptersRead, onMarkPreviousAsReadClicked = screenModel::markPreviousChapterRead, onMultiDeleteClicked = screenModel::showDeleteChapterDialog, onChapterSwipe = screenModel::chapterSwipe, onChapterSelected = screenModel::toggleSelection, onAllChapterSelected = screenModel::toggleAllSelection, onInvertSelection = screenModel::invertSelection, ) var showScanlatorsDialog by remember { mutableStateOf(false) } val onDismissRequest = { screenModel.dismissDialog() if (screenModel.autoOpenTrack && screenModel.isFromChangeCategory) { screenModel.isFromChangeCategory = false screenModel.showTrackDialog() } } when (val dialog = successState.dialog) { null -> {} is MangaScreenModel.Dialog.ChangeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { navigator.push(CategoriesTab) CategoriesTab.showMangaCategory() }, onConfirm = { include, _ -> screenModel.moveMangaToCategoriesAndAddToLibrary(dialog.manga, include) }, ) } is MangaScreenModel.Dialog.DeleteChapters -> { DeleteItemsDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.toggleAllSelection(false) screenModel.deleteChapters(dialog.chapters) }, isManga = true, ) } is MangaScreenModel.Dialog.DuplicateManga -> { DuplicateMangaDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.toggleFavorite(onRemoved = {}, checkDuplicate = false) }, onOpenManga = { navigator.push(MangaScreen(dialog.duplicate.id)) }, onMigrate = { screenModel.showMigrateDialog(dialog.duplicate) }, ) } is MangaScreenModel.Dialog.Migrate -> { MigrateMangaDialog( oldManga = dialog.oldManga, newManga = dialog.newManga, screenModel = MigrateMangaDialogScreenModel(), onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(MangaScreen(dialog.oldManga.id)) }, onPopScreen = { navigator.replace(MangaScreen(dialog.newManga.id)) }, ) } MangaScreenModel.Dialog.SettingsSheet -> ChapterSettingsDialog( onDismissRequest = onDismissRequest, manga = successState.manga, onDownloadFilterChanged = screenModel::setDownloadedFilter, onUnreadFilterChanged = screenModel::setUnreadFilter, onBookmarkedFilterChanged = screenModel::setBookmarkedFilter, onSortModeChanged = screenModel::setSorting, onDisplayModeChanged = screenModel::setDisplayMode, onSetAsDefault = screenModel::setCurrentSettingsAsDefault, onResetToDefault = screenModel::resetToDefaultSettings, scanlatorFilterActive = successState.scanlatorFilterActive, onScanlatorFilterClicked = { showScanlatorsDialog = true }, ) MangaScreenModel.Dialog.TrackSheet -> { NavigatorAdaptiveSheet( screen = MangaTrackInfoDialogHomeScreen( mangaId = successState.manga.id, mangaTitle = successState.manga.title, sourceId = successState.source.id, ), enableSwipeDismiss = { it.lastItem is MangaTrackInfoDialogHomeScreen }, onDismissRequest = onDismissRequest, ) } MangaScreenModel.Dialog.FullCover -> { val sm = rememberScreenModel { MangaCoverScreenModel(successState.manga.id) } val manga by sm.state.collectAsState() if (manga != null) { val getContent = rememberLauncherForActivityResult( ActivityResultContracts.GetContent(), ) { if (it == null) return@rememberLauncherForActivityResult sm.editCover(context, it) } MangaCoverDialog( manga = manga!!, snackbarHostState = sm.snackbarHostState, isCustomCover = remember(manga) { manga!!.hasCustomCover() }, onShareClick = { sm.shareCover(context) }, onSaveClick = { sm.saveCover(context) }, onEditClick = { when (it) { EditCoverAction.EDIT -> getContent.launch("image/*") EditCoverAction.DELETE -> sm.deleteCustomCover(context) } }, onDismissRequest = onDismissRequest, ) } else { LoadingScreen(Modifier.systemBarsPadding()) } } is MangaScreenModel.Dialog.SetMangaFetchInterval -> { SetIntervalDialog( interval = dialog.manga.fetchInterval, nextUpdate = dialog.manga.expectedNextUpdate, onDismissRequest = onDismissRequest, isManga = true, onValueChanged = { interval: Int -> screenModel.setFetchInterval(dialog.manga, interval) } .takeIf { screenModel.isUpdateIntervalEnabled }, ) } } if (showScanlatorsDialog) { ScanlatorFilterDialog( availableScanlators = successState.availableScanlators, excludedScanlators = successState.excludedScanlators, onDismissRequest = { showScanlatorsDialog = false }, onConfirm = screenModel::setExcludedScanlators, ) } } private fun continueReading(context: Context, unreadChapter: Chapter?) { if (unreadChapter != null) openChapter(context, unreadChapter) } private fun openChapter(context: Context, chapter: Chapter) { context.startActivity(ReaderActivity.newIntent(context, chapter.mangaId, chapter.id)) } private fun getMangaUrl(manga_: Manga?, source_: MangaSource?): String? { val manga = manga_ ?: return null val source = source_ as? HttpSource ?: return null return try { source.getMangaUrl(manga.toSManga()) } catch (e: Exception) { null } } private fun openMangaInWebView(navigator: Navigator, manga_: Manga?, source_: MangaSource?) { getMangaUrl(manga_, source_)?.let { url -> navigator.push( WebViewScreen( url = url, initialTitle = manga_?.title, sourceId = source_?.id, ), ) } } private fun shareManga(context: Context, manga_: Manga?, source_: MangaSource?) { try { getMangaUrl(manga_, source_)?.let { url -> val intent = url.toUri().toShareIntent(context, type = "text/plain") context.startActivity( Intent.createChooser( intent, context.stringResource(MR.strings.action_share), ), ) } } catch (e: Exception) { context.toast(e.message) } } /** * Perform a search using the provided query. * * @param query the search query to the parent controller */ private suspend fun performSearch(navigator: Navigator, query: String, global: Boolean) { if (global) { navigator.push(GlobalMangaSearchScreen(query)) return } if (navigator.size < 2) { return } when (val previousController = navigator.items[navigator.size - 2]) { is HomeScreen -> { navigator.pop() MangaLibraryTab.search(query) } is BrowseMangaSourceScreen -> { navigator.pop() previousController.search(query) } } } /** * Performs a genre search using the provided genre name. * * @param genreName the search genre to the parent controller */ private suspend fun performGenreSearch( navigator: Navigator, genreName: String, source: MangaSource, ) { if (navigator.size < 2) { return } val previousController = navigator.items[navigator.size - 2] if (previousController is BrowseMangaSourceScreen && source is HttpSource) { navigator.pop() previousController.searchGenre(genreName) } else { performSearch(navigator, genreName, global = false) } } /** * Copy Manga URL to Clipboard */ private fun copyMangaUrl(context: Context, manga_: Manga?, source_: MangaSource?) { val manga = manga_ ?: return val source = source_ as? HttpSource ?: return val url = source.getMangaUrl(manga.toSManga()) context.copyToClipboard(url, url) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/MangaScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.entries.manga import android.content.Context import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult import androidx.compose.runtime.Immutable import androidx.compose.runtime.getValue import androidx.compose.ui.util.fastAny import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.asState import eu.kanade.core.util.addOrRemove import eu.kanade.core.util.insertSeparators import eu.kanade.domain.entries.manga.interactor.GetExcludedScanlators import eu.kanade.domain.entries.manga.interactor.SetExcludedScanlators import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.entries.manga.model.chaptersFiltered import eu.kanade.domain.entries.manga.model.downloadedFilter import eu.kanade.domain.entries.manga.model.toSManga import eu.kanade.domain.items.chapter.interactor.GetAvailableScanlators import eu.kanade.domain.items.chapter.interactor.SetReadStatus import eu.kanade.domain.items.chapter.interactor.SyncChaptersWithSource import eu.kanade.domain.track.manga.interactor.AddMangaTracks import eu.kanade.domain.track.manga.interactor.RefreshMangaTracks import eu.kanade.domain.track.manga.interactor.TrackChapter import eu.kanade.domain.track.model.AutoTrackState import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.presentation.entries.DownloadAction import eu.kanade.presentation.entries.manga.components.ChapterDownloadAction import eu.kanade.presentation.util.formattedMessage import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.download.manga.model.MangaDownload import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.network.HttpException import eu.kanade.tachiyomi.source.MangaSource import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.chapter.getNextUnread import eu.kanade.tachiyomi.util.removeCovers import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import logcat.LogPriority import mihon.domain.items.chapter.interactor.FilterChaptersForDownload import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.preference.mapAsCheckboxState import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.applyFilter import tachiyomi.domain.entries.manga.interactor.GetDuplicateLibraryManga import tachiyomi.domain.entries.manga.interactor.GetMangaWithChapters import tachiyomi.domain.entries.manga.interactor.SetMangaChapterFlags import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.repository.MangaRepository import tachiyomi.domain.items.chapter.interactor.SetMangaDefaultChapterFlags import tachiyomi.domain.items.chapter.interactor.UpdateChapter import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.items.chapter.model.ChapterUpdate import tachiyomi.domain.items.chapter.model.NoChaptersException import tachiyomi.domain.items.chapter.service.calculateChapterGap import tachiyomi.domain.items.chapter.service.getChapterSort import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.source.local.entries.manga.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.math.floor class MangaScreenModel( private val context: Context, private val lifecycle: Lifecycle, private val mangaId: Long, private val isFromSource: Boolean, private val libraryPreferences: LibraryPreferences = Injekt.get(), private val trackPreferences: TrackPreferences = Injekt.get(), readerPreferences: ReaderPreferences = Injekt.get(), private val trackerManager: TrackerManager = Injekt.get(), private val trackChapter: TrackChapter = Injekt.get(), private val downloadManager: MangaDownloadManager = Injekt.get(), private val downloadCache: MangaDownloadCache = Injekt.get(), private val getMangaAndChapters: GetMangaWithChapters = Injekt.get(), private val getDuplicateLibraryManga: GetDuplicateLibraryManga = Injekt.get(), private val getAvailableScanlators: GetAvailableScanlators = Injekt.get(), private val getExcludedScanlators: GetExcludedScanlators = Injekt.get(), private val setExcludedScanlators: SetExcludedScanlators = Injekt.get(), private val setMangaChapterFlags: SetMangaChapterFlags = Injekt.get(), private val setMangaDefaultChapterFlags: SetMangaDefaultChapterFlags = Injekt.get(), private val setReadStatus: SetReadStatus = Injekt.get(), private val updateChapter: UpdateChapter = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val getTracks: GetMangaTracks = Injekt.get(), private val addTracks: AddMangaTracks = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(), private val mangaRepository: MangaRepository = Injekt.get(), private val filterChaptersForDownload: FilterChaptersForDownload = Injekt.get(), val snackbarHostState: SnackbarHostState = SnackbarHostState(), ) : StateScreenModel(State.Loading) { private val successState: State.Success? get() = state.value as? State.Success val manga: Manga? get() = successState?.manga val source: MangaSource? get() = successState?.source private val isFavorited: Boolean get() = manga?.favorite ?: false private val allChapters: List? get() = successState?.chapters private val filteredChapters: List? get() = successState?.processedChapters val chapterSwipeStartAction = libraryPreferences.swipeChapterEndAction().get() val chapterSwipeEndAction = libraryPreferences.swipeChapterStartAction().get() var autoTrackState = trackPreferences.autoUpdateTrackOnMarkRead().get() private val skipFiltered by readerPreferences.skipFiltered().asState(screenModelScope) val isUpdateIntervalEnabled = LibraryPreferences.ENTRY_OUTSIDE_RELEASE_PERIOD in libraryPreferences.autoUpdateItemRestrictions().get() private val selectedPositions: Array = arrayOf(-1, -1) // first and last selected index in list private val selectedChapterIds: HashSet = HashSet() internal var isFromChangeCategory: Boolean = false internal val autoOpenTrack: Boolean get() = successState?.trackingAvailable == true && trackPreferences.trackOnAddingToLibrary().get() /** * Helper function to update the UI state only if it's currently in success state */ private inline fun updateSuccessState(func: (State.Success) -> State.Success) { mutableState.update { when (it) { State.Loading -> it is State.Success -> func(it) } } } init { screenModelScope.launchIO { combine( getMangaAndChapters.subscribe(mangaId, applyScanlatorFilter = true).distinctUntilChanged(), downloadCache.changes, downloadManager.queueState, ) { mangaAndChapters, _, _ -> mangaAndChapters } .flowWithLifecycle(lifecycle) .collectLatest { (manga, chapters) -> updateSuccessState { it.copy( manga = manga, chapters = chapters.toChapterListItems(manga), ) } } } screenModelScope.launchIO { getExcludedScanlators.subscribe(mangaId) .flowWithLifecycle(lifecycle) .distinctUntilChanged() .collectLatest { excludedScanlators -> updateSuccessState { it.copy(excludedScanlators = excludedScanlators) } } } screenModelScope.launchIO { getAvailableScanlators.subscribe(mangaId) .flowWithLifecycle(lifecycle) .distinctUntilChanged() .collectLatest { availableScanlators -> updateSuccessState { it.copy(availableScanlators = availableScanlators) } } } observeDownloads() screenModelScope.launchIO { val manga = getMangaAndChapters.awaitManga(mangaId) val chapters = getMangaAndChapters.awaitChapters(mangaId, applyScanlatorFilter = true) .toChapterListItems(manga) if (!manga.favorite) { setMangaDefaultChapterFlags.await(manga) } val needRefreshInfo = !manga.initialized val needRefreshChapter = chapters.isEmpty() // Show what we have earlier mutableState.update { State.Success( manga = manga, source = Injekt.get().getOrStub(manga.source), isFromSource = isFromSource, chapters = chapters, availableScanlators = getAvailableScanlators.await(mangaId), excludedScanlators = getExcludedScanlators.await(mangaId), isRefreshingData = needRefreshInfo || needRefreshChapter, dialog = null, ) } // Start observe tracking since it only needs mangaId observeTrackers() // Fetch info-chapters when needed if (screenModelScope.isActive) { val fetchFromSourceTasks = listOf( async { if (needRefreshInfo) fetchMangaFromSource() }, async { if (needRefreshChapter) fetchChaptersFromSource() }, ) fetchFromSourceTasks.awaitAll() } // Initial loading finished updateSuccessState { it.copy(isRefreshingData = false) } } } fun fetchAllFromSource(manualFetch: Boolean = true) { screenModelScope.launch { updateSuccessState { it.copy(isRefreshingData = true) } val fetchFromSourceTasks = listOf( async { fetchMangaFromSource(manualFetch) }, async { fetchChaptersFromSource(manualFetch) }, ) fetchFromSourceTasks.awaitAll() updateSuccessState { it.copy(isRefreshingData = false) } } } // Manga info - start /** * Fetch manga information from source. */ private suspend fun fetchMangaFromSource(manualFetch: Boolean = false) { val state = successState ?: return try { withIOContext { val networkManga = state.source.getMangaDetails(state.manga.toSManga()) updateManga.awaitUpdateFromSource(state.manga, networkManga, manualFetch) } } catch (e: Throwable) { // Ignore early hints "errors" that aren't handled by OkHttp if (e is HttpException && e.code == 103) return logcat(LogPriority.ERROR, e) screenModelScope.launch { snackbarHostState.showSnackbar(message = with(context) { e.formattedMessage }) } } } fun toggleFavorite() { toggleFavorite( onRemoved = { screenModelScope.launch { if (!hasDownloads()) return@launch val result = snackbarHostState.showSnackbar( message = context.stringResource(MR.strings.delete_downloads_for_manga), actionLabel = context.stringResource(MR.strings.action_delete), withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed) { deleteDownloads() } } }, ) } /** * Update favorite status of manga, (removes / adds) manga (to / from) library. */ fun toggleFavorite( onRemoved: () -> Unit, checkDuplicate: Boolean = true, ) { val state = successState ?: return screenModelScope.launchIO { val manga = state.manga if (isFavorited) { // Remove from library if (updateManga.awaitUpdateFavorite(manga.id, false)) { // Remove covers and update last modified in db if (manga.removeCovers() != manga) { updateManga.awaitUpdateCoverLastModified(manga.id) } withUIContext { onRemoved() } } } else { // Add to library // First, check if duplicate exists if callback is provided if (checkDuplicate) { val duplicate = getDuplicateLibraryManga.await(manga).getOrNull(0) if (duplicate != null) { updateSuccessState { it.copy( dialog = Dialog.DuplicateManga(manga, duplicate), ) } return@launchIO } } // Now check if user previously set categories, when available val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultMangaCategory().get().toLong() val defaultCategory = categories.find { it.id == defaultCategoryId } when { // Default category set defaultCategory != null -> { val result = updateManga.awaitUpdateFavorite(manga.id, true) if (!result) return@launchIO moveMangaToCategory(defaultCategory) } // Automatic 'Default' or no categories defaultCategoryId == 0L || categories.isEmpty() -> { val result = updateManga.awaitUpdateFavorite(manga.id, true) if (!result) return@launchIO moveMangaToCategory(null) } // Choose a category else -> { isFromChangeCategory = true showChangeCategoryDialog() } } // Finally match with enhanced tracking when available addTracks.bindEnhancedTrackers(manga, state.source) if (autoOpenTrack) { showTrackDialog() } } } } fun showChangeCategoryDialog() { val manga = successState?.manga ?: return screenModelScope.launch { val categories = getCategories() val selection = getMangaCategoryIds(manga) updateSuccessState { successState -> successState.copy( dialog = Dialog.ChangeCategory( manga = manga, initialSelection = categories.mapAsCheckboxState { it.id in selection }.toImmutableList(), ), ) } } } fun showSetMangaFetchIntervalDialog() { val manga = successState?.manga ?: return updateSuccessState { it.copy(dialog = Dialog.SetMangaFetchInterval(manga)) } } fun setFetchInterval(manga: Manga, interval: Int) { screenModelScope.launchIO { if ( updateManga.awaitUpdateFetchInterval( // Custom intervals are negative manga.copy(fetchInterval = -interval), ) ) { val updatedManga = mangaRepository.getMangaById(manga.id) updateSuccessState { it.copy(manga = updatedManga) } } } } /** * Returns true if the manga has any downloads. */ private fun hasDownloads(): Boolean { val manga = successState?.manga ?: return false return downloadManager.getDownloadCount(manga) > 0 } /** * Deletes all the downloads for the manga. */ private fun deleteDownloads() { val state = successState ?: return downloadManager.deleteManga(state.manga, state.source) } /** * Get user categories. * * @return List of categories, not including the default category */ suspend fun getCategories(): List { return getCategories.await().filterNot { it.isSystemCategory } } /** * Gets the category id's the manga is in, if the manga is not in a category, returns the default id. * * @param manga the manga to get categories from. * @return Array of category ids the manga is in, if none returns default id */ private suspend fun getMangaCategoryIds(manga: Manga): List { return getCategories.await(manga.id) .map { it.id } } fun moveMangaToCategoriesAndAddToLibrary(manga: Manga, categories: List) { moveMangaToCategory(categories) if (manga.favorite) return screenModelScope.launchIO { updateManga.awaitUpdateFavorite(manga.id, true) } } /** * Move the given manga to categories. * * @param categories the selected categories. */ private fun moveMangaToCategories(categories: List) { val categoryIds = categories.map { it.id } moveMangaToCategory(categoryIds) } private fun moveMangaToCategory(categoryIds: List) { screenModelScope.launchIO { setMangaCategories.await(mangaId, categoryIds) } } /** * Move the given manga to the category. * * @param category the selected category, or null for default category. */ private fun moveMangaToCategory(category: Category?) { moveMangaToCategories(listOfNotNull(category)) } // Manga info - end // Chapters list - start private fun observeDownloads() { screenModelScope.launchIO { downloadManager.statusFlow() .filter { it.manga.id == successState?.manga?.id } .catch { error -> logcat(LogPriority.ERROR, error) } .flowWithLifecycle(lifecycle) .collect { withUIContext { updateDownloadState(it) } } } screenModelScope.launchIO { downloadManager.progressFlow() .filter { it.manga.id == successState?.manga?.id } .catch { error -> logcat(LogPriority.ERROR, error) } .flowWithLifecycle(lifecycle) .collect { withUIContext { updateDownloadState(it) } } } } private fun updateDownloadState(download: MangaDownload) { updateSuccessState { successState -> val modifiedIndex = successState.chapters.indexOfFirst { it.id == download.chapter.id } if (modifiedIndex < 0) return@updateSuccessState successState val newChapters = successState.chapters.toMutableList().apply { val item = removeAt(modifiedIndex) .copy(downloadState = download.status, downloadProgress = download.progress) add(modifiedIndex, item) } successState.copy(chapters = newChapters) } } private fun List.toChapterListItems(manga: Manga): List { val isLocal = manga.isLocal() return map { chapter -> val activeDownload = if (isLocal) { null } else { downloadManager.getQueuedDownloadOrNull(chapter.id) } val downloaded = if (isLocal) { true } else { downloadManager.isChapterDownloaded( chapter.name, chapter.scanlator, manga.title, manga.source, ) } val downloadState = when { activeDownload != null -> activeDownload.status downloaded -> MangaDownload.State.DOWNLOADED else -> MangaDownload.State.NOT_DOWNLOADED } ChapterList.Item( chapter = chapter, downloadState = downloadState, downloadProgress = activeDownload?.progress ?: 0, selected = chapter.id in selectedChapterIds, ) } } /** * Requests an updated list of chapters from the source. */ private suspend fun fetchChaptersFromSource(manualFetch: Boolean = false) { val state = successState ?: return try { withIOContext { val chapters = state.source.getChapterList(state.manga.toSManga()) val newChapters = syncChaptersWithSource.await( chapters, state.manga, state.source, manualFetch, ) if (manualFetch) { downloadNewChapters(newChapters) } } } catch (e: Throwable) { val message = if (e is NoChaptersException) { context.stringResource(MR.strings.no_chapters_error) } else { logcat(LogPriority.ERROR, e) with(context) { e.formattedMessage } } screenModelScope.launch { snackbarHostState.showSnackbar(message = message) } val newManga = mangaRepository.getMangaById(mangaId) updateSuccessState { it.copy(manga = newManga, isRefreshingData = false) } } } /** * @throws IllegalStateException if the swipe action is [LibraryPreferences.ChapterSwipeAction.Disabled] */ fun chapterSwipe(chapterItem: ChapterList.Item, swipeAction: LibraryPreferences.ChapterSwipeAction) { screenModelScope.launch { executeChapterSwipeAction(chapterItem, swipeAction) } } /** * @throws IllegalStateException if the swipe action is [LibraryPreferences.ChapterSwipeAction.Disabled] */ private fun executeChapterSwipeAction( chapterItem: ChapterList.Item, swipeAction: LibraryPreferences.ChapterSwipeAction, ) { val chapter = chapterItem.chapter when (swipeAction) { LibraryPreferences.ChapterSwipeAction.ToggleRead -> { markChaptersRead(listOf(chapter), !chapter.read) } LibraryPreferences.ChapterSwipeAction.ToggleBookmark -> { bookmarkChapters(listOf(chapter), !chapter.bookmark) } LibraryPreferences.ChapterSwipeAction.Download -> { val downloadAction: ChapterDownloadAction = when (chapterItem.downloadState) { MangaDownload.State.ERROR, MangaDownload.State.NOT_DOWNLOADED, -> ChapterDownloadAction.START_NOW MangaDownload.State.QUEUE, MangaDownload.State.DOWNLOADING, -> ChapterDownloadAction.CANCEL MangaDownload.State.DOWNLOADED -> ChapterDownloadAction.DELETE } runChapterDownloadActions( items = listOf(chapterItem), action = downloadAction, ) } LibraryPreferences.ChapterSwipeAction.Disabled -> throw IllegalStateException() } } /** * Returns the next unread chapter or null if everything is read. */ fun getNextUnreadChapter(): Chapter? { val successState = successState ?: return null return successState.chapters.getNextUnread(successState.manga) } private fun getUnreadChapters(): List { val chapterItems = if (skipFiltered) filteredChapters.orEmpty() else allChapters.orEmpty() return chapterItems .filter { (chapter, dlStatus) -> !chapter.read && dlStatus == MangaDownload.State.NOT_DOWNLOADED } .map { it.chapter } } private fun getUnreadChaptersSorted(): List { val manga = successState?.manga ?: return emptyList() val chaptersSorted = getUnreadChapters().sortedWith(getChapterSort(manga)) return if (manga.sortDescending()) chaptersSorted.reversed() else chaptersSorted } private fun startDownload( chapters: List, startNow: Boolean, ) { val successState = successState ?: return screenModelScope.launchNonCancellable { if (startNow) { val chapterId = chapters.singleOrNull()?.id ?: return@launchNonCancellable downloadManager.startDownloadNow(chapterId) } else { downloadChapters(chapters) } if (!isFavorited && !successState.hasPromptedToAddBefore) { updateSuccessState { state -> state.copy(hasPromptedToAddBefore = true) } val result = snackbarHostState.showSnackbar( message = context.stringResource(AYMR.strings.snack_add_to_manga_library), actionLabel = context.stringResource(MR.strings.action_add), withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed && !isFavorited) { toggleFavorite() } } } } fun runChapterDownloadActions( items: List, action: ChapterDownloadAction, ) { when (action) { ChapterDownloadAction.START -> { startDownload(items.map { it.chapter }, false) if (items.any { it.downloadState == MangaDownload.State.ERROR }) { downloadManager.startDownloads() } } ChapterDownloadAction.START_NOW -> { val chapter = items.singleOrNull()?.chapter ?: return startDownload(listOf(chapter), true) } ChapterDownloadAction.CANCEL -> { val chapterId = items.singleOrNull()?.id ?: return cancelDownload(chapterId) } ChapterDownloadAction.DELETE -> { deleteChapters(items.map { it.chapter }) } } } fun runDownloadAction(action: DownloadAction) { val chaptersToDownload = when (action) { DownloadAction.NEXT_1_ITEM -> getUnreadChaptersSorted().take(1) DownloadAction.NEXT_5_ITEMS -> getUnreadChaptersSorted().take(5) DownloadAction.NEXT_10_ITEMS -> getUnreadChaptersSorted().take(10) DownloadAction.NEXT_25_ITEMS -> getUnreadChaptersSorted().take(25) DownloadAction.UNVIEWED_ITEMS -> getUnreadChapters() } if (chaptersToDownload.isNotEmpty()) { startDownload(chaptersToDownload, false) } } private fun cancelDownload(chapterId: Long) { val activeDownload = downloadManager.getQueuedDownloadOrNull(chapterId) ?: return downloadManager.cancelQueuedDownloads(listOf(activeDownload)) updateDownloadState(activeDownload.apply { status = MangaDownload.State.NOT_DOWNLOADED }) } fun markPreviousChapterRead(pointer: Chapter) { val manga = successState?.manga ?: return val chapters = filteredChapters.orEmpty().map { it.chapter } val prevChapters = if (manga.sortDescending()) chapters.asReversed() else chapters val pointerPos = prevChapters.indexOf(pointer) if (pointerPos != -1) markChaptersRead(prevChapters.take(pointerPos), true) } /** * Mark the selected chapter list as read/unread. * @param chapters the list of selected chapters. * @param read whether to mark chapters as read or unread. */ fun markChaptersRead(chapters: List, read: Boolean) { toggleAllSelection(false) if (chapters.isEmpty()) return screenModelScope.launchIO { setReadStatus.await( read = read, chapters = chapters.toTypedArray(), ) if (!read || successState?.hasLoggedInTrackers == false || autoTrackState == AutoTrackState.NEVER) { return@launchIO } refreshTrackers() val tracks = getTracks.await(mangaId) val maxChapterNumber = chapters.maxOf { it.chapterNumber } val shouldPromptTrackingUpdate = tracks.any { track -> maxChapterNumber > track.lastChapterRead } if (!shouldPromptTrackingUpdate) return@launchIO if (autoTrackState == AutoTrackState.ALWAYS) { trackChapter.await(context, mangaId, maxChapterNumber) withUIContext { context.toast( context.stringResource(AYMR.strings.trackers_updated_summary_manga, maxChapterNumber.toInt()), ) } return@launchIO } val result = snackbarHostState.showSnackbar( message = context.stringResource(MR.strings.confirm_tracker_update, maxChapterNumber.toInt()), actionLabel = context.stringResource(MR.strings.action_ok), duration = SnackbarDuration.Short, withDismissAction = true, ) if (result == SnackbarResult.ActionPerformed) { trackChapter.await(context, mangaId, maxChapterNumber) } } } private suspend fun refreshTrackers( refreshTracks: RefreshMangaTracks = Injekt.get(), ) { refreshTracks.await(mangaId) .filter { it.first != null } .forEach { (track, e) -> logcat(LogPriority.ERROR, e) { "Failed to refresh track data mangaId=$mangaId for service ${track!!.id}" } withUIContext { context.toast( context.stringResource( MR.strings.track_error, track!!.name, e.message ?: "", ), ) } } } /** * Downloads the given list of chapters with the manager. * @param chapters the list of chapters to download. */ private fun downloadChapters(chapters: List) { val manga = successState?.manga ?: return downloadManager.downloadChapters(manga, chapters) toggleAllSelection(false) } /** * Bookmarks the given list of chapters. * @param chapters the list of chapters to bookmark. */ fun bookmarkChapters(chapters: List, bookmarked: Boolean) { screenModelScope.launchIO { chapters .filterNot { it.bookmark == bookmarked } .map { ChapterUpdate(id = it.id, bookmark = bookmarked) } .let { updateChapter.awaitAll(it) } } toggleAllSelection(false) } /** * Deletes the given list of chapter. * * @param chapters the list of chapters to delete. */ fun deleteChapters(chapters: List) { screenModelScope.launchNonCancellable { try { successState?.let { state -> downloadManager.deleteChapters( chapters, state.manga, state.source, ) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) } } } private fun downloadNewChapters(chapters: List) { screenModelScope.launchNonCancellable { val manga = successState?.manga ?: return@launchNonCancellable val chaptersToDownload = filterChaptersForDownload.await(manga, chapters) if (chaptersToDownload.isNotEmpty()) { downloadChapters(chaptersToDownload) } } } /** * Sets the read filter and requests an UI update. * @param state whether to display only unread chapters or all chapters. */ fun setUnreadFilter(state: TriState) { val manga = successState?.manga ?: return val flag = when (state) { TriState.DISABLED -> Manga.SHOW_ALL TriState.ENABLED_IS -> Manga.CHAPTER_SHOW_UNREAD TriState.ENABLED_NOT -> Manga.CHAPTER_SHOW_READ } screenModelScope.launchNonCancellable { setMangaChapterFlags.awaitSetUnreadFilter(manga, flag) } } /** * Sets the download filter and requests an UI update. * @param state whether to display only downloaded chapters or all chapters. */ fun setDownloadedFilter(state: TriState) { val manga = successState?.manga ?: return val flag = when (state) { TriState.DISABLED -> Manga.SHOW_ALL TriState.ENABLED_IS -> Manga.CHAPTER_SHOW_DOWNLOADED TriState.ENABLED_NOT -> Manga.CHAPTER_SHOW_NOT_DOWNLOADED } screenModelScope.launchNonCancellable { setMangaChapterFlags.awaitSetDownloadedFilter(manga, flag) } } /** * Sets the bookmark filter and requests an UI update. * @param state whether to display only bookmarked chapters or all chapters. */ fun setBookmarkedFilter(state: TriState) { val manga = successState?.manga ?: return val flag = when (state) { TriState.DISABLED -> Manga.SHOW_ALL TriState.ENABLED_IS -> Manga.CHAPTER_SHOW_BOOKMARKED TriState.ENABLED_NOT -> Manga.CHAPTER_SHOW_NOT_BOOKMARKED } screenModelScope.launchNonCancellable { setMangaChapterFlags.awaitSetBookmarkFilter(manga, flag) } } /** * Sets the active display mode. * @param mode the mode to set. */ fun setDisplayMode(mode: Long) { val manga = successState?.manga ?: return screenModelScope.launchNonCancellable { setMangaChapterFlags.awaitSetDisplayMode(manga, mode) } } /** * Sets the sorting method and requests an UI update. * @param sort the sorting mode. */ fun setSorting(sort: Long) { val manga = successState?.manga ?: return screenModelScope.launchNonCancellable { setMangaChapterFlags.awaitSetSortingModeOrFlipOrder(manga, sort) } } fun setCurrentSettingsAsDefault(applyToExisting: Boolean) { val manga = successState?.manga ?: return screenModelScope.launchNonCancellable { libraryPreferences.setChapterSettingsDefault(manga) if (applyToExisting) { setMangaDefaultChapterFlags.awaitAll() } snackbarHostState.showSnackbar( message = context.stringResource(MR.strings.chapter_settings_updated), ) } } fun resetToDefaultSettings() { val manga = successState?.manga ?: return screenModelScope.launchNonCancellable { setMangaDefaultChapterFlags.await(manga) } } fun toggleSelection( item: ChapterList.Item, selected: Boolean, userSelected: Boolean = false, fromLongPress: Boolean = false, ) { updateSuccessState { successState -> val newChapters = successState.processedChapters.toMutableList().apply { val selectedIndex = successState.processedChapters.indexOfFirst { it.id == item.chapter.id } if (selectedIndex < 0) return@apply val selectedItem = get(selectedIndex) if ((selectedItem.selected && selected) || (!selectedItem.selected && !selected)) return@apply val firstSelection = none { it.selected } set(selectedIndex, selectedItem.copy(selected = selected)) selectedChapterIds.addOrRemove(item.id, selected) if (selected && userSelected && fromLongPress) { if (firstSelection) { selectedPositions[0] = selectedIndex selectedPositions[1] = selectedIndex } else { // Try to select the items in-between when possible val range: IntRange if (selectedIndex < selectedPositions[0]) { range = selectedIndex + 1.. selectedPositions[1]) { range = (selectedPositions[1] + 1).. selectedPositions[1]) { selectedPositions[1] = selectedIndex } } } } successState.copy(chapters = newChapters) } } fun toggleAllSelection(selected: Boolean) { updateSuccessState { successState -> val newChapters = successState.chapters.map { selectedChapterIds.addOrRemove(it.id, selected) it.copy(selected = selected) } selectedPositions[0] = -1 selectedPositions[1] = -1 successState.copy(chapters = newChapters) } } fun invertSelection() { updateSuccessState { successState -> val newChapters = successState.chapters.map { selectedChapterIds.addOrRemove(it.id, !it.selected) it.copy(selected = !it.selected) } selectedPositions[0] = -1 selectedPositions[1] = -1 successState.copy(chapters = newChapters) } } // Chapters list - end // Track sheet - start private fun observeTrackers() { val manga = successState?.manga ?: return screenModelScope.launchIO { combine( getTracks.subscribe(manga.id).catch { logcat(LogPriority.ERROR, it) }, trackerManager.loggedInTrackersFlow(), ) { mangaTracks, loggedInTrackers -> // Show only if the service supports this manga's source val supportedTrackers = loggedInTrackers.filter { (it as? EnhancedMangaTracker)?.accept(source!!) ?: true } val supportedTrackerIds = supportedTrackers.map { it.id }.toHashSet() val supportedTrackerTracks = mangaTracks.filter { it.trackerId in supportedTrackerIds } supportedTrackerTracks.size to supportedTrackers.isNotEmpty() } .flowWithLifecycle(lifecycle) .distinctUntilChanged() .collectLatest { (trackingCount, hasLoggedInTrackers) -> updateSuccessState { it.copy( trackingCount = trackingCount, hasLoggedInTrackers = hasLoggedInTrackers, ) } } } } // Track sheet - end sealed interface Dialog { data class ChangeCategory( val manga: Manga, val initialSelection: ImmutableList>, ) : Dialog data class DeleteChapters(val chapters: List) : Dialog data class DuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog data class Migrate(val newManga: Manga, val oldManga: Manga) : Dialog data class SetMangaFetchInterval(val manga: Manga) : Dialog data object SettingsSheet : Dialog data object TrackSheet : Dialog data object FullCover : Dialog } fun dismissDialog() { updateSuccessState { it.copy(dialog = null) } } fun showDeleteChapterDialog(chapters: List) { updateSuccessState { it.copy(dialog = Dialog.DeleteChapters(chapters)) } } fun showSettingsDialog() { updateSuccessState { it.copy(dialog = Dialog.SettingsSheet) } } fun showTrackDialog() { updateSuccessState { it.copy(dialog = Dialog.TrackSheet) } } fun showCoverDialog() { updateSuccessState { it.copy(dialog = Dialog.FullCover) } } fun showMigrateDialog(duplicate: Manga) { val manga = successState?.manga ?: return updateSuccessState { it.copy(dialog = Dialog.Migrate(newManga = manga, oldManga = duplicate)) } } fun setExcludedScanlators(excludedScanlators: Set) { screenModelScope.launchIO { setExcludedScanlators.await(mangaId, excludedScanlators) } } sealed interface State { @Immutable data object Loading : State @Immutable data class Success( val manga: Manga, val source: MangaSource, val isFromSource: Boolean, val chapters: List, val availableScanlators: Set, val excludedScanlators: Set, val trackingCount: Int = 0, val hasLoggedInTrackers: Boolean = false, val isRefreshingData: Boolean = false, val dialog: Dialog? = null, val hasPromptedToAddBefore: Boolean = false, ) : State { val processedChapters by lazy { chapters.applyFilters(manga).toList() } val isAnySelected by lazy { chapters.fastAny { it.selected } } val chapterListItems by lazy { processedChapters.insertSeparators { before, after -> val (lowerChapter, higherChapter) = if (manga.sortDescending()) { after to before } else { before to after } if (higherChapter == null) return@insertSeparators null if (lowerChapter == null) { floor(higherChapter.chapter.chapterNumber) .toInt() .minus(1) .coerceAtLeast(0) } else { calculateChapterGap(higherChapter.chapter, lowerChapter.chapter) } .takeIf { it > 0 } ?.let { missingCount -> ChapterList.MissingCount( id = "${lowerChapter?.id}-${higherChapter.id}", count = missingCount, ) } } } val scanlatorFilterActive: Boolean get() = excludedScanlators.intersect(availableScanlators).isNotEmpty() val filterActive: Boolean get() = scanlatorFilterActive || manga.chaptersFiltered() val trackingAvailable: Boolean get() = trackingCount > 0 /** * Applies the view filters to the list of chapters obtained from the database. * @return an observable of the list of chapters filtered and sorted. */ private fun List.applyFilters(manga: Manga): Sequence { val isLocalManga = manga.isLocal() val unreadFilter = manga.unreadFilter val downloadedFilter = manga.downloadedFilter val bookmarkedFilter = manga.bookmarkedFilter return asSequence() .filter { (chapter) -> applyFilter(unreadFilter) { !chapter.read } } .filter { (chapter) -> applyFilter(bookmarkedFilter) { chapter.bookmark } } .filter { applyFilter(downloadedFilter) { it.isDownloaded || isLocalManga } } .sortedWith { (chapter1), (chapter2) -> getChapterSort(manga).invoke( chapter1, chapter2, ) } } } } } @Immutable sealed class ChapterList { @Immutable data class MissingCount( val id: String, val count: Int, ) : ChapterList() @Immutable data class Item( val chapter: Chapter, val downloadState: MangaDownload.State, val downloadProgress: Int, val selected: Boolean = false, ) : ChapterList() { val id = chapter.id val isDownloaded = downloadState == MangaDownload.State.DOWNLOADED } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/track/MangaTrackInfoDialog.kt ================================================ package eu.kanade.tachiyomi.ui.entries.manga.track import android.app.Application import android.content.Context import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SelectableDates import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import dev.icerock.moko.resources.StringResource import eu.kanade.domain.track.manga.interactor.RefreshMangaTracks import eu.kanade.domain.track.manga.model.toDbTrack import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.track.TrackDateSelector import eu.kanade.presentation.track.TrackItemSelector import eu.kanade.presentation.track.TrackScoreSelector import eu.kanade.presentation.track.TrackStatusSelector import eu.kanade.presentation.track.manga.MangaTrackInfoDialogHome import eu.kanade.presentation.track.manga.MangaTrackerSearch import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.track.DeletableMangaTracker import eu.kanade.tachiyomi.data.track.EnhancedMangaTracker import eu.kanade.tachiyomi.data.track.MangaTracker import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.MangaTrackSearch import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.track.manga.interactor.DeleteMangaTrack import tachiyomi.domain.track.manga.interactor.GetMangaTracks import tachiyomi.domain.track.manga.model.MangaTrack import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.LabeledCheckbox import tachiyomi.presentation.core.components.material.AlertDialogContent import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.time.Instant import java.time.LocalDate import java.time.ZoneId import java.time.ZoneOffset import tachiyomi.domain.track.manga.model.MangaTrack as DbMangaTrack data class MangaTrackInfoDialogHomeScreen( private val mangaId: Long, private val mangaTitle: String, private val sourceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val screenModel = rememberScreenModel { Model(mangaId, sourceId) } val dateFormat = remember { UiPreferences.dateFormat( Injekt.get().dateFormat().get(), ) } val state by screenModel.state.collectAsState() MangaTrackInfoDialogHome( trackItems = state.trackItems, dateFormat = dateFormat, onStatusClick = { navigator.push( TrackStatusSelectorScreen( track = it.track!!, serviceId = it.tracker.id, ), ) }, onChapterClick = { navigator.push( TrackChapterSelectorScreen( track = it.track!!, serviceId = it.tracker.id, ), ) }, onScoreClick = { navigator.push( TrackScoreSelectorScreen( track = it.track!!, serviceId = it.tracker.id, ), ) }, onStartDateEdit = { navigator.push( TrackDateSelectorScreen( track = it.track!!, serviceId = it.tracker.id, start = true, ), ) }, onEndDateEdit = { navigator.push( TrackDateSelectorScreen( track = it.track!!, serviceId = it.tracker.id, start = false, ), ) }, onNewSearch = { if (it.tracker is EnhancedMangaTracker) { screenModel.registerEnhancedTracking(it) } else { navigator.push( TrackServiceSearchScreen( mangaId = mangaId, initialQuery = it.track?.title ?: mangaTitle, currentUrl = it.track?.remoteUrl, serviceId = it.tracker.id, ), ) } }, onOpenInBrowser = { openTrackerInBrowser(context, it) }, onRemoved = { navigator.push( TrackerMangaRemoveScreen( mangaId = mangaId, track = it.track!!, serviceId = it.tracker.id, ), ) }, onCopyLink = { context.copyTrackerLink(it) }, onTogglePrivate = screenModel::togglePrivate, ) } /** * Opens registered tracker url in browser */ private fun openTrackerInBrowser(context: Context, trackItem: MangaTrackItem) { val url = trackItem.track?.remoteUrl ?: return if (url.isNotBlank()) { context.openInBrowser(url) } } private fun Context.copyTrackerLink(trackItem: MangaTrackItem) { val url = trackItem.track?.remoteUrl ?: return if (url.isNotBlank()) { copyToClipboard(url, url) } } private class Model( private val mangaId: Long, private val sourceId: Long, private val getTracks: GetMangaTracks = Injekt.get(), ) : StateScreenModel(State()) { init { screenModelScope.launch { refreshTrackers() } screenModelScope.launch { getTracks.subscribe(mangaId) .catch { logcat(LogPriority.ERROR, it) } .distinctUntilChanged() .map { it.mapToTrackItem() } .collectLatest { trackItems -> mutableState.update { it.copy( trackItems = trackItems, ) } } } } fun registerEnhancedTracking(item: MangaTrackItem) { item.tracker as EnhancedMangaTracker screenModelScope.launchNonCancellable { val manga = Injekt.get().await(mangaId) ?: return@launchNonCancellable try { val matchResult = item.tracker.match(manga) ?: throw Exception() item.tracker.mangaService.register(matchResult, mangaId) } catch (e: Exception) { withUIContext { Injekt.get().toast(MR.strings.error_no_match) } } } } private suspend fun refreshTrackers() { val refreshTracks = Injekt.get() val context = Injekt.get() refreshTracks.await(mangaId) .filter { it.first != null } .forEach { (track, e) -> logcat(LogPriority.ERROR, e) { "Failed to refresh track data mangaId=$mangaId for service ${track!!.name}" } withUIContext { context.toast( context.stringResource( MR.strings.track_error, track!!.name, e.message ?: "", ), ) } } } fun togglePrivate(item: MangaTrackItem) { screenModelScope.launchNonCancellable { (item.tracker as? MangaTracker)?.setRemotePrivate(item.track!!.toDbTrack(), !item.track.private) } } private fun List.mapToTrackItem(): List { val loggedInTrackers = Injekt.get().loggedInTrackers().filter { it is MangaTracker } val source = Injekt.get().getOrStub(sourceId) return loggedInTrackers // Map to TrackItem .map { service -> MangaTrackItem(find { it.trackerId == service.id }, service) } // Show only if the service supports this manga's source .filter { (it.tracker as? EnhancedMangaTracker)?.accept(source) ?: true } } @Immutable data class State( val trackItems: List = emptyList(), ) } } private data class TrackStatusSelectorScreen( private val track: DbMangaTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() TrackStatusSelector( selection = state.selection, onSelectionChange = screenModel::setSelection, selections = remember { screenModel.getSelections() }, onConfirm = { screenModel.setStatus() navigator.pop() }, onDismissRequest = navigator::pop, ) } private class Model( private val track: DbMangaTrack, private val tracker: Tracker, ) : StateScreenModel(State(track.status)) { fun getSelections(): Map { return tracker.mangaService.getStatusListManga().associateWith { (tracker as? MangaTracker)?.getStatusForManga(it) } } fun setSelection(selection: Long) { mutableState.update { it.copy(selection = selection) } } fun setStatus() { screenModelScope.launchNonCancellable { tracker.mangaService.setRemoteMangaStatus(track.toDbTrack(), state.value.selection) } } @Immutable data class State( val selection: Long, ) } } private data class TrackChapterSelectorScreen( private val track: DbMangaTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() TrackItemSelector( selection = state.selection, onSelectionChange = screenModel::setSelection, range = remember { screenModel.getRange() }, onConfirm = { screenModel.setChapter() navigator.pop() }, onDismissRequest = navigator::pop, isManga = true, ) } private class Model( private val track: DbMangaTrack, private val tracker: Tracker, ) : StateScreenModel(State(track.lastChapterRead.toInt())) { fun getRange(): Iterable { val endRange = if (track.totalChapters > 0) { track.totalChapters } else { 10000 } return 0..endRange.toInt() } fun setSelection(selection: Int) { mutableState.update { it.copy(selection = selection) } } fun setChapter() { screenModelScope.launchNonCancellable { tracker.mangaService.setRemoteLastChapterRead( track.toDbTrack(), state.value.selection, ) } } @Immutable data class State( val selection: Int, ) } } private data class TrackScoreSelectorScreen( private val track: DbMangaTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() TrackScoreSelector( selection = state.selection, onSelectionChange = screenModel::setSelection, selections = remember { screenModel.getSelections() }, onConfirm = { screenModel.setScore() navigator.pop() }, onDismissRequest = navigator::pop, ) } private class Model( private val track: DbMangaTrack, private val tracker: Tracker, ) : StateScreenModel(State(tracker.mangaService.displayScore(track))) { fun getSelections(): ImmutableList { return tracker.mangaService.getScoreList() } fun setSelection(selection: String) { mutableState.update { it.copy(selection = selection) } } fun setScore() { screenModelScope.launchNonCancellable { tracker.mangaService.setRemoteScore(track.toDbTrack(), state.value.selection) } } @Immutable data class State( val selection: String, ) } } private data class TrackDateSelectorScreen( private val track: DbMangaTrack, private val serviceId: Long, private val start: Boolean, ) : Screen() { @Transient private val selectableDates = object : SelectableDates { override fun isSelectableDate(utcTimeMillis: Long): Boolean { val dateToCheck = Instant.ofEpochMilli(utcTimeMillis) .atZone(ZoneOffset.systemDefault()) .toLocalDate() if (dateToCheck > LocalDate.now()) { // Disallow future dates return false } return if (start && track.finishDate > 0) { // Disallow start date to be set later than finish date val dateFinished = Instant.ofEpochMilli(track.finishDate) .atZone(ZoneId.systemDefault()) .toLocalDate() dateToCheck <= dateFinished } else if (!start && track.startDate > 0) { // Disallow end date to be set earlier than start date val dateStarted = Instant.ofEpochMilli(track.startDate) .atZone(ZoneId.systemDefault()) .toLocalDate() dateToCheck >= dateStarted } else { // Nothing set before true } } override fun isSelectableYear(year: Int): Boolean { if (year > LocalDate.now().year) { // Disallow future dates return false } return if (start && track.finishDate > 0) { // Disallow start date to be set later than finish date val dateFinished = Instant.ofEpochMilli(track.finishDate) .atZone(ZoneId.systemDefault()) .toLocalDate() .year year <= dateFinished } else if (!start && track.startDate > 0) { // Disallow end date to be set earlier than start date val dateStarted = Instant.ofEpochMilli(track.startDate) .atZone(ZoneId.systemDefault()) .toLocalDate() .year year >= dateStarted } else { // Nothing set before true } } } @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, start = start, ) } val canRemove = if (start) { track.startDate > 0 } else { track.finishDate > 0 } TrackDateSelector( title = if (start) { stringResource(MR.strings.track_started_reading_date) } else { stringResource(MR.strings.track_finished_reading_date) }, initialSelectedDateMillis = screenModel.initialSelection, selectableDates = selectableDates, onConfirm = { screenModel.setDate(it) navigator.pop() }, onRemove = { screenModel.confirmRemoveDate(navigator) }.takeIf { canRemove }, onDismissRequest = navigator::pop, ) } private class Model( private val track: DbMangaTrack, private val tracker: Tracker, private val start: Boolean, ) : ScreenModel { // In UTC val initialSelection: Long get() { val millis = (if (start) track.startDate else track.finishDate) .takeIf { it != 0L } ?: Instant.now().toEpochMilli() return millis.convertEpochMillisZone(ZoneOffset.systemDefault(), ZoneOffset.UTC) } // In UTC fun setDate(millis: Long) { // Convert to local time val localMillis = millis.convertEpochMillisZone(ZoneOffset.UTC, ZoneOffset.systemDefault()) screenModelScope.launchNonCancellable { if (start) { tracker.mangaService.setRemoteStartDate(track.toDbTrack(), localMillis) } else { tracker.mangaService.setRemoteFinishDate(track.toDbTrack(), localMillis) } } } fun confirmRemoveDate(navigator: Navigator) { navigator.push(TrackDateRemoverScreen(track, tracker.id, start)) } } } private data class TrackDateRemoverScreen( private val track: DbMangaTrack, private val serviceId: Long, private val start: Boolean, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( track = track, tracker = Injekt.get().get(serviceId)!!, start = start, ) } AlertDialogContent( modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars), icon = { Icon( imageVector = Icons.Default.Delete, contentDescription = null, ) }, title = { Text( text = stringResource(MR.strings.track_remove_date_conf_title), textAlign = TextAlign.Center, ) }, text = { val serviceName = screenModel.getName() Text( text = if (start) { stringResource(MR.strings.track_remove_start_date_conf_text, serviceName) } else { stringResource(MR.strings.track_remove_finish_date_conf_text, serviceName) }, ) }, buttons = { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy( MaterialTheme.padding.small, Alignment.End, ), ) { TextButton(onClick = navigator::pop) { Text(text = stringResource(MR.strings.action_cancel)) } FilledTonalButton( onClick = { screenModel.removeDate() navigator.popUntil { it is MangaTrackInfoDialogHomeScreen } }, colors = ButtonDefaults.filledTonalButtonColors( containerColor = MaterialTheme.colorScheme.errorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer, ), ) { Text(text = stringResource(MR.strings.action_remove)) } } }, ) } private class Model( private val track: DbMangaTrack, private val tracker: Tracker, private val start: Boolean, ) : ScreenModel { fun getName() = tracker.name fun removeDate() { screenModelScope.launchNonCancellable { if (start) { tracker.mangaService.setRemoteStartDate(track.toDbTrack(), 0) } else { tracker.mangaService.setRemoteFinishDate(track.toDbTrack(), 0) } } } } } data class TrackServiceSearchScreen( private val mangaId: Long, private val initialQuery: String, private val currentUrl: String?, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( mangaId = mangaId, currentUrl = currentUrl, initialQuery = initialQuery, tracker = Injekt.get().get(serviceId)!!, ) } val state by screenModel.state.collectAsState() val textFieldState = rememberTextFieldState(initialQuery) MangaTrackerSearch( state = textFieldState, onDispatchQuery = { screenModel.trackingSearch(textFieldState.text.toString()) }, queryResult = state.queryResult, selected = state.selected, onSelectedChange = screenModel::updateSelection, onConfirmSelection = f@{ private: Boolean -> val selected = state.selected ?: return@f selected.private = private screenModel.registerTracking(selected) navigator.pop() }, onDismissRequest = navigator::pop, supportsPrivateTracking = screenModel.supportsPrivateTracking, ) } private class Model( private val mangaId: Long, private val currentUrl: String? = null, initialQuery: String, private val tracker: Tracker, ) : StateScreenModel(State()) { val supportsPrivateTracking = tracker.supportsPrivateTracking init { // Run search on first launch if (initialQuery.isNotBlank()) { trackingSearch(initialQuery) } } fun trackingSearch(query: String) { screenModelScope.launch { // To show loading state mutableState.update { it.copy(queryResult = null, selected = null) } val result = withIOContext { try { val results = tracker.mangaService.searchManga(query) Result.success(results) } catch (e: Throwable) { Result.failure(e) } } mutableState.update { oldState -> oldState.copy( queryResult = result, selected = result.getOrNull()?.find { it.tracking_url == currentUrl }, ) } } } fun registerTracking(item: MangaTrackSearch) { screenModelScope.launchNonCancellable { tracker.mangaService.register(item, mangaId) } } fun updateSelection(selected: MangaTrackSearch) { mutableState.update { it.copy(selected = selected) } } @Immutable data class State( val queryResult: Result>? = null, val selected: MangaTrackSearch? = null, ) } } private data class TrackerMangaRemoveScreen( private val mangaId: Long, private val track: MangaTrack, private val serviceId: Long, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { Model( mangaId = mangaId, track = track, tracker = Injekt.get().get(serviceId)!!, ) } val serviceName = screenModel.getName() var removeRemoteTrack by remember { mutableStateOf(false) } AlertDialogContent( modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars), icon = { Icon( imageVector = Icons.Default.Delete, contentDescription = null, ) }, title = { Text( text = stringResource(MR.strings.track_delete_title, serviceName), textAlign = TextAlign.Center, ) }, text = { Column( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Text( text = stringResource(MR.strings.track_delete_text, serviceName), ) if (screenModel.isDeletable()) { LabeledCheckbox( label = stringResource(MR.strings.track_delete_remote_text, serviceName), checked = removeRemoteTrack, onCheckedChange = { removeRemoteTrack = it }, ) } } }, buttons = { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy( MaterialTheme.padding.small, Alignment.End, ), ) { TextButton(onClick = navigator::pop) { Text(text = stringResource(MR.strings.action_cancel)) } FilledTonalButton( onClick = { screenModel.unregisterTracking(serviceId) if (removeRemoteTrack) screenModel.deleteMangaFromService() navigator.pop() }, colors = ButtonDefaults.filledTonalButtonColors( containerColor = MaterialTheme.colorScheme.errorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer, ), ) { Text(text = stringResource(MR.strings.action_ok)) } } }, ) } private class Model( private val mangaId: Long, private val track: MangaTrack, private val tracker: Tracker, private val deleteTrack: DeleteMangaTrack = Injekt.get(), ) : ScreenModel { fun getName() = tracker.name fun isDeletable() = tracker is DeletableMangaTracker fun deleteMangaFromService() { screenModelScope.launchNonCancellable { try { (tracker as DeletableMangaTracker).delete(track) } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to delete manga entry from service" } } } } fun unregisterTracking(serviceId: Long) { screenModelScope.launchNonCancellable { deleteTrack.await(mangaId, serviceId) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/entries/manga/track/MangaTrackItem.kt ================================================ package eu.kanade.tachiyomi.ui.entries.manga.track import eu.kanade.tachiyomi.data.track.Tracker import tachiyomi.domain.track.manga.model.MangaTrack data class MangaTrackItem(val track: MangaTrack?, val tracker: Tracker) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoriesTab.kt ================================================ package eu.kanade.tachiyomi.ui.history import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.domain.ui.model.NavStyle import eu.kanade.presentation.components.TabbedScreen import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.history.anime.AnimeHistoryScreenModel import eu.kanade.tachiyomi.ui.history.anime.animeHistoryTab import eu.kanade.tachiyomi.ui.history.anime.resumeLastEpisodeSeenEvent import eu.kanade.tachiyomi.ui.history.manga.MangaHistoryScreenModel import eu.kanade.tachiyomi.ui.history.manga.mangaHistoryTab import eu.kanade.tachiyomi.ui.main.MainActivity import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource data object HistoriesTab : Tab { override val options: TabOptions @Composable get() { val isSelected = LocalTabNavigator.current.current.key == key val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_history_enter) val index: UShort = when (currentNavigationStyle()) { NavStyle.MOVE_HISTORY_TO_MORE -> 5u NavStyle.MOVE_BROWSE_TO_MORE -> 3u else -> 2u } return TabOptions( index = index, title = stringResource(MR.strings.history), icon = rememberAnimatedVectorPainter(image, isSelected), ) } override suspend fun onReselect(navigator: Navigator) { resumeLastEpisodeSeenEvent.send(Unit) } @Composable override fun Content() { val context = LocalContext.current val fromMore = currentNavigationStyle() == NavStyle.MOVE_HISTORY_TO_MORE // Hoisted for history tab's search bar val mangaHistoryScreenModel = rememberScreenModel { MangaHistoryScreenModel() } val mangaSearchQuery by mangaHistoryScreenModel.query.collectAsState() val animeHistoryScreenModel = rememberScreenModel { AnimeHistoryScreenModel() } val animeSearchQuery by animeHistoryScreenModel.query.collectAsState() TabbedScreen( titleRes = MR.strings.label_recent_manga, tabs = persistentListOf( animeHistoryTab(context, fromMore), mangaHistoryTab(context, fromMore), ), mangaSearchQuery = mangaSearchQuery, onChangeMangaSearchQuery = mangaHistoryScreenModel::search, animeSearchQuery = animeSearchQuery, onChangeAnimeSearchQuery = animeHistoryScreenModel::search, ) LaunchedEffect(Unit) { (context as? MainActivity)?.ready = true } } } private const val TAB_ANIME = 0 private const val TAB_MANGA = 1 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/history/anime/AnimeHistoryScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.history.anime import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.util.insertSeparators import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.track.anime.interactor.AddAnimeTracks import eu.kanade.presentation.history.anime.AnimeHistoryUiModel import eu.kanade.tachiyomi.util.lang.toLocalDate import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.mapAsCheckboxState import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.category.anime.interactor.SetAnimeCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.interactor.GetDuplicateLibraryAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.history.anime.interactor.GetAnimeHistory import tachiyomi.domain.history.anime.interactor.GetNextEpisodes import tachiyomi.domain.history.anime.interactor.RemoveAnimeHistory import tachiyomi.domain.history.anime.model.AnimeHistoryWithRelations import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class AnimeHistoryScreenModel( private val addTracks: AddAnimeTracks = Injekt.get(), private val getCategories: GetAnimeCategories = Injekt.get(), private val getDuplicateLibraryAnime: GetDuplicateLibraryAnime = Injekt.get(), private val getHistory: GetAnimeHistory = Injekt.get(), private val getAnime: GetAnime = Injekt.get(), private val getNextEpisodes: GetNextEpisodes = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val removeHistory: RemoveAnimeHistory = Injekt.get(), private val setAnimeCategories: SetAnimeCategories = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), val snackbarHostState: SnackbarHostState = SnackbarHostState(), private val sourceManager: AnimeSourceManager = Injekt.get(), ) : StateScreenModel(State()) { private val _events: Channel = Channel(Channel.UNLIMITED) val events: Flow = _events.receiveAsFlow() private val _query: MutableStateFlow = MutableStateFlow(null) val query: StateFlow = _query.asStateFlow() init { screenModelScope.launch { _query.collectLatest { query -> getHistory.subscribe(query ?: "") .distinctUntilChanged() .catch { error -> logcat(LogPriority.ERROR, error) _events.send(Event.InternalError) } .map { it.toAnimeHistoryUiModels() } .flowOn(Dispatchers.IO) .collect { newList -> mutableState.update { it.copy(list = newList) } } } } } fun search(query: String?) { screenModelScope.launchIO { _query.emit(query) } } private fun List.toAnimeHistoryUiModels(): List { return map { AnimeHistoryUiModel.Item(it) } .insertSeparators { before, after -> val beforeDate = before?.item?.seenAt?.time?.toLocalDate() val afterDate = after?.item?.seenAt?.time?.toLocalDate() when { beforeDate != afterDate && afterDate != null -> AnimeHistoryUiModel.Header(afterDate) // Return null to avoid adding a separator between two items. else -> null } } } suspend fun getNextEpisode(): Episode? { return withIOContext { getNextEpisodes.await(onlyUnseen = false).firstOrNull() } } fun getNextEpisodeForAnime(animeId: Long, episodeId: Long) { screenModelScope.launchIO { sendNextEpisodeEvent(getNextEpisodes.await(animeId, episodeId, onlyUnseen = false)) } } private suspend fun sendNextEpisodeEvent(episodes: List) { val episode = episodes.firstOrNull() _events.send(Event.OpenEpisode(episode)) } fun removeFromHistory(history: AnimeHistoryWithRelations) { screenModelScope.launchIO { removeHistory.await(history) } } fun removeAllFromHistory(animeId: Long) { screenModelScope.launchIO { removeHistory.await(animeId) } } fun removeAllHistory() { screenModelScope.launchIO { val result = removeHistory.awaitAll() if (!result) return@launchIO _events.send(Event.HistoryCleared) } } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } /** * Get user categories. * * @return List of categories, not including the default category */ suspend fun getCategories(): List { return getCategories.await().filterNot { it.isSystemCategory } } private fun moveAnimeToCategory(animeId: Long, categories: Category?) { val categoryIds = listOfNotNull(categories).map { it.id } moveAnimeToCategory(animeId, categoryIds) } private fun moveAnimeToCategory(animeId: Long, categoryIds: List) { screenModelScope.launchIO { setAnimeCategories.await(animeId, categoryIds) } } fun moveAnimeToCategoriesAndAddToLibrary(anime: Anime, categories: List) { moveAnimeToCategory(anime.id, categories) if (anime.favorite) return screenModelScope.launchIO { updateAnime.awaitUpdateFavorite(anime.id, true) } } private suspend fun getAnimeCategoryIds(anime: Anime): List { return getCategories.await(anime.id) .map { it.id } } fun addFavorite(animeId: Long) { screenModelScope.launchIO { val anime = getAnime.await(animeId) ?: return@launchIO val duplicate = getDuplicateLibraryAnime.await(anime).getOrNull(0) if (duplicate != null) { mutableState.update { it.copy(dialog = Dialog.DuplicateAnime(anime, duplicate)) } return@launchIO } addFavorite(anime) } } fun addFavorite(anime: Anime) { screenModelScope.launchIO { // Move to default category if applicable val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultAnimeCategory().get().toLong() val defaultCategory = categories.find { it.id == defaultCategoryId } when { // Default category set defaultCategory != null -> { val result = updateAnime.awaitUpdateFavorite(anime.id, true) if (!result) return@launchIO moveAnimeToCategory(anime.id, defaultCategory) } // Automatic 'Default' or no categories defaultCategoryId == 0L || categories.isEmpty() -> { val result = updateAnime.awaitUpdateFavorite(anime.id, true) if (!result) return@launchIO moveAnimeToCategory(anime.id, null) } // Choose a category else -> showChangeCategoryDialog(anime) } // Sync with tracking services if applicable addTracks.bindEnhancedTrackers(anime, sourceManager.getOrStub(anime.source)) } } fun showMigrateDialog(currentAnime: Anime, duplicate: Anime) { mutableState.update { currentState -> currentState.copy(dialog = Dialog.Migrate(newAnime = currentAnime, oldAnime = duplicate)) } } fun showChangeCategoryDialog(anime: Anime) { screenModelScope.launch { val categories = getCategories() val selection = getAnimeCategoryIds(anime) mutableState.update { currentState -> currentState.copy( dialog = Dialog.ChangeCategory( anime = anime, initialSelection = categories.mapAsCheckboxState { it.id in selection }.toImmutableList(), ), ) } } } @Immutable data class State( val searchQuery: String? = null, val list: List? = null, val dialog: Dialog? = null, ) sealed interface Dialog { data object DeleteAll : Dialog data class Delete(val history: AnimeHistoryWithRelations) : Dialog data class DuplicateAnime(val anime: Anime, val duplicate: Anime) : Dialog data class ChangeCategory( val anime: Anime, val initialSelection: ImmutableList>, ) : Dialog data class Migrate(val newAnime: Anime, val oldAnime: Anime) : Dialog } sealed interface Event { data class OpenEpisode(val episode: Episode?) : Event data object InternalError : Event data object HistoryCleared : Event } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/history/anime/AnimeHistoryTab.kt ================================================ package eu.kanade.tachiyomi.ui.history.anime import android.content.Context import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DeleteSweep import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.presentation.entries.anime.DuplicateAnimeDialog import eu.kanade.presentation.history.HistoryDeleteAllDialog import eu.kanade.presentation.history.HistoryDeleteDialog import eu.kanade.presentation.history.anime.AnimeHistoryScreen import eu.kanade.tachiyomi.ui.browse.anime.migration.anime.season.MigrateSeasonSelectScreen import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialog import eu.kanade.tachiyomi.ui.browse.anime.migration.search.MigrateAnimeDialogScreenModel import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.items.episode.model.Episode import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.injectLazy val resumeLastEpisodeSeenEvent = Channel() @Composable fun Screen.animeHistoryTab( context: Context, fromMore: Boolean, ): TabContent { val snackbarHostState = SnackbarHostState() val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { AnimeHistoryScreenModel() } val state by screenModel.state.collectAsState() val searchQuery by screenModel.query.collectAsState() suspend fun openEpisode(context: Context, episode: Episode?) { val playerPreferences: PlayerPreferences by injectLazy() val extPlayer = playerPreferences.alwaysUseExternalPlayer().get() if (episode != null) { MainActivity.startPlayerActivity(context, episode.animeId, episode.id, extPlayer) } else { snackbarHostState.showSnackbar(context.stringResource(AYMR.strings.no_next_episode)) } } val scope = rememberCoroutineScope() val navigateUp: (() -> Unit)? = if (fromMore) { { if (navigator.lastItem == HomeScreen) { scope.launch { HomeScreen.openTab(HomeScreen.Tab.AnimeLib()) } } else { navigator.pop() } } } else { null } return TabContent( titleRes = AYMR.strings.label_anime_history, searchEnabled = true, content = { contentPadding, _ -> AnimeHistoryScreen( state = state, searchQuery = searchQuery, snackbarHostState = snackbarHostState, onClickCover = { navigator.push(AnimeScreen(it)) }, onClickResume = screenModel::getNextEpisodeForAnime, onDialogChange = screenModel::setDialog, onClickFavorite = screenModel::addFavorite, ) val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is AnimeHistoryScreenModel.Dialog.Delete -> { HistoryDeleteDialog( onDismissRequest = onDismissRequest, onDelete = { all -> if (all) { screenModel.removeAllFromHistory(dialog.history.animeId) } else { screenModel.removeFromHistory(dialog.history) } }, isManga = false, ) } is AnimeHistoryScreenModel.Dialog.DeleteAll -> { HistoryDeleteAllDialog( onDismissRequest = onDismissRequest, onDelete = screenModel::removeAllHistory, ) } is AnimeHistoryScreenModel.Dialog.DuplicateAnime -> { DuplicateAnimeDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.addFavorite(dialog.anime) }, onOpenAnime = { navigator.push(AnimeScreen(dialog.duplicate.id)) }, onMigrate = { screenModel.showMigrateDialog(dialog.anime, dialog.duplicate) }, ) } is AnimeHistoryScreenModel.Dialog.ChangeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { navigator.push(CategoriesTab) }, onConfirm = { include, _ -> screenModel.moveAnimeToCategoriesAndAddToLibrary(dialog.anime, include) }, ) } is AnimeHistoryScreenModel.Dialog.Migrate -> { MigrateAnimeDialog( oldAnime = dialog.oldAnime, newAnime = dialog.newAnime, screenModel = MigrateAnimeDialogScreenModel(), onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(AnimeScreen(dialog.oldAnime.id)) }, onClickSeasons = { navigator.push(MigrateSeasonSelectScreen(dialog.oldAnime, dialog.newAnime)) }, onPopScreen = { navigator.replace(AnimeScreen(dialog.oldAnime.id)) }, ) } null -> {} } LaunchedEffect(state.list) { if (state.list != null) { (context as? MainActivity)?.ready = true } } LaunchedEffect(Unit) { screenModel.events.collectLatest { e -> when (e) { AnimeHistoryScreenModel.Event.InternalError -> snackbarHostState.showSnackbar(context.stringResource(MR.strings.internal_error)) AnimeHistoryScreenModel.Event.HistoryCleared -> snackbarHostState.showSnackbar(context.stringResource(MR.strings.clear_history_completed)) is AnimeHistoryScreenModel.Event.OpenEpisode -> openEpisode(context, e.episode) } } } LaunchedEffect(Unit) { resumeLastEpisodeSeenEvent.receiveAsFlow().collectLatest { openEpisode(context, screenModel.getNextEpisode()) } } }, actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.pref_clear_history), icon = Icons.Outlined.DeleteSweep, onClick = { screenModel.setDialog(AnimeHistoryScreenModel.Dialog.DeleteAll) }, ), ), navigateUp = navigateUp, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/history/manga/MangaHistoryScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.history.manga import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Immutable import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.util.insertSeparators import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.track.manga.interactor.AddMangaTracks import eu.kanade.presentation.history.manga.MangaHistoryUiModel import eu.kanade.tachiyomi.util.lang.toLocalDate import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import logcat.LogPriority import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.mapAsCheckboxState import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.manga.interactor.GetMangaCategories import tachiyomi.domain.category.manga.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.manga.interactor.GetDuplicateLibraryManga import tachiyomi.domain.entries.manga.interactor.GetManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.history.manga.interactor.GetMangaHistory import tachiyomi.domain.history.manga.interactor.GetNextChapters import tachiyomi.domain.history.manga.interactor.RemoveMangaHistory import tachiyomi.domain.history.manga.model.MangaHistoryWithRelations import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaHistoryScreenModel( private val addTracks: AddMangaTracks = Injekt.get(), private val getCategories: GetMangaCategories = Injekt.get(), private val getDuplicateLibraryManga: GetDuplicateLibraryManga = Injekt.get(), private val getHistory: GetMangaHistory = Injekt.get(), private val getManga: GetManga = Injekt.get(), private val getNextChapters: GetNextChapters = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val removeHistory: RemoveMangaHistory = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), val snackbarHostState: SnackbarHostState = SnackbarHostState(), private val sourceManager: MangaSourceManager = Injekt.get(), ) : StateScreenModel(State()) { private val _events: Channel = Channel(Channel.UNLIMITED) val events: Flow = _events.receiveAsFlow() private val _query: MutableStateFlow = MutableStateFlow(null) val query: StateFlow = _query.asStateFlow() init { screenModelScope.launch { _query.collectLatest { query -> getHistory.subscribe(query ?: "") .distinctUntilChanged() .catch { error -> logcat(LogPriority.ERROR, error) _events.send(Event.InternalError) } .map { it.toHistoryUiModels() } .flowOn(Dispatchers.IO) .collect { newList -> mutableState.update { it.copy(list = newList) } } } } } fun search(query: String?) { screenModelScope.launchIO { _query.emit(query) } } private fun List.toHistoryUiModels(): List { return map { MangaHistoryUiModel.Item(it) } .insertSeparators { before, after -> val beforeDate = before?.item?.readAt?.time?.toLocalDate() val afterDate = after?.item?.readAt?.time?.toLocalDate() when { beforeDate != afterDate && afterDate != null -> MangaHistoryUiModel.Header(afterDate) // Return null to avoid adding a separator between two items. else -> null } } } suspend fun getNextChapter(): Chapter? { return withIOContext { getNextChapters.await(onlyUnread = false).firstOrNull() } } fun getNextChapterForManga(mangaId: Long, chapterId: Long) { screenModelScope.launchIO { sendNextChapterEvent(getNextChapters.await(mangaId, chapterId, onlyUnread = false)) } } private suspend fun sendNextChapterEvent(chapters: List) { val chapter = chapters.firstOrNull() _events.send(Event.OpenChapter(chapter)) } fun removeFromHistory(history: MangaHistoryWithRelations) { screenModelScope.launchIO { removeHistory.await(history) } } fun removeAllFromHistory(mangaId: Long) { screenModelScope.launchIO { removeHistory.await(mangaId) } } fun removeAllHistory() { screenModelScope.launchIO { val result = removeHistory.awaitAll() if (!result) return@launchIO _events.send(Event.HistoryCleared) } } fun updateSearchQuery(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun setDialog(dialog: Dialog?) { mutableState.update { it.copy(dialog = dialog) } } /** * Get user categories. * * @return List of categories, not including the default category */ suspend fun getCategories(): List { return getCategories.await().filterNot { it.isSystemCategory } } private fun moveMangaToCategory(mangaId: Long, categories: Category?) { val categoryIds = listOfNotNull(categories).map { it.id } moveMangaToCategory(mangaId, categoryIds) } private fun moveMangaToCategory(mangaId: Long, categoryIds: List) { screenModelScope.launchIO { setMangaCategories.await(mangaId, categoryIds) } } fun moveMangaToCategoriesAndAddToLibrary(manga: Manga, categories: List) { moveMangaToCategory(manga.id, categories) if (manga.favorite) return screenModelScope.launchIO { updateManga.awaitUpdateFavorite(manga.id, true) } } private suspend fun getMangaCategoryIds(manga: Manga): List { return getCategories.await(manga.id) .map { it.id } } fun addFavorite(mangaId: Long) { screenModelScope.launchIO { val manga = getManga.await(mangaId) ?: return@launchIO val duplicate = getDuplicateLibraryManga.await(manga).getOrNull(0) if (duplicate != null) { mutableState.update { it.copy(dialog = Dialog.DuplicateManga(manga, duplicate)) } return@launchIO } addFavorite(manga) } } fun addFavorite(manga: Manga) { screenModelScope.launchIO { // Move to default category if applicable val categories = getCategories() val defaultCategoryId = libraryPreferences.defaultMangaCategory().get().toLong() val defaultCategory = categories.find { it.id == defaultCategoryId } when { // Default category set defaultCategory != null -> { val result = updateManga.awaitUpdateFavorite(manga.id, true) if (!result) return@launchIO moveMangaToCategory(manga.id, defaultCategory) } // Automatic 'Default' or no categories defaultCategoryId == 0L || categories.isEmpty() -> { val result = updateManga.awaitUpdateFavorite(manga.id, true) if (!result) return@launchIO moveMangaToCategory(manga.id, null) } // Choose a category else -> showChangeCategoryDialog(manga) } // Sync with tracking services if applicable addTracks.bindEnhancedTrackers(manga, sourceManager.getOrStub(manga.source)) } } fun showMigrateDialog(currentManga: Manga, duplicate: Manga) { mutableState.update { currentState -> currentState.copy(dialog = Dialog.Migrate(newManga = currentManga, oldManga = duplicate)) } } fun showChangeCategoryDialog(manga: Manga) { screenModelScope.launch { val categories = getCategories() val selection = getMangaCategoryIds(manga) mutableState.update { currentState -> currentState.copy( dialog = Dialog.ChangeCategory( manga = manga, initialSelection = categories.mapAsCheckboxState { it.id in selection }.toImmutableList(), ), ) } } } @Immutable data class State( val searchQuery: String? = null, val list: List? = null, val dialog: Dialog? = null, ) sealed interface Dialog { data object DeleteAll : Dialog data class Delete(val history: MangaHistoryWithRelations) : Dialog data class DuplicateManga(val manga: Manga, val duplicate: Manga) : Dialog data class ChangeCategory( val manga: Manga, val initialSelection: ImmutableList>, ) : Dialog data class Migrate(val newManga: Manga, val oldManga: Manga) : Dialog } sealed interface Event { data class OpenChapter(val chapter: Chapter?) : Event data object InternalError : Event data object HistoryCleared : Event } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/history/manga/MangaHistoryTab.kt ================================================ package eu.kanade.tachiyomi.ui.history.manga import android.content.Context import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DeleteSweep import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.TabContent import eu.kanade.presentation.entries.manga.DuplicateMangaDialog import eu.kanade.presentation.history.HistoryDeleteAllDialog import eu.kanade.presentation.history.HistoryDeleteDialog import eu.kanade.presentation.history.manga.MangaHistoryScreen import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaDialog import eu.kanade.tachiyomi.ui.browse.manga.migration.search.MigrateMangaDialogScreenModel import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import tachiyomi.core.common.i18n.stringResource import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource val resumeLastChapterReadEvent = Channel() @Composable fun Screen.mangaHistoryTab( context: Context, fromMore: Boolean, ): TabContent { val snackbarHostState = SnackbarHostState() val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MangaHistoryScreenModel() } val state by screenModel.state.collectAsState() val searchQuery by screenModel.query.collectAsState() suspend fun openChapter(context: Context, chapter: Chapter?) { if (chapter != null) { val intent = ReaderActivity.newIntent(context, chapter.mangaId, chapter.id) context.startActivity(intent) } else { snackbarHostState.showSnackbar(context.stringResource(MR.strings.no_next_chapter)) } } val scope = rememberCoroutineScope() val navigateUp: (() -> Unit)? = if (fromMore) { { if (navigator.lastItem == HomeScreen) { scope.launch { HomeScreen.openTab(HomeScreen.Tab.AnimeLib()) } } else { navigator.pop() } } } else { null } return TabContent( titleRes = AYMR.strings.label_history, searchEnabled = true, content = { contentPadding, _ -> MangaHistoryScreen( state = state, searchQuery = searchQuery, snackbarHostState = snackbarHostState, onClickCover = { navigator.push(MangaScreen(it)) }, onClickResume = screenModel::getNextChapterForManga, onDialogChange = screenModel::setDialog, onClickFavorite = screenModel::addFavorite, ) val onDismissRequest = { screenModel.setDialog(null) } when (val dialog = state.dialog) { is MangaHistoryScreenModel.Dialog.Delete -> { HistoryDeleteDialog( onDismissRequest = onDismissRequest, onDelete = { all -> if (all) { screenModel.removeAllFromHistory(dialog.history.mangaId) } else { screenModel.removeFromHistory(dialog.history) } }, isManga = true, ) } is MangaHistoryScreenModel.Dialog.DeleteAll -> { HistoryDeleteAllDialog( onDismissRequest = onDismissRequest, onDelete = screenModel::removeAllHistory, ) } is MangaHistoryScreenModel.Dialog.DuplicateManga -> { DuplicateMangaDialog( onDismissRequest = onDismissRequest, onConfirm = { screenModel.addFavorite(dialog.manga) }, onOpenManga = { navigator.push(MangaScreen(dialog.duplicate.id)) }, onMigrate = { screenModel.showMigrateDialog(dialog.manga, dialog.duplicate) }, ) } is MangaHistoryScreenModel.Dialog.ChangeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { navigator.push(CategoriesTab) CategoriesTab.showMangaCategory() }, onConfirm = { include, _ -> screenModel.moveMangaToCategoriesAndAddToLibrary(dialog.manga, include) }, ) } is MangaHistoryScreenModel.Dialog.Migrate -> { MigrateMangaDialog( oldManga = dialog.oldManga, newManga = dialog.newManga, screenModel = MigrateMangaDialogScreenModel(), onDismissRequest = onDismissRequest, onClickTitle = { navigator.push(MangaScreen(dialog.oldManga.id)) }, onPopScreen = { navigator.replace(MangaScreen(dialog.newManga.id)) }, ) } null -> {} } LaunchedEffect(state.list) { if (state.list != null) { (context as? MainActivity)?.ready = true } } LaunchedEffect(Unit) { screenModel.events.collectLatest { e -> when (e) { MangaHistoryScreenModel.Event.InternalError -> snackbarHostState.showSnackbar(context.stringResource(MR.strings.internal_error)) MangaHistoryScreenModel.Event.HistoryCleared -> snackbarHostState.showSnackbar(context.stringResource(MR.strings.clear_history_completed)) is MangaHistoryScreenModel.Event.OpenChapter -> openChapter(context, e.chapter) } } } LaunchedEffect(Unit) { resumeLastChapterReadEvent.receiveAsFlow().collectLatest { openChapter(context, screenModel.getNextChapter()) } } }, actions = persistentListOf( AppBar.Action( title = stringResource(MR.strings.pref_clear_history), icon = Icons.Outlined.DeleteSweep, onClick = { screenModel.setDialog(MangaHistoryScreenModel.Dialog.DeleteAll) }, ), ), navigateUp = navigateUp, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt ================================================ package eu.kanade.tachiyomi.ui.home import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.expandVertically import androidx.compose.animation.shrinkVertically import androidx.compose.animation.togetherWith import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.padding import androidx.compose.material3.Badge import androidx.compose.material3.BadgedBox import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationRailItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.produceState import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.util.fastForEach import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabNavigator import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.util.Screen import eu.kanade.presentation.util.isTabletUi import eu.kanade.tachiyomi.ui.browse.BrowseTab import eu.kanade.tachiyomi.ui.download.DownloadsTab import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.history.HistoriesTab import eu.kanade.tachiyomi.ui.library.anime.AnimeLibraryTab import eu.kanade.tachiyomi.ui.library.manga.MangaLibraryTab import eu.kanade.tachiyomi.ui.more.MoreTab import eu.kanade.tachiyomi.ui.updates.UpdatesTab import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import soup.compose.material.motion.animation.materialFadeThroughIn import soup.compose.material.motion.animation.materialFadeThroughOut import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.NavigationBar import tachiyomi.presentation.core.components.material.NavigationRail import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy object HomeScreen : Screen() { private val librarySearchEvent = Channel() private val openTabEvent = Channel() private val showBottomNavEvent = Channel() private const val TAB_FADE_DURATION = 200 private const val TAB_NAVIGATOR_KEY = "HomeTabs" private val uiPreferences: UiPreferences by injectLazy() private val defaultTab = uiPreferences.startScreen().get().tab private val moreTab = uiPreferences.navStyle().get().moreTab @Composable override fun Content() { val navStyle by uiPreferences.navStyle().collectAsState() val navigator = LocalNavigator.currentOrThrow TabNavigator( tab = defaultTab, key = TAB_NAVIGATOR_KEY, ) { tabNavigator -> // Provide usable navigator to content screen CompositionLocalProvider(LocalNavigator provides navigator) { Scaffold( startBar = { if (isTabletUi()) { NavigationRail { navStyle.tabs.fastForEach { NavigationRailItem(it) } } } }, bottomBar = { if (!isTabletUi()) { val bottomNavVisible by produceState(initialValue = true) { showBottomNavEvent.receiveAsFlow().collectLatest { value = it } } AnimatedVisibility( visible = bottomNavVisible && tabNavigator.current != navStyle.moreTab, enter = expandVertically(), exit = shrinkVertically(), ) { NavigationBar { navStyle.tabs.fastForEach { NavigationBarItem(it) } } } } }, contentWindowInsets = WindowInsets(0), ) { contentPadding -> Box( modifier = Modifier .padding(contentPadding) .consumeWindowInsets(contentPadding), ) { AnimatedContent( targetState = tabNavigator.current, transitionSpec = { materialFadeThroughIn( initialScale = 1f, durationMillis = TAB_FADE_DURATION, ) togetherWith materialFadeThroughOut(durationMillis = TAB_FADE_DURATION) }, label = "tabContent", ) { tabNavigator.saveableState(key = "currentTab", it) { it.Content() } } } } } val goToStartScreen = { if (defaultTab != moreTab) { tabNavigator.current = defaultTab } else { tabNavigator.current = AnimeLibraryTab } } BackHandler( enabled = (tabNavigator.current == moreTab || tabNavigator.current != defaultTab) && (tabNavigator.current != AnimeLibraryTab || defaultTab != moreTab), onBack = goToStartScreen, ) LaunchedEffect(Unit) { launch { librarySearchEvent.receiveAsFlow().collectLatest { goToStartScreen() when (defaultTab) { AnimeLibraryTab -> AnimeLibraryTab.search(it) MangaLibraryTab -> MangaLibraryTab.search(it) else -> {} } } } launch { openTabEvent.receiveAsFlow().collectLatest { tabNavigator.current = when (it) { is Tab.AnimeLib -> AnimeLibraryTab is Tab.Library -> MangaLibraryTab is Tab.Updates -> UpdatesTab is Tab.History -> HistoriesTab is Tab.Browse -> { if (it.toExtensions) { if (!it.anime) { BrowseTab.showExtension() } else { BrowseTab.showAnimeExtension() } } BrowseTab } is Tab.More -> MoreTab } if (it is Tab.AnimeLib && it.animeIdToOpen != null) { navigator.push(AnimeScreen(it.animeIdToOpen)) } if (it is Tab.Library && it.mangaIdToOpen != null) { navigator.push(MangaScreen(it.mangaIdToOpen)) } if (it is Tab.More && it.toDownloads) { navigator.push(DownloadsTab) } } } } } } @Composable private fun RowScope.NavigationBarItem(tab: eu.kanade.presentation.util.Tab) { val tabNavigator = LocalTabNavigator.current val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val selected = tabNavigator.current::class == tab::class NavigationBarItem( selected = selected, onClick = { if (!selected) { tabNavigator.current = tab } else { scope.launch { tab.onReselect(navigator) } } }, icon = { NavigationIconItem(tab) }, label = { Text( text = tab.options.title, style = MaterialTheme.typography.labelLarge, maxLines = 1, overflow = TextOverflow.Ellipsis, ) }, alwaysShowLabel = true, ) } @Composable fun NavigationRailItem(tab: eu.kanade.presentation.util.Tab) { val tabNavigator = LocalTabNavigator.current val navigator = LocalNavigator.currentOrThrow val scope = rememberCoroutineScope() val selected = tabNavigator.current::class == tab::class NavigationRailItem( selected = selected, onClick = { if (!selected) { tabNavigator.current = tab } else { scope.launch { tab.onReselect(navigator) } } }, icon = { NavigationIconItem(tab) }, label = { Text( text = tab.options.title, style = MaterialTheme.typography.labelLarge, maxLines = 1, overflow = TextOverflow.Ellipsis, ) }, alwaysShowLabel = true, ) } @Composable private fun NavigationIconItem(tab: eu.kanade.presentation.util.Tab) { BadgedBox( badge = { when { UpdatesTab::class.isInstance(tab) -> { val count by produceState(initialValue = 0) { val pref = Injekt.get() combine( pref.newAnimeUpdatesCount().changes(), pref.newMangaUpdatesCount().changes(), ) { countAnime, countManga -> countAnime + countManga } .collectLatest { value = if (pref.newShowUpdatesCount().get()) it else 0 } } if (count > 0) { Badge { val desc = pluralStringResource( MR.plurals.notification_chapters_generic, count = count, count, ) Text( text = count.toString(), modifier = Modifier.semantics { contentDescription = desc }, ) } } } BrowseTab::class.isInstance(tab) -> { val count by produceState(initialValue = 0) { val pref = Injekt.get() combine( pref.mangaExtensionUpdatesCount().changes(), pref.animeExtensionUpdatesCount().changes(), ) { extCount, animeExtCount -> extCount + animeExtCount } .collectLatest { value = it } } if (count > 0) { Badge { val desc = pluralStringResource( MR.plurals.update_check_notification_ext_updates, count = count, count, ) Text( text = count.toString(), modifier = Modifier.semantics { contentDescription = desc }, ) } } } } }, ) { Icon( painter = tab.options.icon!!, contentDescription = tab.options.title, // TODO: https://issuetracker.google.com/u/0/issues/316327367 tint = LocalContentColor.current, ) } } suspend fun search(query: String) { librarySearchEvent.send(query) } suspend fun openTab(tab: Tab) { openTabEvent.send(tab) } suspend fun showBottomNav(show: Boolean) { showBottomNavEvent.send(show) } sealed interface Tab { data class AnimeLib(val animeIdToOpen: Long? = null) : Tab data class Library(val mangaIdToOpen: Long? = null) : Tab data object Updates : Tab data object History : Tab data class Browse(val toExtensions: Boolean = false, val anime: Boolean = false) : Tab data class More(val toDownloads: Boolean) : Tab } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryItem.kt ================================================ package eu.kanade.tachiyomi.ui.library.anime import eu.kanade.tachiyomi.source.anime.getNameForAnimeInfo import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.source.anime.service.AnimeSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get data class AnimeLibraryItem( val libraryAnime: LibraryAnime, var downloadCount: Long = -1, var unseenCount: Long = -1, var isLocal: Boolean = false, var sourceLanguage: String = "", private val sourceManager: AnimeSourceManager = Injekt.get(), ) { /** * Checks if a query matches the anime * * @param constraint the query to check. * @return true if the anime matches the query, false otherwise. */ fun matches(constraint: String): Boolean { val sourceName by lazy { sourceManager.getOrStub(libraryAnime.anime.source).getNameForAnimeInfo() } if (constraint.startsWith("id:", true)) { val id = constraint.substringAfter("id:").toLongOrNull() return libraryAnime.id == id } return libraryAnime.anime.title.contains(constraint, true) || (libraryAnime.anime.author?.contains(constraint, true) ?: false) || (libraryAnime.anime.artist?.contains(constraint, true) ?: false) || (libraryAnime.anime.description?.contains(constraint, true) ?: false) || constraint.split(",").map { it.trim() }.all { subconstraint -> checkNegatableConstraint(subconstraint) { sourceName.contains(it, true) || (libraryAnime.anime.genre?.any { genre -> genre.equals(it, true) } ?: false) } } } /** * Checks a predicate on a negatable constraint. If the constraint starts with a minus character, * the minus is stripped and the result of the predicate is inverted. * * @param constraint the argument to the predicate. Inverts the predicate if it starts with '-'. * @param predicate the check to be run against the constraint. * @return !predicate(x) if constraint = "-x", otherwise predicate(constraint) */ private fun checkNegatableConstraint( constraint: String, predicate: (String) -> Boolean, ): Boolean { return if (constraint.startsWith("-")) { !predicate(constraint.substringAfter("-").trimStart()) } else { predicate(constraint) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.library.anime import androidx.compose.runtime.Immutable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastDistinctBy import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastMap import androidx.compose.ui.util.fastMapNotNull import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.core.preference.asState import eu.kanade.core.util.fastFilterNot import eu.kanade.core.util.fastPartition import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.entries.anime.interactor.UpdateAnime import eu.kanade.domain.items.episode.interactor.SetSeenStatus import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS import eu.kanade.presentation.entries.DownloadAction import eu.kanade.presentation.library.components.LibraryToolbarTitle import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.cache.AnimeBackgroundCache import eu.kanade.tachiyomi.data.cache.AnimeCoverCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.util.episode.getNextUnseen import eu.kanade.tachiyomi.util.removeBackgrounds import eu.kanade.tachiyomi.util.removeCovers import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.util.lang.compareToWithCollator import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.category.anime.interactor.GetVisibleAnimeCategories import tachiyomi.domain.category.anime.interactor.SetAnimeCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.anime.interactor.GetLibraryAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.entries.anime.model.AnimeUpdate import tachiyomi.domain.entries.applyFilter import tachiyomi.domain.history.anime.interactor.GetNextEpisodes import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.domain.library.anime.model.AnimeLibrarySort import tachiyomi.domain.library.anime.model.sort import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.track.anime.interactor.GetTracksPerAnime import tachiyomi.domain.track.anime.model.AnimeTrack import tachiyomi.source.local.entries.anime.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.random.Random /** * Typealias for the library anime, using the category as keys, and list of anime as values. */ typealias AnimeLibraryMap = Map> class AnimeLibraryScreenModel( private val getLibraryAnime: GetLibraryAnime = Injekt.get(), private val getCategories: GetVisibleAnimeCategories = Injekt.get(), private val getTracksPerAnime: GetTracksPerAnime = Injekt.get(), private val getNextEpisodes: GetNextEpisodes = Injekt.get(), private val getEpisodesByAnimeId: GetEpisodesByAnimeId = Injekt.get(), private val setSeenStatus: SetSeenStatus = Injekt.get(), private val updateAnime: UpdateAnime = Injekt.get(), private val setAnimeCategories: SetAnimeCategories = Injekt.get(), private val preferences: BasePreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val coverCache: AnimeCoverCache = Injekt.get(), private val backgroundCache: AnimeBackgroundCache = Injekt.get(), private val sourceManager: AnimeSourceManager = Injekt.get(), private val downloadManager: AnimeDownloadManager = Injekt.get(), private val downloadCache: AnimeDownloadCache = Injekt.get(), private val trackerManager: TrackerManager = Injekt.get(), ) : StateScreenModel(State()) { var activeCategoryIndex: Int by libraryPreferences.lastUsedAnimeCategory().asState( screenModelScope, ) init { screenModelScope.launchIO { combine( state.map { it.searchQuery }.debounce(SEARCH_DEBOUNCE_MILLIS), getLibraryFlow(), getTracksPerAnime.subscribe(), getTrackingFilterFlow(), downloadCache.changes, ) { searchQuery, library, tracks, trackingFilter, _ -> library .applyFilters(tracks, trackingFilter) .applySort(tracks, trackingFilter.keys) .mapValues { (_, value) -> if (searchQuery != null) { value.filter { it.matches(searchQuery) } } else { value } } } .collectLatest { mutableState.update { state -> state.copy( isLoading = false, library = it, ) } } } combine( libraryPreferences.categoryTabs().changes(), libraryPreferences.categoryNumberOfItems().changes(), libraryPreferences.showContinueViewingButton().changes(), ) { a, b, c -> arrayOf(a, b, c) } .onEach { (showCategoryTabs, showAnimeCount, showAnimeContinueButton) -> mutableState.update { state -> state.copy( showCategoryTabs = showCategoryTabs, showAnimeCount = showAnimeCount, showAnimeContinueButton = showAnimeContinueButton, ) } } .launchIn(screenModelScope) combine( getAnimelibItemPreferencesFlow(), getTrackingFilterFlow(), ) { prefs, trackFilter -> ( listOf( prefs.filterDownloaded, prefs.filterUnseen, prefs.filterStarted, prefs.filterBookmarked, prefs.filterCompleted, prefs.filterIntervalCustom, ) + trackFilter.values ).any { it != TriState.DISABLED } } .distinctUntilChanged() .onEach { mutableState.update { state -> state.copy(hasActiveFilters = it) } } .launchIn(screenModelScope) } private suspend fun AnimeLibraryMap.applyFilters( trackMap: Map>, trackingFilter: Map, ): AnimeLibraryMap { val prefs = getAnimelibItemPreferencesFlow().first() val downloadedOnly = prefs.globalFilterDownloaded val skipOutsideReleasePeriod = prefs.skipOutsideReleasePeriod val filterDownloaded = if (downloadedOnly) TriState.ENABLED_IS else prefs.filterDownloaded val filterUnseen = prefs.filterUnseen val filterStarted = prefs.filterStarted val filterBookmarked = prefs.filterBookmarked val filterCompleted = prefs.filterCompleted val filterIntervalCustom = prefs.filterIntervalCustom val isNotLoggedInAnyTrack = trackingFilter.isEmpty() val excludedTracks = trackingFilter.mapNotNull { if (it.value == TriState.ENABLED_NOT) it.key else null } val includedTracks = trackingFilter.mapNotNull { if (it.value == TriState.ENABLED_IS) it.key else null } val trackFiltersIsIgnored = includedTracks.isEmpty() && excludedTracks.isEmpty() val filterFnDownloaded: (AnimeLibraryItem) -> Boolean = { applyFilter(filterDownloaded) { it.libraryAnime.anime.isLocal() || it.downloadCount > 0 || downloadManager.getDownloadCount(it.libraryAnime.anime) > 0 } } val filterFnUnseen: (AnimeLibraryItem) -> Boolean = { applyFilter(filterUnseen) { it.libraryAnime.unseenCount > 0 } } val filterFnStarted: (AnimeLibraryItem) -> Boolean = { applyFilter(filterStarted) { it.libraryAnime.hasStarted } } val filterFnBookmarked: (AnimeLibraryItem) -> Boolean = { applyFilter(filterBookmarked) { it.libraryAnime.hasBookmarks } } val filterFnCompleted: (AnimeLibraryItem) -> Boolean = { applyFilter(filterCompleted) { it.libraryAnime.anime.status.toInt() == SAnime.COMPLETED } } val filterFnIntervalCustom: (AnimeLibraryItem) -> Boolean = { if (skipOutsideReleasePeriod) { applyFilter(filterIntervalCustom) { it.libraryAnime.anime.fetchInterval < 0 } } else { true } } val filterFnTracking: (AnimeLibraryItem) -> Boolean = tracking@{ item -> if (isNotLoggedInAnyTrack || trackFiltersIsIgnored) return@tracking true val animeTracks = trackMap .mapValues { entry -> entry.value.map { it.trackerId } }[item.libraryAnime.id] .orEmpty() val isExcluded = excludedTracks.isNotEmpty() && animeTracks.fastAny { it in excludedTracks } val isIncluded = includedTracks.isEmpty() || animeTracks.fastAny { it in includedTracks } !isExcluded && isIncluded } val filterFn: (AnimeLibraryItem) -> Boolean = { filterFnDownloaded(it) && filterFnUnseen(it) && filterFnStarted(it) && filterFnBookmarked(it) && filterFnCompleted(it) && filterFnIntervalCustom(it) && filterFnTracking(it) } return mapValues { (_, value) -> value.fastFilter(filterFn) } } private fun AnimeLibraryMap.applySort( trackMap: Map>, loggedInTrackerIds: Set, ): AnimeLibraryMap { val sortAlphabetically: (AnimeLibraryItem, AnimeLibraryItem) -> Int = { i1, i2 -> i1.libraryAnime.anime.title.lowercase().compareToWithCollator(i2.libraryAnime.anime.title.lowercase()) } val defaultTrackerScoreSortValue = -1.0 val trackerScores by lazy { val trackerMap = trackerManager.getAll(loggedInTrackerIds).associateBy { e -> e.id } trackMap.mapValues { entry -> when { entry.value.isEmpty() -> null else -> entry.value .mapNotNull { trackerMap[it.trackerId]?.animeService?.get10PointScore(it) } .average() } } } fun AnimeLibrarySort.comparator(): Comparator = Comparator { i1, i2 -> when (this.type) { AnimeLibrarySort.Type.Alphabetical -> { sortAlphabetically(i1, i2) } AnimeLibrarySort.Type.LastSeen -> { i1.libraryAnime.lastSeen.compareTo(i2.libraryAnime.lastSeen) } AnimeLibrarySort.Type.LastUpdate -> { i1.libraryAnime.anime.lastUpdate.compareTo(i2.libraryAnime.anime.lastUpdate) } AnimeLibrarySort.Type.UnseenCount -> when { // Ensure unseen content comes first i1.libraryAnime.unseenCount == i2.libraryAnime.unseenCount -> 0 i1.libraryAnime.unseenCount == 0L -> if (this.isAscending) 1 else -1 i2.libraryAnime.unseenCount == 0L -> if (this.isAscending) -1 else 1 else -> i1.libraryAnime.unseenCount.compareTo(i2.libraryAnime.unseenCount) } AnimeLibrarySort.Type.TotalEpisodes -> { i1.libraryAnime.totalCount.compareTo(i2.libraryAnime.totalCount) } AnimeLibrarySort.Type.LatestEpisode -> { i1.libraryAnime.latestUpload.compareTo(i2.libraryAnime.latestUpload) } AnimeLibrarySort.Type.EpisodeFetchDate -> { i1.libraryAnime.episodeFetchedAt.compareTo(i2.libraryAnime.episodeFetchedAt) } AnimeLibrarySort.Type.DateAdded -> { i1.libraryAnime.anime.dateAdded.compareTo(i2.libraryAnime.anime.dateAdded) } AnimeLibrarySort.Type.TrackerMean -> { val item1Score = trackerScores[i1.libraryAnime.id] ?: defaultTrackerScoreSortValue val item2Score = trackerScores[i2.libraryAnime.id] ?: defaultTrackerScoreSortValue item1Score.compareTo(item2Score) } AnimeLibrarySort.Type.AiringTime -> when { i1.libraryAnime.unseenCount != i2.libraryAnime.unseenCount -> i1.libraryAnime.unseenCount.compareTo(i2.libraryAnime.unseenCount) i1.libraryAnime.anime.nextEpisodeAiringAt == i2.libraryAnime.anime.nextEpisodeAiringAt -> 0 i1.libraryAnime.anime.nextEpisodeAiringAt == 0L -> if (this.isAscending) 1 else -1 i2.libraryAnime.anime.nextEpisodeAiringAt == 0L -> if (this.isAscending) -1 else 1 else -> i1.libraryAnime.anime.nextEpisodeAiringAt.compareTo( i2.libraryAnime.anime.nextEpisodeAiringAt, ) } AnimeLibrarySort.Type.Random -> { error("Why Are We Still Here? Just To Suffer?") } } } return mapValues { (key, value) -> if (key.sort.type == AnimeLibrarySort.Type.Random) { return@mapValues value.shuffled(Random(libraryPreferences.randomAnimeSortSeed().get())) } val comparator = key.sort.comparator() .let { if (key.sort.isAscending) it else it.reversed() } .thenComparator(sortAlphabetically) value.sortedWith(comparator) } } private fun getAnimelibItemPreferencesFlow(): Flow { return combine( libraryPreferences.downloadBadge().changes(), libraryPreferences.unreadBadge().changes(), libraryPreferences.localBadge().changes(), libraryPreferences.languageBadge().changes(), libraryPreferences.autoUpdateItemRestrictions().changes(), preferences.downloadedOnly().changes(), libraryPreferences.filterDownloadedAnime().changes(), libraryPreferences.filterUnseen().changes(), libraryPreferences.filterStartedAnime().changes(), libraryPreferences.filterBookmarkedAnime().changes(), libraryPreferences.filterCompletedAnime().changes(), libraryPreferences.filterIntervalCustom().changes(), transform = { ItemPreferences( downloadBadge = it[0] as Boolean, unseenBadge = it[1] as Boolean, localBadge = it[2] as Boolean, languageBadge = it[3] as Boolean, skipOutsideReleasePeriod = LibraryPreferences.ENTRY_OUTSIDE_RELEASE_PERIOD in (it[4] as Set<*>), globalFilterDownloaded = it[5] as Boolean, filterDownloaded = it[6] as TriState, filterUnseen = it[7] as TriState, filterStarted = it[8] as TriState, filterBookmarked = it[9] as TriState, filterCompleted = it[10] as TriState, filterIntervalCustom = it[11] as TriState, ) }, ) } /** * Get the categories and all its anime from the database. */ private fun getLibraryFlow(): Flow { val animelibAnimesFlow = combine( getLibraryAnime.subscribe(), getAnimelibItemPreferencesFlow(), downloadCache.changes, ) { animelibAnimeList, prefs, _ -> animelibAnimeList .map { animelibAnime -> // Display mode based on user preference: take it from global library setting or category AnimeLibraryItem( animelibAnime, downloadCount = if (prefs.downloadBadge) { downloadManager.getDownloadCount(animelibAnime.anime).toLong() } else { 0 }, unseenCount = if (prefs.unseenBadge) animelibAnime.unseenCount else 0, isLocal = if (prefs.localBadge) animelibAnime.anime.isLocal() else false, sourceLanguage = if (prefs.languageBadge) { sourceManager.getOrStub(animelibAnime.anime.source).lang } else { "" }, ) } .groupBy { it.libraryAnime.category } } return combine(getCategories.subscribe(), animelibAnimesFlow) { categories, animelibAnime -> val displayCategories = if (animelibAnime.isNotEmpty() && !animelibAnime.containsKey(0)) { categories.fastFilterNot { it.isSystemCategory } } else { categories } displayCategories.associateWith { animelibAnime[it.id].orEmpty() } } } /** * Flow of tracking filter preferences * * @return map of track id with the filter value */ private fun getTrackingFilterFlow(): Flow> { return trackerManager.loggedInTrackersFlow().flatMapLatest { loggedInTrackers -> if (loggedInTrackers.isEmpty()) return@flatMapLatest flowOf(emptyMap()) val prefFlows = loggedInTrackers.map { tracker -> libraryPreferences.filterTrackedAnime(tracker.id.toInt()).changes() } combine(prefFlows) { loggedInTrackers .mapIndexed { index, tracker -> tracker.id to it[index] } .toMap() } } } /** * Returns the common categories for the given list of anime. * * @param animes the list of anime. */ private suspend fun getCommonCategories(animes: List): Collection { if (animes.isEmpty()) return emptyList() return animes .map { getCategories.await(it.id).toSet() } .reduce { set1, set2 -> set1.intersect(set2) } } suspend fun getNextUnseenEpisode(anime: Anime): Episode? { return getEpisodesByAnimeId.await(anime.id).getNextUnseen(anime, downloadManager) } /** * Returns the mix (non-common) categories for the given list of anime. * * @param animes the list of anime. */ private suspend fun getMixCategories(animes: List): Collection { if (animes.isEmpty()) return emptyList() val nimeCategories = animes.map { getCategories.await(it.id).toSet() } val common = nimeCategories.reduce { set1, set2 -> set1.intersect(set2) } return nimeCategories.flatten().distinct().subtract(common) } fun runDownloadActionSelection(action: DownloadAction) { val selection = state.value.selection val animes = selection.map { it.anime }.toList() when (action) { DownloadAction.NEXT_1_ITEM -> downloadUnseenEpisodes(animes, 1) DownloadAction.NEXT_5_ITEMS -> downloadUnseenEpisodes(animes, 5) DownloadAction.NEXT_10_ITEMS -> downloadUnseenEpisodes(animes, 10) DownloadAction.NEXT_25_ITEMS -> downloadUnseenEpisodes(animes, 25) DownloadAction.UNVIEWED_ITEMS -> downloadUnseenEpisodes(animes, null) } clearSelection() } /** * Queues the amount specified of unseen episodes from the list of animes given. * * @param animes the list of anime. * @param amount the amount to queue or null to queue all */ private fun downloadUnseenEpisodes(animes: List, amount: Int?) { screenModelScope.launchNonCancellable { animes.forEach { anime -> val episodes = getNextEpisodes.await(anime.id) .fastFilterNot { episode -> downloadManager.getQueuedDownloadOrNull(episode.id) != null || downloadManager.isEpisodeDownloaded( episode.name, episode.scanlator, anime.title, anime.source, ) } .let { if (amount != null) it.take(amount) else it } downloadManager.downloadEpisodes(anime, episodes) } } } /** * Marks animes' episodes seen status. */ fun markSeenSelection(seen: Boolean) { val animes = state.value.selection.toList() screenModelScope.launchNonCancellable { animes.forEach { anime -> setSeenStatus.await( anime = anime.anime, seen = seen, ) } } clearSelection() } /** * Remove the selected anime. * * @param animeList the list of anime to delete. * @param deleteFromLibrary whether to delete anime from library. * @param deleteEpisodes whether to delete downloaded episodes. */ fun removeAnimes(animeList: List, deleteFromLibrary: Boolean, deleteEpisodes: Boolean) { screenModelScope.launchNonCancellable { val animeToDelete = animeList.distinctBy { it.id } if (deleteFromLibrary) { val toDelete = animeToDelete.map { it.removeCovers(coverCache) it.removeBackgrounds(backgroundCache) AnimeUpdate( favorite = false, id = it.id, ) } updateAnime.awaitAll(toDelete) } if (deleteEpisodes) { animeToDelete.forEach { anime -> val source = sourceManager.get(anime.source) as? AnimeHttpSource if (source != null) { downloadManager.deleteAnime(anime, source) } } } } } /** * Bulk update categories of anime using old and new common categories. * * @param animeList the list of anime to move. * @param addCategories the categories to add for all animes. * @param removeCategories the categories to remove in all animes. */ fun setAnimeCategories( animeList: List, addCategories: List, removeCategories: List, ) { screenModelScope.launchNonCancellable { animeList.forEach { anime -> val categoryIds = getCategories.await(anime.id) .map { it.id } .subtract(removeCategories.toSet()) .plus(addCategories) .toList() setAnimeCategories.await(anime.id, categoryIds) } } } fun getDisplayMode(): PreferenceMutableState { return libraryPreferences.displayMode().asState(screenModelScope) } fun getColumnsPreferenceForCurrentOrientation(isLandscape: Boolean): PreferenceMutableState { return ( if (isLandscape) { libraryPreferences.animeLandscapeColumns() } else { libraryPreferences.animePortraitColumns() } ).asState( screenModelScope, ) } suspend fun getRandomAnimelibItemForCurrentCategory(): AnimeLibraryItem? { if (state.value.categories.isEmpty()) return null return withIOContext { state.value .getAnimelibItemsByCategoryId(state.value.categories[activeCategoryIndex].id) ?.randomOrNull() } } fun showSettingsDialog() { mutableState.update { it.copy(dialog = Dialog.SettingsSheet) } } fun clearSelection() { mutableState.update { it.copy(selection = persistentListOf()) } } fun toggleSelection(anime: LibraryAnime) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> if (list.fastAny { it.id == anime.id }) { list.removeAll { it.id == anime.id } } else { list.add(anime) } } state.copy(selection = newSelection) } } /** * Selects all nimes between and including the given anime and the last pressed anime from the * same category as the given anime */ fun toggleRangeSelection(anime: LibraryAnime) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> val lastSelected = list.lastOrNull() if (lastSelected?.category != anime.category) { list.add(anime) return@mutate } val items = state.getAnimelibItemsByCategoryId(anime.category) ?.fastMap { it.libraryAnime }.orEmpty() val lastAnimeIndex = items.indexOf(lastSelected) val curAnimeIndex = items.indexOf(anime) val selectedIds = list.fastMap { it.id } val selectionRange = when { lastAnimeIndex < curAnimeIndex -> IntRange(lastAnimeIndex, curAnimeIndex) curAnimeIndex < lastAnimeIndex -> IntRange(curAnimeIndex, lastAnimeIndex) // We shouldn't reach this point else -> return@mutate } val newSelections = selectionRange.mapNotNull { index -> items[index].takeUnless { it.id in selectedIds } } list.addAll(newSelections) } state.copy(selection = newSelection) } } fun selectAll(index: Int) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> val categoryId = state.categories.getOrNull(index)?.id ?: -1 val selectedIds = list.fastMap { it.id } state.getAnimelibItemsByCategoryId(categoryId) ?.fastMapNotNull { item -> item.libraryAnime.takeUnless { it.id in selectedIds } } ?.let { list.addAll(it) } } state.copy(selection = newSelection) } } fun invertSelection(index: Int) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> val categoryId = state.categories[index].id val items = state.getAnimelibItemsByCategoryId(categoryId)?.fastMap { it.libraryAnime }.orEmpty() val selectedIds = list.fastMap { it.id } val (toRemove, toAdd) = items.fastPartition { it.id in selectedIds } val toRemoveIds = toRemove.fastMap { it.id } list.removeAll { it.id in toRemoveIds } list.addAll(toAdd) } state.copy(selection = newSelection) } } fun search(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun openChangeCategoryDialog() { screenModelScope.launchIO { // Create a copy of selected anime val animeList = state.value.selection.map { it.anime } // Hide the default category because it has a different behavior than the ones from db. val categories = state.value.categories.filter { it.id != 0L } // Get indexes of the common categories to preselect. val common = getCommonCategories(animeList) // Get indexes of the mix categories to preselect. val mix = getMixCategories(animeList) val preselected = categories .map { when (it) { in common -> CheckboxState.State.Checked(it) in mix -> CheckboxState.TriState.Exclude(it) else -> CheckboxState.State.None(it) } } .toImmutableList() mutableState.update { it.copy(dialog = Dialog.ChangeCategory(animeList, preselected)) } } } fun openDeleteAnimeDialog() { val nimeList = state.value.selection.map { it.anime } mutableState.update { it.copy(dialog = Dialog.DeleteAnime(nimeList)) } } fun closeDialog() { mutableState.update { it.copy(dialog = null) } } sealed interface Dialog { data object SettingsSheet : Dialog data class ChangeCategory( val anime: List, val initialSelection: ImmutableList>, ) : Dialog data class DeleteAnime(val anime: List) : Dialog } @Immutable private data class ItemPreferences( val downloadBadge: Boolean, val unseenBadge: Boolean, val localBadge: Boolean, val languageBadge: Boolean, val skipOutsideReleasePeriod: Boolean, val globalFilterDownloaded: Boolean, val filterDownloaded: TriState, val filterUnseen: TriState, val filterStarted: TriState, val filterBookmarked: TriState, val filterCompleted: TriState, val filterIntervalCustom: TriState, ) @Immutable data class State( val isLoading: Boolean = true, val library: AnimeLibraryMap = emptyMap(), val searchQuery: String? = null, val selection: PersistentList = persistentListOf(), val hasActiveFilters: Boolean = false, val showCategoryTabs: Boolean = false, val showAnimeCount: Boolean = false, val showAnimeContinueButton: Boolean = false, val dialog: Dialog? = null, ) { private val libraryCount by lazy { library.values .flatten() .fastDistinctBy { it.libraryAnime.anime.id } .size } val isLibraryEmpty by lazy { libraryCount == 0 } val selectionMode = selection.isNotEmpty() val categories = library.keys.toList() fun getAnimelibItemsByCategoryId(categoryId: Long): List? { return library.firstNotNullOfOrNull { (k, v) -> v.takeIf { k.id == categoryId } } } fun getAnimelibItemsByPage(page: Int): List { return library.values.toTypedArray().getOrNull(page).orEmpty() } fun getAnimeCountForCategory(category: Category): Int? { return if (showAnimeCount || !searchQuery.isNullOrEmpty()) library[category]?.size else null } fun getToolbarTitle( defaultTitle: String, defaultCategoryTitle: String, page: Int, ): LibraryToolbarTitle { val category = categories.getOrNull(page) ?: return LibraryToolbarTitle(defaultTitle) val categoryName = category.let { if (it.isSystemCategory) defaultCategoryTitle else it.name } val title = if (showCategoryTabs) defaultTitle else categoryName val count = when { !showAnimeCount -> null !showCategoryTabs -> getAnimeCountForCategory(category) // Whole library count else -> libraryCount } return LibraryToolbarTitle(title, count) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibrarySettingsScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.library.anime import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.data.track.TrackerManager import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.stateIn import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.preference.getAndSet import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.anime.interactor.SetAnimeDisplayMode import tachiyomi.domain.category.anime.interactor.SetSortModeForAnimeCategory import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.anime.model.AnimeLibrarySort import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.service.LibraryPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds class AnimeLibrarySettingsScreenModel( val preferences: BasePreferences = Injekt.get(), val libraryPreferences: LibraryPreferences = Injekt.get(), private val setAnimeDisplayMode: SetAnimeDisplayMode = Injekt.get(), private val setSortModeForCategory: SetSortModeForAnimeCategory = Injekt.get(), trackerManager: TrackerManager = Injekt.get(), ) : ScreenModel { val trackersFlow = trackerManager.loggedInTrackersFlow() .stateIn( scope = screenModelScope, started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds), initialValue = trackerManager.loggedInTrackers(), ) fun toggleFilter(preference: (LibraryPreferences) -> Preference) { preference(libraryPreferences).getAndSet { it.next() } } fun toggleTracker(id: Int) { toggleFilter { libraryPreferences.filterTrackedAnime(id) } } fun setDisplayMode(mode: LibraryDisplayMode) { setAnimeDisplayMode.await(mode) } fun setSort( category: Category?, mode: AnimeLibrarySort.Type, direction: AnimeLibrarySort.Direction, ) { screenModelScope.launchIO { setSortModeForCategory.await(category, mode, direction) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/anime/AnimeLibraryTab.kt ================================================ package eu.kanade.tachiyomi.ui.library.anime import androidx.activity.compose.BackHandler import androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.util.fastAll import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.entries.components.LibraryBottomActionMenu import eu.kanade.presentation.library.DeleteLibraryEntryDialog import eu.kanade.presentation.library.anime.AnimeLibraryContent import eu.kanade.presentation.library.anime.AnimeLibrarySettingsDialog import eu.kanade.presentation.library.components.LibraryToolbar import eu.kanade.presentation.more.onboarding.GETTING_STARTED_URL import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.anime.AnimeLibraryUpdateJob import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearchScreen import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.library.anime.LibraryAnime import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreenAction import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.anime.isLocal import uy.kohesive.injekt.injectLazy data object AnimeLibraryTab : Tab { @OptIn(ExperimentalAnimationGraphicsApi::class) override val options: TabOptions @Composable get() { val title = AYMR.strings.label_anime_library val isSelected = LocalTabNavigator.current.current.key == key val image = AnimatedImageVector.animatedVectorResource( R.drawable.anim_animelibrary_leave, ) return TabOptions( index = 0u, title = stringResource(title), icon = rememberAnimatedVectorPainter(image, isSelected), ) } override suspend fun onReselect(navigator: Navigator) { requestOpenSettingsSheet() } @OptIn(ExperimentalMaterial3Api::class) @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val scope = rememberCoroutineScope() val haptic = LocalHapticFeedback.current val screenModel = rememberScreenModel { AnimeLibraryScreenModel() } val settingsScreenModel = rememberScreenModel { AnimeLibrarySettingsScreenModel() } val state by screenModel.state.collectAsState() val snackbarHostState = remember { SnackbarHostState() } val onClickRefresh: (Category?) -> Boolean = { category -> val started = AnimeLibraryUpdateJob.startNow(context, category) scope.launch { val msgRes = if (started) MR.strings.updating_category else MR.strings.update_already_running snackbarHostState.showSnackbar(context.stringResource(msgRes)) } started } suspend fun openEpisode(episode: Episode) { val playerPreferences: PlayerPreferences by injectLazy() val extPlayer = playerPreferences.alwaysUseExternalPlayer().get() MainActivity.startPlayerActivity(context, episode.animeId, episode.id, extPlayer) } val defaultTitle = stringResource(AYMR.strings.label_anime_library) Scaffold( topBar = { scrollBehavior -> val title = state.getToolbarTitle( defaultTitle = defaultTitle, defaultCategoryTitle = stringResource(MR.strings.label_default), page = screenModel.activeCategoryIndex, ) val tabVisible = state.showCategoryTabs && state.categories.size > 1 LibraryToolbar( hasActiveFilters = state.hasActiveFilters, selectedCount = state.selection.size, title = title, onClickUnselectAll = screenModel::clearSelection, onClickSelectAll = { screenModel.selectAll(screenModel.activeCategoryIndex) }, onClickInvertSelection = { screenModel.invertSelection( screenModel.activeCategoryIndex, ) }, onClickFilter = screenModel::showSettingsDialog, onClickRefresh = { onClickRefresh( state.categories[screenModel.activeCategoryIndex], ) }, onClickGlobalUpdate = { onClickRefresh(null) }, onClickOpenRandomEntry = { scope.launch { val randomItem = screenModel.getRandomAnimelibItemForCurrentCategory() if (randomItem != null) { navigator.push(AnimeScreen(randomItem.libraryAnime.anime.id)) } else { snackbarHostState.showSnackbar( context.stringResource(MR.strings.information_no_entries_found), ) } } }, searchQuery = state.searchQuery, onSearchQueryChange = screenModel::search, scrollBehavior = scrollBehavior.takeIf { !tabVisible }, // For scroll overlay when no tab ) }, bottomBar = { LibraryBottomActionMenu( visible = state.selectionMode, onChangeCategoryClicked = screenModel::openChangeCategoryDialog, onMarkAsViewedClicked = { screenModel.markSeenSelection(true) }, onMarkAsUnviewedClicked = { screenModel.markSeenSelection(false) }, onDownloadClicked = screenModel::runDownloadActionSelection .takeIf { state.selection.fastAll { !it.anime.isLocal() } }, onDeleteClicked = screenModel::openDeleteAnimeDialog, isManga = false, ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.searchQuery.isNullOrEmpty() && !state.hasActiveFilters && state.isLibraryEmpty -> { val handler = LocalUriHandler.current EmptyScreen( stringRes = MR.strings.information_empty_library, modifier = Modifier.padding(contentPadding), actions = persistentListOf( EmptyScreenAction( stringRes = MR.strings.getting_started_guide, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = { handler.openUri(GETTING_STARTED_URL) }, ), ), ) } else -> { AnimeLibraryContent( categories = state.categories, searchQuery = state.searchQuery, selection = state.selection, contentPadding = contentPadding, currentPage = { screenModel.activeCategoryIndex }, hasActiveFilters = state.hasActiveFilters, showPageTabs = state.showCategoryTabs || !state.searchQuery.isNullOrEmpty(), onChangeCurrentPage = { screenModel.activeCategoryIndex = it }, onAnimeClicked = { navigator.push(AnimeScreen(it)) }, onContinueWatchingClicked = { it: LibraryAnime -> scope.launchIO { val episode = screenModel.getNextUnseenEpisode(it.anime) if (episode != null) openEpisode(episode) } Unit }.takeIf { state.showAnimeContinueButton }, onToggleSelection = screenModel::toggleSelection, onToggleRangeSelection = { screenModel.toggleRangeSelection(it) haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, onRefresh = onClickRefresh, onGlobalSearchClicked = { navigator.push( GlobalAnimeSearchScreen(screenModel.state.value.searchQuery ?: ""), ) }, getNumberOfAnimeForCategory = { state.getAnimeCountForCategory(it) }, getDisplayMode = { screenModel.getDisplayMode() }, getColumnsForOrientation = { screenModel.getColumnsPreferenceForCurrentOrientation( it, ) }, ) { state.getAnimelibItemsByPage(it) } } } } val onDismissRequest = screenModel::closeDialog when (val dialog = state.dialog) { is AnimeLibraryScreenModel.Dialog.SettingsSheet -> run { val category = state.categories.getOrNull(screenModel.activeCategoryIndex) if (category == null) { onDismissRequest() return@run } AnimeLibrarySettingsDialog( onDismissRequest = onDismissRequest, screenModel = settingsScreenModel, category = category, ) } is AnimeLibraryScreenModel.Dialog.ChangeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { screenModel.clearSelection() navigator.push(CategoriesTab) }, onConfirm = { include, exclude -> screenModel.clearSelection() screenModel.setAnimeCategories(dialog.anime, include, exclude) }, ) } is AnimeLibraryScreenModel.Dialog.DeleteAnime -> { DeleteLibraryEntryDialog( containsLocalEntry = dialog.anime.any(Anime::isLocal), onDismissRequest = onDismissRequest, onConfirm = { deleteAnime, deleteEpisode -> screenModel.removeAnimes(dialog.anime, deleteAnime, deleteEpisode) screenModel.clearSelection() }, isManga = false, ) } null -> {} } BackHandler(enabled = state.selectionMode || state.searchQuery != null) { when { state.selectionMode -> screenModel.clearSelection() state.searchQuery != null -> screenModel.search(null) } } LaunchedEffect(state.selectionMode, state.dialog) { HomeScreen.showBottomNav(!state.selectionMode) } LaunchedEffect(state.isLoading) { if (!state.isLoading) { (context as? MainActivity)?.ready = true } } LaunchedEffect(Unit) { launch { queryEvent.receiveAsFlow().collect(screenModel::search) } launch { requestSettingsSheetEvent.receiveAsFlow().collectLatest { screenModel.showSettingsDialog() } } } } // For invoking search from other screen private val queryEvent = Channel() suspend fun search(query: String) = queryEvent.send(query) // For opening settings sheet in LibraryController private val requestSettingsSheetEvent = Channel() private suspend fun requestOpenSettingsSheet() = requestSettingsSheetEvent.send(Unit) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryItem.kt ================================================ package eu.kanade.tachiyomi.ui.library.manga import eu.kanade.tachiyomi.source.manga.getNameForMangaInfo import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.source.manga.service.MangaSourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaLibraryItem( val libraryManga: LibraryManga, var downloadCount: Long = -1, var unreadCount: Long = -1, var isLocal: Boolean = false, var sourceLanguage: String = "", private val sourceManager: MangaSourceManager = Injekt.get(), ) { /** * Checks if a query matches the manga * * @param constraint the query to check. * @return true if the manga matches the query, false otherwise. */ fun matches(constraint: String): Boolean { val sourceName by lazy { sourceManager.getOrStub(libraryManga.manga.source).getNameForMangaInfo() } if (constraint.startsWith("id:", true)) { val id = constraint.substringAfter("id:").toLongOrNull() return libraryManga.id == id } return libraryManga.manga.title.contains(constraint, true) || (libraryManga.manga.author?.contains(constraint, true) ?: false) || (libraryManga.manga.artist?.contains(constraint, true) ?: false) || (libraryManga.manga.description?.contains(constraint, true) ?: false) || constraint.split(",").map { it.trim() }.all { subconstraint -> checkNegatableConstraint(subconstraint) { sourceName.contains(it, true) || (libraryManga.manga.genre?.any { genre -> genre.equals(it, true) } ?: false) } } } /** * Checks a predicate on a negatable constraint. If the constraint starts with a minus character, * the minus is stripped and the result of the predicate is inverted. * * @param constraint the argument to the predicate. Inverts the predicate if it starts with '-'. * @param predicate the check to be run against the constraint. * @return !predicate(x) if constraint = "-x", otherwise predicate(constraint) */ private fun checkNegatableConstraint( constraint: String, predicate: (String) -> Boolean, ): Boolean { return if (constraint.startsWith("-")) { !predicate(constraint.substringAfter("-").trimStart()) } else { predicate(constraint) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.library.manga import androidx.compose.runtime.Immutable import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastDistinctBy import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastMap import androidx.compose.ui.util.fastMapNotNull import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.core.preference.asState import eu.kanade.core.util.fastFilterNot import eu.kanade.core.util.fastPartition import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.entries.manga.interactor.UpdateManga import eu.kanade.domain.items.chapter.interactor.SetReadStatus import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS import eu.kanade.presentation.entries.DownloadAction import eu.kanade.presentation.library.components.LibraryToolbarTitle import eu.kanade.tachiyomi.data.cache.MangaCoverCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.chapter.getNextUnread import eu.kanade.tachiyomi.util.removeCovers import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import tachiyomi.core.common.preference.CheckboxState import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.util.lang.compareToWithCollator import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.domain.category.manga.interactor.GetVisibleMangaCategories import tachiyomi.domain.category.manga.interactor.SetMangaCategories import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.applyFilter import tachiyomi.domain.entries.manga.interactor.GetLibraryManga import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.entries.manga.model.MangaUpdate import tachiyomi.domain.history.manga.interactor.GetNextChapters import tachiyomi.domain.items.chapter.interactor.GetChaptersByMangaId import tachiyomi.domain.items.chapter.model.Chapter import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.domain.library.manga.model.MangaLibrarySort import tachiyomi.domain.library.manga.model.sort import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.manga.service.MangaSourceManager import tachiyomi.domain.track.manga.interactor.GetTracksPerManga import tachiyomi.domain.track.manga.model.MangaTrack import tachiyomi.source.local.entries.manga.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.random.Random /** * Typealias for the library manga, using the category as keys, and list of manga as values. */ typealias MangaLibraryMap = Map> class MangaLibraryScreenModel( private val getLibraryManga: GetLibraryManga = Injekt.get(), private val getCategories: GetVisibleMangaCategories = Injekt.get(), private val getTracksPerManga: GetTracksPerManga = Injekt.get(), private val getNextChapters: GetNextChapters = Injekt.get(), private val getChaptersByMangaId: GetChaptersByMangaId = Injekt.get(), private val setReadStatus: SetReadStatus = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), private val setMangaCategories: SetMangaCategories = Injekt.get(), private val preferences: BasePreferences = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), private val coverCache: MangaCoverCache = Injekt.get(), private val sourceManager: MangaSourceManager = Injekt.get(), private val downloadManager: MangaDownloadManager = Injekt.get(), private val downloadCache: MangaDownloadCache = Injekt.get(), private val trackerManager: TrackerManager = Injekt.get(), ) : StateScreenModel(State()) { var activeCategoryIndex: Int by libraryPreferences.lastUsedMangaCategory().asState( screenModelScope, ) init { screenModelScope.launchIO { combine( state.map { it.searchQuery }.debounce(SEARCH_DEBOUNCE_MILLIS), getLibraryFlow(), getTracksPerManga.subscribe(), getTrackingFilterFlow(), downloadCache.changes, ) { searchQuery, library, tracks, trackingFilter, _ -> library .applyFilters(tracks, trackingFilter) .applySort(tracks, trackingFilter.keys) .mapValues { (_, value) -> if (searchQuery != null) { value.filter { it.matches(searchQuery) } } else { value } } } .collectLatest { mutableState.update { state -> state.copy( isLoading = false, library = it, ) } } } combine( libraryPreferences.categoryTabs().changes(), libraryPreferences.categoryNumberOfItems().changes(), libraryPreferences.showContinueViewingButton().changes(), ) { a, b, c -> arrayOf(a, b, c) } .onEach { (showCategoryTabs, showMangaCount, showMangaContinueButton) -> mutableState.update { state -> state.copy( showCategoryTabs = showCategoryTabs, showMangaCount = showMangaCount, showMangaContinueButton = showMangaContinueButton, ) } } .launchIn(screenModelScope) combine( getLibraryItemPreferencesFlow(), getTrackingFilterFlow(), ) { prefs, trackFilter -> ( listOf( prefs.filterDownloaded, prefs.filterUnread, prefs.filterStarted, prefs.filterBookmarked, prefs.filterCompleted, prefs.filterIntervalCustom, ) + trackFilter.values ).any { it != TriState.DISABLED } } .distinctUntilChanged() .onEach { mutableState.update { state -> state.copy(hasActiveFilters = it) } } .launchIn(screenModelScope) } private suspend fun MangaLibraryMap.applyFilters( trackMap: Map>, trackingFilter: Map, ): MangaLibraryMap { val prefs = getLibraryItemPreferencesFlow().first() val downloadedOnly = prefs.globalFilterDownloaded val skipOutsideReleasePeriod = prefs.skipOutsideReleasePeriod val filterDownloaded = if (downloadedOnly) TriState.ENABLED_IS else prefs.filterDownloaded val filterUnread = prefs.filterUnread val filterStarted = prefs.filterStarted val filterBookmarked = prefs.filterBookmarked val filterCompleted = prefs.filterCompleted val filterIntervalCustom = prefs.filterIntervalCustom val isNotLoggedInAnyTrack = trackingFilter.isEmpty() val excludedTracks = trackingFilter.mapNotNull { if (it.value == TriState.ENABLED_NOT) it.key else null } val includedTracks = trackingFilter.mapNotNull { if (it.value == TriState.ENABLED_IS) it.key else null } val trackFiltersIsIgnored = includedTracks.isEmpty() && excludedTracks.isEmpty() val filterFnDownloaded: (MangaLibraryItem) -> Boolean = { applyFilter(filterDownloaded) { it.libraryManga.manga.isLocal() || it.downloadCount > 0 || downloadManager.getDownloadCount(it.libraryManga.manga) > 0 } } val filterFnUnread: (MangaLibraryItem) -> Boolean = { applyFilter(filterUnread) { it.libraryManga.unreadCount > 0 } } val filterFnStarted: (MangaLibraryItem) -> Boolean = { applyFilter(filterStarted) { it.libraryManga.hasStarted } } val filterFnBookmarked: (MangaLibraryItem) -> Boolean = { applyFilter(filterBookmarked) { it.libraryManga.hasBookmarks } } val filterFnCompleted: (MangaLibraryItem) -> Boolean = { applyFilter(filterCompleted) { it.libraryManga.manga.status.toInt() == SManga.COMPLETED } } val filterFnIntervalCustom: (MangaLibraryItem) -> Boolean = { if (skipOutsideReleasePeriod) { applyFilter(filterIntervalCustom) { it.libraryManga.manga.fetchInterval < 0 } } else { true } } val filterFnTracking: (MangaLibraryItem) -> Boolean = tracking@{ item -> if (isNotLoggedInAnyTrack || trackFiltersIsIgnored) return@tracking true val mangaTracks = trackMap .mapValues { entry -> entry.value.map { it.trackerId } }[item.libraryManga.id] .orEmpty() val isExcluded = excludedTracks.isNotEmpty() && mangaTracks.fastAny { it in excludedTracks } val isIncluded = includedTracks.isEmpty() || mangaTracks.fastAny { it in includedTracks } !isExcluded && isIncluded } val filterFn: (MangaLibraryItem) -> Boolean = { filterFnDownloaded(it) && filterFnUnread(it) && filterFnStarted(it) && filterFnBookmarked(it) && filterFnCompleted(it) && filterFnIntervalCustom(it) && filterFnTracking(it) } return mapValues { (_, value) -> value.fastFilter(filterFn) } } private fun MangaLibraryMap.applySort( trackMap: Map>, loggedInTrackerIds: Set, ): MangaLibraryMap { val sortAlphabetically: (MangaLibraryItem, MangaLibraryItem) -> Int = { i1, i2 -> i1.libraryManga.manga.title.lowercase().compareToWithCollator(i2.libraryManga.manga.title.lowercase()) } val defaultTrackerScoreSortValue = -1.0 val trackerScores by lazy { val trackerMap = trackerManager.getAll(loggedInTrackerIds).associateBy { e -> e.id } trackMap.mapValues { entry -> when { entry.value.isEmpty() -> null else -> entry.value .mapNotNull { trackerMap[it.trackerId]?.mangaService?.get10PointScore(it) } .average() } } } fun MangaLibrarySort.comparator(): Comparator = Comparator { i1, i2 -> when (this.type) { MangaLibrarySort.Type.Alphabetical -> { sortAlphabetically(i1, i2) } MangaLibrarySort.Type.LastRead -> { i1.libraryManga.lastRead.compareTo(i2.libraryManga.lastRead) } MangaLibrarySort.Type.LastUpdate -> { i1.libraryManga.manga.lastUpdate.compareTo(i2.libraryManga.manga.lastUpdate) } MangaLibrarySort.Type.UnreadCount -> when { // Ensure unread content comes first i1.libraryManga.unreadCount == i2.libraryManga.unreadCount -> 0 i1.libraryManga.unreadCount == 0L -> if (this.isAscending) 1 else -1 i2.libraryManga.unreadCount == 0L -> if (this.isAscending) -1 else 1 else -> i1.libraryManga.unreadCount.compareTo(i2.libraryManga.unreadCount) } MangaLibrarySort.Type.TotalChapters -> { i1.libraryManga.totalChapters.compareTo(i2.libraryManga.totalChapters) } MangaLibrarySort.Type.LatestChapter -> { i1.libraryManga.latestUpload.compareTo(i2.libraryManga.latestUpload) } MangaLibrarySort.Type.ChapterFetchDate -> { i1.libraryManga.chapterFetchedAt.compareTo(i2.libraryManga.chapterFetchedAt) } MangaLibrarySort.Type.DateAdded -> { i1.libraryManga.manga.dateAdded.compareTo(i2.libraryManga.manga.dateAdded) } MangaLibrarySort.Type.TrackerMean -> { val item1Score = trackerScores[i1.libraryManga.id] ?: defaultTrackerScoreSortValue val item2Score = trackerScores[i2.libraryManga.id] ?: defaultTrackerScoreSortValue item1Score.compareTo(item2Score) } MangaLibrarySort.Type.Random -> { error("Why Are We Still Here? Just To Suffer?") } } } return mapValues { (key, value) -> if (key.sort.type == MangaLibrarySort.Type.Random) { return@mapValues value.shuffled(Random(libraryPreferences.randomMangaSortSeed().get())) } val comparator = key.sort.comparator() .let { if (key.sort.isAscending) it else it.reversed() } .thenComparator(sortAlphabetically) value.sortedWith(comparator) } } private fun getLibraryItemPreferencesFlow(): Flow { return combine( libraryPreferences.downloadBadge().changes(), libraryPreferences.unreadBadge().changes(), libraryPreferences.localBadge().changes(), libraryPreferences.languageBadge().changes(), libraryPreferences.autoUpdateItemRestrictions().changes(), preferences.downloadedOnly().changes(), libraryPreferences.filterDownloadedManga().changes(), libraryPreferences.filterUnread().changes(), libraryPreferences.filterStartedManga().changes(), libraryPreferences.filterBookmarkedManga().changes(), libraryPreferences.filterCompletedManga().changes(), libraryPreferences.filterIntervalCustom().changes(), ) { ItemPreferences( downloadBadge = it[0] as Boolean, unreadBadge = it[1] as Boolean, localBadge = it[2] as Boolean, languageBadge = it[3] as Boolean, skipOutsideReleasePeriod = LibraryPreferences.ENTRY_OUTSIDE_RELEASE_PERIOD in (it[4] as Set<*>), globalFilterDownloaded = it[5] as Boolean, filterDownloaded = it[6] as TriState, filterUnread = it[7] as TriState, filterStarted = it[8] as TriState, filterBookmarked = it[9] as TriState, filterCompleted = it[10] as TriState, filterIntervalCustom = it[11] as TriState, ) } } /** * Get the categories and all its manga from the database. */ private fun getLibraryFlow(): Flow { val libraryMangasFlow = combine( getLibraryManga.subscribe(), getLibraryItemPreferencesFlow(), downloadCache.changes, ) { libraryMangaList, prefs, _ -> libraryMangaList .map { libraryManga -> // Display mode based on user preference: take it from global library setting or category MangaLibraryItem( libraryManga, downloadCount = if (prefs.downloadBadge) { downloadManager.getDownloadCount(libraryManga.manga).toLong() } else { 0 }, unreadCount = if (prefs.unreadBadge) libraryManga.unreadCount else 0, isLocal = if (prefs.localBadge) libraryManga.manga.isLocal() else false, sourceLanguage = if (prefs.languageBadge) { sourceManager.getOrStub(libraryManga.manga.source).lang } else { "" }, ) } .groupBy { it.libraryManga.category } } return combine(getCategories.subscribe(), libraryMangasFlow) { categories, libraryManga -> val displayCategories = if (libraryManga.isNotEmpty() && !libraryManga.containsKey(0)) { categories.fastFilterNot { it.isSystemCategory } } else { categories } displayCategories.associateWith { libraryManga[it.id].orEmpty() } } } /** * Flow of tracking filter preferences * * @return map of track id with the filter value */ private fun getTrackingFilterFlow(): Flow> { return trackerManager.loggedInTrackersFlow().flatMapLatest { loggedInTrackers -> if (loggedInTrackers.isEmpty()) return@flatMapLatest flowOf(emptyMap()) val prefFlows = loggedInTrackers.map { tracker -> libraryPreferences.filterTrackedManga(tracker.id.toInt()).changes() } combine(prefFlows) { loggedInTrackers .mapIndexed { index, tracker -> tracker.id to it[index] } .toMap() } } } /** * Returns the common categories for the given list of manga. * * @param mangas the list of manga. */ private suspend fun getCommonCategories(mangas: List): Collection { if (mangas.isEmpty()) return emptyList() return mangas .map { getCategories.await(it.id).toSet() } .reduce { set1, set2 -> set1.intersect(set2) } } suspend fun getNextUnreadChapter(manga: Manga): Chapter? { return getChaptersByMangaId.await(manga.id, applyScanlatorFilter = true).getNextUnread(manga, downloadManager) } /** * Returns the mix (non-common) categories for the given list of manga. * * @param mangas the list of manga. */ private suspend fun getMixCategories(mangas: List): Collection { if (mangas.isEmpty()) return emptyList() val mangaCategories = mangas.map { getCategories.await(it.id).toSet() } val common = mangaCategories.reduce { set1, set2 -> set1.intersect(set2) } return mangaCategories.flatten().distinct().subtract(common) } fun runDownloadActionSelection(action: DownloadAction) { val selection = state.value.selection val mangas = selection.map { it.manga }.toList() when (action) { DownloadAction.NEXT_1_ITEM -> downloadUnreadChapters(mangas, 1) DownloadAction.NEXT_5_ITEMS -> downloadUnreadChapters(mangas, 5) DownloadAction.NEXT_10_ITEMS -> downloadUnreadChapters(mangas, 10) DownloadAction.NEXT_25_ITEMS -> downloadUnreadChapters(mangas, 25) DownloadAction.UNVIEWED_ITEMS -> downloadUnreadChapters(mangas, null) } clearSelection() } /** * Queues the amount specified of unread chapters from the list of mangas given. * * @param mangas the list of manga. * @param amount the amount to queue or null to queue all */ private fun downloadUnreadChapters(mangas: List, amount: Int?) { screenModelScope.launchNonCancellable { mangas.forEach { manga -> val chapters = getNextChapters.await(manga.id) .fastFilterNot { chapter -> downloadManager.getQueuedDownloadOrNull(chapter.id) != null || downloadManager.isChapterDownloaded( chapter.name, chapter.scanlator, manga.title, manga.source, ) } .let { if (amount != null) it.take(amount) else it } downloadManager.downloadChapters(manga, chapters) } } } /** * Marks mangas' chapters read status. */ fun markReadSelection(read: Boolean) { val mangas = state.value.selection.toList() screenModelScope.launchNonCancellable { mangas.forEach { manga -> setReadStatus.await( manga = manga.manga, read = read, ) } } clearSelection() } /** * Remove the selected manga. * * @param mangaList the list of manga to delete. * @param deleteFromLibrary whether to delete manga from library. * @param deleteChapters whether to delete downloaded chapters. */ fun removeMangas(mangaList: List, deleteFromLibrary: Boolean, deleteChapters: Boolean) { screenModelScope.launchNonCancellable { val mangaToDelete = mangaList.distinctBy { it.id } if (deleteFromLibrary) { val toDelete = mangaToDelete.map { it.removeCovers(coverCache) MangaUpdate( favorite = false, id = it.id, ) } updateManga.awaitAll(toDelete) } if (deleteChapters) { mangaToDelete.forEach { manga -> val source = sourceManager.get(manga.source) as? HttpSource if (source != null) { downloadManager.deleteManga(manga, source) } } } } } /** * Bulk update categories of manga using old and new common categories. * * @param mangaList the list of manga to move. * @param addCategories the categories to add for all mangas. * @param removeCategories the categories to remove in all mangas. */ fun setMangaCategories( mangaList: List, addCategories: List, removeCategories: List, ) { screenModelScope.launchNonCancellable { mangaList.forEach { manga -> val categoryIds = getCategories.await(manga.id) .map { it.id } .subtract(removeCategories.toSet()) .plus(addCategories) .toList() setMangaCategories.await(manga.id, categoryIds) } } } fun getDisplayMode(): PreferenceMutableState { return libraryPreferences.displayMode().asState(screenModelScope) } fun getColumnsPreferenceForCurrentOrientation(isLandscape: Boolean): PreferenceMutableState { return ( if (isLandscape) { libraryPreferences.mangaLandscapeColumns() } else { libraryPreferences.mangaPortraitColumns() } ).asState( screenModelScope, ) } suspend fun getRandomLibraryItemForCurrentCategory(): MangaLibraryItem? { if (state.value.categories.isEmpty()) return null return withIOContext { state.value .getLibraryItemsByCategoryId(state.value.categories[activeCategoryIndex].id) ?.randomOrNull() } } fun showSettingsDialog() { mutableState.update { it.copy(dialog = Dialog.SettingsSheet) } } fun clearSelection() { mutableState.update { it.copy(selection = persistentListOf()) } } fun toggleSelection(manga: LibraryManga) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> if (list.fastAny { it.id == manga.id }) { list.removeAll { it.id == manga.id } } else { list.add(manga) } } state.copy(selection = newSelection) } } /** * Selects all mangas between and including the given manga and the last pressed manga from the * same category as the given manga */ fun toggleRangeSelection(manga: LibraryManga) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> val lastSelected = list.lastOrNull() if (lastSelected?.category != manga.category) { list.add(manga) return@mutate } val items = state.getLibraryItemsByCategoryId(manga.category) ?.fastMap { it.libraryManga }.orEmpty() val lastMangaIndex = items.indexOf(lastSelected) val curMangaIndex = items.indexOf(manga) val selectedIds = list.fastMap { it.id } val selectionRange = when { lastMangaIndex < curMangaIndex -> IntRange(lastMangaIndex, curMangaIndex) curMangaIndex < lastMangaIndex -> IntRange(curMangaIndex, lastMangaIndex) // We shouldn't reach this point else -> return@mutate } val newSelections = selectionRange.mapNotNull { index -> items[index].takeUnless { it.id in selectedIds } } list.addAll(newSelections) } state.copy(selection = newSelection) } } fun selectAll(index: Int) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> val categoryId = state.categories.getOrNull(index)?.id ?: -1 val selectedIds = list.fastMap { it.id } state.getLibraryItemsByCategoryId(categoryId) ?.fastMapNotNull { item -> item.libraryManga.takeUnless { it.id in selectedIds } } ?.let { list.addAll(it) } } state.copy(selection = newSelection) } } fun invertSelection(index: Int) { mutableState.update { state -> val newSelection = state.selection.mutate { list -> val categoryId = state.categories[index].id val items = state.getLibraryItemsByCategoryId(categoryId)?.fastMap { it.libraryManga }.orEmpty() val selectedIds = list.fastMap { it.id } val (toRemove, toAdd) = items.fastPartition { it.id in selectedIds } val toRemoveIds = toRemove.fastMap { it.id } list.removeAll { it.id in toRemoveIds } list.addAll(toAdd) } state.copy(selection = newSelection) } } fun search(query: String?) { mutableState.update { it.copy(searchQuery = query) } } fun openChangeCategoryDialog() { screenModelScope.launchIO { // Create a copy of selected manga val mangaList = state.value.selection.map { it.manga } // Hide the default category because it has a different behavior than the ones from db. val categories = state.value.categories.filter { it.id != 0L } // Get indexes of the common categories to preselect. val common = getCommonCategories(mangaList) // Get indexes of the mix categories to preselect. val mix = getMixCategories(mangaList) val preselected = categories .map { when (it) { in common -> CheckboxState.State.Checked(it) in mix -> CheckboxState.TriState.Exclude(it) else -> CheckboxState.State.None(it) } } .toImmutableList() mutableState.update { it.copy(dialog = Dialog.ChangeCategory(mangaList, preselected)) } } } fun openDeleteMangaDialog() { val mangaList = state.value.selection.map { it.manga } mutableState.update { it.copy(dialog = Dialog.DeleteManga(mangaList)) } } fun closeDialog() { mutableState.update { it.copy(dialog = null) } } sealed interface Dialog { data object SettingsSheet : Dialog data class ChangeCategory( val manga: List, val initialSelection: ImmutableList>, ) : Dialog data class DeleteManga(val manga: List) : Dialog } @Immutable private data class ItemPreferences( val downloadBadge: Boolean, val unreadBadge: Boolean, val localBadge: Boolean, val languageBadge: Boolean, val skipOutsideReleasePeriod: Boolean, val globalFilterDownloaded: Boolean, val filterDownloaded: TriState, val filterUnread: TriState, val filterStarted: TriState, val filterBookmarked: TriState, val filterCompleted: TriState, val filterIntervalCustom: TriState, ) @Immutable data class State( val isLoading: Boolean = true, val library: MangaLibraryMap = emptyMap(), val searchQuery: String? = null, val selection: PersistentList = persistentListOf(), val hasActiveFilters: Boolean = false, val showCategoryTabs: Boolean = false, val showMangaCount: Boolean = false, val showMangaContinueButton: Boolean = false, val dialog: Dialog? = null, ) { private val libraryCount by lazy { library.values .flatten() .fastDistinctBy { it.libraryManga.manga.id } .size } val isLibraryEmpty by lazy { libraryCount == 0 } val selectionMode = selection.isNotEmpty() val categories = library.keys.toList() fun getLibraryItemsByCategoryId(categoryId: Long): List? { return library.firstNotNullOfOrNull { (k, v) -> v.takeIf { k.id == categoryId } } } fun getLibraryItemsByPage(page: Int): List { return library.values.toTypedArray().getOrNull(page).orEmpty() } fun getMangaCountForCategory(category: Category): Int? { return if (showMangaCount || !searchQuery.isNullOrEmpty()) library[category]?.size else null } fun getToolbarTitle( defaultTitle: String, defaultCategoryTitle: String, page: Int, ): LibraryToolbarTitle { val category = categories.getOrNull(page) ?: return LibraryToolbarTitle(defaultTitle) val categoryName = category.let { if (it.isSystemCategory) defaultCategoryTitle else it.name } val title = if (showCategoryTabs) defaultTitle else categoryName val count = when { !showMangaCount -> null !showCategoryTabs -> getMangaCountForCategory(category) // Whole library count else -> libraryCount } return LibraryToolbarTitle(title, count) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibrarySettingsScreenModel.kt ================================================ package eu.kanade.tachiyomi.ui.library.manga import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.data.track.TrackerManager import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.stateIn import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.TriState import tachiyomi.core.common.preference.getAndSet import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.manga.interactor.SetMangaDisplayMode import tachiyomi.domain.category.manga.interactor.SetSortModeForMangaCategory import tachiyomi.domain.category.model.Category import tachiyomi.domain.library.manga.model.MangaLibrarySort import tachiyomi.domain.library.model.LibraryDisplayMode import tachiyomi.domain.library.service.LibraryPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.time.Duration.Companion.seconds class MangaLibrarySettingsScreenModel( val preferences: BasePreferences = Injekt.get(), val libraryPreferences: LibraryPreferences = Injekt.get(), private val setMangaDisplayMode: SetMangaDisplayMode = Injekt.get(), private val setSortModeForCategory: SetSortModeForMangaCategory = Injekt.get(), trackerManager: TrackerManager = Injekt.get(), ) : ScreenModel { val trackersFlow = trackerManager.loggedInTrackersFlow() .stateIn( scope = screenModelScope, started = SharingStarted.WhileSubscribed(5.seconds.inWholeMilliseconds), initialValue = trackerManager.loggedInTrackers(), ) fun toggleFilter(preference: (LibraryPreferences) -> Preference) { preference(libraryPreferences).getAndSet { it.next() } } fun toggleTracker(id: Int) { toggleFilter { libraryPreferences.filterTrackedManga(id) } } fun setDisplayMode(mode: LibraryDisplayMode) { setMangaDisplayMode.await(mode) } fun setSort( category: Category?, mode: MangaLibrarySort.Type, direction: MangaLibrarySort.Direction, ) { screenModelScope.launchIO { setSortModeForCategory.await(category, mode, direction) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/library/manga/MangaLibraryTab.kt ================================================ package eu.kanade.tachiyomi.ui.library.manga import androidx.activity.compose.BackHandler import androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.HelpOutline import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.util.fastAll import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.domain.ui.model.NavStyle import eu.kanade.presentation.category.components.ChangeCategoryDialog import eu.kanade.presentation.entries.components.LibraryBottomActionMenu import eu.kanade.presentation.library.DeleteLibraryEntryDialog import eu.kanade.presentation.library.components.LibraryToolbar import eu.kanade.presentation.library.manga.MangaLibraryContent import eu.kanade.presentation.library.manga.MangaLibrarySettingsDialog import eu.kanade.presentation.more.onboarding.GETTING_STARTED_URL import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.manga.MangaLibraryUpdateJob import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.launch import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.category.model.Category import tachiyomi.domain.entries.manga.model.Manga import tachiyomi.domain.library.manga.LibraryManga import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.EmptyScreen import tachiyomi.presentation.core.screens.EmptyScreenAction import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.source.local.entries.manga.isLocal data object MangaLibraryTab : Tab { @OptIn(ExperimentalAnimationGraphicsApi::class) override val options: TabOptions @Composable get() { val fromMore = currentNavigationStyle() == NavStyle.MOVE_MANGA_TO_MORE val title = AYMR.strings.label_manga_library val isSelected = LocalTabNavigator.current.current.key == key val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_library_enter) val index: UShort = if (fromMore) 5u else 1u return TabOptions( index = index, title = stringResource(title), icon = rememberAnimatedVectorPainter(image, isSelected), ) } override suspend fun onReselect(navigator: Navigator) { requestOpenSettingsSheet() } @OptIn(ExperimentalMaterial3Api::class) @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val scope = rememberCoroutineScope() val haptic = LocalHapticFeedback.current val screenModel = rememberScreenModel { MangaLibraryScreenModel() } val settingsScreenModel = rememberScreenModel { MangaLibrarySettingsScreenModel() } val state by screenModel.state.collectAsState() val snackbarHostState = remember { SnackbarHostState() } val onClickRefresh: (Category?) -> Boolean = { category -> val started = MangaLibraryUpdateJob.startNow(context, category) scope.launch { val msgRes = if (started) MR.strings.updating_category else MR.strings.update_already_running snackbarHostState.showSnackbar(context.stringResource(msgRes)) } started } val fromMore = currentNavigationStyle() == NavStyle.MOVE_MANGA_TO_MORE val navigateUp: (() -> Unit)? = if (fromMore) { { if (navigator.lastItem == HomeScreen) { scope.launch { HomeScreen.openTab(HomeScreen.Tab.AnimeLib()) } } else { navigator.pop() } } } else { null } val defaultTitle = stringResource(AYMR.strings.label_manga_library) Scaffold( topBar = { scrollBehavior -> val title = state.getToolbarTitle( defaultTitle = defaultTitle, defaultCategoryTitle = stringResource(MR.strings.label_default), page = screenModel.activeCategoryIndex, ) val tabVisible = state.showCategoryTabs && state.categories.size > 1 LibraryToolbar( hasActiveFilters = state.hasActiveFilters, selectedCount = state.selection.size, title = title, onClickUnselectAll = screenModel::clearSelection, onClickSelectAll = { screenModel.selectAll(screenModel.activeCategoryIndex) }, onClickInvertSelection = { screenModel.invertSelection( screenModel.activeCategoryIndex, ) }, onClickFilter = screenModel::showSettingsDialog, onClickRefresh = { onClickRefresh( state.categories[screenModel.activeCategoryIndex], ) }, onClickGlobalUpdate = { onClickRefresh(null) }, onClickOpenRandomEntry = { scope.launch { val randomItem = screenModel.getRandomLibraryItemForCurrentCategory() if (randomItem != null) { navigator.push(MangaScreen(randomItem.libraryManga.manga.id)) } else { snackbarHostState.showSnackbar( context.stringResource(MR.strings.information_no_entries_found), ) } } }, searchQuery = state.searchQuery, onSearchQueryChange = screenModel::search, scrollBehavior = scrollBehavior.takeIf { !tabVisible }, // For scroll overlay when no tab navigateUp = navigateUp, ) }, bottomBar = { LibraryBottomActionMenu( visible = state.selectionMode, onChangeCategoryClicked = screenModel::openChangeCategoryDialog, onMarkAsViewedClicked = { screenModel.markReadSelection(true) }, onMarkAsUnviewedClicked = { screenModel.markReadSelection(false) }, onDownloadClicked = screenModel::runDownloadActionSelection .takeIf { state.selection.fastAll { !it.manga.isLocal() } }, onDeleteClicked = screenModel::openDeleteMangaDialog, isManga = true, ) }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { contentPadding -> when { state.isLoading -> LoadingScreen(Modifier.padding(contentPadding)) state.searchQuery.isNullOrEmpty() && !state.hasActiveFilters && state.isLibraryEmpty -> { val handler = LocalUriHandler.current EmptyScreen( stringRes = MR.strings.information_empty_library, modifier = Modifier.padding(contentPadding), actions = persistentListOf( EmptyScreenAction( stringRes = MR.strings.getting_started_guide, icon = Icons.AutoMirrored.Outlined.HelpOutline, onClick = { handler.openUri(GETTING_STARTED_URL) }, ), ), ) } else -> { MangaLibraryContent( categories = state.categories, searchQuery = state.searchQuery, selection = state.selection, contentPadding = contentPadding, currentPage = { screenModel.activeCategoryIndex }, hasActiveFilters = state.hasActiveFilters, showPageTabs = state.showCategoryTabs || !state.searchQuery.isNullOrEmpty(), onChangeCurrentPage = { screenModel.activeCategoryIndex = it }, onMangaClicked = { navigator.push(MangaScreen(it)) }, onContinueReadingClicked = { it: LibraryManga -> scope.launchIO { val chapter = screenModel.getNextUnreadChapter(it.manga) if (chapter != null) { context.startActivity( ReaderActivity.newIntent( context, chapter.mangaId, chapter.id, ), ) } else { snackbarHostState.showSnackbar( context.stringResource(MR.strings.no_next_chapter), ) } } Unit }.takeIf { state.showMangaContinueButton }, onToggleSelection = screenModel::toggleSelection, onToggleRangeSelection = { screenModel.toggleRangeSelection(it) haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, onRefresh = onClickRefresh, onGlobalSearchClicked = { navigator.push( GlobalMangaSearchScreen(screenModel.state.value.searchQuery ?: ""), ) }, getNumberOfMangaForCategory = { state.getMangaCountForCategory(it) }, getDisplayMode = { screenModel.getDisplayMode() }, getColumnsForOrientation = { screenModel.getColumnsPreferenceForCurrentOrientation( it, ) }, ) { state.getLibraryItemsByPage(it) } } } } val onDismissRequest = screenModel::closeDialog when (val dialog = state.dialog) { is MangaLibraryScreenModel.Dialog.SettingsSheet -> run { val category = state.categories.getOrNull(screenModel.activeCategoryIndex) if (category == null) { onDismissRequest() return@run } MangaLibrarySettingsDialog( onDismissRequest = onDismissRequest, screenModel = settingsScreenModel, category = category, ) } is MangaLibraryScreenModel.Dialog.ChangeCategory -> { ChangeCategoryDialog( initialSelection = dialog.initialSelection, onDismissRequest = onDismissRequest, onEditCategories = { screenModel.clearSelection() navigator.push(CategoriesTab) CategoriesTab.showMangaCategory() }, onConfirm = { include, exclude -> screenModel.clearSelection() screenModel.setMangaCategories(dialog.manga, include, exclude) }, ) } is MangaLibraryScreenModel.Dialog.DeleteManga -> { DeleteLibraryEntryDialog( containsLocalEntry = dialog.manga.any(Manga::isLocal), onDismissRequest = onDismissRequest, onConfirm = { deleteManga, deleteChapter -> screenModel.removeMangas(dialog.manga, deleteManga, deleteChapter) screenModel.clearSelection() }, isManga = true, ) } null -> {} } BackHandler(enabled = state.selectionMode || state.searchQuery != null) { when { state.selectionMode -> screenModel.clearSelection() state.searchQuery != null -> screenModel.search(null) } } LaunchedEffect(state.selectionMode, state.dialog) { HomeScreen.showBottomNav(!state.selectionMode) } LaunchedEffect(state.isLoading) { if (!state.isLoading) { (context as? MainActivity)?.ready = true } } LaunchedEffect(Unit) { launch { queryEvent.receiveAsFlow().collect(screenModel::search) } launch { requestSettingsSheetEvent.receiveAsFlow().collectLatest { screenModel.showSettingsDialog() } } } } // For invoking search from other screen private val queryEvent = Channel() suspend fun search(query: String) = queryEvent.send(query) // For opening settings sheet in LibraryController private val requestSettingsSheetEvent = Channel() private suspend fun requestOpenSettingsSheet() = requestSettingsSheetEvent.send(Unit) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt ================================================ package eu.kanade.tachiyomi.ui.main import android.animation.ValueAnimator import android.app.Activity import android.app.Application import android.app.SearchManager import android.app.assist.AssistContent import android.content.Context import android.content.Intent import android.graphics.Color import android.os.Build import android.os.Bundle import android.view.View import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle import androidx.activity.enableEdgeToEdge import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.luminance import androidx.compose.ui.platform.LocalContext import androidx.core.animation.doOnEnd import androidx.core.net.toUri import androidx.core.splashscreen.SplashScreen import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.util.Consumer import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.interpolator.view.animation.LinearOutSlowInInterpolator import androidx.lifecycle.lifecycleScope import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.source.anime.interactor.GetAnimeIncognitoState import eu.kanade.domain.source.manga.interactor.GetMangaIncognitoState import eu.kanade.presentation.components.AppStateBanners import eu.kanade.presentation.components.DownloadedOnlyBannerBackgroundColor import eu.kanade.presentation.components.IncognitoModeBannerBackgroundColor import eu.kanade.presentation.components.IndexingBannerBackgroundColor import eu.kanade.presentation.more.settings.screen.browse.AnimeExtensionReposScreen import eu.kanade.presentation.more.settings.screen.browse.MangaExtensionReposScreen import eu.kanade.presentation.more.settings.screen.data.RestoreBackupScreen import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.DefaultNavigatorScreenTransition import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.animesource.model.Hoster import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.core.common.Constants import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadCache import eu.kanade.tachiyomi.data.download.manga.MangaDownloadCache import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.updater.AppUpdateChecker import eu.kanade.tachiyomi.data.updater.RELEASE_URL import eu.kanade.tachiyomi.extension.anime.api.AnimeExtensionApi import eu.kanade.tachiyomi.extension.manga.api.MangaExtensionApi import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.browse.anime.source.browse.BrowseAnimeSourceScreen import eu.kanade.tachiyomi.ui.browse.anime.source.globalsearch.GlobalAnimeSearchScreen import eu.kanade.tachiyomi.ui.browse.manga.source.browse.BrowseMangaSourceScreen import eu.kanade.tachiyomi.ui.browse.manga.source.globalsearch.GlobalMangaSearchScreen import eu.kanade.tachiyomi.ui.deeplink.DeepLinkScreenType import eu.kanade.tachiyomi.ui.deeplink.anime.DeepLinkAnimeScreen import eu.kanade.tachiyomi.ui.deeplink.manga.DeepLinkMangaScreen import eu.kanade.tachiyomi.ui.entries.anime.AnimeScreen import eu.kanade.tachiyomi.ui.entries.manga.MangaScreen import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.more.NewUpdateScreen import eu.kanade.tachiyomi.ui.more.OnboardingScreen import eu.kanade.tachiyomi.ui.player.ExternalIntents import eu.kanade.tachiyomi.ui.player.PlayerActivity import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.isNavigationBarNeedsScrim import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.updaterEnabled import eu.kanade.tachiyomi.util.view.setComposeContent import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import logcat.LogPriority import mihon.core.migration.Migrator import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.release.interactor.GetApplicationRelease import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy class MainActivity : BaseActivity() { private val libraryPreferences: LibraryPreferences by injectLazy() private val preferences: BasePreferences by injectLazy() private val animeDownloadCache: AnimeDownloadCache by injectLazy() private val downloadCache: MangaDownloadCache by injectLazy() private val chapterCache: ChapterCache by injectLazy() private val getAnimeIncognitoState: GetAnimeIncognitoState by injectLazy() private val getMangaIncognitoState: GetMangaIncognitoState by injectLazy() // To be checked by splash screen. If true then splash screen will be removed. var ready = false private var navigator: Navigator? = null init { registerSecureActivity(this) } override fun onCreate(savedInstanceState: Bundle?) { val isLaunch = savedInstanceState == null // Prevent splash screen showing up on configuration changes val splashScreen = if (isLaunch) installSplashScreen() else null super.onCreate(savedInstanceState) val didMigration = Migrator.awaitAndRelease() // Do not let the launcher create a new activity http://stackoverflow.com/questions/16283079 if (!isTaskRoot) { finish() return } setComposeContent { val context = LocalContext.current var incognito by remember { mutableStateOf(getMangaIncognitoState.await(null)) } var incognitoAnime by remember { mutableStateOf(getAnimeIncognitoState.await(null)) } val downloadOnly by preferences.downloadedOnly().collectAsState() val indexing by downloadCache.isInitializing.collectAsState() val indexingAnime by animeDownloadCache.isInitializing.collectAsState() val isSystemInDarkTheme = isSystemInDarkTheme() val statusBarBackgroundColor = when { indexing || indexingAnime -> IndexingBannerBackgroundColor downloadOnly -> DownloadedOnlyBannerBackgroundColor incognito || incognitoAnime -> IncognitoModeBannerBackgroundColor else -> MaterialTheme.colorScheme.surface } LaunchedEffect(isSystemInDarkTheme, statusBarBackgroundColor) { // Draw edge-to-edge and set system bars color to transparent val lightStyle = SystemBarStyle.light(Color.TRANSPARENT, Color.BLACK) val darkStyle = SystemBarStyle.dark(Color.TRANSPARENT) enableEdgeToEdge( statusBarStyle = if (statusBarBackgroundColor.luminance() > 0.5) lightStyle else darkStyle, navigationBarStyle = if (isSystemInDarkTheme) darkStyle else lightStyle, ) } Navigator( screen = HomeScreen, disposeBehavior = NavigatorDisposeBehavior( disposeNestedNavigators = false, disposeSteps = true, ), ) { navigator -> LaunchedEffect(navigator) { this@MainActivity.navigator = navigator if (isLaunch) { // Set start screen handleIntentAction(intent, navigator) // Reset Incognito Mode on relaunch preferences.incognitoMode().set(false) } } LaunchedEffect(navigator.lastItem) { (navigator.lastItem as? BrowseMangaSourceScreen)?.sourceId .let(getMangaIncognitoState::subscribe) .collectLatest { incognito = it } } LaunchedEffect(navigator.lastItem) { (navigator.lastItem as? BrowseAnimeSourceScreen)?.sourceId .let(getAnimeIncognitoState::subscribe) .collectLatest { incognitoAnime = it } } val scaffoldInsets = WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal) Scaffold( topBar = { AppStateBanners( downloadedOnlyMode = downloadOnly, incognitoMode = incognito || incognitoAnime, indexing = indexing || indexingAnime, modifier = Modifier.windowInsetsPadding(scaffoldInsets), ) }, contentWindowInsets = scaffoldInsets, ) { contentPadding -> // Consume insets already used by app state banners Box { // Shows current screen DefaultNavigatorScreenTransition( navigator = navigator, modifier = Modifier .padding(contentPadding) .consumeWindowInsets(contentPadding), ) // Draw navigation bar scrim when needed if (remember { isNavigationBarNeedsScrim() }) { Spacer( modifier = Modifier .align(Alignment.BottomCenter) .fillMaxWidth() .windowInsetsBottomHeight(WindowInsets.navigationBars) .alpha(0.8f) .background(MaterialTheme.colorScheme.surfaceContainer), ) } } } // Pop source-related screens when incognito mode is turned off LaunchedEffect(Unit) { preferences.incognitoMode().changes() .drop(1) .filter { !it } .onEach { val currentScreen = navigator.lastItem if (( currentScreen is BrowseMangaSourceScreen || (currentScreen is MangaScreen && currentScreen.fromSource) ) || ( currentScreen is BrowseAnimeSourceScreen || (currentScreen is AnimeScreen && currentScreen.fromSource) ) ) { navigator.popUntilRoot() } } .launchIn(this) } HandleOnNewIntent(context = context, navigator = navigator) CheckForUpdates() ShowOnboarding() } var showChangelog by remember { mutableStateOf(didMigration && !BuildConfig.DEBUG) } if (showChangelog) { AlertDialog( onDismissRequest = { showChangelog = false }, title = { Text( text = stringResource(MR.strings.updated_version, BuildConfig.VERSION_NAME), ) }, dismissButton = { TextButton(onClick = { openInBrowser(RELEASE_URL) }) { Text(text = stringResource(MR.strings.whats_new)) } }, confirmButton = { TextButton(onClick = { showChangelog = false }) { Text(text = stringResource(MR.strings.action_ok)) } }, ) } } val startTime = System.currentTimeMillis() splashScreen?.setKeepOnScreenCondition { val elapsed = System.currentTimeMillis() - startTime elapsed <= SPLASH_MIN_DURATION || !ready && elapsed <= SPLASH_MAX_DURATION } setSplashScreenExitAnimation(splashScreen) if (isLaunch && libraryPreferences.autoClearItemCache().get()) { lifecycleScope.launchIO { chapterCache.clear() } } externalPlayerResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult(), ) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { val animeId = savedInstanceState?.getLong(SAVED_STATE_ANIME_KEY) val episodeId = savedInstanceState?.getLong(SAVED_STATE_EPISODE_KEY) if (animeId != null && episodeId != null) { runBlocking { ExternalIntents.externalIntents.initAnime(animeId, episodeId) } } ExternalIntents.externalIntents.onActivityResult(result.data) } } } override fun onProvideAssistContent(outContent: AssistContent) { super.onProvideAssistContent(outContent) when (val screen = navigator?.lastItem) { is AssistContentScreen -> { screen.onProvideAssistUrl()?.let { outContent.webUri = it.toUri() } } } } @Composable private fun HandleOnNewIntent(context: Context, navigator: Navigator) { LaunchedEffect(Unit) { callbackFlow { val componentActivity = context as ComponentActivity val consumer = Consumer { trySend(it) } componentActivity.addOnNewIntentListener(consumer) awaitClose { componentActivity.removeOnNewIntentListener(consumer) } } .collectLatest { handleIntentAction(it, navigator) } } } @Composable private fun CheckForUpdates() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow // App updates LaunchedEffect(Unit) { if (updaterEnabled) { try { val result = AppUpdateChecker().checkForUpdate(context) if (result is GetApplicationRelease.Result.NewUpdate) { val updateScreen = NewUpdateScreen( versionName = result.release.version, changelogInfo = result.release.info, releaseLink = result.release.releaseLink, downloadLink = result.release.downloadLink, ) navigator.push(updateScreen) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) } } } // Extensions updates LaunchedEffect(Unit) { try { AnimeExtensionApi().checkForUpdates(context) MangaExtensionApi().checkForUpdates(context) } catch (e: Exception) { logcat(LogPriority.ERROR, e) } } } @Composable private fun ShowOnboarding() { val navigator = LocalNavigator.currentOrThrow LaunchedEffect(Unit) { if (!preferences.shownOnboardingFlow().get() && navigator.lastItem !is OnboardingScreen) { navigator.push(OnboardingScreen()) } } } /** * Sets custom splash screen exit animation on devices prior to Android 12. * * When custom animation is used, status and navigation bar color will be set to transparent and will be restored * after the animation is finished. */ @Suppress("Deprecation") private fun setSplashScreenExitAnimation(splashScreen: SplashScreen?) { val root = findViewById(android.R.id.content) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S && splashScreen != null) { window.statusBarColor = Color.TRANSPARENT window.navigationBarColor = Color.TRANSPARENT splashScreen.setOnExitAnimationListener { splashProvider -> // For some reason the SplashScreen applies (incorrect) Y translation to the iconView splashProvider.iconView.translationY = 0F val activityAnim = ValueAnimator.ofFloat(1F, 0F).apply { interpolator = LinearOutSlowInInterpolator() duration = SPLASH_EXIT_ANIM_DURATION addUpdateListener { va -> val value = va.animatedValue as Float root.translationY = value * 16.dpToPx } } val splashAnim = ValueAnimator.ofFloat(1F, 0F).apply { interpolator = FastOutSlowInInterpolator() duration = SPLASH_EXIT_ANIM_DURATION addUpdateListener { va -> val value = va.animatedValue as Float splashProvider.view.alpha = value } doOnEnd { splashProvider.remove() } } activityAnim.start() splashAnim.start() } } } private fun handleIntentAction(intent: Intent, navigator: Navigator): Boolean { val notificationId = intent.getIntExtra("notificationId", -1) if (notificationId > -1) { NotificationReceiver.dismissNotification( applicationContext, notificationId, intent.getIntExtra("groupId", 0), ) } val tabToOpen = when (intent.action) { Constants.SHORTCUT_ANIMELIB -> HomeScreen.Tab.AnimeLib() Constants.SHORTCUT_LIBRARY -> HomeScreen.Tab.Library() Constants.SHORTCUT_MANGA -> { val idToOpen = intent.extras?.getLong(Constants.MANGA_EXTRA) ?: return false navigator.popUntilRoot() HomeScreen.Tab.Library(idToOpen) } Constants.SHORTCUT_ANIME -> { val idToOpen = intent.extras?.getLong(Constants.ANIME_EXTRA) ?: return false navigator.popUntilRoot() HomeScreen.Tab.AnimeLib(idToOpen) } Constants.SHORTCUT_UPDATES -> HomeScreen.Tab.Updates Constants.SHORTCUT_HISTORY -> HomeScreen.Tab.History Constants.SHORTCUT_SOURCES -> HomeScreen.Tab.Browse(false) Constants.SHORTCUT_ANIMEEXTENSIONS -> HomeScreen.Tab.Browse(true, true) Constants.SHORTCUT_EXTENSIONS -> HomeScreen.Tab.Browse(true) Constants.SHORTCUT_DOWNLOADS -> { navigator.popUntilRoot() HomeScreen.Tab.More(toDownloads = true) } Constants.SHORTCUT_ANIME_DOWNLOADS -> { navigator.popUntilRoot() HomeScreen.Tab.More(toDownloads = true) } Intent.ACTION_SEARCH, Intent.ACTION_SEND, "com.google.android.gms.actions.SEARCH_ACTION" -> { // If the intent match the "standard" Android search intent // or the Google-specific search intent (triggered by saying or typing "search *query* on *Tachiyomi*" in Google Search/Google Assistant) // Get the search query provided in extras, and if not null, perform a global search with it. val query = intent.getStringExtra(SearchManager.QUERY) ?: intent.getStringExtra(Intent.EXTRA_TEXT) if (!query.isNullOrEmpty()) { navigator.popUntilRoot() val screenType = intent.getStringExtra(INTENT_SEARCH_TYPE).orEmpty() .ifBlank { "ANIME" } .let(DeepLinkScreenType::valueOf) when (screenType) { DeepLinkScreenType.MANGA -> { navigator.push(GlobalMangaSearchScreen(query)) navigator.push(DeepLinkMangaScreen(query)) } DeepLinkScreenType.ANIME -> { navigator.push(GlobalAnimeSearchScreen(query)) navigator.push(DeepLinkAnimeScreen(query)) } } } null } INTENT_SEARCH -> { // Used by extensions (url intent handlers) val query = intent.getStringExtra(INTENT_SEARCH_QUERY) if (!query.isNullOrEmpty()) { val filter = intent.getStringExtra(INTENT_SEARCH_FILTER) navigator.popUntilRoot() navigator.push(GlobalMangaSearchScreen(query, filter)) } null } INTENT_ANIMESEARCH -> { // Same as above val query = intent.getStringExtra(INTENT_SEARCH_QUERY) if (!query.isNullOrEmpty()) { val filter = intent.getStringExtra(INTENT_SEARCH_FILTER) navigator.popUntilRoot() navigator.push(GlobalAnimeSearchScreen(query, filter)) } null } Intent.ACTION_VIEW -> { // Handling opening of backup files if (intent.data.toString().endsWith(".tachibk")) { navigator.popUntilRoot() navigator.push(RestoreBackupScreen(intent.data.toString())) } // Deep link to add anime extension repo else if (intent.scheme == "aniyomi" && intent.data?.host == "add-repo") { intent.data?.getQueryParameter("url")?.let { repoUrl -> navigator.popUntilRoot() navigator.push(AnimeExtensionReposScreen(repoUrl)) } } // Deep link to add extension repo else if (intent.scheme == "tachiyomi" && intent.data?.host == "add-repo") { intent.data?.getQueryParameter("url")?.let { repoUrl -> navigator.popUntilRoot() navigator.push(MangaExtensionReposScreen(repoUrl)) } } null } else -> return false } if (tabToOpen != null) { lifecycleScope.launch { HomeScreen.openTab(tabToOpen) } } ready = true return true } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) ExternalIntents.externalIntents.animeId?.let { outState.putLong(SAVED_STATE_ANIME_KEY, it) } ExternalIntents.externalIntents.episodeId?.let { outState.putLong(SAVED_STATE_EPISODE_KEY, it) } } companion object { const val INTENT_SEARCH = "eu.kanade.tachiyomi.SEARCH" const val INTENT_ANIMESEARCH = "eu.kanade.tachiyomi.ANIMESEARCH" const val INTENT_SEARCH_QUERY = "query" const val INTENT_SEARCH_FILTER = "filter" const val INTENT_SEARCH_TYPE = "type" const val SAVED_STATE_ANIME_KEY = "saved_state_anime_key" const val SAVED_STATE_EPISODE_KEY = "saved_state_episode_key" private var externalPlayerResult: ActivityResultLauncher? = null suspend fun startPlayerActivity( context: Context, animeId: Long, episodeId: Long, extPlayer: Boolean, video: Video? = null, hosterIndex: Int = -1, videoIndex: Int = -1, hosterList: List? = null, ) { if (extPlayer) { val intent = try { ExternalIntents.newIntent(context, animeId, episodeId, video) } catch (e: Exception) { logcat(LogPriority.ERROR, e) withUIContext { Injekt.get().toast(e.message) } null } ?: return externalPlayerResult?.launch(intent) ?: return } else { context.startActivity( PlayerActivity.newIntent( context, animeId, episodeId, hosterList, hosterIndex, videoIndex, ), ) } } } } // Splash screen private const val SPLASH_MIN_DURATION = 500 // ms private const val SPLASH_MAX_DURATION = 5000 // ms private const val SPLASH_EXIT_ANIM_DURATION = 400L // ms ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/more/MoreTab.kt ================================================ package eu.kanade.tachiyomi.ui.more import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.model.ScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabOptions import eu.kanade.core.preference.asState import eu.kanade.domain.base.BasePreferences import eu.kanade.presentation.more.MoreScreen import eu.kanade.presentation.util.Tab import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.manga.MangaDownloadManager import eu.kanade.tachiyomi.ui.category.CategoriesTab import eu.kanade.tachiyomi.ui.download.DownloadsTab import eu.kanade.tachiyomi.ui.setting.PlayerSettingsScreen import eu.kanade.tachiyomi.ui.setting.SettingsScreen import eu.kanade.tachiyomi.ui.stats.StatsTab import eu.kanade.tachiyomi.ui.storage.StorageTab import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import tachiyomi.core.common.util.lang.launchIO import tachiyomi.i18n.MR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get data object MoreTab : Tab { override val options: TabOptions @Composable get() { val isSelected = LocalTabNavigator.current.current.key == key val image = AnimatedImageVector.animatedVectorResource(R.drawable.anim_more_enter) return TabOptions( index = 4u, title = stringResource(MR.strings.label_more), icon = rememberAnimatedVectorPainter(image, isSelected), ) } override suspend fun onReselect(navigator: Navigator) { navigator.push(SettingsScreen()) } @Composable override fun Content() { val context = LocalContext.current val navigator = LocalNavigator.currentOrThrow val screenModel = rememberScreenModel { MoreScreenModel() } val downloadQueueState by screenModel.downloadQueueState.collectAsState() val navStyle = currentNavigationStyle() MoreScreen( downloadQueueStateProvider = { downloadQueueState }, downloadedOnly = screenModel.downloadedOnly, onDownloadedOnlyChange = { screenModel.downloadedOnly = it }, incognitoMode = screenModel.incognitoMode, onIncognitoModeChange = { screenModel.incognitoMode = it }, navStyle = navStyle, onClickAlt = { navigator.push(navStyle.moreTab) }, onClickDownloadQueue = { navigator.push(DownloadsTab) }, onClickCategories = { navigator.push(CategoriesTab) }, onClickStats = { navigator.push(StatsTab) }, onClickStorage = { navigator.push(StorageTab) }, onClickDataAndStorage = { navigator.push(SettingsScreen(SettingsScreen.Destination.DataAndStorage)) }, onClickPlayerSettings = { navigator.push(PlayerSettingsScreen(mainSettings = false)) }, onClickSettings = { navigator.push(SettingsScreen()) }, onClickAbout = { navigator.push(SettingsScreen(SettingsScreen.Destination.About)) }, ) } } private class MoreScreenModel( private val downloadManager: MangaDownloadManager = Injekt.get(), private val animeDownloadManager: AnimeDownloadManager = Injekt.get(), preferences: BasePreferences = Injekt.get(), ) : ScreenModel { var downloadedOnly by preferences.downloadedOnly().asState(screenModelScope) var incognitoMode by preferences.incognitoMode().asState(screenModelScope) private var _downloadQueueState: MutableStateFlow = MutableStateFlow( DownloadQueueState.Stopped, ) val downloadQueueState: StateFlow = _downloadQueueState.asStateFlow() init { // Handle running/paused status change and queue progress updating screenModelScope.launchIO { combine( downloadManager.isDownloaderRunning, downloadManager.queueState, ) { isRunningManga, mangaDownloadQueue -> Pair(isRunningManga, mangaDownloadQueue.size) } .collectLatest { (isDownloadingManga, mangaDownloadQueueSize) -> combine( animeDownloadManager.isDownloaderRunning, animeDownloadManager.queueState, ) { isRunningAnime, animeDownloadQueue -> Pair( isRunningAnime, animeDownloadQueue.size, ) } .collectLatest { (isDownloadingAnime, animeDownloadQueueSize) -> val isDownloading = isDownloadingAnime || isDownloadingManga val downloadQueueSize = mangaDownloadQueueSize + animeDownloadQueueSize val pendingDownloadExists = downloadQueueSize != 0 _downloadQueueState.value = when { !pendingDownloadExists -> DownloadQueueState.Stopped !isDownloading -> DownloadQueueState.Paused(downloadQueueSize) else -> DownloadQueueState.Downloading(downloadQueueSize) } } } } } } sealed interface DownloadQueueState { data object Stopped : DownloadQueueState data class Paused(val pending: Int) : DownloadQueueState data class Downloading(val pending: Int) : DownloadQueueState } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/more/NewUpdateScreen.kt ================================================ package eu.kanade.tachiyomi.ui.more import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.more.NewUpdateScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.updater.AppUpdateDownloadJob import eu.kanade.tachiyomi.util.system.openInBrowser class NewUpdateScreen( private val versionName: String, private val changelogInfo: String, private val releaseLink: String, private val downloadLink: String, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current val changelogInfoNoChecksum = remember { changelogInfo.replace("""---(\R|.)*Checksums(\R|.)*""".toRegex(), "") } NewUpdateScreen( versionName = versionName, changelogInfo = changelogInfoNoChecksum, onOpenInBrowser = { context.openInBrowser(releaseLink) }, onRejectUpdate = navigator::pop, onAcceptUpdate = { AppUpdateDownloadJob.start( context = context, url = downloadLink, title = versionName, ) navigator.pop() }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/more/OnboardingScreen.kt ================================================ package eu.kanade.tachiyomi.ui.more import androidx.activity.compose.BackHandler import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.domain.base.BasePreferences import eu.kanade.presentation.more.onboarding.OnboardingScreen import eu.kanade.presentation.more.settings.screen.SearchableSettings import eu.kanade.presentation.more.settings.screen.SettingsDataScreen import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.ui.setting.SettingsScreen import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class OnboardingScreen : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow val basePreferences = remember { Injekt.get() } val shownOnboardingFlow by basePreferences.shownOnboardingFlow().collectAsState() val finishOnboarding: () -> Unit = { basePreferences.shownOnboardingFlow().set(true) navigator.pop() } val restoreSettingKey = stringResource(SettingsDataScreen.restorePreferenceKeyString) BackHandler( enabled = !shownOnboardingFlow, onBack = { // Prevent exiting if onboarding hasn't been completed }, ) OnboardingScreen( onComplete = finishOnboarding, onRestoreBackup = { finishOnboarding() SearchableSettings.highlightKey = restoreSettingKey navigator.push(SettingsScreen(SettingsScreen.Destination.DataAndStorage)) }, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/AniyomiMPVView.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player import android.content.Context import android.os.Build import android.os.Environment import android.util.AttributeSet import android.view.KeyCharacterMap import android.view.KeyEvent import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.player.controls.components.panels.toColorHexString import eu.kanade.tachiyomi.ui.player.settings.AdvancedPlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.DecoderPreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import `is`.xyz.mpv.BaseMPVView import `is`.xyz.mpv.KeyMapping import `is`.xyz.mpv.MPVLib import logcat.LogPriority import logcat.logcat import uy.kohesive.injekt.injectLazy import kotlin.reflect.KProperty class AniyomiMPVView(context: Context, attributes: AttributeSet) : BaseMPVView(context, attributes) { private val playerPreferences: PlayerPreferences by injectLazy() private val decoderPreferences: DecoderPreferences by injectLazy() private val subtitlePreferences: SubtitlePreferences by injectLazy() private val audioPreferences: AudioPreferences by injectLazy() private val advancedPreferences: AdvancedPlayerPreferences by injectLazy() private val networkPreferences: NetworkPreferences by injectLazy() var isExiting = false private fun getPropertyInt(property: String): Int? { return MPVLib.getPropertyInt(property) as Int? } private fun getPropertyBoolean(property: String): Boolean? { return MPVLib.getPropertyBoolean(property) as Boolean? } private fun getPropertyDouble(property: String): Double? { return MPVLib.getPropertyDouble(property) as Double? } private fun getPropertyString(property: String): String? { return MPVLib.getPropertyString(property) as String? } val duration: Int? get() = getPropertyInt("duration") var timePos: Int? get() = getPropertyInt("time-pos") set(position) = MPVLib.setPropertyInt("time-pos", position!!) var paused: Boolean? get() = getPropertyBoolean("pause") set(paused) = MPVLib.setPropertyBoolean("pause", paused!!) val hwdecActive: String get() = getPropertyString("hwdec-current") ?: "no" val videoH: Int? get() = getPropertyInt("video-params/h") /** * Returns the video aspect ratio. Rotation is taken into account. */ fun getVideoOutAspect(): Double? { return getPropertyDouble("video-params/aspect")?.let { if (it < 0.001) return 0.0 if ((getPropertyInt("video-params/rotate") ?: 0) % 180 == 90) 1.0 / it else it } } inner class TrackDelegate(private val name: String) { operator fun getValue(thisRef: Any?, property: KProperty<*>): Int { val v = getPropertyString(name) // we can get null here for "no" or other invalid value return v?.toIntOrNull() ?: -1 } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) { if (value == -1) { MPVLib.setPropertyString(name, "no") } else { MPVLib.setPropertyInt(name, value) } } } var sid: Int by TrackDelegate("sid") var secondarySid: Int by TrackDelegate("secondary-sid") var aid: Int by TrackDelegate("aid") override fun initOptions(vo: String) { setVo(if (decoderPreferences.gpuNext().get()) "gpu-next" else "gpu") MPVLib.setPropertyBoolean("pause", true) MPVLib.setOptionString("profile", "fast") MPVLib.setOptionString("hwdec", if (decoderPreferences.tryHWDecoding().get()) "auto" else "no") when (decoderPreferences.videoDebanding().get()) { Debanding.None -> {} Debanding.CPU -> MPVLib.setOptionString("vf", "gradfun=radius=12") Debanding.GPU -> MPVLib.setOptionString("deband", "yes") } if (decoderPreferences.useYUV420P().get()) { MPVLib.setOptionString("vf", "format=yuv420p") } MPVLib.setOptionString("msg-level", "all=" + if (networkPreferences.verboseLogging().get()) "v" else "warn") MPVLib.setPropertyBoolean("keep-open", true) MPVLib.setPropertyBoolean("input-default-bindings", true) MPVLib.setOptionString("ytdl", "no") MPVLib.setOptionString("tls-verify", "yes") MPVLib.setOptionString("tls-ca-file", "${context.filesDir.path}/${PlayerActivity.MPV_DIR}/cacert.pem") // Limit demuxer cache since the defaults are too high for mobile devices val cacheMegs = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) 64 else 32 MPVLib.setOptionString("demuxer-max-bytes", "${cacheMegs * 1024 * 1024}") MPVLib.setOptionString("demuxer-max-back-bytes", "${cacheMegs * 1024 * 1024}") // val screenshotDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) screenshotDir.mkdirs() MPVLib.setOptionString("screenshot-directory", screenshotDir.path) VideoFilters.entries.forEach { MPVLib.setOptionString(it.mpvProperty, it.preference(decoderPreferences).get().toString()) } MPVLib.setOptionString("speed", playerPreferences.playerSpeed().get().toString()) // workaround for MPVLib.setOptionString("vd-lavc-film-grain", "cpu") setupSubtitlesOptions() setupAudioOptions() } override fun observeProperties() { for ((name, format) in observedProps) MPVLib.observeProperty(name, format) } override fun postInitOptions() { advancedPreferences.playerStatisticsPage().get().let { if (it != 0) { MPVLib.command(arrayOf("script-binding", "stats/display-stats-toggle")) MPVLib.command(arrayOf("script-binding", "stats/display-page-$it")) } } } fun onKey(event: KeyEvent): Boolean { if (event.action == KeyEvent.ACTION_MULTIPLE || KeyEvent.isModifierKey(event.keyCode)) { return false } var mapped = KeyMapping.map.get(event.keyCode) if (mapped == null) { // Fallback to produced glyph if (!event.isPrintingKey) { if (event.repeatCount == 0) { logcat(LogPriority.DEBUG) { "Unmapped non-printable key ${event.keyCode}" } } return false } val ch = event.unicodeChar if (ch.and(KeyCharacterMap.COMBINING_ACCENT) != 0) { return false // dead key } mapped = ch.toChar().toString() } if (event.repeatCount > 0) { return true // eat event but ignore it, mpv has its own key repeat } val mod: MutableList = mutableListOf() event.isShiftPressed && mod.add("shift") event.isCtrlPressed && mod.add("ctrl") event.isAltPressed && mod.add("alt") event.isMetaPressed && mod.add("meta") val action = if (event.action == KeyEvent.ACTION_DOWN) "keydown" else "keyup" mod.add(mapped) MPVLib.command(arrayOf(action, mod.joinToString("+"))) return true } private val observedProps = mapOf( "chapter" to MPVLib.mpvFormat.MPV_FORMAT_INT64, "chapter-list" to MPVLib.mpvFormat.MPV_FORMAT_NONE, "track-list" to MPVLib.mpvFormat.MPV_FORMAT_NONE, "time-pos" to MPVLib.mpvFormat.MPV_FORMAT_INT64, "demuxer-cache-time" to MPVLib.mpvFormat.MPV_FORMAT_INT64, "duration" to MPVLib.mpvFormat.MPV_FORMAT_INT64, "volume" to MPVLib.mpvFormat.MPV_FORMAT_INT64, "volume-max" to MPVLib.mpvFormat.MPV_FORMAT_INT64, "sid" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "secondary-sid" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "aid" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "speed" to MPVLib.mpvFormat.MPV_FORMAT_DOUBLE, "video-params/aspect" to MPVLib.mpvFormat.MPV_FORMAT_DOUBLE, "hwdec-current" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "hwdec" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "pause" to MPVLib.mpvFormat.MPV_FORMAT_FLAG, "paused-for-cache" to MPVLib.mpvFormat.MPV_FORMAT_FLAG, "seeking" to MPVLib.mpvFormat.MPV_FORMAT_FLAG, "eof-reached" to MPVLib.mpvFormat.MPV_FORMAT_FLAG, "user-data/aniyomi/show_text" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/toggle_ui" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/show_panel" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/software_keyboard" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/set_button_title" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/reset_button_title" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/toggle_button" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/switch_episode" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/pause" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/seek_by" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/seek_to" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/seek_by_with_text" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/seek_to_with_text" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/aniyomi/launch_int_picker" to MPVLib.mpvFormat.MPV_FORMAT_STRING, "user-data/current-anime/intro-length" to MPVLib.mpvFormat.MPV_FORMAT_INT64, ) private fun setupAudioOptions() { MPVLib.setOptionString("alang", audioPreferences.preferredAudioLanguages().get()) MPVLib.setOptionString("audio-delay", (audioPreferences.audioDelay().get() / 1000.0).toString()) MPVLib.setOptionString("audio-pitch-correction", audioPreferences.enablePitchCorrection().get().toString()) MPVLib.setOptionString("volume-max", (audioPreferences.volumeBoostCap().get() + 100).toString()) } private fun setupSubtitlesOptions() { MPVLib.setOptionString("sub-delay", (subtitlePreferences.subtitlesDelay().get() / 1000.0).toString()) MPVLib.setOptionString("sub-speed", subtitlePreferences.subtitlesSpeed().get().toString()) MPVLib.setOptionString( "secondary-sub-delay", (subtitlePreferences.subtitlesSecondaryDelay().get() / 1000.0).toString(), ) MPVLib.setOptionString("sub-font", subtitlePreferences.subtitleFont().get()) if (subtitlePreferences.overrideSubsASS().get()) { MPVLib.setOptionString("sub-ass-override", "force") MPVLib.setOptionString("sub-ass-justify", "yes") } MPVLib.setOptionString("sub-font-size", subtitlePreferences.subtitleFontSize().get().toString()) MPVLib.setOptionString("sub-bold", if (subtitlePreferences.boldSubtitles().get()) "yes" else "no") MPVLib.setOptionString("sub-italic", if (subtitlePreferences.italicSubtitles().get()) "yes" else "no") MPVLib.setOptionString("sub-justify", subtitlePreferences.subtitleJustification().get().value) MPVLib.setOptionString("sub-color", subtitlePreferences.textColorSubtitles().get().toColorHexString()) MPVLib.setOptionString( "sub-back-color", subtitlePreferences.backgroundColorSubtitles().get().toColorHexString(), ) MPVLib.setOptionString("sub-border-color", subtitlePreferences.borderColorSubtitles().get().toColorHexString()) MPVLib.setOptionString("sub-border-size", subtitlePreferences.subtitleBorderSize().get().toString()) MPVLib.setOptionString("sub-border-style", subtitlePreferences.borderStyleSubtitles().get().value) MPVLib.setOptionString("sub-shadow-offset", subtitlePreferences.shadowOffsetSubtitles().get().toString()) MPVLib.setOptionString("sub-pos", subtitlePreferences.subtitlePos().get().toString()) MPVLib.setOptionString("sub-scale", subtitlePreferences.subtitleFontScale().get().toString()) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/ExternalIntents.kt ================================================ package eu.kanade.tachiyomi.ui.player import android.app.Application import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle import androidx.core.content.FileProvider import androidx.core.net.toUri import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.track.anime.model.toDbTrack import eu.kanade.domain.track.anime.service.DelayedAnimeTrackingUpdateJob import eu.kanade.domain.track.anime.store.DelayedAnimeTrackingStore import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.track.AnimeTracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.ui.player.loader.EpisodeLoader import eu.kanade.tachiyomi.ui.player.loader.HosterLoader import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.util.system.LocaleHelper import eu.kanade.tachiyomi.util.system.isOnline import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import logcat.LogPriority import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.history.anime.interactor.UpsertAnimeHistory import tachiyomi.domain.history.anime.model.AnimeHistoryUpdate import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.Episode import tachiyomi.domain.items.episode.model.EpisodeUpdate import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.domain.track.anime.interactor.InsertAnimeTrack import tachiyomi.source.local.entries.anime.LocalAnimeSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.io.File import java.util.Date class ExternalIntents { /** * The common variables * Used to dictate what video is sent an external player. */ lateinit var anime: Anime lateinit var source: AnimeSource lateinit var episode: Episode var animeId: Long? = null var episodeId: Long? = null /** * Returns the [Intent] to be sent to an external player. * * @param context the application context. * @param animeId the id of the anime. * @param episodeId the id of the episode. */ suspend fun getExternalIntent( context: Context, animeId: Long, episodeId: Long, chosenVideo: Video?, ): Intent? { if (!initAnime(animeId, episodeId)) return null val hosters = EpisodeLoader.getHosters(episode, anime, source) val video = chosenVideo ?: HosterLoader.getBestVideo(source, hosters) ?: throw Exception("Video list is empty") val videoUrl = getVideoUrl(source, context, video) ?: return null val pkgName = playerPreferences.externalPlayerPreference().get() return if (pkgName.isEmpty()) { Intent(Intent.ACTION_VIEW).apply { setDataAndTypeAndNormalize(videoUrl, getMime(videoUrl)) addExtrasAndFlags(false, this) addVideoHeaders(false, video, this) } } else { getIntentForPackage(pkgName, context, videoUrl, video) } } suspend fun initAnime(animeId: Long, episodeId: Long): Boolean { anime = getAnime.await(animeId) ?: return false source = sourceManager.get(anime.source) ?: return false episode = getEpisodesByAnimeId.await(anime.id).find { it.id == episodeId } ?: return false this.animeId = animeId this.episodeId = episodeId return true } /** * Returns the [Uri] of the given video. * * @param context the application context. * @param video the video being sent to the external player. */ private suspend fun getVideoUrl(source: AnimeSource, context: Context, video: Video): Uri? { val resolvedVideo = HosterLoader.getResolvedVideo(source, video) if (resolvedVideo == null || resolvedVideo.videoUrl.isEmpty()) { makeErrorToast(context, Exception("Video URL is empty.")) return null } else { val uri = resolvedVideo.videoUrl.toUri() val isOnDevice = if (anime.source == LocalAnimeSource.ID) { true } else { downloadManager.isEpisodeDownloaded( episodeName = episode.name, episodeScanlator = episode.scanlator, animeTitle = anime.title, sourceId = anime.source, skipCache = true, ) } return if (isOnDevice && uri.scheme != "content") { FileProvider.getUriForFile( context, context.applicationContext.packageName + ".provider", File(uri.path!!), ) } else { uri } } } /** * Returns the second to start the external player at. */ private fun getLastSecondSeen(): Long { val preserveWatchPos = playerPreferences.preserveWatchingPosition().get() val isEpisodeWatched = episode.lastSecondSeen == episode.totalSeconds return if (episode.seen && (!preserveWatchPos || (preserveWatchPos && isEpisodeWatched))) { 1L } else { episode.lastSecondSeen } } /** * Display an error toast in this [context]. * * @param context the application context. * @param e the exception error to be displayed. */ private suspend fun makeErrorToast(context: Context, e: Exception?) { withUIContext { context.toast(e?.message ?: "Cannot open episode") } } /** * Returns the [Intent] with added data to send to the given external player. * * @param pkgName the name of the package to send the [Intent] to. * @param context the application context. * @param uri the path data of the video. * @param video the video being sent to the external player. */ private fun getIntentForPackage(pkgName: String, context: Context, uri: Uri, video: Video): Intent { return when (pkgName) { WEB_VIDEO_CASTER -> webVideoCasterIntent(pkgName, context, uri, video) else -> standardIntentForPackage(pkgName, context, uri, video) } } private fun webVideoCasterIntent(pkgName: String, context: Context, uri: Uri, video: Video): Intent { return Intent(Intent.ACTION_VIEW).apply { setDataAndType(uri, "video/*") if (isPackageInstalled(pkgName, context.packageManager)) setPackage(WEB_VIDEO_CASTER) addExtrasAndFlags(true, this) val headers = Bundle() video.headers?.forEach { headers.putString(it.first, it.second) } val localLangName = LocaleHelper.getSimpleLocaleDisplayName() video.subtitleTracks.firstOrNull { it.lang.contains(localLangName, true) }?.let { putExtra("subtitle", it.url) } ?: video.subtitleTracks.firstOrNull()?.let { putExtra("subtitle", it.url) } putExtra("android.media.intent.extra.HTTP_HEADERS", headers) putExtra("secure_uri", true) } } /** * Returns the [Intent] with added data to send to the given external player. * * @param pkgName the name of the package to send the [Intent] to. * @param context the application context. * @param uri the path data of the video. * @param video the video being sent to the external player. */ private fun standardIntentForPackage(pkgName: String, context: Context, uri: Uri, video: Video): Intent { return Intent(Intent.ACTION_VIEW).apply { if (isPackageInstalled(pkgName, context.packageManager)) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && pkgName.contains("vlc")) { setPackage(pkgName) } else { component = getComponent(pkgName) } } setDataAndType(uri, "video/*") addExtrasAndFlags(true, this) addVideoHeaders(true, video, this) // Add support for Subtitles to external players val localLangName = LocaleHelper.getSimpleLocaleDisplayName() val langIndex = video.subtitleTracks.indexOfFirst { it.lang.contains(localLangName, true) } val requestedLanguage = if (langIndex == -1) 0 else langIndex val requestedUrl = video.subtitleTracks.getOrNull(requestedLanguage)?.url // Just, Next, MX Player, mpv putExtra("subs", video.subtitleTracks.map { it.url.toUri() }.toTypedArray()) putExtra("subs.name", video.subtitleTracks.map { it.lang }.toTypedArray()) putExtra("subs.enable", requestedUrl?.let { arrayOf(it.toUri()) } ?: emptyArray()) // VLC - seems to only work for local sub files requestedUrl?.let { putExtra("subtitles_location", it) } } } /** * Adds extras and flags to the given [Intent]. * * @param isSupportedPlayer is it a supported external player. * @param intent the [Intent] that the extras and flags are added to. */ private fun addExtrasAndFlags(isSupportedPlayer: Boolean, intent: Intent): Intent { return intent.apply { putExtra("title", anime.title + " - " + episode.name) putExtra("position", getLastSecondSeen().toInt()) putExtra("return_result", true) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) if (isSupportedPlayer) putExtra("secure_uri", true) } } /** * Adds the headers of the video to the given [Intent]. * * @param isSupportedPlayer is it a supported external player. * @param video the [Video] to get the headers from. * @param intent the [Intent] that the headers are added to. */ private fun addVideoHeaders(isSupportedPlayer: Boolean, video: Video, intent: Intent): Intent { return intent.apply { val headers = video.headers ?: (source as? AnimeHttpSource)?.headers if (headers != null) { var headersArray = arrayOf() for (header in headers) { headersArray += arrayOf(header.first, header.second) } putExtra("headers", headersArray) val headersString = headersArray.drop(2).joinToString(": ") if (!isSupportedPlayer) putExtra("http-header-fields", headersString) } } } /** * Returns the MIME type based on the video's extension. * * @param uri the path data of the video. */ private fun getMime(uri: Uri): String { return when (uri.path?.substringAfterLast(".")) { "mp4" -> "video/mp4" "mkv" -> "video/x-matroska" "m3u8" -> "application/x-mpegURL" else -> "video/any" } } /** * Returns the specific activity to be called. * If the package is a part of the supported external players * * @param packageName the name of the package. */ private fun getComponent(packageName: String): ComponentName? { return when (packageName) { MPV_PLAYER -> ComponentName(packageName, "$packageName.MPVActivity") MX_PLAYER, MX_PLAYER_FREE, MX_PLAYER_PRO -> ComponentName( packageName, "$packageName.ActivityScreen", ) VLC_PLAYER -> ComponentName(packageName, "$packageName.gui.video.VideoPlayerActivity") MPV_KT, MPV_KT_PREVIEW -> ComponentName(packageName, "live.mehiz.mpvkt.ui.player.PlayerActivity") MPV_REMOTE -> ComponentName(packageName, "$packageName.MainActivity") JUST_PLAYER -> ComponentName(packageName, "$packageName.PlayerActivity") NEXT_PLAYER -> ComponentName(packageName, "$packageName.feature.player.PlayerActivity") X_PLAYER -> ComponentName(packageName, "com.inshot.xplayer.activities.PlayerActivity") else -> null } } /** * Returns true if the given package is installed on the device. * * @param packageName the name of the package to be found. * @param packageManager the instance of the package manager provided by the device. */ private fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean { return try { packageManager.getPackageInfo(packageName, 0) true } catch (e: PackageManager.NameNotFoundException) { false } } /** * Saves the episode's data based on whats returned by the external player. * * @param intent the [Intent] that contains the episode's position and duration. */ @OptIn(DelicateCoroutinesApi::class) @Suppress("DEPRECATION") fun onActivityResult(intent: Intent?) { val data = intent ?: return if (animeId == null || episodeId == null) return val anime = anime val currentExtEpisode = episode val currentPosition: Long val duration: Long val cause = data.getStringExtra("end_by") ?: "" // Check for position and duration as Long values if (cause.isNotEmpty()) { val positionExtra = data.extras?.get("position") currentPosition = if (positionExtra is Int) { positionExtra.toLong() } else { positionExtra as? Long ?: 0L } val durationExtra = data.extras?.get("duration") duration = if (durationExtra is Int) { durationExtra.toLong() } else { durationExtra as? Long ?: 0L } } else { if (data.extras?.get("extra_position") != null) { currentPosition = data.getLongExtra("extra_position", 0L) duration = data.getLongExtra("extra_duration", 0L) } else { currentPosition = data.getIntExtra("position", 0).toLong() duration = data.getIntExtra("duration", 0).toLong() } } // Update the episode's progress and history launchIO { if (cause == "playback_completion" || (currentPosition == duration && duration == 0L)) { saveEpisodeProgress( currentExtEpisode, anime, currentExtEpisode.totalSeconds, currentExtEpisode.totalSeconds, ) } else { saveEpisodeProgress(currentExtEpisode, anime, currentPosition, duration) } saveEpisodeHistory(currentExtEpisode) } } // List of all the required Injectable classes private val upsertHistory: UpsertAnimeHistory = Injekt.get() private val updateEpisode: UpdateEpisode = Injekt.get() private val getAnime: GetAnime = Injekt.get() private val sourceManager: AnimeSourceManager = Injekt.get() private val getEpisodesByAnimeId: GetEpisodesByAnimeId = Injekt.get() private val getTracks: GetAnimeTracks = Injekt.get() private val insertTrack: InsertAnimeTrack = Injekt.get() private val downloadManager: AnimeDownloadManager by injectLazy() private val delayedTrackingStore: DelayedAnimeTrackingStore = Injekt.get() private val playerPreferences: PlayerPreferences = Injekt.get() private val downloadPreferences: DownloadPreferences = Injekt.get() private val trackPreferences: TrackPreferences = Injekt.get() private val basePreferences: BasePreferences by injectLazy() /** * Saves this episode's last seen history if incognito mode isn't on. * * @param currentEpisode the episode to update. */ private suspend fun saveEpisodeHistory(currentEpisode: Episode) { if (basePreferences.incognitoMode().get()) return upsertHistory.await( AnimeHistoryUpdate(currentEpisode.id, Date()), ) } /** * Saves this episode's progress (last seen second and whether it's seen). * Only if incognito mode isn't on * * @param currentEpisode the episode to update. * @param anime the anime of the episode. * @param lastSecondSeen the position of the episode. * @param totalSeconds the duration of the episode. */ private suspend fun saveEpisodeProgress( currentEpisode: Episode?, anime: Anime, lastSecondSeen: Long, totalSeconds: Long, ) { if (basePreferences.incognitoMode().get()) return val currEp = currentEpisode ?: return if (totalSeconds > 0L) { val progress = playerPreferences.progressPreference().get() val seen = if (!currEp.seen) lastSecondSeen >= totalSeconds * progress else true updateEpisode.await( EpisodeUpdate( id = currEp.id, seen = seen, bookmark = currEp.bookmark, fillermark = currEp.fillermark, lastSecondSeen = lastSecondSeen, totalSeconds = totalSeconds, ), ) if (trackPreferences.autoUpdateTrack().get() && currEp.seen) { updateTrackEpisodeSeen(currEp.episodeNumber.toDouble(), anime) } if (seen) { deleteEpisodeIfNeeded(currentEpisode, anime) } } } /** * Determines if deleting option is enabled and nth to last episode actually exists. * If both conditions are satisfied enqueues episode for delete * * @param episode the episode, which is going to be marked as seen. * @param anime the anime of the episode. */ private suspend fun deleteEpisodeIfNeeded(episode: Episode, anime: Anime) { // Determine which episode should be deleted and enqueue val sortFunction: (Episode, Episode) -> Int = when (anime.sorting) { Anime.EPISODE_SORTING_SOURCE -> { c1, c2 -> c2.sourceOrder.compareTo(c1.sourceOrder) } Anime.EPISODE_SORTING_NUMBER -> { c1, c2 -> c1.episodeNumber.compareTo(c2.episodeNumber) } Anime.EPISODE_SORTING_UPLOAD_DATE -> { c1, c2 -> c1.dateUpload.compareTo(c2.dateUpload) } else -> throw NotImplementedError("Unknown sorting method") } val episodes = getEpisodesByAnimeId.await(anime.id) .sortedWith { e1, e2 -> sortFunction(e1, e2) } val currentEpisodePosition = episodes.indexOf(episode) val removeAfterSeenSlots = downloadPreferences.removeAfterReadSlots().get() val episodeToDelete = episodes.getOrNull(currentEpisodePosition - removeAfterSeenSlots) // Check if deleting option is enabled and episode exists if (removeAfterSeenSlots != -1 && episodeToDelete != null) { enqueueDeleteSeenEpisodes(episodeToDelete, anime) } } /** * Starts the service that updates the last episode seen in sync services. * This operation will run in a background thread and errors are ignored. * * @param episodeNumber the episode number to be updated. * @param anime the anime of the episode. */ private suspend fun updateTrackEpisodeSeen(episodeNumber: Double, anime: Anime) { if (!trackPreferences.autoUpdateTrack().get()) return val trackerManager = Injekt.get() val context = Injekt.get() withIOContext { getTracks.await(anime.id) .mapNotNull { track -> val tracker = trackerManager.get(track.trackerId) if (tracker != null && tracker.isLoggedIn && tracker is AnimeTracker && episodeNumber > track.lastEpisodeSeen ) { val updatedTrack = track.copy(lastEpisodeSeen = episodeNumber) // We want these to execute even if the presenter is destroyed and leaks // for a while. The view can still be garbage collected. async { runCatching { if (context.isOnline()) { tracker.animeService.update(updatedTrack.toDbTrack(), true) insertTrack.await(updatedTrack) } else { delayedTrackingStore.addAnime(track.animeId, lastEpisodeSeen = episodeNumber) DelayedAnimeTrackingUpdateJob.setupTask(context) } } } } else { null } } .awaitAll() .mapNotNull { it.exceptionOrNull() } .forEach { logcat(LogPriority.INFO, it) } } } /** * Enqueues an [Episode] to be deleted later. * * @param episode the episode being deleted. * @param anime the anime of the episode. */ private suspend fun enqueueDeleteSeenEpisodes(episode: Episode, anime: Anime) { if (episode.seen) { withIOContext { downloadManager.enqueueEpisodesToDelete( listOf(episode), anime, ) } } } companion object { val externalIntents: ExternalIntents by injectLazy() /** * Used to direct the [Intent] of a chosen episode to an external player. * * @param context the application context. * @param animeId the id of the anime. * @param episodeId the id of the episode. */ suspend fun newIntent(context: Context, animeId: Long, episodeId: Long, video: Video?): Intent? { return externalIntents.getExternalIntent(context, animeId, episodeId, video) } } } // List of supported external players and their packages const val MPV_PLAYER = "is.xyz.mpv" const val MX_PLAYER = "com.mxtech.videoplayer" const val MX_PLAYER_FREE = "com.mxtech.videoplayer.ad" const val MX_PLAYER_PRO = "com.mxtech.videoplayer.pro" const val VLC_PLAYER = "org.videolan.vlc" const val MPV_KT = "live.mehiz.mpvkt" const val MPV_KT_PREVIEW = "live.mehiz.mpvkt.preview" const val MPV_REMOTE = "com.husudosu.mpvremote" const val JUST_PLAYER = "com.brouken.player" const val NEXT_PLAYER = "dev.anilbeesetti.nextplayer" const val X_PLAYER = "video.player.videoplayer" const val WEB_VIDEO_CASTER = "com.instantbits.cast.webvideo" ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/PipActions.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player import android.app.PendingIntent import android.app.RemoteAction import android.content.Context import android.content.Intent import android.graphics.drawable.Icon import androidx.annotation.DrawableRes import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.R import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR fun createPipActions( context: Context, isPaused: Boolean, replaceWithPrevious: Boolean, playlistCount: Int, playlistPosition: Int, ): ArrayList = arrayListOf( if (replaceWithPrevious) { createPipAction( context, R.drawable.ic_skip_previous_24dp, AYMR.strings.action_previous_episode, PIP_PREVIOUS, PIP_PREVIOUS, playlistPosition != 0, ) } else { createPipAction( context, R.drawable.ic_forward_10_24dp, AYMR.strings.pref_skip_10, PIP_SKIP, PIP_SKIP, ) }, if (isPaused) { createPipAction( context, R.drawable.ic_play_arrow_24dp, AYMR.strings.action_play, PIP_PLAY, PIP_PLAY, ) } else { createPipAction( context, R.drawable.ic_pause_24dp, MR.strings.action_pause, PIP_PAUSE, PIP_PAUSE, ) }, createPipAction( context, R.drawable.ic_skip_next_24dp, AYMR.strings.action_next_episode, PIP_NEXT, PIP_NEXT, playlistPosition != playlistCount - 1, ), ) fun createPipAction( context: Context, @DrawableRes icon: Int, titleRes: StringResource, requestCode: Int, controlType: Int, isEnabled: Boolean = true, ): RemoteAction { val action = RemoteAction( Icon.createWithResource(context, icon), context.stringResource(titleRes), context.stringResource(titleRes), PendingIntent.getBroadcast( context, requestCode, Intent(PIP_INTENTS_FILTER).putExtra(PIP_INTENT_ACTION, controlType).setPackage(context.packageName), PendingIntent.FLAG_IMMUTABLE, ), ) action.isEnabled = isEnabled return action } const val PIP_INTENTS_FILTER = "pip_control" const val PIP_INTENT_ACTION = "media_control" const val PIP_PAUSE = 1 const val PIP_PLAY = 2 const val PIP_PREVIOUS = 3 const val PIP_NEXT = 4 const val PIP_SKIP = 5 ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Code is a mix between PlayerActivity from mpvKt and the former * PlayerActivity from Aniyomi. */ package eu.kanade.tachiyomi.ui.player import android.annotation.SuppressLint import android.app.PictureInPictureParams import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.pm.ActivityInfo import android.content.pm.PackageManager import android.content.res.AssetManager import android.content.res.Configuration import android.graphics.Rect import android.media.AudioManager import android.media.session.MediaSession import android.media.session.PlaybackState import android.net.Uri import android.os.Build import android.os.Bundle import android.util.Rational import android.view.KeyEvent import android.view.View import android.view.WindowManager import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.compose.ui.Modifier import androidx.compose.ui.layout.boundsInWindow import androidx.compose.ui.layout.onGloballyPositioned import androidx.core.net.toUri import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.media.AudioAttributesCompat import androidx.media.AudioFocusRequestCompat import androidx.media.AudioManagerCompat import com.hippo.unifile.UniFile import eu.kanade.presentation.theme.TachiyomiTheme import eu.kanade.tachiyomi.animesource.model.ChapterType import eu.kanade.tachiyomi.animesource.model.Hoster import eu.kanade.tachiyomi.animesource.model.SerializableHoster.Companion.serialize import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.databinding.PlayerLayoutBinding import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.player.controls.PlayerControls import eu.kanade.tachiyomi.ui.player.settings.AdvancedPlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.player.utils.ChapterUtils import eu.kanade.tachiyomi.ui.player.utils.ChapterUtils.Companion.getStringRes import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import `is`.xyz.mpv.MPVLib import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.launchUI import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.IOException import java.io.InputStream import java.io.OutputStream import kotlin.math.ceil import kotlin.math.floor class PlayerActivity : BaseActivity() { private val viewModel by viewModels(factoryProducer = { PlayerViewModelProviderFactory(this) }) private val binding by lazy { PlayerLayoutBinding.inflate(layoutInflater) } private val playerObserver by lazy { PlayerObserver(this) } val player by lazy { binding.player } val windowInsetsController by lazy { WindowCompat.getInsetsController(window, window.decorView) } val audioManager by lazy { getSystemService(Context.AUDIO_SERVICE) as AudioManager } private var mediaSession: MediaSession? = null private val gesturePreferences: GesturePreferences by lazy { viewModel.gesturePreferences } private val playerPreferences: PlayerPreferences by lazy { viewModel.playerPreferences } private val audioPreferences: AudioPreferences = Injekt.get() private val advancedPlayerPreferences: AdvancedPlayerPreferences = Injekt.get() private val networkPreferences: NetworkPreferences = Injekt.get() private val storageManager: StorageManager = Injekt.get() private var audioFocusRequest: AudioFocusRequestCompat? = null private var restoreAudioFocus: () -> Unit = {} private var pipRect: Rect? = null val isPipSupportedAndEnabled by lazy { packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) && playerPreferences.enablePip().get() } private var pipReceiver: BroadcastReceiver? = null private val noisyReceiver = object : BroadcastReceiver() { var initialized = false override fun onReceive(context: Context?, intent: Intent?) { if (intent?.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) { viewModel.pause() window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } } } companion object { fun newIntent( context: Context, animeId: Long?, episodeId: Long?, hostList: List? = null, hostIndex: Int? = null, vidIndex: Int? = null, ): Intent { return Intent(context, PlayerActivity::class.java).apply { putExtra("animeId", animeId) putExtra("episodeId", episodeId) hostIndex?.let { putExtra("hostIndex", it) } vidIndex?.let { putExtra("vidIndex", it) } hostList?.let { putExtra("hostList", it.serialize()) } addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) } } internal const val MPV_DIR = "mpv" private const val MPV_FONTS_DIR = "fonts" private const val MPV_SCRIPTS_DIR = "scripts" private const val MPV_SCRIPTS_OPTS_DIR = "script-opts" private const val MPV_SHADERS_DIR = "shaders" } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) val animeId = intent.extras?.getLong("animeId") ?: -1 val episodeId = intent.extras?.getLong("episodeId") ?: -1 val hostList = intent.extras?.getString("hostList") ?: "" val hostIndex = intent.extras?.getInt("hostIndex") ?: -1 val vidIndex = intent.extras?.getInt("vidIndex") ?: -1 if (animeId == -1L || episodeId == -1L) { finish() return } NotificationReceiver.dismissNotification( this, animeId.hashCode(), Notifications.ID_NEW_EPISODES, ) viewModel.saveCurrentEpisodeWatchingProgress() lifecycleScope.launchNonCancellable { viewModel.updateIsLoadingEpisode(true) viewModel.updateIsLoadingHosters(true) val initResult = viewModel.init(animeId, episodeId, hostList, hostIndex, vidIndex) if (!initResult.second.getOrDefault(false)) { val exception = initResult.second.exceptionOrNull() ?: IllegalStateException( "Unknown error", ) withUIContext { setInitialEpisodeError(exception) } } viewModel.updateIsLoadingHosters(false) lifecycleScope.launch { viewModel.loadHosters( source = viewModel.currentSource.value!!, hosterList = initResult.first.hosterList ?: emptyList(), hosterIndex = initResult.first.videoIndex.first, videoIndex = initResult.first.videoIndex.second, ) } } setIntent(intent) } @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() registerSecureActivity(this) super.onCreate(savedInstanceState) setContentView(binding.root) setupPlayerMPV() setupPlayerAudio() setupMediaSession() setupPlayerOrientation() Thread.setDefaultUncaughtExceptionHandler { _, throwable -> runOnUiThread { toast(throwable.message) } logcat(LogPriority.ERROR, throwable) finish() } viewModel.eventFlow .onEach { event -> when (event) { is PlayerViewModel.Event.SavedImage -> { onSaveImageResult(event.result) } is PlayerViewModel.Event.ShareImage -> { onShareImageResult(event.uri, event.seconds) } is PlayerViewModel.Event.SetArtResult -> { onSetAsArtResult(event.result, event.artType) } } } .launchIn(lifecycleScope) binding.controls.setContent { TachiyomiTheme { PlayerControls( viewModel = viewModel, onBackPress = { if (isPipSupportedAndEnabled && player.paused == false && playerPreferences.pipOnExit().get()) { enterPictureInPictureMode(createPipParams()) } else { finish() } }, modifier = Modifier.onGloballyPositioned { pipRect = run { val boundsInWindow = it.boundsInWindow() Rect( boundsInWindow.left.toInt(), boundsInWindow.top.toInt(), boundsInWindow.right.toInt(), boundsInWindow.bottom.toInt(), ) } }, ) } } onNewIntent(this.intent) } override fun onDestroy() { player.isExiting = true audioFocusRequest?.let { AudioManagerCompat.abandonAudioFocusRequest(audioManager, it) } audioFocusRequest = null mediaSession?.let { it.isActive = false it.release() } if (noisyReceiver.initialized) { unregisterReceiver(noisyReceiver) noisyReceiver.initialized = false } MPVLib.removeLogObserver(playerObserver) MPVLib.removeObserver(playerObserver) player.destroy() super.onDestroy() } override fun onPause() { viewModel.saveCurrentEpisodeWatchingProgress() if (isInPictureInPictureMode) { super.onPause() return } player.isExiting = true if (isFinishing) { viewModel.deletePendingEpisodes() MPVLib.command(arrayOf("stop")) } else { viewModel.pause() } super.onPause() } override fun onStop() { window.attributes.screenBrightness.let { if (playerPreferences.rememberPlayerBrightness().get() && it != -1f) { playerPreferences.playerBrightnessValue().set(it) } } if (isInPictureInPictureMode && powerManager.isInteractive) { viewModel.deletePendingEpisodes() } super.onStop() } override fun onUserLeaveHint() { if (isPipSupportedAndEnabled && player.paused == false && playerPreferences.pipOnExit().get()) { enterPictureInPictureMode() } super.onUserLeaveHint() } @Deprecated("Deprecated in Java") override fun onBackPressed() { if (isPipSupportedAndEnabled && player.paused == false && playerPreferences.pipOnExit().get()) { if (viewModel.sheetShown.value == Sheets.None && viewModel.panelShown.value == Panels.None && viewModel.dialogShown.value == Dialogs.None ) { enterPictureInPictureMode() } } else { super.onBackPressed() } } override fun onStart() { super.onStart() setPictureInPictureParams(createPipParams()) WindowCompat.setDecorFitsSystemWindows(window, false) window.setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, ) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) binding.root.systemUiVisibility = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LOW_PROFILE windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) windowInsetsController.hide(WindowInsetsCompat.Type.navigationBars()) windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { window.attributes.layoutInDisplayCutoutMode = if (playerPreferences.playerFullscreen().get()) { WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES } else { WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER } } if (playerPreferences.rememberPlayerBrightness().get()) { playerPreferences.playerBrightnessValue().get().let { if (it != -1f) viewModel.changeBrightnessTo(it) } } } private fun executeMPVCommand(commands: Array) { if (!player.isExiting) { MPVLib.command(commands) } } private fun UniFile.writeText(text: String) { this.openOutputStream().use { it.write(text.toByteArray()) } } private fun setupPlayerMPV() { val logLevel = if (networkPreferences.verboseLogging().get()) "info" else "warn" val mpvDir = UniFile.fromFile(applicationContext.filesDir)!!.createDirectory(MPV_DIR)!! val mpvConfFile = mpvDir.createFile("mpv.conf")!! advancedPlayerPreferences.mpvConf().get().let { mpvConfFile.writeText(it) } val mpvInputFile = mpvDir.createFile("input.conf")!! advancedPlayerPreferences.mpvInput().get().let { mpvInputFile.writeText(it) } copyUserFiles(mpvDir) copyAssets(mpvDir) copyFontsDirectory(mpvDir) MPVLib.setOptionString("sub-ass-force-margins", "yes") MPVLib.setOptionString("sub-use-margins", "yes") player.initialize( configDir = mpvDir.filePath!!, cacheDir = applicationContext.cacheDir.path, logLvl = logLevel, ) MPVLib.addLogObserver(playerObserver) MPVLib.addObserver(playerObserver) } private fun copyUserFiles(mpvDir: UniFile) { // First, delete all present scripts val scriptsDir = { mpvDir.createDirectory(MPV_SCRIPTS_DIR) } val scriptOptsDir = { mpvDir.createDirectory(MPV_SCRIPTS_OPTS_DIR) } val shadersDir = { mpvDir.createDirectory(MPV_SHADERS_DIR) } scriptsDir()?.delete() scriptOptsDir()?.delete() shadersDir()?.delete() // Then, copy the user files from the Aniyomi directory if (advancedPlayerPreferences.mpvUserFiles().get()) { storageManager.getScriptsDirectory()?.listFiles()?.forEach { file -> val outFile = scriptsDir()?.createFile(file.name) outFile?.let { file.openInputStream().copyTo(it.openOutputStream()) } } storageManager.getScriptOptsDirectory()?.listFiles()?.forEach { file -> val outFile = scriptOptsDir()?.createFile(file.name) outFile?.let { file.openInputStream().copyTo(it.openOutputStream()) } } storageManager.getShadersDirectory()?.listFiles()?.forEach { file -> val outFile = shadersDir()?.createFile(file.name) outFile?.let { file.openInputStream().copyTo(it.openOutputStream()) } } } // Copy over the bridge file val luaFile = scriptsDir()?.createFile("aniyomi.lua") val luaBridge = assets.open("aniyomi.lua") luaFile?.openOutputStream()?.bufferedWriter()?.use { scriptLua -> luaBridge.bufferedReader().use { scriptLua.write(it.readText()) } } } private fun copyAssets(mpvDir: UniFile) { val assetManager = this.assets val files = arrayOf("subfont.ttf", "cacert.pem") for (filename in files) { var ins: InputStream? = null var out: OutputStream? = null try { ins = assetManager.open(filename, AssetManager.ACCESS_STREAMING) val outFile = mpvDir.createFile(filename)!! // Note that .available() officially returns an *estimated* number of bytes available // this is only true for generic streams, asset streams return the full file size if (outFile.length() == ins.available().toLong()) { logcat(LogPriority.VERBOSE) { "Skipping copy of asset file (exists same size): $filename" } continue } out = outFile.openOutputStream() ins.copyTo(out) logcat(LogPriority.WARN) { "Copied asset file: $filename" } } catch (e: IOException) { logcat(LogPriority.ERROR, e) { "Failed to copy asset file: $filename" } } finally { ins?.close() out?.close() } } } private fun copyFontsDirectory(mpvDir: UniFile) { // TODO: I think this is a bad hack. // We need to find a way to let MPV directly access our fonts directory. CoroutineScope(Dispatchers.IO).launchIO { val fontsDirectory = mpvDir.createDirectory(MPV_FONTS_DIR)!! storageManager.getFontsDirectory()?.listFiles()?.forEach { font -> val outFile = fontsDirectory.createFile(font.name) outFile?.let { font.openInputStream().copyTo(it.openOutputStream()) } } MPVLib.setPropertyString("sub-fonts-dir", fontsDirectory.filePath!!) MPVLib.setPropertyString("osd-fonts-dir", fontsDirectory.filePath!!) } } fun setupCustomButtons(buttons: List) { CoroutineScope(Dispatchers.IO).launchIO { val scriptsDir = { UniFile.fromFile(applicationContext.filesDir) ?.createDirectory(MPV_DIR) ?.createDirectory(MPV_SCRIPTS_DIR) } val primaryButtonId = viewModel.primaryButton.value?.id ?: 0L val customButtonsContent = buildString { append( """ local lua_modules = mp.find_config_file('scripts') if lua_modules then package.path = package.path .. ';' .. lua_modules .. '/?.lua;' .. lua_modules .. '/?/init.lua;' .. '${scriptsDir()!!.filePath}' .. '/?.lua' end local aniyomi = require 'aniyomi' """.trimIndent(), ) buttons.forEach { button -> append( """ ${button.getButtonOnStartup(primaryButtonId)} function button${button.id}() ${button.getButtonContent(primaryButtonId)} end mp.register_script_message('call_button_${button.id}', button${button.id}) function button${button.id}long() ${button.getButtonLongPressContent(primaryButtonId)} end mp.register_script_message('call_button_${button.id}_long', button${button.id}long) """.trimIndent(), ) } } val file = scriptsDir()?.createFile("custombuttons.lua") file?.openOutputStream()?.bufferedWriter()?.use { it.write(customButtonsContent) } file?.let { MPVLib.command(arrayOf("load-script", it.filePath)) } } } private fun setupPlayerAudio() { with(audioPreferences) { audioChannels().get().let { MPVLib.setPropertyString(it.property, it.value) } val request = AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN).also { it.setAudioAttributes( AudioAttributesCompat.Builder().setUsage(AudioAttributesCompat.USAGE_MEDIA) .setContentType(AudioAttributesCompat.CONTENT_TYPE_MUSIC).build(), ) it.setOnAudioFocusChangeListener(audioFocusChangeListener) }.build() AudioManagerCompat.requestAudioFocus(audioManager, request).let { if (it == AudioManager.AUDIOFOCUS_REQUEST_FAILED) return@let audioFocusRequest = request } } } private val audioFocusChangeListener = AudioManager.OnAudioFocusChangeListener { when (it) { AudioManager.AUDIOFOCUS_LOSS, AudioManager.AUDIOFOCUS_LOSS_TRANSIENT, -> { val oldRestore = restoreAudioFocus val wasPlayerPaused = player.paused ?: false viewModel.pause() restoreAudioFocus = { oldRestore() if (!wasPlayerPaused) viewModel.unpause() } } AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { MPVLib.command(arrayOf("multiply", "volume", "0.5")) restoreAudioFocus = { MPVLib.command(arrayOf("multiply", "volume", "2")) } } AudioManager.AUDIOFOCUS_GAIN -> { restoreAudioFocus() restoreAudioFocus = {} } AudioManager.AUDIOFOCUS_REQUEST_FAILED -> { logcat(LogPriority.DEBUG) { "didn't get audio focus" } } } } override fun onResume() { if (!player.isExiting) { super.onResume() return } player.isExiting = false super.onResume() viewModel.currentVolume.update { audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).also { if (it < viewModel.maxVolume) viewModel.changeMPVVolumeTo(100) } } } override fun onConfigurationChanged(newConfig: Configuration) { if (!isInPictureInPictureMode) { viewModel.changeVideoAspect(playerPreferences.aspectState().get()) } else { viewModel.hideControls() } super.onConfigurationChanged(newConfig) } fun showToast(message: String) { runOnUiThread { toast(message) } } // A bunch of observers internal fun onObserverEvent(property: String, value: Long) { if (player.isExiting) return when (property) { "time-pos" -> { viewModel.updatePlayBackPos(value.toFloat()) viewModel.setChapter(value.toFloat()) } "demuxer-cache-time" -> viewModel.updateReadAhead(value = value) "volume" -> viewModel.setMPVVolume(value.toInt()) "volume-max" -> viewModel.volumeBoostCap = value.toInt() - 100 // "chapter" -> viewModel.updateChapter(value) "duration" -> viewModel.duration.update { value.toFloat() } "user-data/current-anime/intro-length" -> viewModel.setAnimeSkipIntroLength(value) } } internal fun onObserverEvent(property: String) { if (player.isExiting) return when (property) { "chapter-list" -> { viewModel.loadChapters() viewModel.updateChapter(0) } "track-list" -> viewModel.loadTracks() } } internal fun onObserverEvent(property: String, value: Boolean) { if (player.isExiting) return when (property) { "pause" -> { if (value && player.paused == true) { viewModel.pause() window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } else if (!value && player.paused == false) { viewModel.unpause() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } runCatching { setPictureInPictureParams(createPipParams()) } } "paused-for-cache" -> { viewModel.isLoading.update { value } } "seeking" -> { viewModel.isLoading.update { value } } "eof-reached" -> { endFile(value) } } } val trackId: (String) -> Int? = { when (it) { "auto" -> null "no" -> -1 else -> it.toInt() } } internal fun onObserverEvent(property: String, value: String) { if (player.isExiting) return when (property.substringBeforeLast("/")) { "aid" -> trackId(value)?.let { viewModel.updateAudio(it) } "sid" -> trackId(value)?.let { viewModel.updateSubtitle(it, viewModel.selectedSubtitles.value.second) } "secondary-sid" -> trackId(value)?.let { viewModel.updateSubtitle(viewModel.selectedSubtitles.value.first, it) } "hwdec", "hwdec-current" -> viewModel.getDecoder() "user-data/aniyomi" -> viewModel.handleLuaInvocation(property, value) } } @SuppressLint("NewApi") internal fun onObserverEvent(property: String, value: Double) { if (player.isExiting) return when (property) { "speed" -> viewModel.playbackSpeed.update { value.toFloat() } "video-params/aspect" -> if (isPipSupportedAndEnabled) createPipParams() } } internal fun event(eventId: Int) { if (player.isExiting) return when (eventId) { MPVLib.mpvEventId.MPV_EVENT_FILE_LOADED -> { viewModel.viewModelScope.launchIO { fileLoaded() } } MPVLib.mpvEventId.MPV_EVENT_SEEK -> viewModel.isLoading.update { true } MPVLib.mpvEventId.MPV_EVENT_PLAYBACK_RESTART -> player.isExiting = false } } fun createPipParams(): PictureInPictureParams { val builder = PictureInPictureParams.Builder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { val anime = viewModel.currentAnime.value val episode = viewModel.currentEpisode.value if (anime != null && episode != null) { builder.setTitle(anime.title).setSubtitle(episode.name) } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val autoEnter = playerPreferences.pipOnExit().get() builder.setAutoEnterEnabled(player.paused == false && autoEnter) builder.setSeamlessResizeEnabled(player.paused == false && autoEnter) } builder.setActions( createPipActions( context = this, isPaused = player.paused ?: true, replaceWithPrevious = playerPreferences.pipReplaceWithPrevious().get(), playlistCount = viewModel.currentPlaylist.value.size, playlistPosition = viewModel.getCurrentEpisodeIndex(), ), ) builder.setSourceRectHint(pipRect) player.videoH?.let { val height = it val width = it * player.getVideoOutAspect()!! val rational = Rational(height, width.toInt()).toFloat() if (rational in 0.42..2.38) builder.setAspectRatio(Rational(width.toInt(), height)) } return builder.build() } @SuppressLint("UnspecifiedRegisterReceiverFlag") override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) { if (!isInPictureInPictureMode) { pipReceiver?.let { unregisterReceiver(pipReceiver) pipReceiver = null } } else { setPictureInPictureParams(createPipParams()) viewModel.hideControls() viewModel.hideSeekBar() viewModel.isBrightnessSliderShown.update { false } viewModel.isVolumeSliderShown.update { false } viewModel.sheetShown.update { Sheets.None } pipReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { if (intent == null || intent.action != PIP_INTENTS_FILTER) return when (intent.getIntExtra(PIP_INTENT_ACTION, 0)) { PIP_PAUSE -> viewModel.pause() PIP_PLAY -> viewModel.unpause() PIP_NEXT -> viewModel.changeEpisode(false) PIP_PREVIOUS -> viewModel.changeEpisode(true) PIP_SKIP -> viewModel.seekBy(10) } setPictureInPictureParams(createPipParams()) } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { registerReceiver(pipReceiver, IntentFilter(PIP_INTENTS_FILTER), RECEIVER_NOT_EXPORTED) } else { registerReceiver(pipReceiver, IntentFilter(PIP_INTENTS_FILTER)) } } super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) } private fun setupPlayerOrientation() { if (player.isExiting) return requestedOrientation = when (playerPreferences.defaultPlayerOrientationType().get()) { PlayerOrientation.Free -> ActivityInfo.SCREEN_ORIENTATION_SENSOR PlayerOrientation.Video -> if ((player.getVideoOutAspect() ?: 0.0) > 1.0) { ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE } else { ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT } PlayerOrientation.Portrait -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT PlayerOrientation.ReversePortrait -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT PlayerOrientation.SensorPortrait -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT PlayerOrientation.Landscape -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE PlayerOrientation.ReverseLandscape -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT PlayerOrientation.SensorLandscape -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE } } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { when (keyCode) { KeyEvent.KEYCODE_VOLUME_UP -> { viewModel.changeVolumeBy(1) viewModel.displayVolumeSlider() } KeyEvent.KEYCODE_VOLUME_DOWN -> { viewModel.changeVolumeBy(-1) viewModel.displayVolumeSlider() } KeyEvent.KEYCODE_DPAD_LEFT -> viewModel.handleLeftDoubleTap() KeyEvent.KEYCODE_DPAD_RIGHT -> viewModel.handleRightDoubleTap() KeyEvent.KEYCODE_SPACE -> viewModel.pauseUnpause() KeyEvent.KEYCODE_MEDIA_STOP -> finishAndRemoveTask() KeyEvent.KEYCODE_MEDIA_REWIND -> viewModel.handleLeftDoubleTap() KeyEvent.KEYCODE_MEDIA_FAST_FORWARD -> viewModel.handleRightDoubleTap() // other keys should be bound by the user in input.conf ig else -> { event?.let { player.onKey(it) } super.onKeyDown(keyCode, event) } } return true } override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { if (player.onKey(event!!)) return true return super.onKeyUp(keyCode, event) } private fun setupMediaSession() { val previousAction = gesturePreferences.mediaPreviousGesture().get() val playAction = gesturePreferences.mediaPlayPauseGesture().get() val nextAction = gesturePreferences.mediaNextGesture().get() mediaSession = MediaSession(this, "PlayerActivity").apply { setCallback( object : MediaSession.Callback() { override fun onPlay() { when (playAction) { SingleActionGesture.None -> {} SingleActionGesture.Seek -> {} SingleActionGesture.PlayPause -> { super.onPlay() viewModel.unpause() window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.MediaPlay.keyCode)) } SingleActionGesture.Switch -> {} } } override fun onPause() { when (playAction) { SingleActionGesture.None -> {} SingleActionGesture.Seek -> {} SingleActionGesture.PlayPause -> { super.onPause() viewModel.pause() window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.MediaPlay.keyCode)) } SingleActionGesture.Switch -> {} } } override fun onSkipToPrevious() { when (previousAction) { SingleActionGesture.None -> {} SingleActionGesture.Seek -> { viewModel.leftSeek() } SingleActionGesture.PlayPause -> { viewModel.pauseUnpause() } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.MediaPrevious.keyCode)) } SingleActionGesture.Switch -> viewModel.changeEpisode(true) } } override fun onSkipToNext() { when (nextAction) { SingleActionGesture.None -> {} SingleActionGesture.Seek -> { viewModel.rightSeek() } SingleActionGesture.PlayPause -> { viewModel.pauseUnpause() } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.MediaNext.keyCode)) } SingleActionGesture.Switch -> viewModel.changeEpisode(false) } } override fun onStop() { super.onStop() isActive = false this@PlayerActivity.onStop() } }, ) setPlaybackState( PlaybackState.Builder() .setActions( PlaybackState.ACTION_PLAY or PlaybackState.ACTION_PAUSE or PlaybackState.ACTION_STOP or PlaybackState.ACTION_SKIP_TO_PREVIOUS or PlaybackState.ACTION_SKIP_TO_NEXT, ) .build(), ) isActive = true } val filter = IntentFilter().apply { addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY) } registerReceiver(noisyReceiver, filter) noisyReceiver.initialized = true } // ==== END MPVKT ==== override fun onSaveInstanceState(outState: Bundle) { if (!isChangingConfigurations) { viewModel.onSaveInstanceStateNonConfigurationChange() } super.onSaveInstanceState(outState) } /** * Switches to the episode based on [episodeId], * @param episodeId id of the episode to switch the player to * @param autoPlay whether the episode is switching due to auto play */ internal fun changeEpisode(episodeId: Long?, autoPlay: Boolean = false) { viewModel.sheetShown.update { _ -> Sheets.None } viewModel.panelShown.update { _ -> Panels.None } viewModel.pause() viewModel.isLoading.update { _ -> true } viewModel.resetHosterState() lifecycleScope.launch { viewModel.updateIsLoadingEpisode(true) viewModel.updateIsLoadingHosters(true) viewModel.cancelHosterVideoLinksJob() val pipEpisodeToasts = playerPreferences.pipEpisodeToasts().get() val switchMethod = viewModel.loadEpisode(episodeId) viewModel.updateIsLoadingHosters(false) when (switchMethod) { null -> { if (viewModel.currentAnime.value != null && !autoPlay) { launchUI { toast(AYMR.strings.no_next_episode) } } viewModel.isLoading.update { _ -> false } } else -> { if (switchMethod.hosterList != null) { when { switchMethod.hosterList.isEmpty() -> setInitialEpisodeError( PlayerViewModel.ExceptionWithStringResource( "Hoster list is empty", AYMR.strings.no_hosters, ), ) else -> { viewModel.loadHosters( source = switchMethod.source, hosterList = switchMethod.hosterList, hosterIndex = -1, videoIndex = -1, ) } } } else { logcat(LogPriority.ERROR) { "Error getting links" } } if (isInPictureInPictureMode && pipEpisodeToasts) { launchUI { toast(switchMethod.episodeTitle) } } } } } viewModel.updateHasPreviousEpisode( viewModel.getCurrentEpisodeIndex() != 0, ) viewModel.updateHasNextEpisode( viewModel.getCurrentEpisodeIndex() != viewModel.currentPlaylist.value.size - 1, ) } fun setVideo(video: Video?, position: Long? = null) { if (player.isExiting) return if (video == null) return setHttpOptions(video) if (viewModel.isLoadingEpisode.value) { viewModel.currentEpisode.value?.let { episode -> val preservePos = playerPreferences.preserveWatchingPosition().get() val resumePosition = position ?: if (episode.seen && !preservePos) { 0L } else { episode.last_second_seen } MPVLib.command(arrayOf("set", "start", "${resumePosition / 1000F}")) } } else { player.timePos?.let { MPVLib.command(arrayOf("set", "start", "${player.timePos}")) } } val videoOptions = video.mpvArgs.joinToString(",") { (option, value) -> "$option=\"$value\"" } MPVLib.command( arrayOf( "loadfile", parseVideoUrl(video.videoUrl), "replace", "0", videoOptions, ), ) } /** * Called from the presenter if the initial load couldn't load the videos of the episode. In * this case the activity is closed and a toast is shown to the user. */ private fun setInitialEpisodeError(error: Throwable) { if (error is PlayerViewModel.ExceptionWithStringResource) { toast(error.stringResource) } else { toast(error.message) } logcat(LogPriority.ERROR, error) finish() } fun parseVideoUrl(videoUrl: String?): String? { return videoUrl?.toUri()?.resolveUri(this) ?: videoUrl } fun setHttpOptions(video: Video) { if (viewModel.isEpisodeOnline() != true) return val source = viewModel.currentSource.value as? AnimeHttpSource ?: return val headers = (video.headers ?: source.headers) .toMultimap() .mapValues { it.value.firstOrNull() ?: "" } .toMutableMap() val httpHeaderString = headers.map { it.key + ": " + it.value.replace(",", "\\,") }.joinToString(",") MPVLib.setOptionString("http-header-fields", httpHeaderString) // need to fix the cache // MPVLib.setOptionString("cache-on-disk", "yes") // val cacheDir = File(applicationContext.filesDir, "media").path // MPVLib.setOptionString("cache-dir", cacheDir) } /** * Called from the presenter when a screenshot is ready to be shared. It shows Android's * default sharing tool. */ private fun onShareImageResult(uri: Uri, seconds: String) { val anime = viewModel.currentAnime.value ?: return val episode = viewModel.currentEpisode.value ?: return val intent = uri.toShareIntent( context = applicationContext, message = stringResource(AYMR.strings.share_screenshot_info, anime.title, episode.name, seconds), ) startActivity(Intent.createChooser(intent, stringResource(MR.strings.action_share))) } /** * Called from the presenter when a screenshot is saved or fails. It shows a message * or logs the event depending on the [result]. */ private fun onSaveImageResult(result: PlayerViewModel.SaveImageResult) { when (result) { is PlayerViewModel.SaveImageResult.Success -> { toast(MR.strings.picture_saved) } is PlayerViewModel.SaveImageResult.Error -> { logcat(LogPriority.ERROR, result.error) } } } /** * Called from the presenter when a screenshot is set as art or fails. * It shows a different message depending on the [result]. */ private fun onSetAsArtResult(result: SetAsArt, artType: ArtType) { toast( when (result) { SetAsArt.Success -> when (artType) { ArtType.Cover -> MR.strings.cover_updated ArtType.Background -> AYMR.strings.background_updated ArtType.Thumbnail -> AYMR.strings.thumbnail_updated } SetAsArt.AddToLibraryFirst -> MR.strings.notification_first_add_to_library SetAsArt.Error -> MR.strings.notification_cover_update_failed }, ) } // TODO: exception java.util.ConcurrentModificationException: // UPDATE: MAY HAVE BEEN FIXED // at java.lang.Object java.util.ArrayList$Itr.next() (ArrayList.java:860) // at void eu.kanade.tachiyomi.ui.player.PlayerActivity.fileLoaded() (PlayerActivity.kt:1874) // at void eu.kanade.tachiyomi.ui.player.PlayerActivity.event(int) (PlayerActivity.kt:1566) // at void is.xyz.mpv.MPVLib.event(int) (MPVLib.java:86) private fun fileLoaded() { if (player.isExiting) return setMpvOptions() setMpvMediaTitle() setupPlayerOrientation() setupChapters() setupTracks() // aniSkip stuff viewModel.waitingSkipIntro = playerPreferences.waitingTimeIntroSkip().get() runBlocking { if ( viewModel.introSkipEnabled && playerPreferences.aniSkipEnabled().get() && !(playerPreferences.disableAniSkipOnChapters().get() && viewModel.chapters.value.isNotEmpty()) ) { viewModel.aniSkipResponse(player.duration)?.let { viewModel.updateChapters( ChapterUtils.mergeChapters( currentChapters = viewModel.chapters.value, stamps = it, duration = player.duration, ), ) viewModel.setChapter(viewModel.pos.value) } } } } private fun setMpvOptions() { if (player.isExiting) return val video = viewModel.currentVideo.value ?: return // Only check for `MPV_ARGS_TAG` on downloaded videos if (listOf("file", "content", "data").none { video.videoUrl.startsWith(it) }) { return } try { val metadata = Json.decodeFromString>( MPVLib.getPropertyString("metadata"), ) val opts = metadata[Video.MPV_ARGS_TAG] ?.split(";") ?.map { it.split("=", limit = 2) } ?: return opts.forEach { (option, value) -> MPVLib.setPropertyString(option, value) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to read video metadata" } } } private fun setupTracks() { if (player.isExiting) return viewModel.isLoadingTracks.update { _ -> true } val audioTracks = viewModel.currentVideo.value?.audioTracks?.takeIf { it.isNotEmpty() } val subtitleTracks = viewModel.currentVideo.value?.subtitleTracks?.takeIf { it.isNotEmpty() } // If no external audio or subtitle tracks are present, loadTracks() won't be // called and we need to call onFinishLoadingTracks() manually if (audioTracks == null && subtitleTracks == null) { viewModel.onFinishLoadingTracks() return } audioTracks?.forEach { audio -> executeMPVCommand(arrayOf("audio-add", audio.url, "auto", audio.lang)) } subtitleTracks?.forEach { sub -> executeMPVCommand(arrayOf("sub-add", sub.url, "auto", sub.lang)) } viewModel.isLoadingTracks.update { _ -> false } } private fun setupChapters() { if (player.isExiting) return val timestamps = viewModel.currentVideo.value?.timestamps?.takeIf { it.isNotEmpty() } ?.map { timestamp -> if (timestamp.name.isEmpty() && timestamp.type != ChapterType.Other) { timestamp.copy( name = timestamp.type.getStringRes()?.let(::stringResource) ?: "", ) } else { timestamp } } ?: return viewModel.updateChapters( ChapterUtils.mergeChapters( currentChapters = viewModel.chapters.value, stamps = timestamps, duration = player.duration, ), ) viewModel.setChapter(viewModel.pos.value) } private fun setMpvMediaTitle() { if (player.isExiting) return val anime = viewModel.currentAnime.value ?: return val episode = viewModel.currentEpisode.value ?: return // Write to mpv table MPVLib.setPropertyString("user-data/current-anime/episode-title", episode.name) val epNumber = episode.episode_number.let { number -> if (ceil(number) == floor(number)) number.toInt() else number }.toString().padStart(2, '0') val title = stringResource( AYMR.strings.mpv_media_title, anime.title, epNumber, episode.name, ) MPVLib.setPropertyString("force-media-title", title) } private fun endFile(eofReached: Boolean) { if (eofReached && playerPreferences.autoplayEnabled().get()) { viewModel.changeEpisode(previous = false, autoPlay = true) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerEnums.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player import dev.icerock.moko.resources.StringResource import eu.kanade.tachiyomi.ui.player.settings.DecoderPreferences import tachiyomi.core.common.preference.Preference import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR /** * Results of the set as art feature. */ enum class SetAsArt { Success, AddToLibraryFirst, Error, } enum class ArtType { Cover, Background, Thumbnail, } enum class PlayerOrientation(val titleRes: StringResource) { Free(MR.strings.rotation_free), Video(AYMR.strings.rotation_video), Portrait(MR.strings.rotation_portrait), ReversePortrait(MR.strings.rotation_reverse_portrait), SensorPortrait(AYMR.strings.rotation_sensor_portrait), Landscape(MR.strings.rotation_landscape), ReverseLandscape(AYMR.strings.rotation_reverse_landscape), SensorLandscape(AYMR.strings.rotation_sensor_landscape), } enum class VideoAspect(val titleRes: StringResource) { Crop(AYMR.strings.video_crop_screen), Fit(AYMR.strings.video_fit_screen), Stretch(AYMR.strings.video_stretch_screen), } /** * Action performed by a button, like double tap or media controls */ enum class SingleActionGesture(val stringRes: StringResource) { None(stringRes = AYMR.strings.single_action_none), Seek(stringRes = AYMR.strings.single_action_seek), PlayPause(stringRes = AYMR.strings.single_action_playpause), Switch(stringRes = AYMR.strings.single_action_switch), Custom(stringRes = AYMR.strings.single_action_custom), } /** * Key codes sent through the `Custom` option in gestures */ enum class CustomKeyCodes(val keyCode: String) { DoubleTapLeft("0x10001"), DoubleTapCenter("0x10002"), DoubleTapRight("0x10003"), MediaPrevious("0x10004"), MediaPlay("0x10005"), MediaNext("0x10006"), } enum class Decoder(val title: String, val value: String) { AutoCopy("Auto", "auto-copy"), Auto("Auto", "auto"), SW("SW", "no"), HW("HW", "mediacodec-copy"), HWPlus("HW+", "mediacodec"), } fun getDecoderFromValue(value: String): Decoder { return Decoder.entries.first { it.value == value } } enum class Debanding { None, CPU, GPU, } enum class Sheets { None, PlaybackSpeed, SubtitleTracks, AudioTracks, QualityTracks, Chapters, More, Screenshot, } enum class Panels { None, SubtitleSettings, SubtitleDelay, AudioDelay, VideoFilters, } sealed class Dialogs { data object None : Dialogs() data object EpisodeList : Dialogs() data class IntegerPicker( val defaultValue: Int, val minValue: Int, val maxValue: Int, val step: Int, val nameFormat: String, val title: String, val onChange: (Int) -> Unit, val onDismissRequest: () -> Unit, ) : Dialogs() } sealed class PlayerUpdates { data object None : PlayerUpdates() data object DoubleSpeed : PlayerUpdates() data object AspectRatio : PlayerUpdates() data class ShowText(val value: String) : PlayerUpdates() data class ShowTextResource(val textResource: StringResource) : PlayerUpdates() } enum class VideoFilters( val titleRes: StringResource, val preference: (DecoderPreferences) -> Preference, val mpvProperty: String, ) { BRIGHTNESS( AYMR.strings.player_sheets_filters_brightness, { it.brightnessFilter() }, "brightness", ), SATURATION( AYMR.strings.player_sheets_filters_Saturation, { it.saturationFilter() }, "saturation", ), CONTRAST( AYMR.strings.player_sheets_filters_contrast, { it.contrastFilter() }, "contrast", ), GAMMA( AYMR.strings.player_sheets_filters_gamma, { it.gammaFilter() }, "gamma", ), HUE( AYMR.strings.player_sheets_filters_hue, { it.hueFilter() }, "hue", ), } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerObserver.kt ================================================ package eu.kanade.tachiyomi.ui.player import android.widget.Toast import eu.kanade.tachiyomi.util.system.toast import `is`.xyz.mpv.MPVLib import logcat.LogPriority import tachiyomi.core.common.util.system.logcat class PlayerObserver(val activity: PlayerActivity) : MPVLib.EventObserver, MPVLib.LogObserver { override fun eventProperty(property: String) { activity.runOnUiThread { activity.onObserverEvent(property) } } override fun eventProperty(property: String, value: Long) { activity.runOnUiThread { activity.onObserverEvent(property, value) } } override fun eventProperty(property: String, value: Boolean) { activity.runOnUiThread { activity.onObserverEvent(property, value) } } override fun eventProperty(property: String, value: String) { activity.runOnUiThread { activity.onObserverEvent(property, value) } } override fun eventProperty(property: String, value: Double) { activity.runOnUiThread { activity.onObserverEvent(property, value) } } override fun event(eventId: Int) { activity.runOnUiThread { activity.event(eventId) } } override fun efEvent(err: String?) { var errorMessage = err ?: "Error: File ended" if (!httpError.isNullOrEmpty()) { errorMessage += ": $httpError" httpError = null } logcat(LogPriority.ERROR) { errorMessage } activity.runOnUiThread { activity.toast(errorMessage, Toast.LENGTH_LONG) } } private var httpError: String? = null override fun logMessage(prefix: String, level: Int, text: String) { val logPriority = when (level) { MPVLib.mpvLogLevel.MPV_LOG_LEVEL_FATAL, MPVLib.mpvLogLevel.MPV_LOG_LEVEL_ERROR -> LogPriority.ERROR MPVLib.mpvLogLevel.MPV_LOG_LEVEL_WARN -> LogPriority.WARN MPVLib.mpvLogLevel.MPV_LOG_LEVEL_INFO -> LogPriority.INFO else -> LogPriority.VERBOSE } if (text.contains("HTTP error")) httpError = text logcat.logcat("mpv/$prefix", logPriority) { text } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerUtils.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player import android.content.Context import android.net.Uri import android.os.ParcelFileDescriptor import android.provider.OpenableColumns import `is`.xyz.mpv.Utils import logcat.LogPriority import logcat.logcat internal fun Uri.openContentFd(context: Context): String? { return context.contentResolver.openFileDescriptor(this, "r")?.detachFd()?.let { Utils.findRealPath(it)?.also { _ -> ParcelFileDescriptor.adoptFd(it).close() } ?: "fd://$it" } } internal fun Uri.resolveUri(context: Context): String? { val filepath = when (scheme) { "file" -> path "content" -> openContentFd(context) "data" -> "data://$schemeSpecificPart" in Utils.PROTOCOLS -> toString() else -> null } if (filepath == null) logcat(LogPriority.ERROR) { "unknown scheme: $scheme" } return filepath } internal fun Uri.getFileName(context: Context): String? { return context.contentResolver.query(this, null, null, null, null)?.use { cursor -> val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) cursor.moveToFirst() cursor.getString(nameIndex) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Code is a mix between PlayerViewModel from mpvKt and the former * PlayerViewModel from Aniyomi. */ package eu.kanade.tachiyomi.ui.player import android.app.Application import android.content.Context import android.content.pm.ActivityInfo import android.media.AudioManager import android.net.Uri import android.provider.Settings import android.util.DisplayMetrics import android.view.inputmethod.InputMethodManager import androidx.compose.runtime.Immutable import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.createSavedStateHandle import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.CreationExtras import dev.icerock.moko.resources.StringResource import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.entries.anime.interactor.SetAnimeViewerFlags import eu.kanade.domain.items.episode.model.toDbEpisode import eu.kanade.domain.source.anime.interactor.GetAnimeIncognitoState import eu.kanade.domain.track.anime.interactor.TrackEpisode import eu.kanade.domain.track.service.TrackPreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.more.settings.screen.player.custombutton.CustomButtonFetchState import eu.kanade.presentation.more.settings.screen.player.custombutton.getButtons import eu.kanade.tachiyomi.animesource.AnimeSource import eu.kanade.tachiyomi.animesource.model.ChapterType import eu.kanade.tachiyomi.animesource.model.Hoster import eu.kanade.tachiyomi.animesource.model.SerializableHoster.Companion.toHosterList import eu.kanade.tachiyomi.animesource.model.TimeStamp import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.data.database.models.anime.Episode import eu.kanade.tachiyomi.data.database.models.anime.isRecognizedNumber import eu.kanade.tachiyomi.data.database.models.anime.toDomainEpisode import eu.kanade.tachiyomi.data.database.models.manga.isRecognizedNumber import eu.kanade.tachiyomi.data.download.anime.AnimeDownloadManager import eu.kanade.tachiyomi.data.download.anime.model.AnimeDownload import eu.kanade.tachiyomi.data.saver.Image import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.saver.Location import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.anilist.Anilist import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList import eu.kanade.tachiyomi.ui.player.controls.components.IndexedSegment import eu.kanade.tachiyomi.ui.player.controls.components.sheets.HosterState import eu.kanade.tachiyomi.ui.player.controls.components.sheets.getChangedAt import eu.kanade.tachiyomi.ui.player.loader.EpisodeLoader import eu.kanade.tachiyomi.ui.player.loader.HosterLoader import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.player.utils.AniSkipApi import eu.kanade.tachiyomi.ui.player.utils.ChapterUtils.Companion.getStringRes import eu.kanade.tachiyomi.ui.player.utils.TrackSelect import eu.kanade.tachiyomi.ui.reader.SaveImageNotifier import eu.kanade.tachiyomi.util.editBackground import eu.kanade.tachiyomi.util.editCover import eu.kanade.tachiyomi.util.editThumbnail import eu.kanade.tachiyomi.util.episode.filterDownloadedEpisodes import eu.kanade.tachiyomi.util.lang.byteSize import eu.kanade.tachiyomi.util.lang.takeBytes import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.cacheImageDir import eu.kanade.tachiyomi.util.system.toast import `is`.xyz.mpv.MPVLib import `is`.xyz.mpv.Utils import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Job import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import logcat.LogPriority import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.util.lang.launchIO import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.core.common.util.lang.withUIContext import tachiyomi.core.common.util.system.logcat import tachiyomi.domain.category.anime.interactor.GetAnimeCategories import tachiyomi.domain.custombuttons.interactor.GetCustomButtons import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.domain.download.service.DownloadPreferences import tachiyomi.domain.entries.anime.interactor.GetAnime import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.domain.history.anime.interactor.GetNextEpisodes import tachiyomi.domain.history.anime.interactor.UpsertAnimeHistory import tachiyomi.domain.history.anime.model.AnimeHistoryUpdate import tachiyomi.domain.items.episode.interactor.GetEpisodesByAnimeId import tachiyomi.domain.items.episode.interactor.UpdateEpisode import tachiyomi.domain.items.episode.model.EpisodeUpdate import tachiyomi.domain.items.episode.service.getEpisodeSort import tachiyomi.domain.library.service.LibraryPreferences import tachiyomi.domain.source.anime.service.AnimeSourceManager import tachiyomi.domain.track.anime.interactor.GetAnimeTracks import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.source.local.entries.anime.isLocal import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import java.io.InputStream import java.util.Date import java.util.concurrent.atomic.AtomicBoolean import kotlin.coroutines.cancellation.CancellationException class PlayerViewModelProviderFactory( private val activity: PlayerActivity, ) : ViewModelProvider.Factory { override fun create(modelClass: Class, extras: CreationExtras): T { return PlayerViewModel(activity, extras.createSavedStateHandle()) as T } } class PlayerViewModel @JvmOverloads constructor( private val activity: PlayerActivity, private val savedState: SavedStateHandle, private val sourceManager: AnimeSourceManager = Injekt.get(), private val downloadManager: AnimeDownloadManager = Injekt.get(), private val imageSaver: ImageSaver = Injekt.get(), private val downloadPreferences: DownloadPreferences = Injekt.get(), private val trackPreferences: TrackPreferences = Injekt.get(), private val trackEpisode: TrackEpisode = Injekt.get(), private val getAnime: GetAnime = Injekt.get(), private val getNextEpisodes: GetNextEpisodes = Injekt.get(), private val getEpisodesByAnimeId: GetEpisodesByAnimeId = Injekt.get(), private val getAnimeCategories: GetAnimeCategories = Injekt.get(), private val getTracks: GetAnimeTracks = Injekt.get(), private val upsertHistory: UpsertAnimeHistory = Injekt.get(), private val updateEpisode: UpdateEpisode = Injekt.get(), private val setAnimeViewerFlags: SetAnimeViewerFlags = Injekt.get(), internal val playerPreferences: PlayerPreferences = Injekt.get(), internal val gesturePreferences: GesturePreferences = Injekt.get(), private val basePreferences: BasePreferences = Injekt.get(), private val getCustomButtons: GetCustomButtons = Injekt.get(), private val trackSelect: TrackSelect = Injekt.get(), private val getIncognitoState: GetAnimeIncognitoState = Injekt.get(), private val libraryPreferences: LibraryPreferences = Injekt.get(), uiPreferences: UiPreferences = Injekt.get(), ) : ViewModel() { private val _currentPlaylist = MutableStateFlow>(emptyList()) val currentPlaylist = _currentPlaylist.asStateFlow() private val _hasPreviousEpisode = MutableStateFlow(false) val hasPreviousEpisode = _hasPreviousEpisode.asStateFlow() private val _hasNextEpisode = MutableStateFlow(false) val hasNextEpisode = _hasNextEpisode.asStateFlow() private val _currentEpisode = MutableStateFlow(null) val currentEpisode = _currentEpisode.asStateFlow() private val _currentAnime = MutableStateFlow(null) val currentAnime = _currentAnime.asStateFlow() private val _currentSource = MutableStateFlow(null) val currentSource = _currentSource.asStateFlow() private val _isEpisodeOnline = MutableStateFlow(false) val isEpisodeOnline = _isEpisodeOnline.asStateFlow() private val _isLoadingEpisode = MutableStateFlow(false) val isLoadingEpisode = _isLoadingEpisode.asStateFlow() private val _currentDecoder = MutableStateFlow(getDecoderFromValue(MPVLib.getPropertyString("hwdec"))) val currentDecoder = _currentDecoder.asStateFlow() val mediaTitle = MutableStateFlow("") val animeTitle = MutableStateFlow("") val isLoading = MutableStateFlow(true) val playbackSpeed = MutableStateFlow(playerPreferences.playerSpeed().get()) private val _subtitleTracks = MutableStateFlow>(emptyList()) val subtitleTracks = _subtitleTracks.asStateFlow() private val _selectedSubtitles = MutableStateFlow(Pair(-1, -1)) val selectedSubtitles = _selectedSubtitles.asStateFlow() private val _audioTracks = MutableStateFlow>(emptyList()) val audioTracks = _audioTracks.asStateFlow() private val _selectedAudio = MutableStateFlow(-1) val selectedAudio = _selectedAudio.asStateFlow() val isLoadingTracks = MutableStateFlow(true) private val _hosterList = MutableStateFlow>(emptyList()) val hosterList = _hosterList.asStateFlow() private val _isLoadingHosters = MutableStateFlow(true) val isLoadingHosters = _isLoadingHosters.asStateFlow() private val _hosterState = MutableStateFlow>(emptyList()) val hosterState = _hosterState.asStateFlow() private val _hosterExpandedList = MutableStateFlow>(emptyList()) val hosterExpandedList = _hosterExpandedList.asStateFlow() private val _selectedHosterVideoIndex = MutableStateFlow(Pair(-1, -1)) val selectedHosterVideoIndex = _selectedHosterVideoIndex.asStateFlow() private val _currentVideo = MutableStateFlow(null) val currentVideo = _currentVideo.asStateFlow() private val _chapters = MutableStateFlow>(emptyList()) val chapters = _chapters.asStateFlow() private val _currentChapter = MutableStateFlow(null) val currentChapter = _currentChapter.asStateFlow() private val _skipIntroText = MutableStateFlow(null) val skipIntroText = _skipIntroText.asStateFlow() private val _pos = MutableStateFlow(0f) val pos = _pos.asStateFlow() val duration = MutableStateFlow(0f) private val _readAhead = MutableStateFlow(0f) val readAhead = _readAhead.asStateFlow() private val _paused = MutableStateFlow(false) val paused = _paused.asStateFlow() // False because the video shouldn't start paused private val _pausedState = MutableStateFlow(false) val pausedState = _pausedState.asStateFlow() private val _controlsShown = MutableStateFlow(!playerPreferences.hideControls().get()) val controlsShown = _controlsShown.asStateFlow() private val _seekBarShown = MutableStateFlow(!playerPreferences.hideControls().get()) val seekBarShown = _seekBarShown.asStateFlow() private val _areControlsLocked = MutableStateFlow(false) val areControlsLocked = _areControlsLocked.asStateFlow() val playerUpdate = MutableStateFlow(PlayerUpdates.None) val isBrightnessSliderShown = MutableStateFlow(false) val isVolumeSliderShown = MutableStateFlow(false) val currentBrightness = MutableStateFlow( runCatching { Settings.System.getFloat(activity.contentResolver, Settings.System.SCREEN_BRIGHTNESS) .normalize(0f, 255f, 0f, 1f) }.getOrElse { 0f }, ) val currentVolume = MutableStateFlow(activity.audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)) val currentMPVVolume = MutableStateFlow(MPVLib.getPropertyInt("volume")) var volumeBoostCap: Int = MPVLib.getPropertyInt("volume-max") // Pair(startingPosition, seekAmount) val gestureSeekAmount = MutableStateFlow?>(null) val sheetShown = MutableStateFlow(Sheets.None) val panelShown = MutableStateFlow(Panels.None) val dialogShown = MutableStateFlow(Dialogs.None) private val _dismissSheet = MutableStateFlow(false) val dismissSheet = _dismissSheet.asStateFlow() private val _seekText = MutableStateFlow(null) val seekText = _seekText.asStateFlow() private val _doubleTapSeekAmount = MutableStateFlow(0) val doubleTapSeekAmount = _doubleTapSeekAmount.asStateFlow() private val _isSeekingForwards = MutableStateFlow(false) val isSeekingForwards = _isSeekingForwards.asStateFlow() private var timerJob: Job? = null private val _remainingTime = MutableStateFlow(0) val remainingTime = _remainingTime.asStateFlow() val cachePath: String = activity.cacheDir.path private val _customButtons = MutableStateFlow(CustomButtonFetchState.Loading) val customButtons = _customButtons.asStateFlow() private val _primaryButtonTitle = MutableStateFlow("") val primaryButtonTitle = _primaryButtonTitle.asStateFlow() private val _primaryButton = MutableStateFlow(null) val primaryButton = _primaryButton.asStateFlow() init { viewModelScope.launchIO { try { val buttons = getCustomButtons.getAll() buttons.firstOrNull { it.isFavorite }?.let { _primaryButton.update { _ -> it } // If the button text is not empty, it has been set buy a lua script in which // case we don't want to override it if (_primaryButtonTitle.value.isEmpty()) { setPrimaryCustomButtonTitle(it) } } activity.setupCustomButtons(buttons) _customButtons.update { _ -> CustomButtonFetchState.Success(buttons.toImmutableList()) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) _customButtons.update { _ -> CustomButtonFetchState.Error(e.message ?: "Unable to fetch buttons") } } } } /** * Starts a sleep timer/cancels the current timer if [seconds] is less than 1. */ fun startTimer(seconds: Int) { timerJob?.cancel() _remainingTime.value = seconds if (seconds < 1) return timerJob = viewModelScope.launch { for (time in seconds downTo 0) { _remainingTime.value = time delay(1000) } pause() withUIContext { Injekt.get().toast(AYMR.strings.toast_sleep_timer_ended) } } } fun isEpisodeOnline(): Boolean? { val anime = currentAnime.value ?: return null val episode = currentEpisode.value ?: return null val source = currentSource.value ?: return null return source is AnimeHttpSource && !EpisodeLoader.isDownload( episode.toDomainEpisode()!!, anime, ) } fun updateIsLoadingEpisode(value: Boolean) { _isLoadingEpisode.update { _ -> value } } private fun updateEpisodeList(episodeList: List) { _currentPlaylist.update { _ -> filterEpisodeList(episodeList) } } fun getDecoder() { _currentDecoder.update { getDecoderFromValue(activity.player.hwdecActive) } } fun updateDecoder(decoder: Decoder) { MPVLib.setPropertyString("hwdec", decoder.value) } val getTrackLanguage: (Int) -> String = { if (it != -1) { MPVLib.getPropertyString("track-list/$it/lang") ?: "" } else { activity.stringResource(MR.strings.off) } } val getTrackTitle: (Int) -> String = { if (it != -1) { MPVLib.getPropertyString("track-list/$it/title") ?: "" } else { activity.stringResource(MR.strings.off) } } val getTrackMPVId: (Int) -> Int = { if (it != -1) { MPVLib.getPropertyInt("track-list/$it/id") } else { -1 } } val getTrackType: (Int) -> String? = { MPVLib.getPropertyString("track-list/$it/type") } private var trackLoadingJob: Job? = null fun loadTracks() { trackLoadingJob?.cancel() trackLoadingJob = viewModelScope.launch { val possibleTrackTypes = listOf("audio", "sub") val subTracks = mutableListOf() val audioTracks = mutableListOf( VideoTrack(-1, activity.stringResource(MR.strings.off), null), ) try { val tracksCount = MPVLib.getPropertyInt("track-list/count") ?: 0 for (i in 0.. subTracks.add(VideoTrack(getTrackMPVId(i), getTrackTitle(i), getTrackLanguage(i))) "audio" -> audioTracks.add(VideoTrack(getTrackMPVId(i), getTrackTitle(i), getTrackLanguage(i))) else -> error("Unrecognized track type") } } } catch (e: NullPointerException) { logcat(LogPriority.ERROR) { "Couldn't load tracks, probably cause mpv was destroyed" } return@launch } _subtitleTracks.update { subTracks } _audioTracks.update { audioTracks } if (!isLoadingTracks.value) { onFinishLoadingTracks() } } } /** * When all subtitle/audio tracks are loaded, select the preferred one based on preferences, * or select the first one in the list if trackSelect fails. */ fun onFinishLoadingTracks() { val preferredSubtitle = trackSelect.getPreferredTrackIndex(subtitleTracks.value) (preferredSubtitle ?: subtitleTracks.value.firstOrNull())?.let { activity.player.sid = it.id activity.player.secondarySid = -1 } val preferredAudio = trackSelect.getPreferredTrackIndex(audioTracks.value, subtitle = false) (preferredAudio ?: audioTracks.value.getOrNull(1))?.let { activity.player.aid = it.id } isLoadingTracks.update { _ -> true } updateIsLoadingEpisode(false) setPausedState() } @Immutable data class VideoTrack( val id: Int, val name: String, val language: String?, ) fun loadChapters() { val chapters = mutableListOf() val count = MPVLib.getPropertyInt("chapter-list/count")!! for (i in 0 until count) { val title = MPVLib.getPropertyString("chapter-list/$i/title") val time = MPVLib.getPropertyInt("chapter-list/$i/time")!! chapters.add( IndexedSegment( name = title, start = time.toFloat(), index = 0, ), ) } updateChapters(chapters.sortedBy { it.start }) } fun updateChapters(chapters: List) { _chapters.update { _ -> chapters } } fun selectChapter(index: Int) { val time = chapters.value[index].start seekTo(time.toInt()) } fun updateChapter(index: Long) { if (chapters.value.isEmpty() || index == -1L) return _currentChapter.update { chapters.value.getOrNull(index.toInt()) ?: return } } fun addAudio(uri: Uri) { val url = uri.toString() val isContentUri = url.startsWith("content://") val path = (if (isContentUri) uri.openContentFd(activity) else url) ?: return val name = if (isContentUri) uri.getFileName(activity) else null if (name == null) { MPVLib.command(arrayOf("audio-add", path, "cached")) } else { MPVLib.command(arrayOf("audio-add", path, "cached", name)) } } fun selectAudio(id: Int) { activity.player.aid = id } fun updateAudio(id: Int) { _selectedAudio.update { id } } fun addSubtitle(uri: Uri) { val url = uri.toString() val isContentUri = url.startsWith("content://") val path = (if (isContentUri) uri.openContentFd(activity) else url) ?: return val name = if (isContentUri) uri.getFileName(activity) else null if (name == null) { MPVLib.command(arrayOf("sub-add", path, "cached")) } else { MPVLib.command(arrayOf("sub-add", path, "cached", name)) } } fun selectSub(id: Int) { val selectedSubs = selectedSubtitles.value _selectedSubtitles.update { when (id) { selectedSubs.first -> Pair(selectedSubs.second, -1) selectedSubs.second -> Pair(selectedSubs.first, -1) else -> { if (selectedSubs.first != -1) { Pair(selectedSubs.first, id) } else { Pair(id, -1) } } } } activity.player.secondarySid = _selectedSubtitles.value.second activity.player.sid = _selectedSubtitles.value.first } fun updateSubtitle(sid: Int, secondarySid: Int) { _selectedSubtitles.update { Pair(sid, secondarySid) } } fun updatePlayBackPos(pos: Float) { onSecondReached(pos.toInt(), duration.value.toInt()) _pos.update { pos } } fun updateReadAhead(value: Long) { _readAhead.update { value.toFloat() } } private fun updatePausedState() { if (pausedState.value == null) { _pausedState.update { _ -> paused.value } } } private fun setPausedState() { pausedState.value?.let { if (it) { pause() } else { unpause() } _pausedState.update { _ -> null } } } fun pauseUnpause() { if (paused.value) { unpause() } else { pause() } } fun pause() { activity.player.paused = true _paused.update { true } runCatching { activity.setPictureInPictureParams(activity.createPipParams()) } } fun unpause() { activity.player.paused = false _paused.update { false } } private val showStatusBar = playerPreferences.showSystemStatusBar().get() fun showControls() { if (sheetShown.value != Sheets.None || panelShown.value != Panels.None || dialogShown.value != Dialogs.None ) { return } if (showStatusBar) { activity.windowInsetsController.show(WindowInsetsCompat.Type.statusBars()) } _controlsShown.update { true } } fun hideControls() { activity.windowInsetsController.hide(WindowInsetsCompat.Type.statusBars()) _controlsShown.update { false } } fun hideSeekBar() { _seekBarShown.update { false } } fun showSeekBar() { if (sheetShown.value != Sheets.None) return _seekBarShown.update { true } } fun lockControls() { _areControlsLocked.update { true } } fun unlockControls() { _areControlsLocked.update { false } } fun dismissSheet() { _dismissSheet.update { _ -> true } } private fun resetDismissSheet() { _dismissSheet.update { _ -> false } } fun showSheet(sheet: Sheets) { sheetShown.update { sheet } if (sheet == Sheets.None) { resetDismissSheet() showControls() } else { hideControls() panelShown.update { Panels.None } dialogShown.update { Dialogs.None } } } fun showPanel(panel: Panels) { panelShown.update { panel } if (panel == Panels.None) { showControls() } else { hideControls() sheetShown.update { Sheets.None } dialogShown.update { Dialogs.None } } } fun showDialog(dialog: Dialogs) { dialogShown.update { dialog } if (dialog == Dialogs.None) { showControls() } else { hideControls() sheetShown.update { Sheets.None } panelShown.update { Panels.None } } } fun seekBy(offset: Int, precise: Boolean = false) { MPVLib.command(arrayOf("seek", offset.toString(), if (precise) "relative+exact" else "relative")) } fun seekTo(position: Int, precise: Boolean = true) { if (position !in 0..(activity.player.duration ?: 0)) return MPVLib.command(arrayOf("seek", position.toString(), if (precise) "absolute" else "absolute+keyframes")) } fun changeBrightnessTo( brightness: Float, ) { currentBrightness.update { _ -> brightness.coerceIn(-0.75f, 1f) } activity.window.attributes = activity.window.attributes.apply { screenBrightness = brightness.coerceIn(0f, 1f) } } fun displayBrightnessSlider() { isBrightnessSliderShown.update { true } } val maxVolume = activity.audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) fun changeVolumeBy(change: Int) { val mpvVolume = MPVLib.getPropertyInt("volume") if (volumeBoostCap > 0 && currentVolume.value == maxVolume) { if (mpvVolume == 100 && change < 0) changeVolumeTo(currentVolume.value + change) val finalMPVVolume = (mpvVolume + change).coerceAtLeast(100) if (finalMPVVolume in 100..volumeBoostCap + 100) { changeMPVVolumeTo(finalMPVVolume) return } } changeVolumeTo(currentVolume.value + change) } fun changeVolumeTo(volume: Int) { val newVolume = volume.coerceIn(0..maxVolume) activity.audioManager.setStreamVolume( AudioManager.STREAM_MUSIC, newVolume, 0, ) currentVolume.update { newVolume } } fun changeMPVVolumeTo(volume: Int) { MPVLib.setPropertyInt("volume", volume) } fun setMPVVolume(volume: Int) { if (volume != currentMPVVolume.value) displayVolumeSlider() currentMPVVolume.update { volume } } fun displayVolumeSlider() { isVolumeSliderShown.update { true } } fun setAutoPlay(value: Boolean) { val textRes = if (value) { AYMR.strings.enable_auto_play } else { AYMR.strings.disable_auto_play } playerUpdate.update { PlayerUpdates.ShowTextResource(textRes) } playerPreferences.autoplayEnabled().set(value) } @Suppress("DEPRECATION") fun changeVideoAspect(aspect: VideoAspect) { var ratio = -1.0 var pan = 1.0 when (aspect) { VideoAspect.Crop -> { pan = 1.0 } VideoAspect.Fit -> { pan = 0.0 MPVLib.setPropertyDouble("panscan", 0.0) } VideoAspect.Stretch -> { val dm = DisplayMetrics() activity.windowManager.defaultDisplay.getRealMetrics(dm) ratio = dm.widthPixels / dm.heightPixels.toDouble() pan = 0.0 } } MPVLib.setPropertyDouble("panscan", pan) MPVLib.setPropertyDouble("video-aspect-override", ratio) playerPreferences.aspectState().set(aspect) playerUpdate.update { PlayerUpdates.AspectRatio } } fun cycleScreenRotations() { activity.requestedOrientation = when (activity.requestedOrientation) { ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, -> { playerPreferences.defaultPlayerOrientationType().set(PlayerOrientation.SensorPortrait) ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT } else -> { playerPreferences.defaultPlayerOrientationType().set(PlayerOrientation.SensorLandscape) ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE } } } fun handleLuaInvocation(property: String, value: String) { val data = value .removePrefix("\"") .removeSuffix("\"") .ifEmpty { return } when (property.substringAfterLast("/")) { "show_text" -> playerUpdate.update { PlayerUpdates.ShowText(data) } "toggle_ui" -> { when (data) { "show" -> showControls() "toggle" -> { if (controlsShown.value) hideControls() else showControls() } "hide" -> { sheetShown.update { Sheets.None } panelShown.update { Panels.None } dialogShown.update { Dialogs.None } hideControls() } } } "show_panel" -> { when (data) { "subtitle_settings" -> showPanel(Panels.SubtitleSettings) "subtitle_delay" -> showPanel(Panels.SubtitleDelay) "audio_delay" -> showPanel(Panels.AudioDelay) "video_filters" -> showPanel(Panels.VideoFilters) } } "set_button_title" -> { _primaryButtonTitle.update { _ -> data } } "reset_button_title" -> { _customButtons.value.getButtons().firstOrNull { it.isFavorite }?.let { setPrimaryCustomButtonTitle(it) } } "switch_episode" -> { when (data) { "n" -> changeEpisode(false) "p" -> changeEpisode(true) } } "launch_int_picker" -> { val (title, nameFormat, start, stop, step, pickerProperty) = data.split("|") val defaultValue = MPVLib.getPropertyInt(pickerProperty) showDialog( Dialogs.IntegerPicker( defaultValue = defaultValue, minValue = start.toInt(), maxValue = stop.toInt(), step = step.toInt(), nameFormat = nameFormat, title = title, onChange = { MPVLib.setPropertyInt(pickerProperty, it) }, onDismissRequest = { showDialog(Dialogs.None) }, ), ) } "pause" -> { when (data) { "pause" -> pause() "unpause" -> unpause() "pauseunpause" -> pauseUnpause() } } "seek_to_with_text" -> { val (seekValue, text) = data.split("|", limit = 2) seekToWithText(seekValue.toInt(), text) } "seek_by_with_text" -> { val (seekValue, text) = data.split("|", limit = 2) seekByWithText(seekValue.toInt(), text) } "seek_by" -> seekByWithText(data.toInt(), null) "seek_to" -> seekToWithText(data.toInt(), null) "toggle_button" -> { fun showButton() { if (_primaryButton.value == null) { _primaryButton.update { customButtons.value.getButtons().firstOrNull { it.isFavorite } } } } when (data) { "show" -> showButton() "hide" -> _primaryButton.update { null } "toggle" -> if (_primaryButton.value == null) showButton() else _primaryButton.update { null } } } "software_keyboard" -> when (data) { "show" -> forceShowSoftwareKeyboard() "hide" -> forceHideSoftwareKeyboard() "toggle" -> if (inputMethodManager.isActive) { forceHideSoftwareKeyboard() } else { forceShowSoftwareKeyboard() } } } MPVLib.setPropertyString(property, "") } private operator fun List.component6(): T = get(5) private val inputMethodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager private fun forceShowSoftwareKeyboard() { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0) } private fun forceHideSoftwareKeyboard() { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0) } private val doubleTapToSeekDuration = gesturePreferences.skipLengthPreference().get() private val preciseSeek = gesturePreferences.playerSmoothSeek().get() private val showSeekBar = gesturePreferences.showSeekBar().get() private fun seekToWithText(seekValue: Int, text: String?) { _isSeekingForwards.value = seekValue > 0 _doubleTapSeekAmount.value = seekValue - pos.value.toInt() _seekText.update { _ -> text } seekTo(seekValue, preciseSeek) if (showSeekBar) showSeekBar() } private fun seekByWithText(value: Int, text: String?) { _doubleTapSeekAmount.update { if (value < 0 && it < 0 || pos.value + value > duration.value) 0 else it + value } _seekText.update { text } _isSeekingForwards.value = value > 0 seekBy(value, preciseSeek) if (showSeekBar) showSeekBar() } fun updateSeekAmount(amount: Int) { _doubleTapSeekAmount.update { _ -> amount } } fun updateSeekText(value: String?) { _seekText.update { _ -> value } } fun leftSeek() { if (pos.value > 0) { _doubleTapSeekAmount.value -= doubleTapToSeekDuration } _isSeekingForwards.value = false seekBy(-doubleTapToSeekDuration, preciseSeek) if (showSeekBar) showSeekBar() } fun rightSeek() { if (pos.value < duration.value) { _doubleTapSeekAmount.value += doubleTapToSeekDuration } _isSeekingForwards.value = true seekBy(doubleTapToSeekDuration, preciseSeek) if (showSeekBar) showSeekBar() } fun resetHosterState() { _pausedState.update { _ -> false } _hosterState.update { _ -> emptyList() } _hosterList.update { _ -> emptyList() } _hosterExpandedList.update { _ -> emptyList() } _selectedHosterVideoIndex.update { _ -> Pair(-1, -1) } } fun changeEpisode(previous: Boolean, autoPlay: Boolean = false) { if (previous && !hasPreviousEpisode.value) { activity.showToast(activity.stringResource(AYMR.strings.no_prev_episode)) return } if (!previous && !hasNextEpisode.value) { activity.showToast(activity.stringResource(AYMR.strings.no_next_episode)) return } activity.changeEpisode( episodeId = getAdjacentEpisodeId(previous = previous), autoPlay = autoPlay, ) } fun handleLeftDoubleTap() { when (gesturePreferences.leftDoubleTapGesture().get()) { SingleActionGesture.Seek -> { leftSeek() } SingleActionGesture.PlayPause -> { pauseUnpause() } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.DoubleTapLeft.keyCode)) } SingleActionGesture.None -> {} SingleActionGesture.Switch -> changeEpisode(true) } } fun handleCenterDoubleTap() { when (gesturePreferences.centerDoubleTapGesture().get()) { SingleActionGesture.PlayPause -> { pauseUnpause() } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.DoubleTapCenter.keyCode)) } SingleActionGesture.Seek -> {} SingleActionGesture.None -> {} SingleActionGesture.Switch -> {} } } fun handleRightDoubleTap() { when (gesturePreferences.rightDoubleTapGesture().get()) { SingleActionGesture.Seek -> { rightSeek() } SingleActionGesture.PlayPause -> { pauseUnpause() } SingleActionGesture.Custom -> { MPVLib.command(arrayOf("keypress", CustomKeyCodes.DoubleTapRight.keyCode)) } SingleActionGesture.None -> {} SingleActionGesture.Switch -> changeEpisode(false) } } override fun onCleared() { if (currentEpisode.value != null) { saveWatchingProgress(currentEpisode.value!!) episodeToDownload?.let { downloadManager.addDownloadsToStartOfQueue(listOf(it)) } } } // ====== OLD ====== private val eventChannel = Channel() val eventFlow = eventChannel.receiveAsFlow() private val incognitoMode: Boolean by lazy { getIncognitoState.await(currentAnime.value?.source) } private val downloadAheadAmount = downloadPreferences.autoDownloadWhileWatching().get() internal val relativeTime = uiPreferences.relativeTime().get() internal val dateFormat = UiPreferences.dateFormat(uiPreferences.dateFormat().get()) /** * The position in the current video. Used to restore from process kill. */ private var episodePosition = savedState.get("episode_position") set(value) { savedState["episode_position"] = value field = value } /** * The current video's quality index. Used to restore from process kill. */ private var qualityIndex = savedState.get>("quality_index") ?: Pair(-1, -1) set(value) { savedState["quality_index"] = value field = value } /** * The episode id of the currently loaded episode. Used to restore from process kill. */ private var episodeId = savedState.get("episode_id") ?: -1L set(value) { savedState["episode_id"] = value field = value } private var episodeToDownload: AnimeDownload? = null private fun filterEpisodeList(episodes: List): List { val anime = currentAnime.value ?: return episodes val selectedEpisode = episodes.find { it.id == episodeId } ?: error("Requested episode of id $episodeId not found in episode list") val episodesForPlayer = episodes.filterNot { anime.unseenFilterRaw == Anime.EPISODE_SHOW_SEEN && !it.seen || anime.unseenFilterRaw == Anime.EPISODE_SHOW_UNSEEN && it.seen || anime.downloadedFilterRaw == Anime.EPISODE_SHOW_DOWNLOADED && !downloadManager.isEpisodeDownloaded( it.name, it.scanlator, anime.title, anime.source, ) || anime.downloadedFilterRaw == Anime.EPISODE_SHOW_NOT_DOWNLOADED && downloadManager.isEpisodeDownloaded( it.name, it.scanlator, anime.title, anime.source, ) || anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_BOOKMARKED && !it.bookmark || anime.bookmarkedFilterRaw == Anime.EPISODE_SHOW_NOT_BOOKMARKED && it.bookmark || anime.fillermarkedFilterRaw == Anime.EPISODE_SHOW_FILLERMARKED && !it.fillermark || anime.fillermarkedFilterRaw == Anime.EPISODE_SHOW_NOT_FILLERMARKED && it.fillermark }.toMutableList() if (episodesForPlayer.all { it.id != episodeId }) { episodesForPlayer += listOf(selectedEpisode) } return episodesForPlayer } fun getCurrentEpisodeIndex(): Int { return currentPlaylist.value.indexOfFirst { currentEpisode.value?.id == it.id } } private fun getAdjacentEpisodeId(previous: Boolean): Long { val newIndex = if (previous) getCurrentEpisodeIndex() - 1 else getCurrentEpisodeIndex() + 1 return when { previous && getCurrentEpisodeIndex() == 0 -> -1L !previous && currentPlaylist.value.lastIndex == getCurrentEpisodeIndex() -> -1L else -> currentPlaylist.value.getOrNull(newIndex)?.id ?: -1L } } fun updateHasNextEpisode(value: Boolean) { _hasNextEpisode.update { _ -> value } } fun updateHasPreviousEpisode(value: Boolean) { _hasPreviousEpisode.update { _ -> value } } fun showEpisodeListDialog() { if (currentAnime.value != null) { showDialog(Dialogs.EpisodeList) } } /** * Called when the activity is saved and not changing configurations. It updates the database * to persist the current progress of the active episode. */ fun onSaveInstanceStateNonConfigurationChange() { val currentEpisode = currentEpisode.value ?: return viewModelScope.launchNonCancellable { saveEpisodeProgress(currentEpisode) } } // ====== Initialize anime, episode, hoster, and video list ====== fun updateIsLoadingHosters(value: Boolean) { _isLoadingHosters.update { _ -> value } } /** * Whether this viewModel is initialized with the correct episode. */ private fun needsInit(animeId: Long, episodeId: Long): Boolean { return currentAnime.value?.id != animeId || currentEpisode.value?.id != episodeId } data class InitResult( val hosterList: List?, val videoIndex: Pair, val position: Long?, ) private var currentHosterList: List? = null class ExceptionWithStringResource( message: String, val stringResource: StringResource, ) : Exception(message) suspend fun init( animeId: Long, initialEpisodeId: Long, hostList: String, hostIndex: Int, vidIndex: Int, ): Pair> { val defaultResult = InitResult(currentHosterList, qualityIndex, null) if (!needsInit(animeId, initialEpisodeId)) return Pair(defaultResult, Result.success(true)) return try { val anime = getAnime.await(animeId) if (anime != null) { _currentAnime.update { _ -> anime } animeTitle.update { _ -> anime.title } sourceManager.isInitialized.first { it } episodeId = initialEpisodeId checkTrackers(anime) updateEpisodeList(initEpisodeList(anime)) val episode = currentPlaylist.value.first { it.id == episodeId } val source = sourceManager.getOrStub(anime.source) _currentEpisode.update { _ -> episode } _currentSource.update { _ -> source } updateEpisode(episode) _hasPreviousEpisode.update { _ -> getCurrentEpisodeIndex() != 0 } _hasNextEpisode.update { _ -> getCurrentEpisodeIndex() != currentPlaylist.value.size - 1 } // Write to mpv table MPVLib.setPropertyString("user-data/current-anime/anime-title", anime.title) MPVLib.setPropertyInt("user-data/current-anime/intro-length", getAnimeSkipIntroLength()) MPVLib.setPropertyString( "user-data/current-anime/category", getAnimeCategories.await(anime.id).joinToString { it.name }, ) val currentEp = currentEpisode.value ?: throw ExceptionWithStringResource("No episode loaded", AYMR.strings.no_episode_loaded) if (hostList.isNotBlank()) { currentHosterList = hostList.toHosterList().ifEmpty { currentHosterList = null throw ExceptionWithStringResource( "Hoster selected from empty list", AYMR.strings.select_hoster_from_empty_list, ) } qualityIndex = Pair(hostIndex, vidIndex) } else { EpisodeLoader.getHosters(currentEp.toDomainEpisode()!!, anime, source) .takeIf { it.isNotEmpty() } ?.also { currentHosterList = it } ?: run { currentHosterList = null throw ExceptionWithStringResource("Hoster list is empty", AYMR.strings.no_hosters) } } val result = InitResult( hosterList = currentHosterList, videoIndex = qualityIndex, position = episodePosition, ) Pair(result, Result.success(true)) } else { // Unlikely but okay Pair(defaultResult, Result.success(false)) } } catch (e: Throwable) { Pair(defaultResult, Result.failure(e)) } } private fun updateEpisode(episode: Episode) { mediaTitle.update { _ -> episode.name } _isEpisodeOnline.update { _ -> isEpisodeOnline() == true } MPVLib.setPropertyDouble("user-data/current-anime/episode-number", episode.episode_number.toDouble()) } private fun initEpisodeList(anime: Anime): List { val episodes = runBlocking { getEpisodesByAnimeId.await(anime.id) } return episodes .sortedWith(getEpisodeSort(anime, sortDescending = false)) .run { if (basePreferences.downloadedOnly().get()) { filterDownloadedEpisodes(anime) } else { this } } .map { it.toDbEpisode() } } private var hasTrackers: Boolean = false private val checkTrackers: (Anime) -> Unit = { anime -> val tracks = runBlocking { getTracks.await(anime.id) } hasTrackers = tracks.isNotEmpty() } private var getHosterVideoLinksJob: Job? = null fun cancelHosterVideoLinksJob() { getHosterVideoLinksJob?.cancel() } /** * Set the video list for hosters. */ fun loadHosters(source: AnimeSource, hosterList: List, hosterIndex: Int, videoIndex: Int) { val hasFoundPreferredVideo = AtomicBoolean(false) _hosterList.update { _ -> hosterList } _hosterExpandedList.update { _ -> List(hosterList.size) { true } } getHosterVideoLinksJob?.cancel() getHosterVideoLinksJob = viewModelScope.launchIO { _hosterState.update { _ -> hosterList.map { hoster -> if (hoster.lazy) { HosterState.Idle(hoster.hosterName) } else if (hoster.videoList == null) { HosterState.Loading(hoster.hosterName) } else { val videoList = hoster.videoList!! HosterState.Ready( hoster.hosterName, videoList, List(videoList.size) { Video.State.QUEUE }, ) } } } try { coroutineScope { hosterList.mapIndexed { hosterIdx, hoster -> async { val hosterState = EpisodeLoader.loadHosterVideos(source, hoster) _hosterState.updateAt(hosterIdx, hosterState) if (hosterState is HosterState.Ready) { if (hosterIdx == hosterIndex) { hosterState.videoList.getOrNull(videoIndex)?.let { hasFoundPreferredVideo.set(true) val success = loadVideo(source, it, hosterIndex, videoIndex) if (!success) { hasFoundPreferredVideo.set(false) } } } val prefIndex = hosterState.videoList.indexOfFirst { it.preferred } if (prefIndex != -1 && hosterIndex == -1) { if (hasFoundPreferredVideo.compareAndSet(false, true)) { if (selectedHosterVideoIndex.value == Pair(-1, -1)) { val success = loadVideo( source, hosterState.videoList[prefIndex], hosterIdx, prefIndex, ) if (!success) { hasFoundPreferredVideo.set(false) } } } } } } }.awaitAll() if (hasFoundPreferredVideo.compareAndSet(false, true)) { val (hosterIdx, videoIdx) = HosterLoader.selectBestVideo(hosterState.value) if (hosterIdx == -1) { throw ExceptionWithStringResource("No available videos", AYMR.strings.no_available_videos) } val video = (hosterState.value[hosterIdx] as HosterState.Ready).videoList[videoIdx] loadVideo(source, video, hosterIdx, videoIdx) } } } catch (e: CancellationException) { _hosterState.update { _ -> hosterList.map { HosterState.Idle(it.hosterName) } } throw e } } } private suspend fun loadVideo(source: AnimeSource?, video: Video, hosterIndex: Int, videoIndex: Int): Boolean { val selectedHosterState = (_hosterState.value[hosterIndex] as? HosterState.Ready) ?: return false updateIsLoadingEpisode(true) val oldSelectedIndex = _selectedHosterVideoIndex.value _selectedHosterVideoIndex.update { _ -> Pair(hosterIndex, videoIndex) } _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, video, Video.State.LOAD_VIDEO), ) // Pause until everything has loaded updatePausedState() pause() val resolvedVideo = if (selectedHosterState.videoState[videoIndex] != Video.State.READY) { HosterLoader.getResolvedVideo(source, video) } else { video } if (resolvedVideo == null || resolvedVideo.videoUrl.isEmpty()) { if (currentVideo.value == null) { _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, video, Video.State.ERROR), ) val (newHosterIdx, newVideoIdx) = HosterLoader.selectBestVideo(hosterState.value) if (newHosterIdx == -1) { if (_hosterState.value.any { it is HosterState.Loading }) { _selectedHosterVideoIndex.update { _ -> Pair(-1, -1) } return false } else { throw ExceptionWithStringResource("No available videos", AYMR.strings.no_available_videos) } } val newVideo = (hosterState.value[newHosterIdx] as HosterState.Ready).videoList[newVideoIdx] return loadVideo(source, newVideo, newHosterIdx, newVideoIdx) } else { _selectedHosterVideoIndex.update { _ -> oldSelectedIndex } _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, video, Video.State.ERROR), ) return false } } _hosterState.updateAt( hosterIndex, selectedHosterState.getChangedAt(videoIndex, resolvedVideo, Video.State.READY), ) _currentVideo.update { _ -> resolvedVideo } qualityIndex = Pair(hosterIndex, videoIndex) activity.setVideo(resolvedVideo) return true } fun onVideoClicked(hosterIndex: Int, videoIndex: Int) { val hosterState = _hosterState.value[hosterIndex] as? HosterState.Ready val video = hosterState?.videoList ?.getOrNull(videoIndex) ?: return // Shouldn't happen, but just in case™ val videoState = hosterState.videoState .getOrNull(videoIndex) ?: return if (videoState == Video.State.ERROR) { return } viewModelScope.launchIO { val success = loadVideo(currentSource.value, video, hosterIndex, videoIndex) if (success) { if (sheetShown.value == Sheets.QualityTracks) { dismissSheet() } } else { updateIsLoadingEpisode(false) } } } fun onHosterClicked(index: Int) { when (hosterState.value[index]) { is HosterState.Ready -> { _hosterExpandedList.updateAt(index, !_hosterExpandedList.value[index]) } is HosterState.Idle -> { val hosterName = hosterList.value[index].hosterName _hosterState.updateAt(index, HosterState.Loading(hosterName)) viewModelScope.launchIO { val hosterState = EpisodeLoader.loadHosterVideos( source = currentSource.value!!, hoster = hosterList.value[index], force = true, ) _hosterState.updateAt(index, hosterState) } } is HosterState.Loading, is HosterState.Error -> {} } } private fun MutableStateFlow>.updateAt(index: Int, newValue: T) { this.update { values -> values.toMutableList().apply { this[index] = newValue } } } data class EpisodeLoadResult( val hosterList: List?, val episodeTitle: String, val source: AnimeSource, ) suspend fun loadEpisode(episodeId: Long?): EpisodeLoadResult? { val anime = currentAnime.value ?: return null val source = sourceManager.getOrStub(anime.source) val chosenEpisode = currentPlaylist.value.firstOrNull { ep -> ep.id == episodeId } ?: return null _currentEpisode.update { _ -> chosenEpisode } updateEpisode(chosenEpisode) return withIOContext { try { val currentEpisode = currentEpisode.value ?: throw ExceptionWithStringResource("No episode loaded", AYMR.strings.no_episode_loaded) currentHosterList = EpisodeLoader.getHosters( currentEpisode.toDomainEpisode()!!, anime, source, ) this@PlayerViewModel.episodeId = currentEpisode.id!! } catch (e: Exception) { logcat(LogPriority.ERROR, e) { e.message ?: "Error getting links" } } EpisodeLoadResult( hosterList = currentHosterList, episodeTitle = anime.title + " - " + chosenEpisode.name, source = source, ) } } /** * Called every time a second is reached in the player. Used to mark the flag of episode being * seen, update tracking services, enqueue downloaded episode deletion and download next episode. */ private fun onSecondReached(position: Int, duration: Int) { if (isLoadingEpisode.value) return val currentEp = currentEpisode.value ?: return if (episodeId == -1L) return if (duration == 0) return val seconds = position * 1000L val totalSeconds = duration * 1000L // Save last second seen and mark as seen if needed currentEp.last_second_seen = seconds currentEp.total_seconds = totalSeconds episodePosition = seconds val progress = playerPreferences.progressPreference().get() val shouldTrack = !incognitoMode || hasTrackers if (seconds >= totalSeconds * progress && shouldTrack) { viewModelScope.launchNonCancellable { updateEpisodeProgressOnComplete(currentEp) } } saveWatchingProgress(currentEp) val inDownloadRange = seconds.toDouble() / totalSeconds > 0.35 if (inDownloadRange) { downloadNextEpisodes() } } private suspend fun updateEpisodeProgressOnComplete(currentEp: Episode) { currentEp.seen = true updateTrackEpisodeSeen(currentEp) deleteEpisodeIfNeeded(currentEp) val markDuplicateAsSeen = libraryPreferences.markDuplicateSeenEpisodeAsSeen().get() .contains(LibraryPreferences.MARK_DUPLICATE_EPISODE_SEEN_EXISTING) if (!markDuplicateAsSeen) return val duplicateUnseenEpisodes = currentPlaylist.value .mapNotNull { episode -> if ( !episode.seen && episode.isRecognizedNumber && episode.episode_number == currentEp.episode_number ) { EpisodeUpdate(id = episode.id!!, seen = true) } else { null } } updateEpisode.awaitAll(duplicateUnseenEpisodes) } private fun downloadNextEpisodes() { if (downloadAheadAmount == 0) return val anime = currentAnime.value ?: return // Only download ahead if current + next episode is already downloaded too to avoid jank if (getCurrentEpisodeIndex() == currentPlaylist.value.lastIndex) return val currentEpisode = currentEpisode.value ?: return val nextEpisode = currentPlaylist.value[getCurrentEpisodeIndex() + 1] val episodesAreDownloaded = EpisodeLoader.isDownload(currentEpisode.toDomainEpisode()!!, anime) && EpisodeLoader.isDownload(nextEpisode.toDomainEpisode()!!, anime) viewModelScope.launchIO { if (!episodesAreDownloaded) { return@launchIO } val episodesToDownload = getNextEpisodes.await(anime.id, nextEpisode.id!!) .take(downloadAheadAmount) downloadManager.downloadEpisodes(anime, episodesToDownload) } } /** * Determines if deleting option is enabled and nth to last episode actually exists. * If both conditions are satisfied enqueues episode for delete * @param chosenEpisode current episode, which is going to be marked as seen. */ private fun deleteEpisodeIfNeeded(chosenEpisode: Episode) { // Determine which episode should be deleted and enqueue val currentEpisodePosition = currentPlaylist.value.indexOf(chosenEpisode) val removeAfterSeenSlots = downloadPreferences.removeAfterReadSlots().get() val episodeToDelete = currentPlaylist.value.getOrNull( currentEpisodePosition - removeAfterSeenSlots, ) // If episode is completely seen no need to download it episodeToDownload = null // Check if deleting option is enabled and episode exists if (removeAfterSeenSlots != -1 && episodeToDelete != null) { enqueueDeleteSeenEpisodes(episodeToDelete) } } fun saveCurrentEpisodeWatchingProgress() { currentEpisode.value?.let { saveWatchingProgress(it) } } /** * Called when episode is changed in player or when activity is paused. */ private fun saveWatchingProgress(episode: Episode) { viewModelScope.launchNonCancellable { saveEpisodeProgress(episode) saveEpisodeHistory(episode) } } /** * Saves this [episode] progress (last second seen and whether it's seen). * If incognito mode isn't on or has at least 1 tracker */ private suspend fun saveEpisodeProgress(episode: Episode) { if (!incognitoMode || hasTrackers) { updateEpisode.await( EpisodeUpdate( id = episode.id!!, seen = episode.seen, bookmark = episode.bookmark, fillermark = episode.fillermark, lastSecondSeen = episode.last_second_seen, totalSeconds = episode.total_seconds, ), ) } } /** * Saves this [episode] last seen history if incognito mode isn't on. */ private suspend fun saveEpisodeHistory(episode: Episode) { if (!incognitoMode) { val episodeId = episode.id!! val seenAt = Date() upsertHistory.await( AnimeHistoryUpdate(episodeId, seenAt), ) } } /** * Bookmarks the currently active episode. */ fun bookmarkEpisode(episodeId: Long?, bookmarked: Boolean) { viewModelScope.launchNonCancellable { updateEpisode.await( EpisodeUpdate( id = episodeId!!, bookmark = bookmarked, ), ) } } /** * Fillermarks the currently active episode. */ fun fillermarkEpisode(episodeId: Long?, fillermarked: Boolean) { viewModelScope.launchNonCancellable { updateEpisode.await( EpisodeUpdate( id = episodeId!!, fillermark = fillermarked, ), ) } } fun takeScreenshot(cachePath: String, showSubtitles: Boolean): InputStream? { val filename = cachePath + "/${System.currentTimeMillis()}_mpv_screenshot_tmp.png" val subtitleFlag = if (showSubtitles) "subtitles" else "video" MPVLib.command(arrayOf("screenshot-to-file", filename, subtitleFlag)) val tempFile = File(filename).takeIf { it.exists() } ?: return null val newFile = File("$cachePath/mpv_screenshot.png") newFile.delete() tempFile.renameTo(newFile) return newFile.takeIf { it.exists() }?.inputStream() } /** * Saves the screenshot on the pictures directory and notifies the UI of the result. * There's also a notification to allow sharing the image somewhere else or deleting it. */ fun saveImage(imageStream: () -> InputStream, timePos: Int?) { val anime = currentAnime.value ?: return val context = Injekt.get() val notifier = SaveImageNotifier(context) notifier.onClear() val seconds = timePos?.let { Utils.prettyTime(it) } ?: return val filename = generateFilename(anime, seconds) ?: return // Pictures directory. val relativePath = DiskUtil.buildValidFilename(anime.title) // Copy file in background. viewModelScope.launchNonCancellable { try { val uri = imageSaver.save( image = Image.Page( inputStream = imageStream, name = filename, location = Location.Pictures(relativePath), ), ) notifier.onComplete(uri) eventChannel.send(Event.SavedImage(SaveImageResult.Success(uri))) } catch (e: Throwable) { notifier.onError(e.message) eventChannel.send(Event.SavedImage(SaveImageResult.Error(e))) } } } /** * Shares the screenshot and notifies the UI with the path of the file to share. * The image must be first copied to the internal partition because there are many possible * formats it can come from, like a zipped chapter, in which case it's not possible to directly * get a path to the file and it has to be decompressed somewhere first. Only the last shared * image will be kept so it won't be taking lots of internal disk space. */ fun shareImage(imageStream: () -> InputStream, timePos: Int?) { val anime = currentAnime.value ?: return val context = Injekt.get() val destDir = context.cacheImageDir val seconds = timePos?.let { Utils.prettyTime(it) } ?: return val filename = generateFilename(anime, seconds) ?: return try { viewModelScope.launchIO { destDir.deleteRecursively() val uri = imageSaver.save( image = Image.Page( inputStream = imageStream, name = filename, location = Location.Cache, ), ) eventChannel.send(Event.ShareImage(uri, seconds)) } } catch (e: Throwable) { logcat(LogPriority.ERROR, e) } } /** * Sets the screenshot as art and notifies the UI of the result. */ fun setAsArt(artType: ArtType, imageStream: () -> InputStream) { val anime = currentAnime.value ?: return val episode = currentEpisode.value ?: return viewModelScope.launchNonCancellable { val result = try { when (artType) { ArtType.Cover -> anime.editCover(Injekt.get(), imageStream()) ArtType.Background -> anime.editBackground(Injekt.get(), imageStream()) ArtType.Thumbnail -> episode.editThumbnail(anime, Injekt.get(), imageStream()) } if (anime.isLocal() || anime.favorite) { SetAsArt.Success } else { SetAsArt.AddToLibraryFirst } } catch (e: Exception) { SetAsArt.Error } eventChannel.send(Event.SetArtResult(result, artType)) } } /** * Results of the save image feature. */ sealed class SaveImageResult { class Success(val uri: Uri) : SaveImageResult() class Error(val error: Throwable) : SaveImageResult() } private fun updateTrackEpisodeSeen(episode: Episode) { if (basePreferences.incognitoMode().get() || !hasTrackers) return if (!trackPreferences.autoUpdateTrack().get()) return val anime = currentAnime.value ?: return val context = Injekt.get() viewModelScope.launchNonCancellable { trackEpisode.await(context, anime.id, episode.episode_number.toDouble()) } } /** * Enqueues this [episode] to be deleted when [deletePendingEpisodes] is called. The download * manager handles persisting it across process deaths. */ private fun enqueueDeleteSeenEpisodes(episode: Episode) { if (!episode.seen) return val anime = currentAnime.value ?: return viewModelScope.launchNonCancellable { downloadManager.enqueueEpisodesToDelete(listOf(episode.toDomainEpisode()!!), anime) } } /** * Deletes all the pending episodes. This operation will run in a background thread and errors * are ignored. */ fun deletePendingEpisodes() { viewModelScope.launchNonCancellable { downloadManager.deletePendingEpisodes() } } /** * Returns the skipIntroLength used by this anime or the default one. */ fun getAnimeSkipIntroLength(): Int { val default = gesturePreferences.defaultIntroLength().get() val anime = currentAnime.value ?: return default val skipIntroLength = anime.skipIntroLength val skipIntroDisable = anime.skipIntroDisable return when { skipIntroDisable -> 0 skipIntroLength <= 0 -> default else -> anime.skipIntroLength } } /** * Updates the skipIntroLength for the open anime. */ fun setAnimeSkipIntroLength(skipIntroLength: Long) { val anime = currentAnime.value ?: return if (!anime.favorite) return // Skip unnecessary database operation if (skipIntroLength == getAnimeSkipIntroLength().toLong()) return viewModelScope.launchIO { setAnimeViewerFlags.awaitSetSkipIntroLength(anime.id, skipIntroLength) _currentAnime.update { _ -> getAnime.await(anime.id) } } } /** * Generate a filename for the given [anime] and [timePos] */ private fun generateFilename( anime: Anime, timePos: String, ): String? { val episode = currentEpisode.value ?: return null val filenameSuffix = " - $timePos" return DiskUtil.buildValidFilename( "${anime.title} - ${episode.name}".takeBytes( DiskUtil.MAX_FILE_NAME_BYTES - filenameSuffix.byteSize(), ), ) + filenameSuffix } /** * Returns the response of the AniSkipApi for this episode. * just works if tracking is enabled. */ suspend fun aniSkipResponse(playerDuration: Int?): List? { val animeId = currentAnime.value?.id ?: return null val trackerManager = Injekt.get() var malId: Long? val episodeNumber = currentEpisode.value?.episode_number?.toInt() ?: return null if (getTracks.await(animeId).isEmpty()) { logcat { "AniSkip: No tracks found for anime $animeId" } return null } getTracks.await(animeId).map { track -> val tracker = trackerManager.get(track.trackerId) malId = when (tracker) { is MyAnimeList -> track.remoteId is Anilist -> AniSkipApi().getMalIdFromAL(track.remoteId) else -> null } val duration = playerDuration ?: return null return malId?.let { AniSkipApi().getResult(it.toInt(), episodeNumber, duration.toLong()) } } return null } val introSkipEnabled = playerPreferences.enableSkipIntro().get() private val autoSkip = playerPreferences.autoSkipIntro().get() private val netflixStyle = playerPreferences.enableNetflixStyleIntroSkip().get() private val defaultWaitingTime = playerPreferences.waitingTimeIntroSkip().get() var waitingSkipIntro = defaultWaitingTime fun setChapter(position: Float) { getCurrentChapter(position)?.let { (chapterIndex, chapter) -> if (currentChapter.value != chapter) { _currentChapter.update { _ -> chapter } } if (!introSkipEnabled) { return } if (chapter.chapterType == ChapterType.Other) { _skipIntroText.update { _ -> null } waitingSkipIntro = defaultWaitingTime } else { val nextChapterPos = chapters.value.getOrNull(chapterIndex + 1)?.start ?: pos.value if (netflixStyle) { // show a toast with the seconds before the skip if (waitingSkipIntro == defaultWaitingTime) { activity.showToast( "Skip Intro: ${activity.stringResource( AYMR.strings.player_aniskip_dontskip_toast, chapter.name, waitingSkipIntro, )}", ) } showSkipIntroButton(chapter, nextChapterPos, waitingSkipIntro) waitingSkipIntro-- } else if (autoSkip) { seekToWithText( seekValue = nextChapterPos.toInt(), text = activity.stringResource(AYMR.strings.player_intro_skipped, chapter.name), ) } else { updateSkipIntroButton(chapter.chapterType) } } } } private fun updateSkipIntroButton(chapterType: ChapterType) { val skipButtonString = chapterType.getStringRes() _skipIntroText.update { _ -> skipButtonString?.let { activity.stringResource( AYMR.strings.player_skip_action, activity.stringResource(skipButtonString), ) } } } private fun showSkipIntroButton(chapter: IndexedSegment, nextChapterPos: Float, waitingTime: Int) { if (waitingTime > -1) { if (waitingTime > 0) { _skipIntroText.update { _ -> activity.stringResource(AYMR.strings.player_aniskip_dontskip) } } else { seekToWithText( seekValue = nextChapterPos.toInt(), text = activity.stringResource(AYMR.strings.player_aniskip_skip, chapter.name), ) } } else { // when waitingTime is -1, it means that the user cancelled the skip updateSkipIntroButton(chapter.chapterType) } } fun onSkipIntro() { getCurrentChapter()?.let { (chapterIndex, chapter) -> // this stops the counter if (waitingSkipIntro > 0 && netflixStyle) { waitingSkipIntro = -1 return } val nextChapterPos = chapters.value.getOrNull(chapterIndex + 1)?.start ?: pos.value seekToWithText( seekValue = nextChapterPos.toInt(), text = activity.stringResource(AYMR.strings.player_aniskip_skip, chapter.name), ) } } private fun getCurrentChapter(position: Float? = null): IndexedValue? { return chapters.value.withIndex() .filter { it.value.start <= (position ?: pos.value) } .maxByOrNull { it.value.start } } fun setPrimaryCustomButtonTitle(button: CustomButton) { _primaryButtonTitle.update { _ -> button.name } } sealed class Event { data class SetArtResult(val result: SetAsArt, val artType: ArtType) : Event() data class SavedImage(val result: SaveImageResult) : Event() data class ShareImage(val uri: Uri, val seconds: String) : Event() } } fun CustomButton.execute() { MPVLib.command(arrayOf("script-message", "call_button_$id")) } fun CustomButton.executeLongPress() { MPVLib.command(arrayOf("script-message", "call_button_${id}_long")) } fun Float.normalize(inMin: Float, inMax: Float, outMin: Float, outMax: Float): Float { return (this - inMin) * (outMax - outMin) / (inMax - inMin) + outMin } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/BottomLeftPlayerControls.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.LockOpen import androidx.compose.material.icons.filled.ScreenRotation import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import dev.vivvvek.seeker.Segment import eu.kanade.tachiyomi.ui.player.Sheets import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import eu.kanade.tachiyomi.ui.player.controls.components.CurrentChapter import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun BottomLeftPlayerControls( playbackSpeed: Float, currentChapter: Segment?, onLockControls: () -> Unit, onCycleRotation: () -> Unit, onPlaybackSpeedChange: (Float) -> Unit, onOpenSheet: (Sheets) -> Unit, modifier: Modifier = Modifier, ) { val playerPreferences = remember { Injekt.get() } Row( modifier = modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { ControlsButton( Icons.Default.LockOpen, onClick = onLockControls, ) ControlsButton( icon = Icons.Default.ScreenRotation, onClick = onCycleRotation, ) ControlsButton( text = stringResource(AYMR.strings.player_speed, playbackSpeed), onClick = { val newSpeed = if (playbackSpeed >= 2) 0.25f else playbackSpeed + 0.25f onPlaybackSpeedChange(newSpeed) playerPreferences.playerSpeed().set(newSpeed) }, onLongClick = { onOpenSheet(Sheets.PlaybackSpeed) }, ) AnimatedVisibility( currentChapter != null && playerPreferences.showCurrentChapter().get(), enter = fadeIn(), exit = fadeOut(), ) { CurrentChapter( chapter = currentChapter!!, onClick = { onOpenSheet(Sheets.Chapters) }, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/BottomRightPlayerControls.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.foundation.layout.Row import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AspectRatio import androidx.compose.material.icons.filled.PictureInPictureAlt import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import eu.kanade.tachiyomi.ui.player.controls.components.FilledControlsButton import eu.kanade.tachiyomi.ui.player.execute import eu.kanade.tachiyomi.ui.player.executeLongPress import tachiyomi.domain.custombuttons.model.CustomButton @Composable fun BottomRightPlayerControls( customButton: CustomButton?, customButtonTitle: String, skipIntroButton: String?, onPressSkipIntroButton: () -> Unit, isPipAvailable: Boolean, onAspectClick: () -> Unit, onPipClick: () -> Unit, modifier: Modifier = Modifier, ) { Row(modifier) { if (skipIntroButton != null) { FilledControlsButton( text = skipIntroButton, onClick = onPressSkipIntroButton, onLongClick = {}, ) } else if (customButton != null) { FilledControlsButton( text = customButtonTitle, onClick = customButton::execute, onLongClick = customButton::executeLongPress, ) } if (isPipAvailable) { ControlsButton( Icons.Default.PictureInPictureAlt, onClick = onPipClick, ) } ControlsButton( Icons.Default.AspectRatio, onClick = onAspectClick, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/GestureHandler.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectHorizontalDragGestures import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.gestures.detectVerticalDragGestures import androidx.compose.foundation.indication import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.safeGestures import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.LocalRippleConfiguration import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp import eu.kanade.presentation.player.components.LeftSideOvalShape import eu.kanade.presentation.player.components.RightSideOvalShape import eu.kanade.presentation.theme.playerRippleConfiguration import eu.kanade.tachiyomi.ui.player.Panels import eu.kanade.tachiyomi.ui.player.PlayerUpdates import eu.kanade.tachiyomi.ui.player.PlayerViewModel import eu.kanade.tachiyomi.ui.player.Sheets import eu.kanade.tachiyomi.ui.player.controls.components.DoubleTapSeekTriangles import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import `is`.xyz.mpv.MPVLib import kotlinx.coroutines.delay import kotlinx.coroutines.flow.update import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun GestureHandler( viewModel: PlayerViewModel, interactionSource: MutableInteractionSource, modifier: Modifier = Modifier, ) { val playerPreferences = remember { Injekt.get() } val gesturePreferences = remember { Injekt.get() } val audioPreferences = remember { Injekt.get() } val panelShown by viewModel.panelShown.collectAsState() val allowGesturesInPanels by playerPreferences.allowGestures().collectAsState() val duration by viewModel.duration.collectAsState() val position by viewModel.pos.collectAsState() val controlsShown by viewModel.controlsShown.collectAsState() val areControlsLocked by viewModel.areControlsLocked.collectAsState() val seekAmount by viewModel.doubleTapSeekAmount.collectAsState() val isSeekingForwards by viewModel.isSeekingForwards.collectAsState() var isDoubleTapSeeking by remember { mutableStateOf(false) } LaunchedEffect(seekAmount) { delay(800) isDoubleTapSeeking = false viewModel.updateSeekAmount(0) viewModel.updateSeekText(null) delay(100) viewModel.hideSeekBar() } val gestureVolumeBrightness = gesturePreferences.gestureVolumeBrightness().get() val swapVolumeBrightness by gesturePreferences.swapVolumeBrightness().collectAsState() val seekGesture by gesturePreferences.gestureHorizontalSeek().collectAsState() val preciseSeeking by gesturePreferences.playerSmoothSeek().collectAsState() val showSeekbar by gesturePreferences.showSeekBar().collectAsState() var isLongPressing by remember { mutableStateOf(false) } val currentVolume by viewModel.currentVolume.collectAsState() val currentMPVVolume by viewModel.currentMPVVolume.collectAsState() val currentBrightness by viewModel.currentBrightness.collectAsState() val volumeBoostingCap = audioPreferences.volumeBoostCap().get() val haptics = LocalHapticFeedback.current Box( modifier = modifier .fillMaxSize() .windowInsetsPadding(WindowInsets.safeGestures) .pointerInput(Unit) { val originalSpeed = viewModel.playbackSpeed.value detectTapGestures( onTap = { if (controlsShown) viewModel.hideControls() else viewModel.showControls() }, onDoubleTap = { if (areControlsLocked || isDoubleTapSeeking) return@detectTapGestures if (it.x > size.width * 3 / 5) { if (!isSeekingForwards) viewModel.updateSeekAmount(0) viewModel.handleRightDoubleTap() isDoubleTapSeeking = true } else if (it.x < size.width * 2 / 5) { if (isSeekingForwards) viewModel.updateSeekAmount(0) viewModel.handleLeftDoubleTap() isDoubleTapSeeking = true } else { viewModel.handleCenterDoubleTap() } }, onPress = { if (panelShown != Panels.None && !allowGesturesInPanels) { viewModel.panelShown.update { Panels.None } } val press = PressInteraction.Press( it.copy(x = if (it.x > size.width * 3 / 5) it.x - size.width * 0.6f else it.x), ) if (!areControlsLocked && isDoubleTapSeeking && seekAmount != 0) { if (it.x > size.width * 3 / 5) { if (!isSeekingForwards) viewModel.updateSeekAmount(0) viewModel.handleRightDoubleTap() } else if (it.x < size.width * 2 / 5) { if (isSeekingForwards) viewModel.updateSeekAmount(0) viewModel.handleLeftDoubleTap() } else { viewModel.handleCenterDoubleTap() } } else { isDoubleTapSeeking = false } interactionSource.emit(press) tryAwaitRelease() if (isLongPressing) { isLongPressing = false MPVLib.setPropertyDouble("speed", originalSpeed.toDouble()) viewModel.playerUpdate.update { PlayerUpdates.None } } interactionSource.emit(PressInteraction.Release(press)) }, onLongPress = { if (areControlsLocked) return@detectTapGestures if (!isLongPressing) { haptics.performHapticFeedback(HapticFeedbackType.LongPress) isLongPressing = true viewModel.pause() viewModel.sheetShown.update { Sheets.Screenshot } } }, ) } .pointerInput(areControlsLocked) { if (!seekGesture || areControlsLocked) return@pointerInput var startingPosition = position.toInt() var startingX = 0f var wasPlayerAlreadyPause = false detectHorizontalDragGestures( onDragStart = { startingPosition = position.toInt() startingX = it.x wasPlayerAlreadyPause = viewModel.paused.value viewModel.pause() }, onDragEnd = { viewModel.gestureSeekAmount.update { null } viewModel.hideSeekBar() if (!wasPlayerAlreadyPause) viewModel.unpause() }, ) { change, dragAmount -> if (position <= 0f && dragAmount < 0) return@detectHorizontalDragGestures if (position >= duration && dragAmount > 0) return@detectHorizontalDragGestures calculateNewHorizontalGestureValue(startingPosition, startingX, change.position.x, 0.15f).let { viewModel.gestureSeekAmount.update { _ -> Pair( startingPosition, (it - startingPosition) .coerceIn(0 - startingPosition, (duration - startingPosition).toInt()), ) } viewModel.seekTo(it.coerceIn(0, duration.toInt()), preciseSeeking) } if (showSeekbar) viewModel.showSeekBar() } } .pointerInput(areControlsLocked) { if (!gestureVolumeBrightness || areControlsLocked) return@pointerInput var startingY = 0f var mpvVolumeStartingY = 0f var originalVolume = currentVolume var originalMPVVolume = currentMPVVolume var originalBrightness = currentBrightness val brightnessGestureSens = 0.001f val volumeGestureSens = 0.001f * viewModel.maxVolume val mpvVolumeGestureSens = 0.001f * volumeBoostingCap val isIncreasingVolumeBoost: (Float) -> Boolean = { volumeBoostingCap > 0 && currentVolume == viewModel.maxVolume && currentMPVVolume - 100 < volumeBoostingCap && it < 0 } val isDecreasingVolumeBoost: (Float) -> Boolean = { volumeBoostingCap > 0 && currentVolume == viewModel.maxVolume && currentMPVVolume - 100 in 1..volumeBoostingCap && it > 0 } detectVerticalDragGestures( onDragEnd = { startingY = 0f }, onDragStart = { startingY = 0f mpvVolumeStartingY = 0f originalVolume = currentVolume originalMPVVolume = currentMPVVolume originalBrightness = currentBrightness }, ) { change, amount -> val changeVolume: () -> Unit = { if (isIncreasingVolumeBoost(amount) || isDecreasingVolumeBoost(amount)) { if (mpvVolumeStartingY == 0f) { startingY = 0f originalVolume = currentVolume mpvVolumeStartingY = change.position.y } viewModel.changeMPVVolumeTo( calculateNewVerticalGestureValue( originalMPVVolume, mpvVolumeStartingY, change.position.y, mpvVolumeGestureSens, ) .coerceIn(100..volumeBoostingCap + 100), ) } else { if (startingY == 0f) { mpvVolumeStartingY = 0f originalMPVVolume = currentMPVVolume startingY = change.position.y } viewModel.changeVolumeTo( calculateNewVerticalGestureValue( originalVolume, startingY, change.position.y, volumeGestureSens, ), ) } viewModel.displayVolumeSlider() } val changeBrightness: () -> Unit = { if (startingY == 0f) startingY = change.position.y viewModel.changeBrightnessTo( calculateNewVerticalGestureValue( originalBrightness, startingY, change.position.y, brightnessGestureSens, ), ) viewModel.displayBrightnessSlider() } if (swapVolumeBrightness) { if (change.position.x > size.width / 2) changeBrightness() else changeVolume() } else { if (change.position.x < size.width / 2) changeBrightness() else changeVolume() } } }, ) } @Composable fun DoubleTapToSeekOvals( amount: Int, text: String?, interactionSource: MutableInteractionSource, modifier: Modifier = Modifier, ) { val alpha by animateFloatAsState(if (amount == 0) 0f else 0.2f, label = "double_tap_animation_alpha") Box( modifier = modifier.fillMaxSize(), contentAlignment = if (amount > 0) Alignment.CenterEnd else Alignment.CenterStart, ) { CompositionLocalProvider( LocalRippleConfiguration provides playerRippleConfiguration, ) { if (amount != 0 || text != null) { Box( modifier = Modifier .fillMaxHeight() .fillMaxWidth(0.4f), // 2 fifths contentAlignment = Alignment.Center, ) { Box( modifier = Modifier .fillMaxSize() .clip(if (amount > 0) RightSideOvalShape else LeftSideOvalShape) .background(Color.White.copy(alpha)) .indication(interactionSource, ripple()), ) Column(horizontalAlignment = Alignment.CenterHorizontally) { DoubleTapSeekTriangles(isForward = amount > 0) Text( text = text ?: pluralStringResource(AYMR.plurals.seconds, amount, amount), fontSize = 12.sp, textAlign = TextAlign.Center, color = Color.White, ) } } } } } } fun calculateNewVerticalGestureValue(originalValue: Int, startingY: Float, newY: Float, sensitivity: Float): Int { return originalValue + ((startingY - newY) * sensitivity).toInt() } fun calculateNewVerticalGestureValue(originalValue: Float, startingY: Float, newY: Float, sensitivity: Float): Float { return originalValue + ((startingY - newY) * sensitivity) } fun calculateNewHorizontalGestureValue(originalValue: Int, startingX: Float, newX: Float, sensitivity: Float): Int { return originalValue + ((newX - startingX) * sensitivity).toInt() } fun calculateNewHorizontalGestureValue(originalValue: Float, startingX: Float, newX: Float, sensitivity: Float): Float { return originalValue + ((newX - startingX) * sensitivity) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/MiddlePlayerControls.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import androidx.compose.animation.graphics.res.animatedVectorResource import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter import androidx.compose.animation.graphics.vector.AnimatedImageVector import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.SkipNext import androidx.compose.material.icons.filled.SkipPrevious import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import `is`.xyz.mpv.Utils import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import kotlin.math.abs @Composable fun MiddlePlayerControls( // previous hasPrevious: Boolean, onSkipPrevious: () -> Unit, // middle isLoading: Boolean, isLoadingEpisode: Boolean, controlsShown: Boolean, areControlsLocked: Boolean, showLoadingCircle: Boolean, paused: Boolean, gestureSeekAmount: Pair?, onPlayPauseClick: () -> Unit, // next hasNext: Boolean, onSkipNext: () -> Unit, enter: EnterTransition, exit: ExitTransition, modifier: Modifier = Modifier, ) { Row( modifier, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.large), ) { AnimatedVisibility( visible = controlsShown && !areControlsLocked, enter = enter, exit = exit, ) { if (gestureSeekAmount == null) { ControlsButton( Icons.Filled.SkipPrevious, onClick = onSkipPrevious, iconSize = 48.dp, enabled = hasPrevious, ) } } val icon = AnimatedImageVector.animatedVectorResource(R.drawable.anim_play_to_pause) val interaction = remember { MutableInteractionSource() } when { gestureSeekAmount != null -> { Text( stringResource( AYMR.strings.player_gesture_seek_indicator, if (gestureSeekAmount.second >= 0) '+' else '-', Utils.prettyTime(abs(gestureSeekAmount.second)), Utils.prettyTime(gestureSeekAmount.first + gestureSeekAmount.second), ), style = MaterialTheme.typography.headlineMedium.copy( shadow = Shadow(Color.Black, blurRadius = 5f), ), fontWeight = FontWeight.Bold, textAlign = TextAlign.Center, ) } (isLoading || isLoadingEpisode) && showLoadingCircle -> CircularProgressIndicator(Modifier.size(96.dp)) else -> { AnimatedVisibility( visible = controlsShown && !areControlsLocked, enter = enter, exit = exit, ) { Image( painter = rememberAnimatedVectorPainter(icon, !paused), modifier = Modifier .size(96.dp) .clip(CircleShape) .clickable( interaction, ripple(), onClick = onPlayPauseClick, ) .padding(MaterialTheme.padding.medium), contentDescription = null, ) } } } AnimatedVisibility( visible = controlsShown && !areControlsLocked, enter = enter, exit = exit, ) { if (gestureSeekAmount == null) { ControlsButton( Icons.Filled.SkipNext, onClick = onSkipNext, iconSize = 48.dp, enabled = hasNext, ) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerControls.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.FiniteAnimationSpec import androidx.compose.animation.core.LinearOutSlowInEasing import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Lock import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalRippleConfiguration import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension import eu.kanade.presentation.more.settings.screen.player.custombutton.getButtons import eu.kanade.presentation.theme.playerRippleConfiguration import eu.kanade.tachiyomi.ui.player.Dialogs import eu.kanade.tachiyomi.ui.player.Panels import eu.kanade.tachiyomi.ui.player.PlayerActivity import eu.kanade.tachiyomi.ui.player.PlayerUpdates import eu.kanade.tachiyomi.ui.player.PlayerViewModel import eu.kanade.tachiyomi.ui.player.Sheets import eu.kanade.tachiyomi.ui.player.VideoAspect import eu.kanade.tachiyomi.ui.player.controls.components.BrightnessOverlay import eu.kanade.tachiyomi.ui.player.controls.components.BrightnessSlider import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import eu.kanade.tachiyomi.ui.player.controls.components.SeekbarWithTimers import eu.kanade.tachiyomi.ui.player.controls.components.TextPlayerUpdate import eu.kanade.tachiyomi.ui.player.controls.components.VolumeSlider import eu.kanade.tachiyomi.ui.player.controls.components.sheets.toFixed import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import `is`.xyz.mpv.MPVLib import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay import kotlinx.coroutines.flow.update import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import tachiyomi.source.local.entries.anime.LocalAnimeSource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Suppress("CompositionLocalAllowlist") val LocalPlayerButtonsClickEvent = staticCompositionLocalOf { {} } @Composable fun PlayerControls( viewModel: PlayerViewModel, onBackPress: () -> Unit, modifier: Modifier = Modifier, ) { val spacing = MaterialTheme.padding val playerPreferences = remember { Injekt.get() } val gesturePreferences = remember { Injekt.get() } val audioPreferences = remember { Injekt.get() } val subtitlePreferences = remember { Injekt.get() } val interactionSource = remember { MutableInteractionSource() } val controlsShown by viewModel.controlsShown.collectAsState() val areControlsLocked by viewModel.areControlsLocked.collectAsState() val seekBarShown by viewModel.seekBarShown.collectAsState() val isLoading by viewModel.isLoading.collectAsState() val isLoadingEpisode by viewModel.isLoadingEpisode.collectAsState() val duration by viewModel.duration.collectAsState() val position by viewModel.pos.collectAsState() val paused by viewModel.paused.collectAsState() val gestureSeekAmount by viewModel.gestureSeekAmount.collectAsState() val doubleTapSeekAmount by viewModel.doubleTapSeekAmount.collectAsState() val seekText by viewModel.seekText.collectAsState() val currentChapter by viewModel.currentChapter.collectAsState() val chapters by viewModel.chapters.collectAsState() val currentBrightness by viewModel.currentBrightness.collectAsState() val playerTimeToDisappear by playerPreferences.playerTimeToDisappear().collectAsState() var isSeeking by remember { mutableStateOf(false) } var resetControls by remember { mutableStateOf(true) } val customButtons by viewModel.customButtons.collectAsState() val customButton by viewModel.primaryButton.collectAsState() LaunchedEffect( controlsShown, paused, isSeeking, resetControls, ) { if (controlsShown && !paused && !isSeeking) { delay(playerTimeToDisappear.toLong()) viewModel.hideControls() } } val transparentOverlay by animateFloatAsState( if (controlsShown && !areControlsLocked) .8f else 0f, animationSpec = playerControlsExitAnimationSpec(), label = "controls_transparent_overlay", ) GestureHandler( viewModel = viewModel, interactionSource = interactionSource, ) DoubleTapToSeekOvals(doubleTapSeekAmount, seekText, interactionSource) CompositionLocalProvider( LocalRippleConfiguration provides playerRippleConfiguration, LocalPlayerButtonsClickEvent provides { resetControls = !resetControls }, LocalContentColor provides Color.White, ) { CompositionLocalProvider( LocalLayoutDirection provides LayoutDirection.Ltr, ) { ConstraintLayout( modifier = modifier .fillMaxSize() .background( Brush.verticalGradient( Pair(0f, Color.Black), Pair(.2f, Color.Transparent), Pair(.7f, Color.Transparent), Pair(1f, Color.Black), ), alpha = transparentOverlay, ) .padding(horizontal = MaterialTheme.padding.medium), ) { val (topLeftControls, topRightControls) = createRefs() val (volumeSlider, brightnessSlider) = createRefs() val unlockControlsButton = createRef() val (bottomRightControls, bottomLeftControls) = createRefs() val centerControls = createRef() val seekbar = createRef() val (playerUpdates) = createRefs() val hasPreviousEpisode by viewModel.hasPreviousEpisode.collectAsState() val hasNextEpisode by viewModel.hasNextEpisode.collectAsState() val isBrightnessSliderShown by viewModel.isBrightnessSliderShown.collectAsState() val isVolumeSliderShown by viewModel.isVolumeSliderShown.collectAsState() val brightness by viewModel.currentBrightness.collectAsState() val volume by viewModel.currentVolume.collectAsState() val mpvVolume by viewModel.currentMPVVolume.collectAsState() val swapVolumeAndBrightness by gesturePreferences.swapVolumeBrightness().collectAsState() val reduceMotion by playerPreferences.reduceMotion().collectAsState() LaunchedEffect(volume, mpvVolume, isVolumeSliderShown) { delay(2000) if (isVolumeSliderShown) viewModel.isVolumeSliderShown.update { false } } LaunchedEffect(brightness, isBrightnessSliderShown) { delay(2000) if (isBrightnessSliderShown) viewModel.isBrightnessSliderShown.update { false } } AnimatedVisibility( isBrightnessSliderShown, enter = if (!reduceMotion) { slideInHorizontally(playerControlsEnterAnimationSpec()) { if (swapVolumeAndBrightness) -it else it } + fadeIn( playerControlsEnterAnimationSpec(), ) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutHorizontally(playerControlsExitAnimationSpec()) { if (swapVolumeAndBrightness) -it else it } + fadeOut( playerControlsExitAnimationSpec(), ) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(brightnessSlider) { if (swapVolumeAndBrightness) { start.linkTo(parent.start, spacing.medium) } else { end.linkTo(parent.end, spacing.medium) } top.linkTo(parent.top) bottom.linkTo(parent.bottom) }, ) { BrightnessSlider( brightness = brightness, positiveRange = 0f..1f, negativeRange = 0f..0.75f, ) } AnimatedVisibility( isVolumeSliderShown, enter = if (!reduceMotion) { slideInHorizontally(playerControlsEnterAnimationSpec()) { if (swapVolumeAndBrightness) it else -it } + fadeIn( playerControlsEnterAnimationSpec(), ) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutHorizontally(playerControlsExitAnimationSpec()) { if (swapVolumeAndBrightness) it else -it } + fadeOut( playerControlsExitAnimationSpec(), ) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(volumeSlider) { if (swapVolumeAndBrightness) { end.linkTo(parent.end, spacing.medium) } else { start.linkTo(parent.start, spacing.medium) } top.linkTo(parent.top) bottom.linkTo(parent.bottom) }, ) { val boostCap by audioPreferences.volumeBoostCap().collectAsState() val displayVolumeAsPercentage by playerPreferences.displayVolPer().collectAsState() VolumeSlider( volume = volume, mpvVolume = mpvVolume, range = 0..viewModel.maxVolume, boostRange = if (boostCap > 0) 0..audioPreferences.volumeBoostCap().get() else null, displayAsPercentage = displayVolumeAsPercentage, ) } val currentPlayerUpdate by viewModel.playerUpdate.collectAsState() val aspectRatio by playerPreferences.aspectState().collectAsState() LaunchedEffect(currentPlayerUpdate, aspectRatio) { if (currentPlayerUpdate is PlayerUpdates.DoubleSpeed || currentPlayerUpdate is PlayerUpdates.None) { return@LaunchedEffect } delay(2000) viewModel.playerUpdate.update { PlayerUpdates.None } } AnimatedVisibility( currentPlayerUpdate !is PlayerUpdates.None, enter = fadeIn(playerControlsEnterAnimationSpec()), exit = fadeOut(playerControlsExitAnimationSpec()), modifier = Modifier.constrainAs(playerUpdates) { linkTo(parent.start, parent.end) linkTo(parent.top, parent.bottom, bias = 0.2f) }, ) { when (currentPlayerUpdate) { // is PlayerUpdates.DoubleSpeed -> DoubleSpeedPlayerUpdate() is PlayerUpdates.AspectRatio -> TextPlayerUpdate(stringResource(aspectRatio.titleRes)) is PlayerUpdates.ShowText -> TextPlayerUpdate( (currentPlayerUpdate as PlayerUpdates.ShowText).value, ) is PlayerUpdates.ShowTextResource -> TextPlayerUpdate( stringResource((currentPlayerUpdate as PlayerUpdates.ShowTextResource).textResource), ) else -> {} } } AnimatedVisibility( controlsShown && areControlsLocked, enter = fadeIn(), exit = fadeOut(), modifier = Modifier.constrainAs(unlockControlsButton) { top.linkTo(parent.top, spacing.medium) start.linkTo(parent.start, spacing.medium) }, ) { ControlsButton( Icons.Filled.Lock, onClick = { viewModel.unlockControls() }, ) } AnimatedVisibility( visible = (controlsShown && !areControlsLocked || gestureSeekAmount != null) || isLoading || isLoadingEpisode, enter = fadeIn(playerControlsEnterAnimationSpec()), exit = fadeOut(playerControlsExitAnimationSpec()), modifier = Modifier.constrainAs(centerControls) { end.linkTo(parent.absoluteRight) start.linkTo(parent.absoluteLeft) top.linkTo(parent.top) bottom.linkTo(parent.bottom) }, ) { val showLoadingCircle by playerPreferences.showLoadingCircle().collectAsState() MiddlePlayerControls( hasPrevious = hasPreviousEpisode, onSkipPrevious = { viewModel.changeEpisode(true) }, hasNext = hasNextEpisode, onSkipNext = { viewModel.changeEpisode(false) }, isLoading = isLoading, isLoadingEpisode = isLoadingEpisode, controlsShown = controlsShown, areControlsLocked = areControlsLocked, showLoadingCircle = showLoadingCircle, paused = paused, gestureSeekAmount = gestureSeekAmount, onPlayPauseClick = viewModel::pauseUnpause, enter = fadeIn(playerControlsEnterAnimationSpec()), exit = fadeOut(playerControlsExitAnimationSpec()), ) } AnimatedVisibility( visible = (controlsShown || seekBarShown) && !areControlsLocked, enter = if (!reduceMotion) { slideInVertically(playerControlsEnterAnimationSpec()) { it } + fadeIn(playerControlsEnterAnimationSpec()) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutVertically(playerControlsExitAnimationSpec()) { it } + fadeOut(playerControlsExitAnimationSpec()) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(seekbar) { bottom.linkTo(parent.bottom, spacing.medium) }, ) { val invertDuration by playerPreferences.invertDuration().collectAsState() val readAhead by viewModel.readAhead.collectAsState() val preciseSeeking by gesturePreferences.playerSmoothSeek().collectAsState() SeekbarWithTimers( position = position, duration = duration, readAheadValue = readAhead, onValueChange = { isSeeking = true viewModel.updatePlayBackPos(it) viewModel.seekTo(it.toInt(), preciseSeeking) }, onValueChangeFinished = { isSeeking = false }, timersInverted = Pair(false, invertDuration), durationTimerOnCLick = { playerPreferences.invertDuration().set(!invertDuration) }, positionTimerOnClick = {}, chapters = chapters.map { it.toSegment() }.toImmutableList(), ) } val mediaTitle by viewModel.mediaTitle.collectAsState() val animeTitle by viewModel.animeTitle.collectAsState() AnimatedVisibility( controlsShown && !areControlsLocked, enter = if (!reduceMotion) { slideInHorizontally(playerControlsEnterAnimationSpec()) { -it } + fadeIn(playerControlsEnterAnimationSpec()) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutHorizontally(playerControlsExitAnimationSpec()) { -it } + fadeOut(playerControlsExitAnimationSpec()) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(topLeftControls) { top.linkTo(parent.top, spacing.medium) start.linkTo(parent.start) width = Dimension.fillToConstraints end.linkTo(topRightControls.start) }, ) { TopLeftPlayerControls( animeTitle = animeTitle, mediaTitle = mediaTitle, onTitleClick = { viewModel.showEpisodeListDialog() }, onBackClick = onBackPress, ) } // Top right controls val autoPlayEnabled by playerPreferences.autoplayEnabled().collectAsState() val isEpisodeOnline by viewModel.isEpisodeOnline.collectAsState() AnimatedVisibility( controlsShown && !areControlsLocked, enter = if (!reduceMotion) { slideInHorizontally(playerControlsEnterAnimationSpec()) { it } + fadeIn(playerControlsEnterAnimationSpec()) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutHorizontally(playerControlsExitAnimationSpec()) { it } + fadeOut(playerControlsExitAnimationSpec()) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(topRightControls) { top.linkTo(parent.top, spacing.medium) end.linkTo(parent.end) }, ) { TopRightPlayerControls( autoPlayEnabled = autoPlayEnabled, onToggleAutoPlay = { viewModel.setAutoPlay(it) }, onSubtitlesClick = { viewModel.showSheet(Sheets.SubtitleTracks) }, onSubtitlesLongClick = { viewModel.showPanel(Panels.SubtitleSettings) }, onAudioClick = { viewModel.showSheet(Sheets.AudioTracks) }, onAudioLongClick = { viewModel.showPanel(Panels.AudioDelay) }, onQualityClick = { viewModel.showSheet(Sheets.QualityTracks) }, isEpisodeOnline = isEpisodeOnline, onMoreClick = { viewModel.showSheet(Sheets.More) }, onMoreLongClick = { viewModel.showPanel(Panels.VideoFilters) }, ) } // Bottom right controls val skipIntroButton by viewModel.skipIntroText.collectAsState() val customButtonTitle by viewModel.primaryButtonTitle.collectAsState() AnimatedVisibility( controlsShown && !areControlsLocked, enter = if (!reduceMotion) { slideInHorizontally(playerControlsEnterAnimationSpec()) { it } + fadeIn(playerControlsEnterAnimationSpec()) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutHorizontally(playerControlsExitAnimationSpec()) { it } + fadeOut(playerControlsExitAnimationSpec()) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(bottomRightControls) { bottom.linkTo(seekbar.top) end.linkTo(seekbar.end) }, ) { val activity = LocalContext.current as PlayerActivity BottomRightPlayerControls( customButton = customButton, customButtonTitle = customButtonTitle, skipIntroButton = skipIntroButton, onPressSkipIntroButton = viewModel::onSkipIntro, isPipAvailable = activity.isPipSupportedAndEnabled, onPipClick = { if (!viewModel.isLoadingEpisode.value) { activity.enterPictureInPictureMode(activity.createPipParams()) } }, onAspectClick = { viewModel.changeVideoAspect( when (aspectRatio) { VideoAspect.Fit -> VideoAspect.Stretch VideoAspect.Stretch -> VideoAspect.Crop VideoAspect.Crop -> VideoAspect.Fit }, ) }, ) } // Bottom left controls val playbackSpeed by viewModel.playbackSpeed.collectAsState() AnimatedVisibility( controlsShown && !areControlsLocked, enter = if (!reduceMotion) { slideInHorizontally(playerControlsEnterAnimationSpec()) { -it } + fadeIn(playerControlsEnterAnimationSpec()) } else { fadeIn(playerControlsEnterAnimationSpec()) }, exit = if (!reduceMotion) { slideOutHorizontally(playerControlsExitAnimationSpec()) { -it } + fadeOut(playerControlsExitAnimationSpec()) } else { fadeOut(playerControlsExitAnimationSpec()) }, modifier = Modifier.constrainAs(bottomLeftControls) { bottom.linkTo(seekbar.top) start.linkTo(seekbar.start) width = Dimension.fillToConstraints end.linkTo(bottomRightControls.start) }, ) { BottomLeftPlayerControls( playbackSpeed, currentChapter = currentChapter?.toSegment(), onLockControls = viewModel::lockControls, onCycleRotation = viewModel::cycleScreenRotations, onPlaybackSpeedChange = { MPVLib.setPropertyDouble("speed", it.toDouble()) }, onOpenSheet = viewModel::showSheet, ) } } } val sheetShown by viewModel.sheetShown.collectAsState() val dismissSheet by viewModel.dismissSheet.collectAsState() val subtitles by viewModel.subtitleTracks.collectAsState() val selectedSubtitles by viewModel.selectedSubtitles.collectAsState() val audioTracks by viewModel.audioTracks.collectAsState() val selectedAudio by viewModel.selectedAudio.collectAsState() val isLoadingHosters by viewModel.isLoadingHosters.collectAsState() val hosterState by viewModel.hosterState.collectAsState() val expandedState by viewModel.hosterExpandedList.collectAsState() val selectedHosterVideoIndex by viewModel.selectedHosterVideoIndex.collectAsState() val decoder by viewModel.currentDecoder.collectAsState() val speed by viewModel.playbackSpeed.collectAsState() val sleepTimerTimeRemaining by viewModel.remainingTime.collectAsState() val showSubtitles by subtitlePreferences.screenshotSubtitles().collectAsState() val currentSource by viewModel.currentSource.collectAsState() val showFailedHosters by playerPreferences.showFailedHosters().collectAsState() val emptyHosters by playerPreferences.showEmptyHosters().collectAsState() PlayerSheets( sheetShown = sheetShown, subtitles = subtitles.toImmutableList(), selectedSubtitles = selectedSubtitles.toList().toImmutableList(), onAddSubtitle = viewModel::addSubtitle, onSelectSubtitle = viewModel::selectSub, audioTracks = audioTracks.toImmutableList(), selectedAudio = selectedAudio, onAddAudio = viewModel::addAudio, onSelectAudio = viewModel::selectAudio, isLoadingHosters = isLoadingHosters, hosterState = hosterState, expandedState = expandedState, selectedVideoIndex = selectedHosterVideoIndex, onClickHoster = viewModel::onHosterClicked, onClickVideo = viewModel::onVideoClicked, displayHosters = Pair(showFailedHosters, emptyHosters), chapter = currentChapter?.toSegment(), chapters = chapters.map { it.toSegment() }.toImmutableList(), onSeekToChapter = { viewModel.selectChapter(it) viewModel.dismissSheet() viewModel.unpause() }, decoder = decoder, onUpdateDecoder = viewModel::updateDecoder, speed = speed, onSpeedChange = { MPVLib.setPropertyDouble("speed", it.toFixed(2).toDouble()) }, sleepTimerTimeRemaining = sleepTimerTimeRemaining, onStartSleepTimer = viewModel::startTimer, buttons = customButtons.getButtons().toImmutableList(), isLocalSource = currentSource?.id == LocalAnimeSource.ID, showSubtitles = showSubtitles, onToggleShowSubtitles = { subtitlePreferences.screenshotSubtitles().set(it) }, cachePath = viewModel.cachePath, onSetAsArt = viewModel::setAsArt, onShare = { viewModel.shareImage(it, viewModel.pos.value.toInt()) }, onSave = { viewModel.saveImage(it, viewModel.pos.value.toInt()) }, takeScreenshot = viewModel::takeScreenshot, onDismissScreenshot = { viewModel.showSheet(Sheets.None) viewModel.unpause() }, onOpenPanel = viewModel::showPanel, onDismissRequest = { viewModel.showSheet(Sheets.None) }, dismissSheet = dismissSheet, ) val panel by viewModel.panelShown.collectAsState() PlayerPanels( panelShown = panel, onDismissRequest = { viewModel.showPanel(Panels.None) }, ) val activity = LocalContext.current as PlayerActivity val dialog by viewModel.dialogShown.collectAsState() val anime by viewModel.currentAnime.collectAsState() val playlist by viewModel.currentPlaylist.collectAsState() PlayerDialogs( dialogShown = dialog, episodeDisplayMode = anime?.displayMode, episodeList = playlist, currentEpisodeIndex = viewModel.getCurrentEpisodeIndex(), dateRelativeTime = viewModel.relativeTime, dateFormat = viewModel.dateFormat, onBookmarkClicked = viewModel::bookmarkEpisode, onFillermarkClicked = viewModel::fillermarkEpisode, onEpisodeClicked = { viewModel.showDialog(Dialogs.None) activity.changeEpisode(it) }, onDismissRequest = { viewModel.showDialog(Dialogs.None) }, ) BrightnessOverlay( brightness = currentBrightness, ) } } fun playerControlsExitAnimationSpec(): FiniteAnimationSpec = tween( durationMillis = 300, easing = FastOutSlowInEasing, ) fun playerControlsEnterAnimationSpec(): FiniteAnimationSpec = tween( durationMillis = 100, easing = LinearOutSlowInEasing, ) ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerDialogs.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.runtime.Composable import eu.kanade.tachiyomi.data.database.models.anime.Episode import eu.kanade.tachiyomi.ui.player.Dialogs import eu.kanade.tachiyomi.ui.player.controls.components.dialogs.EpisodeListDialog import eu.kanade.tachiyomi.ui.player.controls.components.dialogs.IntegerPickerDialog import java.time.format.DateTimeFormatter @Composable fun PlayerDialogs( dialogShown: Dialogs, // Episode list episodeDisplayMode: Long?, currentEpisodeIndex: Int, episodeList: List, dateRelativeTime: Boolean, dateFormat: DateTimeFormatter, onBookmarkClicked: (Long?, Boolean) -> Unit, onFillermarkClicked: (Long?, Boolean) -> Unit, onEpisodeClicked: (Long?) -> Unit, onDismissRequest: () -> Unit, ) { when (dialogShown) { Dialogs.None -> {} Dialogs.EpisodeList -> { EpisodeListDialog( displayMode = episodeDisplayMode, currentEpisodeIndex = currentEpisodeIndex, episodeList = episodeList, dateRelativeTime = dateRelativeTime, dateFormat = dateFormat, onBookmarkClicked = onBookmarkClicked, onFillermarkClicked = onFillermarkClicked, onEpisodeClicked = onEpisodeClicked, onDismissRequest = onDismissRequest, ) } is Dialogs.IntegerPicker -> { IntegerPickerDialog( defaultValue = dialogShown.defaultValue, minValue = dialogShown.minValue, maxValue = dialogShown.maxValue, step = dialogShown.step, nameFormat = dialogShown.nameFormat, title = dialogShown.title, onChange = dialogShown.onChange, onDismissRequest = dialogShown.onDismissRequest, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerPanels.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.animation.AnimatedContent import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.togetherWith import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.material3.CardColors import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.ui.player.Panels import eu.kanade.tachiyomi.ui.player.controls.components.panels.AudioDelayPanel import eu.kanade.tachiyomi.ui.player.controls.components.panels.SubtitleDelayPanel import eu.kanade.tachiyomi.ui.player.controls.components.panels.SubtitleSettingsPanel import eu.kanade.tachiyomi.ui.player.controls.components.panels.VideoFiltersPanel import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun PlayerPanels( panelShown: Panels, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { AnimatedContent( targetState = panelShown, label = "panels", contentAlignment = Alignment.CenterEnd, contentKey = { it.name }, transitionSpec = { fadeIn() + slideInHorizontally { it / 3 } togetherWith fadeOut() + slideOutHorizontally { it / 2 } }, modifier = modifier, ) { currentPanel -> when (currentPanel) { Panels.None -> { Box(Modifier.fillMaxHeight()) } Panels.SubtitleSettings -> { SubtitleSettingsPanel(onDismissRequest) } Panels.SubtitleDelay -> { SubtitleDelayPanel(onDismissRequest) } Panels.AudioDelay -> { AudioDelayPanel(onDismissRequest) } Panels.VideoFilters -> { VideoFiltersPanel(onDismissRequest) } } } } val CARDS_MAX_WIDTH = 420.dp val panelCardsColors: @Composable () -> CardColors = { val playerPreferences = remember { Injekt.get() } val colors = CardDefaults.cardColors() colors.copy( containerColor = MaterialTheme.colorScheme.surface.copy(playerPreferences.panelOpacity().get() / 100f), disabledContainerColor = MaterialTheme.colorScheme.surfaceDim.copy( playerPreferences.panelOpacity().get() / 100f, ), ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerSheets.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import dev.vivvvek.seeker.Segment import eu.kanade.tachiyomi.ui.player.ArtType import eu.kanade.tachiyomi.ui.player.Decoder import eu.kanade.tachiyomi.ui.player.Panels import eu.kanade.tachiyomi.ui.player.PlayerViewModel.VideoTrack import eu.kanade.tachiyomi.ui.player.Sheets import eu.kanade.tachiyomi.ui.player.controls.components.sheets.AudioTracksSheet import eu.kanade.tachiyomi.ui.player.controls.components.sheets.ChaptersSheet import eu.kanade.tachiyomi.ui.player.controls.components.sheets.HosterState import eu.kanade.tachiyomi.ui.player.controls.components.sheets.MoreSheet import eu.kanade.tachiyomi.ui.player.controls.components.sheets.PlaybackSpeedSheet import eu.kanade.tachiyomi.ui.player.controls.components.sheets.QualitySheet import eu.kanade.tachiyomi.ui.player.controls.components.sheets.ScreenshotSheet import eu.kanade.tachiyomi.ui.player.controls.components.sheets.SubtitlesSheet import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import tachiyomi.domain.custombuttons.model.CustomButton import java.io.InputStream @Composable fun PlayerSheets( sheetShown: Sheets, // subtitles sheet subtitles: ImmutableList, selectedSubtitles: ImmutableList, onAddSubtitle: (Uri) -> Unit, onSelectSubtitle: (Int) -> Unit, // audio sheet audioTracks: ImmutableList, selectedAudio: Int, onAddAudio: (Uri) -> Unit, onSelectAudio: (Int) -> Unit, // video sheet isLoadingHosters: Boolean, hosterState: List, expandedState: List, selectedVideoIndex: Pair, onClickHoster: (Int) -> Unit, onClickVideo: (Int, Int) -> Unit, displayHosters: Pair, // chapters sheet chapter: Segment?, chapters: ImmutableList, onSeekToChapter: (Int) -> Unit, // Decoders sheet decoder: Decoder, onUpdateDecoder: (Decoder) -> Unit, // Speed sheet speed: Float, onSpeedChange: (Float) -> Unit, // More sheet sleepTimerTimeRemaining: Int, onStartSleepTimer: (Int) -> Unit, buttons: ImmutableList, // Screenshot sheet isLocalSource: Boolean, showSubtitles: Boolean, onToggleShowSubtitles: (Boolean) -> Unit, cachePath: String, onSetAsArt: (ArtType, (() -> InputStream)) -> Unit, onShare: (() -> InputStream) -> Unit, onSave: (() -> InputStream) -> Unit, takeScreenshot: (String, Boolean) -> InputStream?, onDismissScreenshot: () -> Unit, onOpenPanel: (Panels) -> Unit, onDismissRequest: () -> Unit, dismissSheet: Boolean, ) { when (sheetShown) { Sheets.None -> {} Sheets.SubtitleTracks -> { val subtitlesPicker = rememberLauncherForActivityResult( ActivityResultContracts.OpenDocument(), ) { if (it == null) return@rememberLauncherForActivityResult onAddSubtitle(it) } SubtitlesSheet( tracks = subtitles.toImmutableList(), selectedTracks = selectedSubtitles, onSelect = onSelectSubtitle, onAddSubtitle = { subtitlesPicker.launch(arrayOf("*/*")) }, onOpenSubtitleSettings = { onOpenPanel(Panels.SubtitleSettings) }, onOpenSubtitleDelay = { onOpenPanel(Panels.SubtitleDelay) }, onDismissRequest = onDismissRequest, ) } Sheets.AudioTracks -> { val audioPicker = rememberLauncherForActivityResult( ActivityResultContracts.OpenDocument(), ) { if (it == null) return@rememberLauncherForActivityResult onAddAudio(it) } AudioTracksSheet( tracks = audioTracks, selectedId = selectedAudio, onSelect = onSelectAudio, onAddAudioTrack = { audioPicker.launch(arrayOf("*/*")) }, onOpenDelayPanel = { onOpenPanel(Panels.AudioDelay) }, onDismissRequest = onDismissRequest, ) } Sheets.QualityTracks -> { QualitySheet( isLoadingHosters = isLoadingHosters, hosterState = hosterState, expandedState = expandedState, selectedVideoIndex = selectedVideoIndex, onClickHoster = onClickHoster, onClickVideo = onClickVideo, displayHosters = displayHosters, onDismissRequest = onDismissRequest, dismissSheet = dismissSheet, ) } Sheets.Chapters -> { if (chapter == null) return ChaptersSheet( chapters = chapters, currentChapter = chapter, onClick = { onSeekToChapter(chapters.indexOf(it)) }, onDismissRequest = onDismissRequest, dismissSheet = dismissSheet, ) } Sheets.More -> { MoreSheet( selectedDecoder = decoder, onSelectDecoder = onUpdateDecoder, remainingTime = sleepTimerTimeRemaining, onStartTimer = onStartSleepTimer, onDismissRequest = onDismissRequest, onEnterFiltersPanel = { onOpenPanel(Panels.VideoFilters) }, customButtons = buttons, ) } Sheets.PlaybackSpeed -> { PlaybackSpeedSheet( speed, onSpeedChange = onSpeedChange, onDismissRequest = onDismissRequest, ) } Sheets.Screenshot -> { ScreenshotSheet( isLocalSource = isLocalSource, hasSubTracks = subtitles.isNotEmpty(), showSubtitles = showSubtitles, onToggleShowSubtitles = onToggleShowSubtitles, cachePath = cachePath, onSetAsArt = onSetAsArt, onShare = onShare, onSave = onSave, takeScreenshot = takeScreenshot, onDismissRequest = onDismissScreenshot, ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/TopLeftPlayerControls.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.sp import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import tachiyomi.presentation.core.components.material.padding @Composable fun TopLeftPlayerControls( animeTitle: String, mediaTitle: String, onTitleClick: () -> Unit, onBackClick: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.mediumSmall), ) { ControlsButton( icon = Icons.AutoMirrored.Default.ArrowBack, onClick = onBackClick, ) Column( verticalArrangement = Arrangement.spacedBy(-MaterialTheme.padding.extraSmall), modifier = Modifier .clickable(onClick = onTitleClick), ) { Text( animeTitle, fontSize = 16.sp, maxLines = 1, overflow = TextOverflow.Ellipsis, color = Color.White, style = MaterialTheme.typography.bodyLarge, ) Text( mediaTitle, fontSize = 14.sp, maxLines = 1, overflow = TextOverflow.Ellipsis, color = Color.White.copy(alpha = 0.5f), style = MaterialTheme.typography.bodyLarge, fontStyle = FontStyle.Italic, ) } } } @Preview @Composable fun TopLeftPlayerControlsPreview() { TopLeftPlayerControls( animeTitle = "Bleach", mediaTitle = "Episode 1 - A Shinigami is born", onTitleClick = {}, onBackClick = {}, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/TopRightPlayerControls.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Audiotrack import androidx.compose.material.icons.filled.HighQuality import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.Subtitles import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.ui.player.controls.components.AutoPlaySwitch import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import tachiyomi.presentation.core.components.material.padding @Composable fun TopRightPlayerControls( // auto-play autoPlayEnabled: Boolean, onToggleAutoPlay: (Boolean) -> Unit, // subtitles onSubtitlesClick: () -> Unit, onSubtitlesLongClick: () -> Unit, // audio onAudioClick: () -> Unit, onAudioLongClick: () -> Unit, // video onQualityClick: () -> Unit, isEpisodeOnline: Boolean?, // more onMoreClick: () -> Unit, onMoreLongClick: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier, verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Absolute.SpaceEvenly, ) { AutoPlaySwitch( isChecked = autoPlayEnabled, onToggleAutoPlay = onToggleAutoPlay, modifier = Modifier .padding(vertical = MaterialTheme.padding.medium, horizontal = MaterialTheme.padding.mediumSmall) .size(width = 48.dp, height = 24.dp), ) ControlsButton( icon = Icons.Default.Subtitles, onClick = onSubtitlesClick, onLongClick = onSubtitlesLongClick, horizontalSpacing = MaterialTheme.padding.mediumSmall, ) ControlsButton( icon = Icons.Default.Audiotrack, onClick = onAudioClick, onLongClick = onAudioLongClick, horizontalSpacing = MaterialTheme.padding.mediumSmall, ) if (isEpisodeOnline == true) { ControlsButton( icon = Icons.Default.HighQuality, onClick = onQualityClick, onLongClick = onQualityClick, horizontalSpacing = MaterialTheme.padding.mediumSmall, ) } ControlsButton( icon = Icons.Default.MoreVert, onClick = onMoreClick, onLongClick = onMoreLongClick, horizontalSpacing = MaterialTheme.padding.mediumSmall, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/AutoPlaySwitch.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.indication import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.PauseCircle import androidx.compose.material.icons.filled.PlayCircle import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ShapeDefaults import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.BiasAlignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.ui.player.controls.LocalPlayerButtonsClickEvent @Composable fun AutoPlaySwitch( isChecked: Boolean, onToggleAutoPlay: (Boolean) -> Unit, modifier: Modifier = Modifier, iconSize: Dp = 24.dp, ) { val interactionSource = remember { MutableInteractionSource() } val clickEvent = LocalPlayerButtonsClickEvent.current val alignment = remember { Animatable(if (isChecked) 1f else -1f) } LaunchedEffect(isChecked) { alignment.animateTo( targetValue = if (isChecked) 1f else -1f, animationSpec = tween(durationMillis = 250), ) } val (thumbIcon, thumbColor, trackColor) = if (isChecked) { Triple( Icons.Filled.PlayCircle, MaterialTheme.colorScheme.primary, MaterialTheme.colorScheme.secondaryContainer, ) } else { Triple( Icons.Filled.PauseCircle, Color.White, Color.LightGray, ) } Box( modifier = modifier.clickable( interactionSource = interactionSource, indication = null, ) { clickEvent() onToggleAutoPlay(!isChecked) }, contentAlignment = Alignment.Center, ) { Box( modifier = Modifier .fillMaxWidth(fraction = 5 / 6f) .fillMaxHeight(fraction = 2 / 3f) .background(color = trackColor, shape = ShapeDefaults.ExtraLarge), ) Icon( imageVector = thumbIcon, contentDescription = null, modifier = Modifier .size(iconSize) .background(color = Color.Unspecified, shape = CircleShape) .indication(interactionSource, ripple(bounded = false, radius = iconSize * 2 / 3)) .align(BiasAlignment(horizontalBias = alignment.value, verticalBias = 0f)), tint = thumbColor, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/BrightnessOverlay.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.annotation.FloatRange import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import kotlin.math.abs @Composable fun BrightnessOverlay( @FloatRange(from = -0.75, to = 1.0) brightness: Float, modifier: Modifier = Modifier, ) { if (brightness < 0) { val brightnessAlpha = remember(brightness) { abs(brightness) } Canvas( modifier = modifier .fillMaxSize() .graphicsLayer { alpha = brightnessAlpha }, ) { drawRect(Color.Black) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/ControlsButton.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.indication import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CatchingPokemon import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.ui.player.controls.LocalPlayerButtonsClickEvent import tachiyomi.presentation.core.components.material.Button import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding @Composable fun ControlsButton( icon: ImageVector, onClick: () -> Unit, onLongClick: () -> Unit = {}, title: String? = null, color: Color = Color.White, horizontalSpacing: Dp = MaterialTheme.padding.medium, iconSize: Dp = 20.dp, enabled: Boolean = true, modifier: Modifier = Modifier, ) { val interactionSource = remember { MutableInteractionSource() } val clickEvent = LocalPlayerButtonsClickEvent.current val iconColor = if (enabled) color else color.copy(alpha = DISABLED_ALPHA) Box( modifier = modifier .combinedClickable( enabled = enabled, onClick = { clickEvent() onClick() }, onLongClick = onLongClick, interactionSource = interactionSource, indication = null, ) .clip(CircleShape) .indication( interactionSource, ripple(), ) .padding( vertical = MaterialTheme.padding.medium, horizontal = horizontalSpacing, ), ) { Icon( icon, title, tint = iconColor, modifier = Modifier.size(iconSize), ) } } @Composable fun ControlsButton( text: String, onClick: () -> Unit, modifier: Modifier = Modifier, onLongClick: () -> Unit = {}, color: Color = Color.White, ) { val interactionSource = remember { MutableInteractionSource() } val clickEvent = LocalPlayerButtonsClickEvent.current Box( modifier = modifier .combinedClickable( onClick = { clickEvent() onClick() }, onLongClick = onLongClick, interactionSource = interactionSource, indication = null, ) .clip(CircleShape) .indication( interactionSource, ripple(), ) .padding(MaterialTheme.padding.medium), ) { Text( text, color = color, style = MaterialTheme.typography.bodyMedium, ) } } @Composable fun FilledControlsButton( text: String, onClick: () -> Unit, onLongClick: () -> Unit, modifier: Modifier = Modifier, ) { val interactionSource = remember { MutableInteractionSource() } val clickEvent = LocalPlayerButtonsClickEvent.current Box( modifier = modifier.padding(end = MaterialTheme.padding.small), ) { Button(onClick = {}) { Text(text = text) } Box( modifier = Modifier .matchParentSize() .combinedClickable( onClick = { clickEvent() onClick() }, onLongClick = onLongClick, interactionSource = interactionSource, indication = null, ), ) } } @Preview @Composable private fun PreviewControlsButton() { ControlsButton( Icons.Default.CatchingPokemon, onClick = {}, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/CurrentChapter.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.animation.AnimatedContent import androidx.compose.animation.SizeTransform import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bookmarks import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import dev.vivvvek.seeker.Segment import `is`.xyz.mpv.Utils import tachiyomi.presentation.core.components.material.padding @Composable fun CurrentChapter( chapter: Segment, modifier: Modifier = Modifier, onClick: () -> Unit = {}, ) { Box( modifier = modifier .clip(RoundedCornerShape(25)) .background(MaterialTheme.colorScheme.background.copy(alpha = 0.6F)) .clickable(onClick = onClick) .padding(horizontal = MaterialTheme.padding.mediumSmall, vertical = MaterialTheme.padding.small), ) { AnimatedContent( targetState = chapter, transitionSpec = { if (targetState.start > initialState.start) { (slideInVertically { height -> height } + fadeIn()) .togetherWith(slideOutVertically { height -> -height } + fadeOut()) } else { (slideInVertically { height -> -height } + fadeIn()) .togetherWith(slideOutVertically { height -> height } + fadeOut()) }.using( SizeTransform(clip = false), ) }, label = "Chapter", ) { currentChapter -> Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Icon( imageVector = Icons.Default.Bookmarks, contentDescription = null, modifier = Modifier .padding(end = MaterialTheme.padding.extraSmall) .size(16.dp), tint = MaterialTheme.colorScheme.onBackground, ) Text( text = Utils.prettyTime(currentChapter.start.toInt()), fontWeight = FontWeight.ExtraBold, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Clip, color = MaterialTheme.colorScheme.tertiary, ) currentChapter.name.let { Text( text = Typography.bullet.toString(), textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, maxLines = 1, color = MaterialTheme.colorScheme.onSurface, overflow = TextOverflow.Clip, ) Text( text = it, textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onBackground, ) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/DoubleTapSeekTriangles.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.rotate import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.R @Composable fun DoubleTapSeekTriangles(isForward: Boolean) { val animationDuration = 750L val alpha1 = remember { Animatable(0f) } val alpha2 = remember { Animatable(0f) } val alpha3 = remember { Animatable(0f) } LaunchedEffect(animationDuration) { while (true) { alpha1.animateTo(1f, animationSpec = tween((animationDuration / 5).toInt())) alpha2.animateTo(1f, animationSpec = tween((animationDuration / 5).toInt())) alpha3.animateTo(1f, animationSpec = tween((animationDuration / 5).toInt())) alpha1.animateTo(0f, animationSpec = tween((animationDuration / 5).toInt())) alpha2.animateTo(0f, animationSpec = tween((animationDuration / 5).toInt())) alpha3.animateTo(0f, animationSpec = tween((animationDuration / 5).toInt())) } } val rotation = if (isForward) 0f else 180f Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.rotate(rotation), ) { DoubleTapArrow(alpha1.value) DoubleTapArrow(alpha2.value) DoubleTapArrow(alpha3.value) } } @Composable private fun DoubleTapArrow( alpha: Float, ) { Icon( painter = painterResource(R.drawable.ic_play_seek_triangle), contentDescription = null, modifier = Modifier .size(width = 16.dp, height = 20.dp) .alpha(alpha = alpha), tint = Color.White, ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/PlayerUpdates.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import tachiyomi.presentation.core.components.material.padding @Composable fun PlayerUpdate( modifier: Modifier = Modifier, content: @Composable () -> Unit = {}, ) { Box( modifier = modifier .clip(RoundedCornerShape(16.dp)) .background(Color.Black.copy(0.4f)) .padding(vertical = MaterialTheme.padding.small, horizontal = MaterialTheme.padding.medium) .animateContentSize(), contentAlignment = Alignment.Center, ) { content() } } @Composable fun TextPlayerUpdate( text: String, modifier: Modifier = Modifier, ) { PlayerUpdate(modifier) { Text(text) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/SeekBar.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import dev.vivvvek.seeker.Seeker import dev.vivvvek.seeker.SeekerDefaults import dev.vivvvek.seeker.Segment import eu.kanade.tachiyomi.animesource.model.ChapterType import eu.kanade.tachiyomi.ui.player.controls.LocalPlayerButtonsClickEvent import `is`.xyz.mpv.Utils import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import tachiyomi.presentation.core.components.material.padding @Immutable data class IndexedSegment( val name: String, val start: Float, val color: Color = Color.Unspecified, val index: Int = 0, val chapterType: ChapterType = ChapterType.Other, ) { companion object { val Unspecified = IndexedSegment(name = "", start = 0f) } fun toSegment(): Segment = Segment(name, start, color) } @Composable fun SeekbarWithTimers( position: Float, duration: Float, readAheadValue: Float, onValueChange: (Float) -> Unit, onValueChangeFinished: () -> Unit, timersInverted: Pair, positionTimerOnClick: () -> Unit, durationTimerOnCLick: () -> Unit, chapters: ImmutableList, modifier: Modifier = Modifier, ) { val clickEvent = LocalPlayerButtonsClickEvent.current Row( modifier = modifier.height(48.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { VideoTimer( value = position, timersInverted.first, onClick = { clickEvent() positionTimerOnClick() }, modifier = Modifier.width(92.dp), ) Seeker( value = position.coerceIn(0f, duration), range = 0f..duration, onValueChange = onValueChange, onValueChangeFinished = onValueChangeFinished, readAheadValue = readAheadValue, segments = chapters .filter { it.start in 0f..duration } .let { // add an extra segment at 0 if it doesn't exist. if (it.isNotEmpty() && it[0].start != 0f) { persistentListOf(Segment("", 0f)) + it } else { it } + it }, modifier = Modifier.weight(1f), colors = SeekerDefaults.seekerColors( progressColor = MaterialTheme.colorScheme.primary, thumbColor = MaterialTheme.colorScheme.primary, trackColor = MaterialTheme.colorScheme.background, readAheadColor = MaterialTheme.colorScheme.inversePrimary, ), ) VideoTimer( value = if (timersInverted.second) position - duration else duration, isInverted = timersInverted.second, onClick = { clickEvent() durationTimerOnCLick() }, modifier = Modifier.width(92.dp), ) } } @Composable fun VideoTimer( value: Float, isInverted: Boolean, modifier: Modifier = Modifier, onClick: () -> Unit = {}, ) { val interactionSource = remember { MutableInteractionSource() } Text( modifier = modifier .fillMaxHeight() .clickable( interactionSource = interactionSource, indication = ripple(), onClick = onClick, ) .wrapContentHeight(Alignment.CenterVertically), text = Utils.prettyTime(value.toInt(), isInverted), color = Color.White, textAlign = TextAlign.Center, ) } @Preview @Composable private fun PreviewSeekBar() { SeekbarWithTimers( 5f, 20f, 4f, {}, {}, Pair(false, true), {}, {}, persistentListOf(), ) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/VerticalSliders.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.VolumeDown import androidx.compose.material.icons.automirrored.filled.VolumeMute import androidx.compose.material.icons.automirrored.filled.VolumeOff import androidx.compose.material.icons.automirrored.filled.VolumeUp import androidx.compose.material.icons.filled.BrightnessHigh import androidx.compose.material.icons.filled.BrightnessLow import androidx.compose.material.icons.filled.BrightnessMedium import androidx.compose.material.icons.filled.ModeNight import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import tachiyomi.presentation.core.components.material.padding import java.text.NumberFormat import kotlin.math.roundToInt private fun percentage(value: Float, range: ClosedFloatingPointRange): Float { return ((value - range.start) / (range.endInclusive - range.start)).coerceIn(0f, 1f) } private fun percentage(value: Int, range: ClosedRange): Float { return ((value - range.start).toFloat() / (range.endInclusive - range.start)).coerceIn(0f, 1f) } @Composable fun VerticalSlider( value: Float, range: ClosedFloatingPointRange, modifier: Modifier = Modifier, overflowValue: Float? = null, overflowRange: ClosedFloatingPointRange? = null, ) { require(range.contains(value)) { "Value must be within the provided range" } VerticalSliderInternal( percentage = percentage(value, range), overflowPercentage = overflowValue?.let { ov -> overflowRange?.let { or -> percentage(ov, or) } }, modifier = modifier, ) } @Composable fun VerticalSlider( value: Int, range: ClosedRange, modifier: Modifier = Modifier, overflowValue: Int? = null, overflowRange: ClosedRange? = null, ) { require(range.contains(value)) { "Value must be within the provided range" } VerticalSliderInternal( percentage = percentage(value, range), overflowPercentage = overflowValue?.let { ov -> overflowRange?.let { or -> percentage(ov, or) } }, modifier = modifier, ) } @Composable private fun VerticalSliderInternal( percentage: Float, modifier: Modifier = Modifier, overflowPercentage: Float? = null, ) { Box( modifier = modifier.height(120.dp).aspectRatio(0.45f), contentAlignment = Alignment.BottomCenter, ) { Box( modifier = modifier .fillMaxWidth(fraction = 0.5f) .fillMaxHeight() .clip(RoundedCornerShape(16.dp)) .background(MaterialTheme.colorScheme.background), contentAlignment = Alignment.BottomCenter, ) { val targetHeight by animateFloatAsState(percentage, label = "vsliderheight") Box( modifier = Modifier .fillMaxWidth() .fillMaxHeight(targetHeight) .background(MaterialTheme.colorScheme.tertiary), ) if (overflowPercentage != null) { val overflowHeight by animateFloatAsState( targetValue = overflowPercentage, label = "vslideroverflowheight", ) Box( modifier = Modifier .fillMaxWidth() .fillMaxHeight(overflowHeight) .background(MaterialTheme.colorScheme.errorContainer), ) } } } } @Composable fun BrightnessSlider( brightness: Float, positiveRange: ClosedFloatingPointRange, negativeRange: ClosedFloatingPointRange, modifier: Modifier = Modifier, ) { Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Text( text = (brightness * 100).toInt().toString(), style = MaterialTheme.typography.bodySmall, textAlign = TextAlign.Center, ) VerticalSlider( value = brightness.coerceIn(0f, 1f), range = positiveRange, overflowRange = negativeRange, overflowValue = (-brightness).coerceIn(0f..0.75f), ) Icon( imageVector = when (percentage(brightness, positiveRange)) { in -1f..0f -> Icons.Default.ModeNight in 0f..0.3f -> Icons.Default.BrightnessLow in 0.3f..0.6f -> Icons.Default.BrightnessMedium in 0.6f..1f -> Icons.Default.BrightnessHigh else -> Icons.Default.BrightnessMedium }, contentDescription = null, ) } } @Composable fun VolumeSlider( volume: Int, mpvVolume: Int, range: ClosedRange, boostRange: ClosedRange?, modifier: Modifier = Modifier, displayAsPercentage: Boolean = false, ) { val percentage = (percentage(volume, range) * 100).roundToInt() Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { val boostVolume = mpvVolume - 100 val (deviceVolumeString, boostVolumeString) = getVolumeSliderText( volume, boostVolume, percentage, displayAsPercentage, ) Text( text = deviceVolumeString, style = MaterialTheme.typography.bodySmall, textAlign = TextAlign.Center, ) Box { VerticalSlider( value = if (displayAsPercentage) percentage else volume, range = if (displayAsPercentage) 0..100 else range, overflowValue = boostVolume, overflowRange = boostRange, ) Text( text = boostVolumeString, style = MaterialTheme.typography.labelSmall.copy( shadow = Shadow( color = Color.Black, offset = Offset(1f, 1f), blurRadius = 4f, ), ), modifier = Modifier .align(Alignment.TopCenter) .padding(horizontal = 4.dp, vertical = 4.dp), ) } Icon( imageVector = when (percentage) { 0 -> Icons.AutoMirrored.Default.VolumeOff in 0..30 -> Icons.AutoMirrored.Default.VolumeMute in 30..60 -> Icons.AutoMirrored.Default.VolumeDown in 60..100 -> Icons.AutoMirrored.Default.VolumeUp else -> Icons.AutoMirrored.Default.VolumeOff }, contentDescription = null, ) } } val getVolumeSliderText: @Composable (Int, Int, Int, Boolean) -> Pair = { volume, boostVolume, percentageInt, displayAsPercentage -> val percentFormat = remember { NumberFormat.getPercentInstance() } val integerFormat = remember { NumberFormat.getIntegerInstance() } val percentage = percentageInt / 100f val deviceVolumeString = if (displayAsPercentage) { percentFormat.format(percentage) } else { integerFormat.format(volume) } val boostVolumeString = when (boostVolume) { 0 -> "" in 0..1000 -> "+${integerFormat.format(boostVolume)}" in -100..-1 -> "-${integerFormat.format(-boostVolume)}" else -> integerFormat.format(boostVolume) } Pair(deviceVolumeString, boostVolumeString) } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/dialogs/EpisodeListDialog.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components.dialogs import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Label import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.entries.components.DotSeparatorText import eu.kanade.presentation.util.formatEpisodeNumber import eu.kanade.tachiyomi.data.database.models.anime.Episode import eu.kanade.tachiyomi.util.lang.toRelativeString import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.VerticalFastScroller import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import java.time.Instant import java.time.LocalDate import java.time.ZoneId import java.time.format.DateTimeFormatter @Composable fun EpisodeListDialog( displayMode: Long?, currentEpisodeIndex: Int, episodeList: List, dateRelativeTime: Boolean, dateFormat: DateTimeFormatter, onBookmarkClicked: (Long?, Boolean) -> Unit, onFillermarkClicked: (Long?, Boolean) -> Unit, onEpisodeClicked: (Long?) -> Unit, onDismissRequest: () -> Unit, ) { val context = LocalContext.current val itemScrollIndex = (episodeList.size - currentEpisodeIndex) - 1 val episodeListState = rememberLazyListState(initialFirstVisibleItemIndex = itemScrollIndex) PlayerDialog( title = stringResource(AYMR.strings.episodes), modifier = Modifier.fillMaxHeight(fraction = 0.8F).fillMaxWidth(fraction = 0.8F), onDismissRequest = onDismissRequest, ) { VerticalFastScroller( listState = episodeListState, ) { LazyColumn( modifier = Modifier.fillMaxHeight(), state = episodeListState, ) { items( items = episodeList.reversed(), key = { "episode-${it.id}" }, contentType = { "episode" }, ) { episode -> val isCurrentEpisode = episode.id == episodeList[currentEpisodeIndex].id val title = if (displayMode == Anime.EPISODE_DISPLAY_NUMBER) { stringResource( AYMR.strings.display_mode_episode, formatEpisodeNumber(episode.episode_number.toDouble()), ) } else { episode.name } val date = episode.date_upload .takeIf { it > 0L } ?.let { LocalDate.ofInstant( Instant.ofEpochMilli(it), ZoneId.systemDefault(), ).toRelativeString( context = context, relative = dateRelativeTime, dateFormat = dateFormat, ) } ?: "" EpisodeListItem( episode = episode, isCurrentEpisode = isCurrentEpisode, title = title, date = date, onBookmarkClicked = onBookmarkClicked, onFillermarkClicked = onFillermarkClicked, onEpisodeClicked = onEpisodeClicked, ) } } } } } @Composable private fun EpisodeListItem( episode: Episode, isCurrentEpisode: Boolean, title: String, date: String?, onBookmarkClicked: (Long?, Boolean) -> Unit, onFillermarkClicked: (Long?, Boolean) -> Unit, onEpisodeClicked: (Long?) -> Unit, ) { var isBookmarked by remember { mutableStateOf(episode.bookmark) } var isFillermarked by remember { mutableStateOf(episode.fillermark) } var textHeight by remember { mutableStateOf(0) } val defaultColor = MaterialTheme.colorScheme.onSurface val bookmarkAlpha = if (isBookmarked) 1f else DISABLED_ALPHA val bookmarkColor = if (isBookmarked) MaterialTheme.colorScheme.primary else defaultColor val fillermarkAlpha = if (isFillermarked) 1f else DISABLED_ALPHA val fillermarkColor = if (isFillermarked) MaterialTheme.colorScheme.tertiary else defaultColor val episodeColor = if (isBookmarked) { bookmarkColor } else if (isFillermarked) { fillermarkColor } else { defaultColor } val textAlpha = if (episode.seen) DISABLED_ALPHA else 1f val textWeight = if (isCurrentEpisode) FontWeight.Bold else FontWeight.Normal val textStyle = if (isCurrentEpisode) FontStyle.Italic else FontStyle.Normal val clickBookmark: (Boolean) -> Unit = { bookmarked -> episode.bookmark = bookmarked isBookmarked = bookmarked onBookmarkClicked(episode.id, bookmarked) } val clickFillermark: (Boolean) -> Unit = { fillermarked -> episode.fillermark = fillermarked isFillermarked = fillermarked onFillermarkClicked(episode.id, fillermarked) } Row( modifier = Modifier .fillMaxWidth() .clickable(onClick = { onEpisodeClicked(episode.id) }) .padding(vertical = MaterialTheme.padding.extraSmall), ) { IconButton(onClick = { clickBookmark(!isBookmarked) }) { Icon( imageVector = Icons.Filled.Bookmark, contentDescription = null, tint = bookmarkColor, modifier = Modifier .sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }) .alpha(bookmarkAlpha), ) } IconButton(onClick = { clickFillermark(!isFillermarked) }) { Icon( imageVector = Icons.AutoMirrored.Filled.Label, contentDescription = null, tint = fillermarkColor, modifier = Modifier .sizeIn(maxHeight = with(LocalDensity.current) { textHeight.toDp() - 2.dp }) .alpha(fillermarkAlpha), ) } Spacer(modifier = Modifier.width(2.dp)) Column { Text( text = title, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, color = episodeColor, modifier = Modifier.alpha(textAlpha), onTextLayout = { textHeight = it.size.height }, fontWeight = textWeight, fontStyle = textStyle, ) Row( verticalAlignment = Alignment.CenterVertically, ) { if (date != null) { Text( text = date, style = MaterialTheme.typography.labelMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, color = episodeColor, modifier = Modifier.alpha(textAlpha), fontWeight = textWeight, fontStyle = textStyle, ) if (episode.scanlator != null) { DotSeparatorText( modifier = Modifier.alpha(textAlpha), ) } } if (episode.scanlator != null) { Text( text = episode.scanlator!!, style = MaterialTheme.typography.labelMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, color = episodeColor, modifier = Modifier.alpha(textAlpha), fontWeight = textWeight, fontStyle = textStyle, ) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/dialogs/IntegerPickerDialog.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components.dialogs import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import kotlinx.collections.immutable.toImmutableList import tachiyomi.presentation.core.components.WheelTextPicker @Composable fun IntegerPickerDialog( defaultValue: Int, minValue: Int, maxValue: Int, step: Int, nameFormat: String, title: String, onChange: (Int) -> Unit, onDismissRequest: () -> Unit, ) { var newValue = defaultValue val values = (minValue..maxValue step step).toList() val items = values.map { String.format(nameFormat, it) }.toImmutableList() PlayerDialog( title = title, modifier = Modifier.fillMaxWidth(fraction = 0.5f), onConfirmRequest = null, onDismissRequest = { onChange(newValue) onDismissRequest() }, ) { Box( modifier = Modifier.fillMaxWidth(), ) { WheelTextPicker( modifier = Modifier.align(Alignment.Center), items = items, onSelectionChanged = { newValue = values[it] }, startIndex = values.indexOfFirst { it == defaultValue }.coerceAtLeast(0), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/dialogs/PlayerDialog.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components.dialogs import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.TextButton import tachiyomi.presentation.core.i18n.stringResource @Composable fun PlayerDialog( title: String, modifier: Modifier = Modifier, onConfirmRequest: (() -> Unit)? = null, onDismissRequest: () -> Unit, content: @Composable (() -> Unit)? = null, ) { val onConfirm = { onConfirmRequest?.invoke() onDismissRequest() } BasicAlertDialog( onDismissRequest = onDismissRequest, modifier = modifier, properties = DialogProperties( dismissOnBackPress = true, dismissOnClickOutside = true, usePlatformDefaultWidth = false, decorFitsSystemWindows = false, ), ) { Surface( shape = MaterialTheme.shapes.large, modifier = Modifier.fillMaxWidth(), tonalElevation = 1.dp, ) { Column(modifier = Modifier.padding(16.dp)) { Text( text = title, style = MaterialTheme.typography.titleLarge, color = MaterialTheme.colorScheme.onSurface, ) content?.invoke() if (onConfirmRequest != null) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, ) { TextButton(onClick = onDismissRequest) { Text(stringResource(MR.strings.action_cancel)) } TextButton(onClick = onConfirm) { Text(stringResource(MR.strings.action_ok)) } } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/AudioDelayPanel.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import `is`.xyz.mpv.MPVLib import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun AudioDelayPanel( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { val preferences = remember { Injekt.get() } ConstraintLayout( modifier = modifier .fillMaxSize() .padding(MaterialTheme.padding.medium), ) { val delayControlCard = createRef() var delay by remember { mutableIntStateOf((MPVLib.getPropertyDouble("audio-delay") * 1000).toInt()) } LaunchedEffect(delay) { MPVLib.setPropertyDouble("audio-delay", delay / 1000.0) } DelayCard( delay = delay, onDelayChange = { delay = it }, onApply = { preferences.audioDelay().set(delay) }, onReset = { delay = 0 }, title = { AudioDelayCardTitle(onClose = onDismissRequest) }, delayType = DelayType.Audio, modifier = Modifier.constrainAs(delayControlCard) { linkTo(parent.top, parent.bottom, bias = 0.8f) end.linkTo(parent.end) }, ) } } @Composable fun AudioDelayCardTitle( onClose: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Text( stringResource(AYMR.strings.player_sheets_audio_delay_title), style = MaterialTheme.typography.headlineMedium, ) IconButton(onClose) { Icon( Icons.Default.Close, null, modifier = Modifier.size(32.dp), ) } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/SubtitleDelayPanel.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import androidx.compose.animation.animateContentSize import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.FilledIconButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.player.components.OutlinedNumericChooser import eu.kanade.tachiyomi.ui.player.controls.CARDS_MAX_WIDTH import eu.kanade.tachiyomi.ui.player.controls.panelCardsColors import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import `is`.xyz.mpv.MPVLib import kotlinx.coroutines.delay import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.math.round import kotlin.math.roundToInt @Composable fun SubtitleDelayPanel( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { val preferences = remember { Injekt.get() } ConstraintLayout( modifier = modifier .fillMaxSize() .padding(MaterialTheme.padding.medium), ) { val delayControlCard = createRef() var affectedSubtitle by remember { mutableStateOf(SubtitleDelayType.Primary) } var delay by remember { mutableIntStateOf((MPVLib.getPropertyDouble("sub-delay") * 1000).roundToInt()) } var secondaryDelay by remember { mutableIntStateOf((MPVLib.getPropertyDouble("secondary-sub-delay") * 1000).roundToInt()) } var speed by remember { mutableFloatStateOf(MPVLib.getPropertyDouble("sub-speed").toFloat()) } LaunchedEffect(speed) { if (speed in 0.1f..1f) MPVLib.setPropertyDouble("sub-speed", speed.toDouble()) } LaunchedEffect(delay, secondaryDelay) { val finalDelay = (if (affectedSubtitle == SubtitleDelayType.Secondary) secondaryDelay else delay) / 1000.0 when (affectedSubtitle) { SubtitleDelayType.Primary -> MPVLib.setPropertyDouble("sub-delay", finalDelay) SubtitleDelayType.Secondary -> MPVLib.setPropertyDouble("secondary-sub-delay", finalDelay) else -> { MPVLib.setPropertyDouble("sub-delay", finalDelay) MPVLib.setPropertyDouble("secondary-sub-delay", finalDelay) } } } LaunchedEffect(affectedSubtitle) { secondaryDelay = ( MPVLib.getPropertyDouble( if (affectedSubtitle == SubtitleDelayType.Both) "sub-delay" else "secondary-sub-delay", ) * 1000 ).toInt() delay = (MPVLib.getPropertyDouble("sub-delay") * 1000).toInt() } SubtitleDelayCard( delay = if (affectedSubtitle == SubtitleDelayType.Secondary) secondaryDelay else delay, onDelayChange = { if (affectedSubtitle == SubtitleDelayType.Secondary) { secondaryDelay = it } else { delay = it } }, speed = speed, onSpeedChange = { speed = round(it * 1000) / 1000f }, affectedSubtitle = affectedSubtitle, onTypeChange = { affectedSubtitle = it }, onApply = { preferences.subtitlesDelay().set(delay) if (speed in 0.1f..10f) preferences.subtitlesSpeed().set(speed) }, onReset = { delay = 0 secondaryDelay = 0 speed = 1f }, onClose = onDismissRequest, modifier = Modifier.constrainAs(delayControlCard) { linkTo(parent.top, parent.bottom, bias = 0.8f) end.linkTo(parent.end) }, ) } } @Composable fun SubtitleDelayCard( delay: Int, onDelayChange: (Int) -> Unit, speed: Float, onSpeedChange: (Float) -> Unit, affectedSubtitle: SubtitleDelayType, onTypeChange: (SubtitleDelayType) -> Unit, onApply: () -> Unit, onReset: () -> Unit, onClose: () -> Unit, modifier: Modifier = Modifier, ) { DelayCard( delay = delay, onDelayChange = onDelayChange, onApply = onApply, onReset = onReset, title = { SubtitleDelayTitle( affectedSubtitle = affectedSubtitle, onClose = onClose, onTypeChange = onTypeChange, ) }, extraSettings = { when (affectedSubtitle) { SubtitleDelayType.Primary -> { OutlinedNumericChooser( label = { Text(stringResource(AYMR.strings.player_sheets_sub_delay_speed)) }, value = speed, onChange = onSpeedChange, max = 10f, step = .01f, min = .1f, ) } else -> {} } }, delayType = DelayType.Subtitle, modifier = modifier, ) } enum class SubtitleDelayType( val title: StringResource, ) { Primary(AYMR.strings.player_sheets_sub_delay_subtitle_type_primary), Secondary(AYMR.strings.player_sheets_sub_delay_subtitle_type_secondary), Both(AYMR.strings.player_sheets_sub_delay_subtitle_type_primary_and_secondary), } @Suppress("LambdaParameterInRestartableEffect") // Intentional @Composable fun DelayCard( delay: Int, onDelayChange: (Int) -> Unit, onApply: () -> Unit, onReset: () -> Unit, title: @Composable () -> Unit, delayType: DelayType, modifier: Modifier = Modifier, extraSettings: @Composable ColumnScope.() -> Unit = {}, ) { Card( modifier = modifier .widthIn(max = CARDS_MAX_WIDTH) .animateContentSize(), colors = panelCardsColors(), ) { Column( Modifier .verticalScroll(rememberScrollState()) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { title() OutlinedNumericChooser( label = { Text(stringResource(AYMR.strings.player_sheets_sub_delay_delay)) }, value = delay, onChange = onDelayChange, step = 50, min = Int.MIN_VALUE, max = Int.MAX_VALUE, suffix = { Text(stringResource(AYMR.strings.player_generic_unit_ms)) }, ) Column( modifier = Modifier.animateContentSize(), ) { extraSettings() } // true (heard -> spotted), false (spotted -> heard) var isDirectionPositive by remember { mutableStateOf(null) } Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { var timerStart by remember { mutableStateOf(null) } var finalDelay by remember { mutableIntStateOf(delay) } LaunchedEffect(isDirectionPositive) { if (isDirectionPositive == null) { onDelayChange(finalDelay) return@LaunchedEffect } finalDelay = delay timerStart = System.currentTimeMillis() val startingDelay: Int = finalDelay while (isDirectionPositive != null && timerStart != null) { val elapsed = System.currentTimeMillis() - timerStart!! finalDelay = startingDelay + (if (isDirectionPositive!!) elapsed else -elapsed).toInt() // Arbitrary delay of 20ms delay(20) } } Button( onClick = { isDirectionPositive = if (isDirectionPositive == null) delayType == DelayType.Audio else null }, modifier = Modifier.weight(1f), enabled = isDirectionPositive != (delayType == DelayType.Audio), ) { Text( stringResource( if (delayType == DelayType.Audio) { AYMR.strings.player_sheets_sub_delay_audio_sound_heard } else { AYMR.strings.player_sheets_sub_delay_subtitle_voice_heard }, ), ) } Button( onClick = { isDirectionPositive = if (isDirectionPositive == null) delayType != DelayType.Audio else null }, modifier = Modifier.weight(1f), enabled = isDirectionPositive != (delayType == DelayType.Subtitle), ) { Text( stringResource( if (delayType == DelayType.Audio) { AYMR.strings.player_sheets_sub_delay_sound_sound_spotted } else { AYMR.strings.player_sheets_sub_delay_subtitle_text_seen }, ), ) } } Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Button( onClick = onApply, modifier = Modifier.weight(1f), enabled = isDirectionPositive == null, ) { Text(stringResource(AYMR.strings.player_sheets_delay_set_as_default)) } FilledIconButton( onClick = onReset, enabled = isDirectionPositive == null, ) { Icon(Icons.Default.Refresh, null) } } } } } @Composable fun SubtitleDelayTitle( affectedSubtitle: SubtitleDelayType, onClose: () -> Unit, onTypeChange: (SubtitleDelayType) -> Unit, modifier: Modifier = Modifier, ) { Row( verticalAlignment = Alignment.Bottom, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), modifier = modifier.fillMaxWidth(), ) { Text( stringResource(AYMR.strings.player_sheets_sub_delay_title), style = MaterialTheme.typography.headlineMedium, ) var showDropDownMenu by remember { mutableStateOf(false) } Row(modifier = Modifier.clickable { showDropDownMenu = true }) { Text( stringResource(affectedSubtitle.title), color = MaterialTheme.colorScheme.onSurfaceVariant, style = MaterialTheme.typography.bodyMedium, ) Icon(Icons.Default.ArrowDropDown, null) DropdownMenu( expanded = showDropDownMenu, onDismissRequest = { showDropDownMenu = false }, ) { SubtitleDelayType.entries.forEach { DropdownMenuItem( text = { Text(stringResource(it.title)) }, onClick = { onTypeChange(it) showDropDownMenu = false }, ) } } } Spacer(Modifier.weight(1f)) IconButton(onClose) { Icon( Icons.Default.Close, null, modifier = Modifier.size(32.dp), ) } } } enum class DelayType { Audio, Subtitle, } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/SubtitleSettingsColorsCard.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.BorderColor import androidx.compose.material.icons.filled.FormatColorFill import androidx.compose.material.icons.filled.FormatColorReset import androidx.compose.material.icons.filled.FormatColorText import androidx.compose.material.icons.filled.Palette import androidx.compose.material3.Icon import androidx.compose.material3.IconToggleButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.core.graphics.alpha import androidx.core.graphics.blue import androidx.core.graphics.green import androidx.core.graphics.red import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.player.components.ExpandableCard import eu.kanade.presentation.player.components.TintedSliderItem import eu.kanade.tachiyomi.ui.player.controls.CARDS_MAX_WIDTH import eu.kanade.tachiyomi.ui.player.controls.panelCardsColors import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import `is`.xyz.mpv.MPVLib import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.deleteAndGet import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun SubtitleSettingsColorsCard( modifier: Modifier = Modifier, ) { val preferences = remember { Injekt.get() } var isExpanded by remember { mutableStateOf(true) } ExpandableCard( isExpanded = isExpanded, onExpand = { isExpanded = !isExpanded }, title = { Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { Icon(Icons.Default.Palette, null) Text(stringResource(AYMR.strings.player_sheets_sub_colors_title)) } }, modifier = modifier.widthIn(max = CARDS_MAX_WIDTH), colors = panelCardsColors(), ) { Column { var currentColorType by remember { mutableStateOf(SubColorType.Text) } var currentColor by remember { mutableIntStateOf(getCurrentMPVColor(currentColorType)) } LaunchedEffect(currentColorType) { currentColor = getCurrentMPVColor(currentColorType) } Row( horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() .horizontalScroll(rememberScrollState()) .padding(start = MaterialTheme.padding.extraSmall, end = MaterialTheme.padding.medium), ) { SubColorType.entries.forEach { type -> IconToggleButton( checked = currentColorType == type, onCheckedChange = { currentColorType = type }, ) { Icon( when (type) { SubColorType.Text -> Icons.Default.FormatColorText SubColorType.Border -> Icons.Default.BorderColor SubColorType.Background -> Icons.Default.FormatColorFill }, null, ) } } Text(stringResource(currentColorType.titleRes)) Spacer(Modifier.weight(1f)) TextButton( onClick = { resetColors(preferences, currentColorType) currentColor = getCurrentMPVColor(currentColorType) }, ) { Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), verticalAlignment = Alignment.CenterVertically, ) { Icon(Icons.Default.FormatColorReset, null) Text(stringResource(MR.strings.action_reset)) } } } SubtitlesColorPicker( currentColor, onColorChange = { currentColor = it currentColorType.preference(preferences).set(it) MPVLib.setPropertyString(currentColorType.property, it.toColorHexString()) }, ) } } } fun Int.copyAsArgb( alpha: Int = this.alpha, red: Int = this.red, green: Int = this.green, blue: Int = this.blue, ) = (alpha shl 24) or (red shl 16) or (green shl 8) or blue @OptIn(ExperimentalStdlibApi::class) fun Int.toColorHexString() = "#" + this.toHexString().uppercase() enum class SubColorType( val titleRes: StringResource, val property: String, val preference: (SubtitlePreferences) -> Preference, ) { Text( AYMR.strings.player_sheets_subtitles_color_text, "sub-color", preference = SubtitlePreferences::textColorSubtitles, ), Border( AYMR.strings.player_sheets_subtitles_color_border, "sub-border-color", preference = SubtitlePreferences::borderColorSubtitles, ), Background( AYMR.strings.player_sheets_subtitles_color_background, "sub-back-color", preference = SubtitlePreferences::backgroundColorSubtitles, ), } fun resetColors(preferences: SubtitlePreferences, type: SubColorType) { when (type) { SubColorType.Text -> { MPVLib.setPropertyString("sub-color", preferences.textColorSubtitles().deleteAndGet().toColorHexString()) } SubColorType.Border -> { MPVLib.setPropertyString( "sub-border-color", preferences.borderColorSubtitles().deleteAndGet().toColorHexString(), ) } SubColorType.Background -> { MPVLib.setPropertyString( "sub-back-color", preferences.backgroundColorSubtitles().deleteAndGet().toColorHexString(), ) } } } val getCurrentMPVColor: (SubColorType) -> Int = { colorType -> MPVLib.getPropertyString(colorType.property)?.let { android.graphics.Color.parseColor(it.uppercase()) }!! } @Composable fun SubtitlesColorPicker( color: Int, onColorChange: (Int) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier) { TintedSliderItem( stringResource(AYMR.strings.player_sheets_sub_color_red), color.red, color.red.toString(), onChange = { onColorChange(color.copyAsArgb(red = it)) }, max = 255, tint = Color.Red, ) TintedSliderItem( stringResource(AYMR.strings.player_sheets_sub_color_green), color.green, color.green.toString(), onChange = { onColorChange(color.copyAsArgb(green = it)) }, max = 255, tint = Color.Green, ) TintedSliderItem( stringResource(AYMR.strings.player_sheets_sub_color_blue), color.blue, color.blue.toString(), onChange = { onColorChange(color.copyAsArgb(blue = it)) }, max = 255, tint = Color.Blue, ) TintedSliderItem( stringResource(AYMR.strings.player_sheets_sub_color_alpha), color.alpha, color.alpha.toString(), onChange = { onColorChange(color.copyAsArgb(alpha = it)) }, max = 255, tint = Color.White, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/SubtitleSettingsMiscellaneousCard.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AlignVerticalCenter import androidx.compose.material.icons.filled.EditOff import androidx.compose.material.icons.filled.FormatSize import androidx.compose.material.icons.filled.Tune import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import eu.kanade.presentation.player.components.ExpandableCard import eu.kanade.presentation.player.components.SliderItem import eu.kanade.presentation.player.components.SwitchPreference import eu.kanade.tachiyomi.ui.player.controls.CARDS_MAX_WIDTH import eu.kanade.tachiyomi.ui.player.controls.components.sheets.toFixed import eu.kanade.tachiyomi.ui.player.controls.panelCardsColors import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import `is`.xyz.mpv.MPVLib import tachiyomi.core.common.preference.deleteAndGet import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun SubtitlesMiscellaneousCard(modifier: Modifier = Modifier) { val preferences = remember { Injekt.get() } var isExpanded by remember { mutableStateOf(true) } ExpandableCard( isExpanded, title = { Row(horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium)) { Icon(Icons.Default.Tune, null) Text(stringResource(AYMR.strings.player_sheets_sub_misc_title)) } }, onExpand = { isExpanded = !isExpanded }, modifier.widthIn(max = CARDS_MAX_WIDTH), colors = panelCardsColors(), ) { Column { var overrideAssSubs by remember { mutableStateOf(MPVLib.getPropertyString("sub-ass-override").also { println(it) } == "force") } SwitchPreference( overrideAssSubs, onValueChange = { overrideAssSubs = it preferences.overrideSubsASS().set(it) MPVLib.setPropertyString("sub-ass-override", if (it) "force" else "scale") }, content = { Text(stringResource(AYMR.strings.player_sheets_sub_override_ass)) }, modifier = Modifier .fillMaxWidth(), ) var subScale by remember { mutableStateOf(MPVLib.getPropertyDouble("sub-scale").toFloat()) } var subPos by remember { mutableStateOf(MPVLib.getPropertyInt("sub-pos")) } SliderItem( label = stringResource(AYMR.strings.player_sheets_sub_scale), value = subScale, valueText = subScale.toFixed(2).toString(), onChange = { subScale = it preferences.subtitleFontScale().set(it) MPVLib.setPropertyDouble("sub-scale", it.toDouble()) }, max = 5f, icon = { Icon( Icons.Default.FormatSize, null, ) }, ) SliderItem( label = stringResource(AYMR.strings.player_sheets_sub_position), value = subPos, valueText = subPos.toString(), onChange = { subPos = it preferences.subtitlePos().set(it) MPVLib.setPropertyInt("sub-pos", it) }, max = 150, icon = { Icon( Icons.Default.AlignVerticalCenter, null, ) }, ) Row( modifier = Modifier .fillMaxWidth() .padding(end = MaterialTheme.padding.medium, bottom = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.End, ) { TextButton( onClick = { preferences.subtitlePos().deleteAndGet().let { subPos = it MPVLib.setPropertyInt("sub-pos", it) } preferences.subtitleFontScale().deleteAndGet().let { subScale = it MPVLib.setPropertyDouble("sub-scale", it.toDouble()) } preferences.overrideSubsASS().deleteAndGet().let { overrideAssSubs = it } MPVLib.setPropertyString("sub-ass-override", "scale") // mpv's default is 'scale' }, ) { Row { Icon(Icons.Default.EditOff, null) Text(stringResource(MR.strings.action_reset)) } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/SubtitleSettingsPanel.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import android.content.res.Configuration.ORIENTATION_PORTRAIT import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.width import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.PageSize import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shadow import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import eu.kanade.tachiyomi.ui.player.controls.CARDS_MAX_WIDTH import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun SubtitleSettingsPanel( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { BackHandler(onBack = onDismissRequest) val orientation = LocalConfiguration.current.orientation ConstraintLayout(modifier = modifier.fillMaxSize()) { val subSettingsCards = createRef() val cards: @Composable (Int, Modifier) -> Unit = { value, cardsModifier -> when (value) { 0 -> SubtitleSettingsTypographyCard(cardsModifier) 1 -> SubtitleSettingsColorsCard(cardsModifier) 2 -> SubtitlesMiscellaneousCard(cardsModifier) else -> {} } } val pagerState = rememberPagerState { 3 } if (orientation == ORIENTATION_PORTRAIT) { Column( modifier = Modifier.constrainAs(subSettingsCards) { top.linkTo(parent.top, 32.dp) start.linkTo(parent.start) }, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { TopAppBar( title = { Text( text = stringResource(AYMR.strings.player_sheets_subtitles_settings_title), style = MaterialTheme.typography.headlineMedium.copy(shadow = Shadow(blurRadius = 20f)), ) }, navigationIcon = { IconButton(onClick = onDismissRequest) { Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) } }, colors = TopAppBarDefaults.topAppBarColors().copy(containerColor = Color.Transparent), ) HorizontalPager( state = pagerState, pageSize = PageSize.Fixed(LocalConfiguration.current.screenWidthDp.dp * 0.9f), verticalAlignment = Alignment.Top, pageSpacing = MaterialTheme.padding.small, contentPadding = PaddingValues(horizontal = MaterialTheme.padding.small), beyondViewportPageCount = 1, ) { page -> cards(page, Modifier.fillMaxWidth()) } } } else { Column( horizontalAlignment = Alignment.Start, verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), modifier = Modifier .constrainAs(subSettingsCards) { top.linkTo(parent.top) end.linkTo(parent.end, 32.dp) } .verticalScroll(rememberScrollState()), ) { Spacer(Modifier.height(16.dp)) Row( Modifier .width(CARDS_MAX_WIDTH), horizontalArrangement = Arrangement.SpaceBetween, ) { Text( text = stringResource(AYMR.strings.player_sheets_subtitles_settings_title), style = MaterialTheme.typography.headlineMedium.copy( shadow = Shadow(blurRadius = 20f), ), ) IconButton(onDismissRequest) { Icon(imageVector = Icons.Default.Close, contentDescription = null) } } repeat(3) { cards(it, Modifier) } Spacer(Modifier.height(16.dp)) } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/SubtitleSettingsTypographyCard.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import android.annotation.SuppressLint import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.BorderColor import androidx.compose.material.icons.filled.BorderStyle import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.FormatBold import androidx.compose.material.icons.filled.FormatClear import androidx.compose.material.icons.filled.FormatColorText import androidx.compose.material.icons.filled.FormatItalic import androidx.compose.material.icons.filled.FormatSize import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconToggleButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.yubyf.truetypeparser.TTFFile import dev.icerock.moko.resources.StringResource import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.player.components.ExpandableCard import eu.kanade.presentation.player.components.ExposedTextDropDownMenu import eu.kanade.presentation.player.components.SliderItem import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.player.controls.CARDS_MAX_WIDTH import eu.kanade.tachiyomi.ui.player.controls.panelCardsColors import eu.kanade.tachiyomi.ui.player.settings.SubtitleJustification import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import `is`.xyz.mpv.MPVLib import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import tachiyomi.core.common.preference.deleteAndGet import tachiyomi.domain.storage.service.StorageManager import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @SuppressLint("MutableCollectionMutableState") @Composable fun SubtitleSettingsTypographyCard( modifier: Modifier = Modifier, ) { val preferences = remember { Injekt.get() } val storageManager = remember { Injekt.get() } var isExpanded by remember { mutableStateOf(true) } val fontsDir = storageManager.getFontsDirectory() val fonts by remember { mutableStateOf(mutableListOf(preferences.subtitleFont().defaultValue())) } var fontsLoadingIndicator: (@Composable () -> Unit)? by remember { val indicator: (@Composable () -> Unit) = { CircularProgressIndicator(Modifier.size(32.dp)) } mutableStateOf(indicator) } LaunchedEffect(Unit) { if (fontsDir == null) { fontsLoadingIndicator = null return@LaunchedEffect } withContext(Dispatchers.IO) { fontsDir.listFiles()?.filter { file -> file.name?.lowercase()?.matches(FONT_EXTENSION_REGEX) == true }?.mapNotNull { runCatching { TTFFile.open(it.openInputStream()).families.values.first() }.getOrNull() }?.let { fonts.addAll( it.distinct(), ) } fontsLoadingIndicator = null } } ExpandableCard( isExpanded = isExpanded, onExpand = { isExpanded = !isExpanded }, title = { Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { Icon(Icons.Default.FormatColorText, null) Text(stringResource(AYMR.strings.player_sheets_sub_typography_title)) } }, modifier = modifier.widthIn(max = CARDS_MAX_WIDTH), colors = panelCardsColors(), ) { Column { var isBold by remember { mutableStateOf(MPVLib.getPropertyBoolean("sub-bold")) } var isItalic by remember { mutableStateOf(MPVLib.getPropertyBoolean("sub-italic")) } var justify by remember { mutableStateOf( SubtitleJustification.entries.first { it.value == MPVLib.getPropertyString("sub-justify") }, ) } var font by remember { mutableStateOf(MPVLib.getPropertyString("sub-font")) } var fontSize by remember { mutableStateOf(MPVLib.getPropertyInt("sub-font-size")) } var borderStyle by remember { mutableStateOf( SubtitlesBorderStyle.entries.first { it.value == MPVLib.getPropertyString("sub-border-style") }, ) } var borderSize by remember { mutableStateOf( MPVLib.getPropertyInt("sub-border-size"), ) } var shadowOffset by remember { mutableStateOf( MPVLib.getPropertyInt("sub-shadow-offset"), ) } Row( Modifier .fillMaxWidth() .horizontalScroll(rememberScrollState()) .padding(start = MaterialTheme.padding.extraSmall, end = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { IconToggleButton( checked = isBold, onCheckedChange = { isBold = it preferences.boldSubtitles().set(it) MPVLib.setPropertyBoolean("sub-bold", it) }, ) { Icon( Icons.Default.FormatBold, null, modifier = Modifier.size(32.dp), ) } IconToggleButton( checked = isItalic, onCheckedChange = { isItalic = it preferences.italicSubtitles().set(it) MPVLib.setPropertyBoolean("sub-italic", it) }, ) { Icon( Icons.Default.FormatItalic, null, modifier = Modifier.size(32.dp), ) } SubtitleJustification.entries.minus(SubtitleJustification.Auto).forEach { justification -> IconToggleButton( checked = justify == justification, onCheckedChange = { justify = justification MPVLib.setPropertyBoolean("sub-ass-justify", it) if (it) { preferences.subtitleJustification().set(justification) MPVLib.setPropertyString("sub-justify", justification.value) } else { preferences.subtitleJustification().set(SubtitleJustification.Auto) MPVLib.setPropertyString("sub-justify", SubtitleJustification.Auto.value) } }, ) { Icon(justification.icon, null) } } Spacer(Modifier.weight(1f)) TextButton(onClick = { resetTypography(preferences) isBold = MPVLib.getPropertyBoolean("sub-bold") isItalic = MPVLib.getPropertyBoolean("sub-italic") justify = SubtitleJustification.entries.first { it.value == MPVLib.getPropertyString("sub-justify") } font = MPVLib.getPropertyString("sub-font") fontSize = MPVLib.getPropertyInt("sub-font-size") borderStyle = SubtitlesBorderStyle.entries.first { it.value == MPVLib.getPropertyString("sub-border-style") } borderSize = MPVLib.getPropertyInt("sub-border-size") shadowOffset = MPVLib.getPropertyInt("sub-shadow-offset") }) { Row( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), verticalAlignment = Alignment.CenterVertically, ) { Icon(Icons.Default.FormatClear, null) Text(stringResource(MR.strings.action_reset)) } } } Row( modifier = Modifier.padding(horizontal = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, ) { Icon( painterResource(R.drawable.outline_brand_family_24), null, modifier = Modifier.size(32.dp), ) ExposedTextDropDownMenu( selectedValue = font, options = fonts.toImmutableList(), label = stringResource(AYMR.strings.player_sheets_sub_typography_font), onValueChangedEvent = { font = it preferences.subtitleFont().set(it) MPVLib.setPropertyString("sub-font", it) }, leadingIcon = fontsLoadingIndicator, ) } SliderItem( label = stringResource(AYMR.strings.player_sheets_sub_typography_font_size), max = 100, min = 1, value = fontSize, valueText = fontSize.toString(), onChange = { fontSize = it preferences.subtitleFontSize().set(it) MPVLib.setPropertyInt("sub-font-size", it) }, ) { Icon(Icons.Default.FormatSize, null) } var selectingBorderStyle by remember { mutableStateOf(false) } Box { Row( modifier = Modifier .fillMaxWidth() .clickable( onClick = { selectingBorderStyle = !selectingBorderStyle }, ) .padding( horizontal = MaterialTheme.padding.medium, vertical = MaterialTheme.padding.small, ), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.large), ) { Icon(Icons.Default.BorderStyle, null) Column { Text( text = stringResource(AYMR.strings.player_sheets_sub_typography_border_style), style = MaterialTheme.typography.bodyLarge, ) Text( text = stringResource(borderStyle.titleRes), style = MaterialTheme.typography.bodyMedium, ) } } DropdownMenu(expanded = selectingBorderStyle, onDismissRequest = { selectingBorderStyle = false }) { SubtitlesBorderStyle.entries.map { DropdownMenuItem( text = { Text(stringResource(it.titleRes)) }, onClick = { borderStyle = it preferences.borderStyleSubtitles().set(it) MPVLib.setPropertyString("sub-border-style", it.value) selectingBorderStyle = false }, trailingIcon = { if (borderStyle == it) { Icon( imageVector = Icons.Default.Check, contentDescription = null, ) } }, ) } } } SliderItem( stringResource(AYMR.strings.player_sheets_sub_typography_border_size), value = borderSize, valueText = borderSize.toString(), onChange = { borderSize = it preferences.subtitleBorderSize().set(it) MPVLib.setPropertyInt("sub-border-size", it) }, max = 100, icon = { Icon(Icons.Default.BorderColor, null) }, ) SliderItem( stringResource(AYMR.strings.player_sheets_subtitles_shadow_offset), value = shadowOffset, valueText = shadowOffset.toString(), onChange = { shadowOffset = it preferences.shadowOffsetSubtitles().set(it) MPVLib.setPropertyInt("sub-shadow-offset", it) }, max = 100, icon = { Icon(painterResource(R.drawable.sharp_shadow_24), null) }, ) } } } private val FONT_EXTENSION_REGEX = Regex(""".*\.[ot]tf${'$'}""") fun resetTypography(preferences: SubtitlePreferences) { MPVLib.setPropertyBoolean("sub-bold", preferences.boldSubtitles().deleteAndGet()) MPVLib.setPropertyBoolean("sub-italic", preferences.italicSubtitles().deleteAndGet()) MPVLib.setPropertyBoolean("sub-ass-justify", preferences.overrideSubsASS().deleteAndGet()) MPVLib.setPropertyString("sub-justify", preferences.subtitleJustification().deleteAndGet().value) MPVLib.setPropertyString("sub-font", preferences.subtitleFont().deleteAndGet()) MPVLib.setPropertyInt("sub-font-size", preferences.subtitleFontSize().deleteAndGet()) MPVLib.setPropertyInt("sub-border-size", preferences.subtitleBorderSize().deleteAndGet()) MPVLib.setPropertyInt("sub-shadow-offset", preferences.shadowOffsetSubtitles().deleteAndGet()) MPVLib.setPropertyString("sub-border-style", preferences.borderStyleSubtitles().deleteAndGet().value) } enum class SubtitlesBorderStyle( val value: String, val titleRes: StringResource, ) { OutlineAndShadow("outline-and-shadow", AYMR.strings.player_sheets_subtitles_border_style_outline_and_shadow), OpaqueBox("opaque-box", AYMR.strings.player_sheets_subtitles_border_style_opaque_box), BackgroundBox("background-box", AYMR.strings.player_sheets_subtitles_border_style_background_box), } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/panels/VideoFiltersPanel.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.panels import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.outlined.Info import androidx.compose.material3.Card import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.constraintlayout.compose.ConstraintLayout import eu.kanade.presentation.player.components.SliderItem import eu.kanade.tachiyomi.ui.player.VideoFilters import eu.kanade.tachiyomi.ui.player.controls.CARDS_MAX_WIDTH import eu.kanade.tachiyomi.ui.player.controls.components.ControlsButton import eu.kanade.tachiyomi.ui.player.controls.panelCardsColors import eu.kanade.tachiyomi.ui.player.settings.DecoderPreferences import `is`.xyz.mpv.MPVLib import tachiyomi.core.common.preference.deleteAndGet import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun VideoFiltersPanel( onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { ConstraintLayout( modifier = modifier .fillMaxSize() .padding(MaterialTheme.padding.medium), ) { val filtersCard = createRef() FiltersCard( Modifier.constrainAs(filtersCard) { linkTo(parent.top, parent.bottom, bias = 0.8f) end.linkTo(parent.end) }, onClose = onDismissRequest, ) } } @Composable fun FiltersCard( modifier: Modifier = Modifier, onClose: () -> Unit, ) { val decoderPreferences = remember { Injekt.get() } Card( colors = panelCardsColors(), modifier = modifier .widthIn(max = CARDS_MAX_WIDTH), ) { Row( Modifier .fillMaxWidth() .padding(start = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { Text( stringResource(AYMR.strings.player_sheets_filters_title), style = MaterialTheme.typography.headlineMedium, ) Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { TextButton( onClick = { VideoFilters.entries.forEach { MPVLib.setPropertyInt(it.mpvProperty, it.preference(decoderPreferences).deleteAndGet()) } }, ) { Text(text = stringResource(MR.strings.action_reset)) } ControlsButton(Icons.Default.Close, onClose) } } LazyColumn { items(VideoFilters.entries) { filter -> val value by filter.preference(decoderPreferences).collectAsState() SliderItem( label = stringResource(filter.titleRes), value = value, valueText = value.toString(), onChange = { filter.preference(decoderPreferences).set(it) MPVLib.setPropertyInt(filter.mpvProperty, it) }, max = 100, min = -100, ) } item { if (decoderPreferences.gpuNext().get()) return@item Column( modifier = Modifier .padding(MaterialTheme.padding.medium) .fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), horizontalAlignment = Alignment.Start, ) { Icon(Icons.Outlined.Info, null) Text(stringResource(AYMR.strings.player_sheets_filters_warning)) } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/AudioTracksSheet.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreTime import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import eu.kanade.tachiyomi.ui.player.PlayerViewModel.VideoTrack import kotlinx.collections.immutable.ImmutableList import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun AudioTracksSheet( tracks: ImmutableList, selectedId: Int, onSelect: (Int) -> Unit, onAddAudioTrack: () -> Unit, onOpenDelayPanel: () -> Unit, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { GenericTracksSheet( tracks = tracks, onDismissRequest = onDismissRequest, header = { TrackSheetTitle( title = stringResource(AYMR.strings.pref_player_audio), actions = { TextButton(onClick = onOpenDelayPanel) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Icon(imageVector = Icons.Default.MoreTime, contentDescription = null) Text(text = stringResource(AYMR.strings.player_sheets_track_delay)) } } }, ) AddTrackRow( title = stringResource(AYMR.strings.player_sheets_add_ext_audio), onClick = onAddAudioTrack, ) }, track = { AudioTrackRow( title = getTrackTitle(it), isSelected = selectedId == it.id, onClick = { onSelect(it.id) }, ) }, modifier = modifier, ) } @Composable fun AudioTrackRow( title: String, isSelected: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier .fillMaxWidth() .clickable(onClick = onClick) .padding(start = MaterialTheme.padding.small, end = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { RadioButton( selected = isSelected, onClick = onClick, ) Text( title, fontWeight = if (isSelected) FontWeight.ExtraBold else FontWeight.Normal, fontStyle = if (isSelected) FontStyle.Italic else FontStyle.Normal, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/ChaptersSheet.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import dev.vivvvek.seeker.Segment import `is`.xyz.mpv.Utils import kotlinx.collections.immutable.ImmutableList import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun ChaptersSheet( chapters: ImmutableList, currentChapter: Segment, onClick: (Segment) -> Unit, onDismissRequest: () -> Unit, dismissSheet: Boolean, modifier: Modifier = Modifier, ) { GenericTracksSheet( tracks = chapters, header = { TrackSheetTitle( title = stringResource(AYMR.strings.player_sheets_chapters_title), modifier = modifier.padding(top = MaterialTheme.padding.small), ) }, track = { ChapterTrack( chapter = it, index = chapters.indexOf(it), selected = currentChapter == it, onClick = { onClick(it) }, ) }, onDismissRequest = onDismissRequest, dismissEvent = dismissSheet, modifier = modifier, ) } @Composable fun ChapterTrack( chapter: Segment, index: Int, selected: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier, ) { Row( modifier = modifier .fillMaxWidth() .clickable(onClick = onClick) .padding(vertical = MaterialTheme.padding.small, horizontal = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.SpaceBetween, ) { Text( stringResource(AYMR.strings.player_sheets_track_title_wo_lang, index + 1, chapter.name), fontStyle = if (selected) FontStyle.Italic else FontStyle.Normal, fontWeight = if (selected) FontWeight.ExtraBold else FontWeight.Normal, maxLines = 1, modifier = Modifier.weight(1f), overflow = TextOverflow.Ellipsis, ) Text( Utils.prettyTime(chapter.start.toInt()), fontStyle = if (selected) FontStyle.Italic else FontStyle.Normal, fontWeight = if (selected) FontWeight.ExtraBold else FontWeight.Normal, ) } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/GenericTracksSheet.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import eu.kanade.presentation.player.components.PlayerSheet import eu.kanade.tachiyomi.ui.player.PlayerViewModel.VideoTrack import kotlinx.collections.immutable.ImmutableList import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable fun GenericTracksSheet( tracks: ImmutableList, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, dismissEvent: Boolean = false, header: @Composable () -> Unit = {}, track: @Composable (T) -> Unit = {}, footer: @Composable () -> Unit = {}, ) { PlayerSheet(onDismissRequest, dismissEvent = dismissEvent) { Column(modifier) { header() LazyColumn { items(tracks) { track(it) } item { footer() } } } } } @Composable fun AddTrackRow( title: String, onClick: () -> Unit, modifier: Modifier = Modifier, actions: @Composable RowScope.() -> Unit = {}, ) { Row( modifier = modifier .fillMaxWidth() .clickable(onClick = onClick) .height(48.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Row( modifier = Modifier .clickable(onClick = onClick) .fillMaxHeight() .weight(1f) .padding(start = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), verticalAlignment = Alignment.CenterVertically, ) { Icon( imageVector = Icons.Default.Add, contentDescription = null, modifier = Modifier.size(32.dp), ) Text(text = title) } actions() } } @Composable fun getTrackTitle(track: VideoTrack): String { return when { track.id == -1 -> { track.name } track.language.isNullOrBlank() && track.name.isNotBlank() -> { stringResource(AYMR.strings.player_sheets_track_title_wo_lang, track.id, track.name) } !track.language.isNullOrBlank() && track.name.isNotBlank() -> { stringResource(AYMR.strings.player_sheets_track_title_w_lang, track.id, track.name, track.language) } !track.language.isNullOrBlank() && track.name.isBlank() -> { stringResource(AYMR.strings.player_sheets_track_lang_wo_title, track.id, track.language) } else -> stringResource(AYMR.strings.player_sheets_track_title_wo_lang, track.id, track.name) } } @Composable fun TrackSheetTitle( title: String, modifier: Modifier = Modifier, actions: @Composable RowScope.() -> Unit = {}, ) { Row( modifier = modifier.fillMaxWidth() .padding( start = MaterialTheme.padding.medium, end = MaterialTheme.padding.medium, top = MaterialTheme.padding.small, bottom = MaterialTheme.padding.extraSmall, ), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Text( text = title, style = MaterialTheme.typography.headlineMedium, ) Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { actions() } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/MoreSheet.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.sheets import android.text.format.DateUtils import androidx.compose.animation.animateContentSize import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.KeyboardAlt import androidx.compose.material.icons.filled.Tune import androidx.compose.material.icons.outlined.Schedule import androidx.compose.material.icons.outlined.Timer import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilterChip import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TimeInput import androidx.compose.material3.TimePicker import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import eu.kanade.presentation.player.components.PlayerSheet import eu.kanade.tachiyomi.ui.player.Decoder import eu.kanade.tachiyomi.ui.player.execute import eu.kanade.tachiyomi.ui.player.executeLongPress import eu.kanade.tachiyomi.ui.player.settings.AdvancedPlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.AudioChannels import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import `is`.xyz.mpv.MPVLib import kotlinx.collections.immutable.ImmutableList import tachiyomi.domain.custombuttons.model.CustomButton import tachiyomi.i18n.MR import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @Composable fun MoreSheet( selectedDecoder: Decoder, onSelectDecoder: (Decoder) -> Unit, remainingTime: Int, onStartTimer: (Int) -> Unit, onDismissRequest: () -> Unit, onEnterFiltersPanel: () -> Unit, customButtons: ImmutableList, modifier: Modifier = Modifier, ) { val advancedPreferences = remember { Injekt.get() } val audioPreferences = remember { Injekt.get() } val statisticsPage by advancedPreferences.playerStatisticsPage().collectAsState() PlayerSheet( onDismissRequest = onDismissRequest, modifier = modifier, ) { Column( modifier = Modifier .fillMaxWidth() .padding(MaterialTheme.padding.medium) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(AYMR.strings.player_sheets_more_title), style = MaterialTheme.typography.headlineMedium, ) Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { var isSleepTimerDialogShown by remember { mutableStateOf(false) } TextButton(onClick = { isSleepTimerDialogShown = true }) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Icon(imageVector = Icons.Outlined.Timer, contentDescription = null) Text( text = if (remainingTime == 0) { stringResource(AYMR.strings.timer_title) } else { stringResource( AYMR.strings.timer_remaining, DateUtils.formatElapsedTime(remainingTime.toLong()), ) }, ) if (isSleepTimerDialogShown) { TimePickerDialog( remainingTime = remainingTime, onDismissRequest = { isSleepTimerDialogShown = false }, onTimeSelect = onStartTimer, ) } } } TextButton(onClick = onEnterFiltersPanel) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { Icon(imageVector = Icons.Default.Tune, contentDescription = null) Text(text = stringResource(AYMR.strings.player_sheets_filters_title)) } } } } Text(stringResource(AYMR.strings.player_hwdec_mode)) LazyRow( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items(Decoder.entries.minus(Decoder.Auto)) { decoder -> FilterChip( selected = decoder == selectedDecoder, onClick = { onSelectDecoder(decoder) }, label = { Text(text = decoder.title) }, ) } } Text(stringResource(AYMR.strings.player_sheets_stats_page_title)) LazyRow( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items(6) { page -> FilterChip( label = { Text( stringResource( if (page == 0 ) { AYMR.strings.player_sheets_tracks_off } else { AYMR.strings.player_sheets_stats_page_chip }, page, ), ) }, onClick = { if ((page == 0) xor (statisticsPage == 0)) { MPVLib.command(arrayOf("script-binding", "stats/display-stats-toggle")) } if (page != 0) { MPVLib.command(arrayOf("script-binding", "stats/display-page-$page")) } advancedPreferences.playerStatisticsPage().set(page) }, selected = statisticsPage == page, ) } } if (customButtons.isNotEmpty()) { Text(text = stringResource(AYMR.strings.player_sheets_custom_buttons_title)) FlowRow( verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.mediumSmall), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), maxItemsInEachRow = Int.MAX_VALUE, ) { customButtons.forEach { button -> val inputChipInteractionSource = remember { MutableInteractionSource() } Box { FilterChip( onClick = {}, label = { Text(text = button.name) }, selected = false, interactionSource = inputChipInteractionSource, ) Box( modifier = Modifier .matchParentSize() .combinedClickable( onClick = { button.execute() }, onLongClick = { button.executeLongPress() }, interactionSource = inputChipInteractionSource, indication = null, ), ) } } } } Text(text = stringResource(AYMR.strings.pref_audio_channels)) val audioChannels by audioPreferences.audioChannels().collectAsState() LazyRow( horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { items(AudioChannels.entries) { FilterChip( selected = audioChannels == it, onClick = { audioPreferences.audioChannels().set(it) if (it == AudioChannels.ReverseStereo) { MPVLib.setPropertyString(AudioChannels.AutoSafe.property, AudioChannels.AutoSafe.value) } else { MPVLib.setPropertyString(AudioChannels.ReverseStereo.property, "") } MPVLib.setPropertyString(it.property, it.value) }, label = { Text(text = stringResource(it.titleRes)) }, ) } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun TimePickerDialog( onDismissRequest: () -> Unit, onTimeSelect: (Int) -> Unit, modifier: Modifier = Modifier, remainingTime: Int = 0, ) { Dialog( onDismissRequest = onDismissRequest, properties = DialogProperties(usePlatformDefaultWidth = false), ) { Surface( shape = MaterialTheme.shapes.medium, color = MaterialTheme.colorScheme.surface, modifier = modifier.padding(MaterialTheme.padding.medium), ) { Column( modifier = Modifier .verticalScroll(rememberScrollState()) .width(IntrinsicSize.Max) .animateContentSize() .padding(MaterialTheme.padding.medium), ) { var currentLayoutType by rememberSaveable { mutableIntStateOf(0) } Text( text = stringResource( if (currentLayoutType == 1) { AYMR.strings.timer_picker_pick_time } else { AYMR.strings.timer_picker_enter_timer }, ), ) val state = rememberTimePickerState( remainingTime / 3600, (remainingTime % 3600) / 60, is24Hour = true, ) Box( contentAlignment = Alignment.Center, ) { if (currentLayoutType == 1) { TimePicker(state = state) } else { TimeInput(state = state) } } Row( horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth(), ) { IconButton(onClick = { currentLayoutType = if (currentLayoutType == 0) 1 else 0 }) { Icon( imageVector = if (currentLayoutType == 0 ) { Icons.Outlined.Schedule } else { Icons.Default.KeyboardAlt }, contentDescription = null, ) } Row { if (remainingTime > 0) { TextButton(onClick = { onTimeSelect(0) onDismissRequest() }) { Text(stringResource(AYMR.strings.timer_cancel_timer)) } } Spacer(modifier = Modifier.width(8.dp)) TextButton( onClick = { onTimeSelect(state.hour * 3600 + state.minute * 60) onDismissRequest() }, ) { Text(stringResource(MR.strings.action_ok)) } } } } } } } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/PlaybackSpeedSheet.kt ================================================ /* * Copyright 2024 Abdallah Mehiz * https://github.com/abdallahmehiz/mpvKt * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.kanade.tachiyomi.ui.player.controls.components.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.RestartAlt import androidx.compose.material3.Button import androidx.compose.material3.FilledIconButton import androidx.compose.material3.FilledTonalIconButton import androidx.compose.material3.Icon import androidx.compose.material3.InputChip import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import eu.kanade.presentation.player.components.PlayerSheet import eu.kanade.presentation.player.components.SliderItem import eu.kanade.presentation.player.components.SwitchPreference import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences import `is`.xyz.mpv.MPVLib import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.util.collectAsState import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.math.pow import kotlin.math.roundToInt @Composable fun PlaybackSpeedSheet( speed: Float, onSpeedChange: (Float) -> Unit, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, ) { val preferences = remember { Injekt.get() } val audioPreferences = remember { Injekt.get() } PlayerSheet(onDismissRequest = onDismissRequest) { Column( modifier .verticalScroll(rememberScrollState()) .padding(vertical = MaterialTheme.padding.medium), ) { SliderItem( label = stringResource(AYMR.strings.player_sheets_speed_slider_label), value = speed, valueText = stringResource(AYMR.strings.player_speed, speed), onChange = onSpeedChange, max = 6f, min = 0.01f, ) val playbackSpeedPresets by preferences.speedPresets().collectAsState() Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = MaterialTheme.padding.medium), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), ) { FilledTonalIconButton(onClick = { preferences.speedPresets().delete() }) { Icon(Icons.Default.RestartAlt, null) } LazyRow( modifier = Modifier .weight(1f), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.extraSmall), ) { items( playbackSpeedPresets.map { it.toFloat() }.sorted(), key = { it }, ) { InputChip( selected = speed == it, onClick = { onSpeedChange(it) }, label = { Text(stringResource(AYMR.strings.player_speed, it)) }, modifier = Modifier .animateItem(), trailingIcon = { Icon( Icons.Default.Close, null, modifier = Modifier .clickable { preferences.speedPresets().set( playbackSpeedPresets.minus(it.toFixed(2).toString()), ) }, ) }, ) } } FilledTonalIconButton( onClick = { preferences.speedPresets().set(playbackSpeedPresets.plus(speed.toFixed(2).toString())) }, ) { Icon(Icons.Default.Add, null) } } val pitchCorrection by audioPreferences.enablePitchCorrection().collectAsState() SwitchPreference( value = pitchCorrection, onValueChange = { audioPreferences.enablePitchCorrection().set(it) MPVLib.setPropertyBoolean("audio-pitch-correction", it) }, content = { Column( modifier = Modifier.weight(1f), ) { Text(text = stringResource(AYMR.strings.pref_audio_pitch_correction_title)) Text( text = stringResource(AYMR.strings.pref_audio_pitch_correction_summary), style = MaterialTheme.typography.bodyMedium, ) } }, ) Row( modifier = Modifier .padding(horizontal = MaterialTheme.padding.medium), horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), ) { Button( modifier = Modifier.weight(1f), onClick = { preferences.playerSpeed().set(speed) }, ) { Text(text = stringResource(AYMR.strings.player_sheets_speed_make_default)) } FilledIconButton( onClick = { preferences.playerSpeed().delete() onSpeedChange(1f) }, ) { Icon(imageVector = Icons.Default.RestartAlt, contentDescription = null) } } } } } fun Float.toFixed(precision: Int = 1): Float { val factor = 10.0f.pow(precision) return (this * factor).roundToInt() / factor } ================================================ FILE: app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/QualitySheet.kt ================================================ package eu.kanade.tachiyomi.ui.player.controls.components.sheets import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ErrorOutline import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.filled.KeyboardArrowUp import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.player.components.PlayerSheet import eu.kanade.tachiyomi.animesource.model.Hoster import eu.kanade.tachiyomi.animesource.model.Video import tachiyomi.i18n.aniyomi.AYMR import tachiyomi.presentation.core.components.material.DISABLED_ALPHA import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.pluralStringResource import tachiyomi.presentation.core.i18n.stringResource sealed class HosterState(open val name: String) { data class Idle(override val name: String) : HosterState(name) data class Loading(override val name: String) : HosterState(name) data class Error(override val name: String) : HosterState(name) data class Ready( override val name: String, val videoList: List